一键抓包¶
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 的文档。