一键抓包¶
中间人一键抓包功能,可以全自动的在设备上开启全局中间人,他与您常用的工具不同之处在于,您无需顾及证书安装和设置代理等问题,也无需担心系统不同版本,抓包方法有区别这些问题。他可以无缝应用于安卓 6.0 - 14,我们已经为您处理好了一切,您只需要关心具体业务。 并且支持实时的改包和截获,相比如常用的 GUI 界面程序更适合您作为实际业务使用而不仅仅是 "抓个包看看"。
除此之外,我们可以向您保证没有抓不到的包(证书固定除外),抓包成功率也比常规软件的方法高。您可以截获应用的 http/s 流量,当然也可以包括全局的 DNS 请求。它可以自动应用及撤销中间人,退出脚本后设备及网络也将恢复它原来的样子,您不必做任何其他设置,脚本同时支持国际中间人抓包(通过上游代理实现)让您可以轻松抓取国外软件。
LAMDA 基本使用 (国内及国外抓包)
前期准备¶
首先确保当前电脑与设备在同一个网段,或者具备 USB 连接,我们后面假设 192.168.0.2 为运行了 LAMDA 的手机设备 IP。其次,确保您已正常克隆项目工具代码以及安装了相关依赖,在命令行验证 mitmproxy 已安装成功(可在命令行输入 mitmdump
进行验证)。
如果您没有 Python 也不熟悉什么克隆和依赖,您可以在我们的发布页面下载到 startmitm.exe
,他是 startmitm.py 的打包,您可以在不安装 Python 的情况下执行抓包,这是一个控制台程序,命令参数与 startmitm.py
相同(该文件可能会报毒,请自行决定是否使用)。
基础抓包¶
您可以通过如下命令快速的进行抓包,这是最简单的使用方法。
python3 -u startmitm.py 192.168.0.2
按下一次 CONTROL
+ C
即可退出抓包。
共享抓包¶
如果您想和局域网的小伙伴一起分析,执行如下命令,随后让您的小伙伴用浏览器打开 http://您的IP地址:7890
即可和您看到一样的抓包页面,你们可以一起欢乐的分析。
python3 -u startmitm.py 192.168.0.2 --web-port 7890 --web-host 0.0.0.0
特定应用¶
如果您需要截获特定应用的流量,而不是系统全局的流量包,您可以通过下面这种方法在 IP 后面加入 :包名
来抓取特定应用的流量数据,以下示例将会只截获 com.some.package
的流量。
python3 -u startmitm.py 192.168.0.2:com.some.package
实时修改¶
LAMDA 基本使用 (中间人抓包的实时修改及存储)
您可以实时修改应用的请求数据和响应数据,此功能基于 mitmproxy 的事件钩子。您需要自行根据 mitmproxy 相关 API 编写钩子脚本。关于如何编写钩子脚本请参考 mitmproxy 的官方文档 docs.mitmproxy.org/stable/addons-examples 以及示例代码 mitmproxy/examples/contrib。
假设您编写的钩子脚本为 http_flow_hook.py
,使用以下方式应用钩子脚本。
python3 -u startmitm.py 192.168.0.2 -s http_flow_hook.py
不同网络¶
如果您的手机和当前电脑不在同一个网络,但是可以物理接触设备,您也可以通过 USB ADB 的方式进行抓包。需要确保当前设备已通过 USB ADB 接入电脑且已正确授权。
如果电脑只连接了一个 ADB 设备,使用如下命令进行抓包,localhost
代表使用 ADB 设备。
python3 -u startmitm.py localhost
如果电脑连接了多个 ADB 设备,您需要指定 adb 串号,请从命令 adb devices
的输出中寻找。
python3 -u startmitm.py localhost --serial bfde362
如果您的环境更苛刻,比如手机与当前电脑既不在同一网络下,也无法物理接触设备,但是只要您可以访问 LAMDA 的端口,也可以进行中间人。这种情况通常为,您使用了内置 frp 服务转发了 LAMDA 到远程服务器,或者您自行通过某种方式转发了 LAMDA 的 65000 端口到某个地方,这种情况下您和 LAMDA 之间仅有这一个端口可以直接交流,其他端口是无法互相访问的。这种情况下,手机无法访问到本机的任何端口,本机也只能访问到手机的 LAMDA 端口(或者手机有公网IP,但本机在内网),这样需要通过以下方式来进行。(OpenVPN 网络互通,并不属于以上情况)
这时,需要通过下面这种组合方式来进行,首先,使用 adb_pubkey.py
或者自行调用接口将自身的 ADB 公钥安装到设备上,安装完毕后继续执行以下过程,其中 x.x.x.x
为可以连接到 65000 端口的 IP 或者 127.0.0.1
,依据实际情况修改。
adb connect x.x.x.x:65000
最后,按照和上文一样的方法,通过 USB 抓包来操作。
python3 -u startmitm.py localhost
或者以下这样,这里的 serial 是 adb connect 的地址而不是十六进制串号了。
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 抓包。
DOH 指的是 DNS-Over-HTTP
,建议使用的 DNS 有如下几个,您可以依据情况选择。
国外 https://1.1.1.1/dns-query
国外 https://dns.google/dns-query
国内 https://dns.alidns.com/dns-query
因为使用了 DOH-DNS,所以被污染问题将不复存在,您也可以使用此模式进行国际抓包,比如一下命令通过本机克拉西软件的 7890 端口进行国际网络抓包。
python3 -u startmitm.py 192.168.0.2 --upstream http://127.0.0.1:7890 --dns https://dns.google/dns-query
如果是使用国内代理使用 upstream 模式时,那么建议将 DNS 设置为 alidns。
python3 -u startmitm.py 192.168.0.2 --upstream http://x.x.x.x:8080 --dns https://dns.alidns.com/dns-query
如果上游 HTTP 代理需要登录认证,请按以下命令并替换 USER:PASSWORD
。
python3 -u startmitm.py 192.168.0.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 抓包也会同时开启普通抓包,您可以截获应用的 DNS 查询信息。以下命令启动 DNS 抓包,并指定上游 DNS 为 114.114.114.114。
python3 -u startmitm.py 192.168.0.2 --dns 114.114.114.114
启动 DNS 抓包,但上游 DNS 使用了非标准的端口如 5353。
python3 -u startmitm.py 192.168.0.2 --dns 192.168.0.100:5353