一键抓包

startmitm 中间人,可以全自动的在设备上开启全局中间人,你可以截获应用的 http/s 流量,当然也可以包括全局 DNS 请求。它可以自动应用及撤销中间人,退出脚本后设备及网络也将恢复它原来的样子,脚本同时支持国际中间人抓包。

首先确保当前电脑与设备在同一个网段,192.168.1.2 为运行了 LAMDA 的设备。其次,确保你已在命令行验证 mitmproxy 已安装成功(在命令行输入 mitmdump 进行验证)。当然,电脑与设备不在同一网段或者是远程设备,你也可以轻松抓包,请继续往下看。

发布页面包含了一个 startmitm.exe,他是 startmitm.py 的封装,你可以在不安装 Python 的情况下执行抓包,这是一个控制台程序,命令参数与如下相同(文件可能会报毒,请自行决定是否使用)。

基础抓包

# 注意,设备IP 必须在参数第一位
python3 -u startmitm.py 192.168.1.2

按下一次 CONTROL + C 退出脚本。

共享抓包

如果你想和局域网的小伙伴一起分析,执行如下命令随后让你的小伙伴用浏览器打开 http://你的IP地址:7890 即可。

python3 -u startmitm.py 192.168.1.2 --web-port 7890 --web-host 0.0.0.0

特定应用

如果需要截获特定应用的流量而不是全局

python3 -u startmitm.py 192.168.1.2:com.some.package

实时修改

关于编写 http_flow_hook.py 脚本请参考 docs.mitmproxy.org/stable/addons-examples 以及 mitmproxy/examples/contrib

python3 -u startmitm.py 192.168.1.2 -s http_flow_hook.py

不同网络

手机与当前电脑不在同一网络下但是可以物理接触设备,你也可以进行中间人,但需要确保当前设备已通过USB或者 adb connect 接入电脑且已授权。

# localhost 代表使用 adb 设备
# 当前仅连接了一台 adb 设备
python3 -u startmitm.py localhost
# 电脑连接了多台 adb 设备,你需要指定 adb serial
# 这个 serial 请从命令 adb devices 的输出中寻找
python3 -u startmitm.py localhost --serial bfde362

更加严苛的网络环境

手机与当前电脑不在同一网络下,也无法物理接触设备,但是只要你可以访问 LAMDA 的端口,也可以进行中间人。这种情况通常为,你使用了内置 frp 服务转发了 LAMDA 到远程服务器,或者你自行通过某种方式转发了 LAMDA 的 65000 端口到某个地方,这种情况下你和 LAMDA 之间仅有这一个端口可以直接交流,其他端口是无法互相访问的。这种情况下,手机无法访问到本机的任何端口,本机也只能访问到手机的 LAMDA 端口(或者手机有公网IP,但本机在不互通的内网),这样需要通过以下方式来进行。(OpenVPN 网络互通,并不属于以上情况)

这时需要通过组合方式来进行,首先,使用 adb_pubkey.py 或者自行调用接口将自身的 ADB 公钥安装到设备上,安装完毕后继续执行以下过程。

adb kill-server
# 如果你使用了内置 frp 或者自行使用了 ssh 转发,
# 这里的 x.x.x.x 通常为 127.0.0.1,请依据事实修改
# 而这里的 65000 也非固定,依据你实际设置的目的转发端口做修改
adb connect x.x.x.x:65000

最后,按照和上文通过USB抓包同样的方法操作

# localhost 代表使用 adb 设备
# 当前仅连接了一台 adb 设备
python3 -u startmitm.py localhost
# 电脑连接了多台 adb 设备,你需要指定 adb serial
python3 -u startmitm.py localhost --serial x.x.x.x:65000

上游代理/国际抓包

代理转发模式需要确保 mitmproxy 的版本 >= 9.0.0(且 Python>=3.9)。

startmitm 本身也会启动 mitmproxy 作为代理服务,默认情况下流量都是 mitmproxy 从本机网卡发出的,如果你需要流量通过一个上游代理发出而不是本机,可以使用如下方式指定上游代理,仅支持 HTTP 作为上游代理。

DNS 流量也会经过上游代理,所以也需要指定上游 DOH-DNS,使用该模式将同时开启 DNS 抓包。

建议使用的 DNS-Over-HTTP DNS 有如下几个

国内 https://dns.alidns.com/dns-query
国外 https://dns.google/dns-query
国外 https://1.1.1.1/dns-query

因为使用了 DOH-DNS,所以 DNS 污染问题将不复存在,您也可以使用此模式进行翻墙抓包。

# 通过本机 Clash 软件的端口进行国际网络抓包
python3 -u startmitm.py 192.168.1.2 --upstream http://127.0.0.1:7890 --dns https://dns.google/dns-query
# 国内网络环境使用 upstream 模式时,请使用国内 DOH-DNS 例如阿里云
python3 -u startmitm.py 192.168.1.2 --upstream http://x.x.x.x:8080 --dns https://dns.alidns.com/dns-query

如果上游代理需要登录认证,请按以下命令替换 USER:PASSWORD

python3 -u startmitm.py 192.168.1.2 --upstream http://USER:PASSWORD@x.x.x.x:8080 --dns https://dns.alidns.com/dns-query

DNS抓包

截获 DNS 请求需要确保 mitmproxy 的版本 >= 9.0.0(且 Python>=3.9)。

启动 DNS 抓包,并指定上游 DNS 为 114.114.114.114

python3 -u startmitm.py 192.168.1.2 --dns 114.114.114.114

启动 DNS 抓包,但上游 DNS 使用非标准端口

python3 -u startmitm.py 192.168.1.2 --dns 192.168.0.100:5353

其他相关流量HOOK等操作请查看 mitmproxy 的文档。