使用fiddler进行透明代理抓包的一些注意项

来自三线的随记


太久没用透明代理来进行抓包了,今天尝试抓包居然躺了快一个小时,这里做点记录免得以后再躺

场景假设

有一台低于7版本的安卓手机,现在需要利用fiddler进行透明代理抓包微信小程序https的流量

安卓手机IP为 192.168.254.38

运行着fiddler classic的windows电脑IP为 192.168.254.254

一个可以调整iptables的路由器网关IP为 192.168.254.1 (利用路由器的iptables功能进行透明劫持手机的 80 和 443 等流量)

注意项

被劫持设备需要安装导入fiddler生成的CA证书 (废话)

fiddler classic 默认不监听remote computers流量,需要自行在配置中勾选生效

fiddler classic 默认的监听端口不可用作https流量的透明代理端口,所以需要建立一个专门的端口用于监听https流量

可以在fiddler classic的QuickExec工具栏中(左下方的长黑细条)中执行 !listen 8098 * 以实现独立端口监听

* 号代表着https证书的CN值,一般是域名,如果是透明代理的话,使用*即可。如果已知捕获目标,需要定向捕获某个domain的https流量的话可以替换,如 !listen 8098 baidu.com

重要的是,如果使用 * 进行建立https透明监听端口的话,需要再执行一次 prefs set fiddler.network.https.SetCNFromSNI true 以实现根据SNI动态https证书生成(不然被劫持的客户端会报证书CN错误)

fiddler.network.https.SetCNFromSNI 配置更改以后需要重启fiddler classic才可以生效,查看所有fiddler classic配置可以执行about:config 查看

实施细节

在路由器上执行

iptables -t nat -I PREROUTING -p tcp --dport 443 -s 192.168.254.38 -j DNAT --to-destination=192.168.254.254:8098   # HTTPS流量
iptables -t nat -I PREROUTING -p tcp --dport 80 -s 192.168.254.38 -j DNAT --to-destination=192.168.254.254:8080   # HTTP流量,8080端口自行根据实际情况修改
iptables -t nat -I POSTROUTING -s 192.168.254.38 -d 192.168.254.254 -j MASQUERADE # SNAT以保持会话五元组不被破坏

如无意外,这样就能在fiddler classic中看到安卓手机上劫持的流量

ps

  • 在 Android7.0 及以上的系统中,每个应用可以定义自己的可信 CA 集集。 默认情况下,应用只会信任系统预装的 CA 证书,而不会信任用户安装的 CA 证书。 无论是 fiddler classic还是 Charles 等软件,想抓 https,都必须手机安装对应的证书,通过 fiddler/Charles 安装的证书恰恰正属于用户安装的 CA 证书,因此会被视作不安全的证书。
  • 安卓系统 7.0 以下版本,不管微信任意版本,都会信任安卓系统提供的证书
  • 安卓系统 7.0 以上版本,微信 7.0 以下版本,微信会信任安卓系统提供的证书
  • 安卓系统 7.0 以上版本,微信 7.0 以上版本,微信只信任它自己配置的证书列表
  • 苹果手机目前信任系统提供的证书

关键词

  • transparent proxy
  • android