mitmproxy 应用(一)基础代理
系列文章
mitmproxy 是一个开源的代理工具,我曾经在 手机抓包工具汇总 中提到过它。本系列会把我使用 mitmproxy 时碰到的一些经验列出来。
透明代理
我们经常会在系统中设置代理,但有些软件并不理会系统代理,坚持使用直接连接。要解决这个问题,我们可以使用透明代理。详细的说明可以看 Transparent Proxying 。
下面以 Android(客户端)+macOS(开发宿主机)为例说一下透明代理的实现。我的步骤和 mitmproxy 的文档 略有出入,可对比查看。
1. 启动 mitmproxy ,安装根证书,按标准方式配置好代理之后,在 Android 设备上用浏览器访问 http://mitm.it 即可下载根证书。
2. 启用 IP forwarding
1sudo sysctl -w net.inet.ip.forwarding=1
3. 编译一个配置文件 pf.conf(名称随意),内容如下。将其中的 en0
换成 macOS 上用来代理的网络设备的名称。
1rdr on en0 inet proto tcp to any port 80 -> 127.0.0.1 port 8080
2rdr on en0 inet proto tcp to any port 443 -> 127.0.0.1 port 8080
想知道自己的网络设备的名称,按住 Option(Alt) 键的同时单击网络连接即可:
4. 加载配置文件
1sudo pfctl -f pf.conf
如果你碰到这样的提示,不用理会:
No ALTQ support in kernel ALTQ related functions disabled
当然,如果你非常在意这个提示,可以开启 macOS 的防火墙:
5. 启用配置文件
1sudo pfctl -e
6. 编辑 sudo 权限
注意,这里限制了命令行的使用,因此是安全的。
1sudo visudo
2# 加入以下内容
3ALL ALL=NOPASSWD: /sbin/pfctl -s state
7. 启用透明代理
1mitmproxy -T --host
8. 设置默认网关
在 Android 设备上将默认网关设置为 macOS 的 IP 地址。
一切搞定,打开 Android 设备,就能看到所有的流量都通过代理传输。
Certificate Pinning
mitmproxy 有一套完整的机制处理 HTTPS 加密问题,这套机制能帮助我们解密 HTTPS 流量。How mitmproxy works 介绍了这套机制的原理。
因此,当我们在 mitmproxy 的 log 信息中看到这样的错误时,一般的原因是没有正常安装并信任根证书。
10.42.0.45:50438: Client Handshake failed. The client may not trust the proxy's certificate for xxx.com.
配置客户端代理后访问 http://mitm.it 即可下载根证书,然后手动信任即可。About Certificates 文档详述了方法。
但如果客户端已经正常进行了证书安装,还是碰到这样的提示,就应该考虑是否碰到了 Certificate Pinning ,也叫做 HPKP 。在这种情况下,客户端并不会信任位于根证书域中 mitmproxy 下发的证书,而是仅仅信任自己的证书签发机构签发的证书。
Certificate Pinning 是一种 HTTPS 扩展行为,采用 HSTS 机制实现,一些新的浏览器支持这种行为。当然,自行编写的客户端也可以自行支持这种行为。
Chrome/Firefox/Opera 支持 Certificate Pinning ,但是 IE/Edge/Safari 目前不支持。
一些资料:
- error while running mmitmproxy
- What is certificate pinning?
- Public Key Pinning Extension for HTTP
- HTTP Strict Transport Security
- 文章ID:2652
- 原文作者:zrong
- 原文链接:https://blog.zengrong.net/post/use-mitmproxy-1/
- 版权声明:本作品采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可,非商业转载请注明出处(原文作者,原文链接),商业转载请联系作者获得授权。