HttpCanary
HttpCanary是Android系统下功能最强大的网络分析工具(IOS的是Thro),支持TCP/UDP/HTTP/HTTPS/WebSocket等多种协议,可以视为Android平台下的Fiddler和Charles。
★强大的调试功能
- 断点指定请求,支持修改数据再提交。
- 注入器支持,创建自定义规则修改返回数据包(★静态注入)。
- 支持对网络请求重发、编辑重发、批量重发等操作。
- 配置黑名单或者白名单,自由指定目标抓包。
- 支持数据包屏蔽,比如屏蔽客户端发向服务器的指定数据包。
mitmproxy
顾名思义,mitmproxy 就是用于 MITM 的 proxy,MITM 即中间人攻击(Man-in-the-middle attack)。用于中间人攻击的代理首先会像正常的代理一样转发请求,保障服务端与客户端的通信,其次,会适时的查、记录其截获的数据,或篡改数据,引发服务端或客户端特定的行为。不同于 fiddler 或 wireshark 等抓包工具,mitmproxy 不仅可以截获请求帮助开发者查看、分析,更可以通过自定义脚本进行二次开发。
注:mitmproxy最大的特点跟httpCanary一样,其拥有修改响应的能力,实现如下功能::“截获对浏览器对该 url 的请求,将返回内容置空,并将真实的返回内容存到某个数据库,出现异常时发出邮件通知”,这些都
但 mitmproxy 并不会真的对无辜的人发起中间人攻击,由于 mitmproxy 工作在 HTTP 层,而当前 HTTPS 的普及让客户端拥有了检测并规避中间人攻击的能力,所以要让 mitmproxy 能够正常工作,必须要让客户端(APP 或浏览器)主动信任 mitmproxy 的 SSL 证书,或忽略证书异常,★这也就意味着 APP 或浏览器是属于开发者本人的★——显而易见,这不是在做黑产,而是在做开发或测试。
特性
- 拦截HTTP和HTTPS请求和响应并即时修改它们
- 保存完整的HTTP对话以供以之后重发和分析
- 重发HTTP对话的客户端
- 重发先前记录的服务的HTTP响应
- 反向代理模式将流量转发到指定的服务器
- 在macOS和Linux上实现透明代理模式
- 使用Python对HTTP流量进行脚本化修改
- 实时生成用于拦截的SSL / TLS证书
安装
“安装 mitmproxy”这句话是有歧义的,既可以指①“安装 mitmproxy 工具”,也可以指②“安装 python 的 mitmproxy 包”,注意后者是包含前者的。即安装 python 的 mitmproxy 包除了会得到 mitmproxy 工具外,还会得到开发定制脚本所需要的包依赖,其安装过程并不复杂。
如果只是拿 mitmproxy 做一个替代 fiddler 的工具,没有什么定制化的需求(修改响应等功能),那完全只需要“安装 mitmproxy 工具”即可,去 mitmproxy 官网 上下载一个 installer 便可开箱即用,不需要提前准备好 python 开发环境。但显然,这不是这里要讨论的,我们需要的是“安装 python 的 mitmproxy 包”。
安装命令:pip install mitmproxy
完成后,系统将拥有 mitmproxy
(windows中不支持)、mitmdump
、mitmweb
三个命令,可以拿 mitmdump
测试一下安装是否成功,执行:
1 | mitmdump --version |
应当可以看到类似于这样的输出:
1 | Mitmproxy: 4.0.1 |
运行
要启动 mitmproxy 用 mitmproxy
、mitmdump
、mitmweb
这三个命令中的任意一个即可,这三个命令功能一致,且都可以加载自定义脚本,唯一的区别是交互界面的不同。
mitmproxy
命令启动后,会提供一个命令行界面,用户可以实时看到发生的请求,并通过命令过滤请求,查看请求数据。mitmweb
命令启动后,会提供一个 web 界面,用户可以实时看到发生的请求,并通过 GUI 交互来过滤请求,查看请求数据。mitmdump
命令启动后——没有界面,程序默默运行,所以 mitmdump 无法提供过滤请求、查看数据的功能,只能结合自定义脚本,默默工作。
由于 mitmproxy
命令的交互操作稍显繁杂且不支持 windows 系统,而我们主要的使用方式又是载入自定义脚本,并不需要交互,所以原则上说只需要 mitmdump
即可,但考虑到有交互界面可以更方便排查错误,所以这里以 mitmweb
命令为例。实际使用中可以根据情况选择任何一个命令。
mitmweb
mitmproxy 绑定了 *:8080
作为代理端口,并提供了一个 web 交互界面在 127.0.0.1:8081
。
现在可以测试一下代理,让 Chrome 以 mitmproxy 为代理并忽略证书错误。为了不影响平时正常使用,我们不去改 Chrome 的配置,而是通过命令行带参数起一个 Chrome。如果你不使用 Chrome 而是其他浏览器,也可以搜一下对应的启动参数是什么,应该不会有什么坑。此外示例仅以 windows 系统为例,因为使用 linux 或 mac 开发的同学应该更熟悉命令行的使用才对,应当能自行推导出在各自环境中对应的操作。
接下来关闭所有 Chrome 窗口,否则命令行启动时的附加参数将失效。打开 cmd,执行:
1 | # 前面那一长串是 Chrome 的的安装路径,应当根据系统实际情况修改,后面两参数设置了代理地址并强制忽略掉证书错误。 |
▲推荐先使用mitmdump
:
1 | $ mitmdump |
但是如果没安装https证书的话,是抓取不了https数据的,因此需要安装证书。
证书安装
PC
使用mitmdump
之后下面的文件就会被创建,位于C:\Users\mrli\.mitmproxy
Filename | Contents |
---|---|
mitmproxy-ca.pem | The certificate and the private key in PEM format. |
mitmproxy-ca-cert.pem | The certificate in PEM format. Use this to distribute on most non-Windows platforms. |
mitmproxy-ca-cert.p12 | The certificate in PKCS12 format. For use on Windows. |
mitmproxy-ca-cert.cer | Same file as .pem, but with an extension expected by some Android devices. |
双击mitmproxy-ca-cert.p12
安装,“本地计算机”->下一页
->下一页
->将所有的证书都放入下列存储
(受信任的根证书颁布机构)然后下一页,即可完整证书安装
手机
WIFI中设置代理,ip需要在电脑上通过ipconfig
查看,而port参数跟上面一样,通过mitmdump
可以看到侦听的端口具体为多少,默认为8080。
证书安装:进入网址mitm.it
,根据OS选择安装证书
详情见: mitmproxy抓包工具!!! 从安装到简单使用
★脚本
接下来开始开发自定义脚本,这才是 mitmproxy 真正强大的地方(可以在python代码中直接处理数据包)。
总共有两种写法:
- 定义一些接受指定参数的函数
编写一个 py 文件供 mitmproxy 加载,文件中定义了若干函数,这些函数实现了某些 mitmproxy 提供的事件,mitmproxy 会在某个事件发生时调用对应的函数,形如:
1 | import mitmproxy.http |
第二个是,编写一个 py 文件供 mitmproxy 加载,文件定义了变量 addons,addons 是个数组,每个元素是一个类实例,这些类有若干方法,这些方法实现了某些 mitmproxy 提供的事件,mitmproxy 会在某个事件发生时调用对应的方法。这些类,称为一个个 addon
,比如一个叫 Counter 的 addon(插件):
1 | import mitmproxy.http |
⭐️这里强烈建议使用第二种套路,直觉上就会感觉第二种套路更为先进,使用会更方便也更容易管理和拓展。况且这也是官方内置的一些 addon 的实现方式。
我们将上面第二种套路的示例代码存为 addons.py,再重新启动 mitmproxy:
1 | mitmweb -s addons.py |
当浏览器使用代理进行访问时,就应该能看到控制台里有类似这样的日志:
1 | Web server listening at http://127.0.0.1:8081/ |
这就说明自定义脚本生效了。
总结:自定义脚本可以实现拦截请求,从而对请求头、请求、响应头、响应头进行修改的效果——当人操作时,就能在拦截请求进行处理的时候进行数据处理。所以可以mitmproxy+appnium或者selenium实现模拟点击+抓数据包的方式。
事件
上述当 request 时间发生时,计数器加一,并打印日志。这里对应的是 request 事件,那么mitmproxy中一共有哪些事件呢?
Author: Mrli
Link: https://nymrli.top/2022/04/29/mitmproxy拦截代理——PC版HttpCanary/
Copyright: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.