系列文章

mitmproxy 是一个开源的代理工具,我曾经在 手机抓包工具汇总 中提到过它。本系列会把我使用 mitmproxy 时碰到的一些经验列出来。

透明代理

我们经常会在系统中设置代理,但有些软件并不理会系统代理,坚持使用直接连接。要解决这个问题,我们可以使用透明代理。详细的说明可以看 Transparent Proxying

下面以 Android(客户端)+macOS(开发宿主机)为例说一下透明代理的实现。我的步骤和 mitmproxy 的文档 略有出入,可对比查看。

1. 启动 mitmproxy ,安装根证书,按标准方式配置好代理之后,在 Android 设备上用浏览器访问 http://mitm.it 即可下载根证书。

2. 启用 IP forwarding

1
sudo sysctl -w net.inet.ip.forwarding=1

3. 编译一个配置文件 pf.conf(名称随意),内容如下。将其中的 en0 换成 macOS 上用来代理的网络设备的名称。

1
2
rdr on en0 inet proto tcp to any port 80 -> 127.0.0.1 port 8080
rdr on en0 inet proto tcp to any port 443 -> 127.0.0.1 port 8080

想知道自己的网络设备的名称,按住 Option(Alt) 键的同时单击网络连接即可:

按住 Option(alt) 键得到网络详细信息

4. 加载配置文件

1
sudo pfctl -f pf.conf

如果你碰到这样的提示,不用理会:

No ALTQ support in kernel
ALTQ related functions disabled

当然,如果你非常在意这个提示,可以开启 macOS 的防火墙:

系统偏好设置 -> 安全与隐私 -> 防火墙 -> 打开防火墙

5. 启用配置文件

1
sudo pfctl -e

6. 编辑 sudo 权限

注意,这里限制了命令行的使用,因此是安全的。

1
2
3
sudo visudo
# 加入以下内容
ALL ALL=NOPASSWD: /sbin/pfctl -s state

7. 启用透明代理

1
mitmproxy -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 目前不支持。

一些资料:

全文完

留言

2017-08-09
次访问