将任何 Linux 计算机变成一个公共 Wi-Fi 网络,默默地对所有 HTTP 流量实施中间人攻击。它在 Docker 容器内运行,使用 hostapd、dnsmasq 和 mitmproxy 创建一个名为 "Public" 的开放蜜罐无线网络。为了增加趣味性,将网络名称改为 "xfinitywifi",可以自动连接任何曾经连接过这些网络的人……它们无处不在。
免责声明:本软件仅供教育目的。不得用于非法活动。作者不对其使用负责。不要做混蛋。
# 克隆仓库
git clone https://github.com/brannondorsey/mitm-router
cd mitm-router
# 构建镜像(如果更倾向于从 Docker Hub 仓库拉取镜像,此步骤可省略)
docker build . -t brannondorsey/mitm-router
运行以下命令,将 AP_IFACE 和 INTERNET_IFACE 分别替换为你的无线设备和已连接互联网的以太网/无线设备。你可以通过运行 ifconfig 查看网络设备的名称。
# 运行容器
docker run -it --net host --privileged \
-e AP_IFACE="wlan0" \
-e INTERNET_IFACE="eth0" \
-e SSID="Public" \
-v "$(pwd)/data:/root/data" \
brannondorsey/mitm-router
如果一切顺利,你应该看到类似这样的输出:
Current MAC: a5:ae:f9:a4:b7:e3 (TP-LINK TECHNOLOGIES CO.,LTD.)
Permanent MAC: a5:ae:f9:a4:b7:e3 (TP-LINK TECHNOLOGIES CO.,LTD.)
New MAC: 00:d2:6b:d5:fe:bd (PHOTRON USA)
[ ok ] Starting system message bus: dbus.
[ ok ] Starting DNS forwarder and DHCP server: dnsmasq.
[ ok ] Starting advanced IEEE 802.11 management: hostapd.
Proxy server listening at http://0.0.0.0:1337
mitm-router 透明地捕获发送到路由器 10.0.0.1:80 的所有 HTTP 流量。它不会拦截 HTTPS 流量(端口 443),因为这样做会提醒用户可能正在发生中间人攻击。以 https:// 开头的 URL 之间的流量不会被捕获。
mitm-router/data/ 文件夹与 Docker 容器共享,这样我们可以在宿主机上查看它放置的捕获文件。默认情况下,你会在 mitm-router/data/http-traffic.cap 中找到 mitmdump 捕获文件。
你也可以将 INTERNET_IFACE 连接到手机上的热点,随时随地进行中间人攻击;)
如果似乎出了问题,请参阅故障排除页面。
关闭 Docker 容器以重置 iptable 路由规则。
# 获取你的容器名称
docker ps
# 连接到容器
docker stop <CONTAINER_NAME>
Proxy server listening at http://0.0.0.0:1337
[ ok ] Stopping DNS forwarder and DHCP server: dnsmasq.
[ ok ] Stopping advanced IEEE 802.11 management: hostapd.
[ ok ] Stopping system message bus: dbus.
received shutdown signal, exiting.
默认情况下,mitm-router 会将 AP_IFACE 的 MAC 地址随机化,以匿名化你的网络设备。这可以通过环境变量 MAC="unchanged" 禁用。你也可以使用 MAC="XX:XX:XX:XX:XX:XX" 显式设置 AP_IFACE 的 MAC 地址。
支持的环境变量及其默认值如下:
# 用于接入点的无线设备名称
AP_IFACE="wlan0"
# 用于路由器内部互联网连接的设备名称
# 来自 AP_IFACE 的数据包将被转发到此设备
INTERNET_IFACE="eth0"
# 无线网络名称
SSID="Public"
# 可选的 WPA2 密码;如果留空,网络将开放
PASSWORD=""
# 可选的 AP_IFACE MAC 地址随机化
# 可以设置为特定值,如 "XX:XX:XX:XX:XX:XX"
# 或设置为 "unchanged" 以保持设备 MAC 不变
MAC="random"
# tcpdump 输出文件在容器内的位置
CAPTURE_FILE="/root/data/http-traffic.cap"
# 可选的 mitmproxy 过滤器
# 参见 http://docs.mitmproxy.org/en/stable/features/filters.html
FILTER=""
更多信息请参见故障排除页面。
此接入点在 Docker 内运行以实现隔离,确保接入点中可能被利用的漏洞不会让攻击者访问你的计算机或家庭网络。尽管如此,还是需要注意一些事项:
--net host 会将宿主机上的所有网络接口和 iptables 条目共享给 Docker 容器。假设一个易受攻击的 Docker 容器将对这些设备拥有 root 访问权限。--privileged 模式运行会向 Docker 容器授予扩展权限。ufw)阻止所有端口的入站流量,以便“Public”网络上的计算机无法访问你的机器上暴露的服务。为了增加安全性,我更喜欢在专用计算机(如 Raspberry Pi)上运行此 Docker 容器。
此代码最初是 simonschuang 的 rpi-hostapd 的一个硬分叉。该代码已为中间人攻击目的进行了大量修改。