mitmproxy 是开源的免费的 HTTP 抓包工具。
安装 mitmproxy
解压得到三个核心程序:mitmproxy
, mitmdump
, mitmweb
$ tar xvf ./mitmproxy-8.1.1-osx.tar.gz
x mitmproxy
x mitmdump
x mitmweb
在 macOS 上需要先移除额外的属性,否则执行的时候会触发看门狗询问是否允许执行的提示。
xattr -c *
然后把几个核心程序移到 PATH
路径下:
sudo mv mitm* /usr/local/bin
配置 mitmproxy
运行 mitmproxy,默认监听的端口是 8080,也可以使用参数指定:
mitmproxy -p 9091 # 监听 9091 端口
想要交互友好一点,可以使用带 WebUI 的 mitmweb
:
mitmweb -p 9091
命令执行后会默认打开 Web 控制页面。
配置根证书解密 HTTPS
把本机的代理设置为 127.0.0.1:9091
,然后在浏览器中打开地址:http://mitm.it
点击安装 mitmproxy-ca-cert.pem
到系统的钥匙链中,然后设置信任为始终信任。
现在本机的代理服务器就具备解包 HTTPS 流量的条件了。
最后一步,在终端里设置代理地址为 mitmproxy 服务器的 IP 和端口,在终端有浏览器中打开 http://mitm.it
下载 mitmproxy-ca-cert.pem
并信任。
现在可以开始抓包了。
在 Debian 上部署 mitmproxy 服务
如果有树莓派设备,可以选择把 mitmproxy 服务安装在树莓派上,这样每次抓包的时候只需要启动服务就可以了,一次配置多次使用。
安装 mitmproxy:
sudo apt install mitmproxy
默认情况下,mitmweb
的控制页面默认只监听 127.0.0.1
,需要改为 0.0.0.0
或者树莓派的 IP 地址:
# 控制绑定 IP 为 0.0.0.0,访问端口默认是 8081
# 代理服务的端口为 9091
mitmweb --web-host 0.0.0.0 --listen-port 9091
首次执行命令后,会在 ~/.mitmproxy
目录下生成证书,要解包 HTTPS 需要先把根证书安装到系统中:
$ sudo cp -a ~/.mitmproxy/mitmproxy-ca-cert.pem /usr/local/share/ca-certificates/mitmproxy.crt
$ sudo update-ca-certificates
Updating certificates in /etc/ssl/certs...
1 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.
设置代理链
如果机器上已经存在了其他的代理服务器,就需要把 mitmproxy 服务设置为上游代理模式,这样数据先经过 mitmproxy 后,再由 mitmproxy 转发给上游代理服务。
client
<-> mitmproxy
<-> upstream proxy
<-> Internet
设置代理模式:
mitmweb --mode upstream:http://127.0.0.1:7890 --web-host 0.0.0.0 --listen-port 9091
官方文档: https://docs.mitmproxy.org/stable/concepts-modes/
在 Docker 中使用 mitmproxy
安装 mitmproxy 官方编译的 Docker 镜像:
sudo docker pull mitmproxy/mitmproxy
运行 mitmproxy 服务:
sudo docker run --rm -it \
-v ~/.mitmproxy:/home/mitmproxy/.mitmproxy \
-p 9090:8080 -p 9091:8081 \
mitmproxy/mitmproxy \
mitmweb --no-web-open-browser --web-host 0.0.0.0 --mode upstream:http://10.211.55.2:7890
把 Docker 里的端口 8080
和 8081
映射到主机的 9090
和 9091
端口上,并且需要设置 Web 控制页面绑定的 IP 为 0.0.0.0
,主机才可以访问到。
如果主机上还设置了代理,需要添加 upstream
把数据转发给主机上的代理服务器。
如果是团队小组内部共用一个 mitmproxy 服务器的话,使用 Docker 比较合适,可以为每个登录的成员启动一个 Docker 实例来避免环境干扰。
iOS 模拟器安装 mitmproxy 根证书
和真机有所不同,模拟器安装根证书比较简单,只需要一条命令。
首先启动一个 iOS 模拟器,然后执行命令把根证书添加到模拟器中:
xcrun simctl keychain booted add-root-cert ~/.mitmproxy/mitmproxy-ca-cert.pem
命令执行成功后,需要重启一下模拟器。
调整 TLS 版本需求
如果要限制客户端的 TLS 版本最低为 1.1,需要在命令行中加上参数:
--set tls_version_client_min=TLS1_1
参考资料: https://docs.mitmproxy.org/stable/concepts-certificates/