可能导致 Fiddler 抓包失败的几大坑:证书寿命过长、应用无视代理设置、不支持 HTTP/2

2021-04-26 18:21:40 +08:00
 acess
之前发过一帖 /t/772447
这个帖子是总结一下,以及说说我摸索出来的解决方法……

(1) Android 7.0 以上会(默认)无视用户证书,需要 root 权限安装系统证书。(这一条和 Fiddler 本身无关)
楼主记得之前看到别处有人说,应用可以声明是否信任用户证书,所以通过改包(改 manifest )也可以解决,但楼主没试过。
除此之外就是 SSL Pinning,这种情况是应用无视 CA 证书,是在应用代码里写死的,所以这种情况下只能 xposed (Android 8 及以下,root) / edxposed (Android 8-11,root) / virtualxposed ( 无需 root,不过很显然不能 hook 系统应用) 使用 JustTrustMe 之类的模块,或者反编译改包才能解决。
( xposed 模块可能有 hook 不到的死角;但是一般来说,即便有死角,也足以覆盖安装证书可以解决的情况)

(2) Fiddler 生成证书的有效期太长( 感谢 @mengyx 提醒)
在 Fiddler 的 QuickExec 中打开 about:config,然后修改 fiddler.certmaker.GraceDays 和 fiddler.certmaker.ValidDays,分别是 有效期从 N 天前开始 和 有效期至 N 天之后 ,这样就可以解决因为违反了 Chromium 证书寿命政策而导致证书无效的报错。

(3) 有的时候,应用并不遵循系统设置里的 HTTP 代理,无视代理设置、直连了,所以抓包抓不到或抓不全。
哪怕同一个应用内,也可能一部分请求走代理,一部分无视代理。
我对付这个问题的办法是:客户端跑 ss-android,然后起一个 Linux 的虚拟机来跑 ss-server,再用 redsocks 把 ss-server 出来的流量重定向到虚拟机外的 Fiddler 里。
[真机 /模拟器] 被抓包 app => [真机 /模拟器] ss-android => [虚拟机] ss-server => [虚拟机] iptables -t nat -A OUTPUT -p tcp \! -d 宿主机 IP 地址 -j REDIRECT --to-port redsocks 监听端口 => [虚拟机] redsocks => [宿主机] Fiddler
(很显然这样比较麻烦……直觉上 proxifier 之类的软件要方便得多,但我还没试)

(4) redsocks 转过来的 HTTP CONNECT 请求头里是 IP 地址,而不是主机名。Fiddler 也没有考虑到上述这种重定向所有 TCP 流量的用法。
然后 Fiddler 就按照 IP 地址(而不是主机名 /域名)来发起 TLS 请求——于是,SNI 就丢了;
而且 Fiddler 会按照 IP 地址而不是主机名来验证服务器证书——于是,Fiddler 会报证书错误。
为了解决这个问题,需要给 redsocks 打补丁( github pull request #162 ;另外还需要 #123,否则连接建立后仍然不能正常通信),然后在 redsocks.conf 里设置 parse_sni_host = true 。这样可以从 SNI 里解析出主机名,然后填入 HTTP CONNECT 请求头,来解决这个问题。

(5) Fiddler 目前仍然不支持 HTTP/2 。有些应用可能会通过 ALPN 或 NPN 来检测服务器是否支持 HTTP/2,于是 Fiddler 在这里直接就通不过检测。
解决办法……额,就是不用 Fiddler,换用其他支持 HTTP/2 的抓包软件。



然后……额,我又试了 Burp Suite 社区版。于是又碰到 Burp Suite 的坑:
它好像不像 Fiddler 那样可以直接透明转发 HTTP CONNECT 过来的非 HTTP(S)流量。
然后,从 ss-android 那里过来 DNS 是 TCP 的,被 Burp Suite 拦下来后就挂了。没 DNS 也约等于断网。

于是我还得搞一搞 iptables 规则,让 DNS 直连、不走 Burp Suite:
先删掉之前的规则:
iptables -t nat -D OUTPUT -p tcp \! -d 宿主机 IP 地址 -j REDIRECT --to-port redsocks 监听端口
然后新建一条链(如果链已存在,是改成 MY_REDSOCKS 之类其他名字;还是 iptables -t nat -F REDSOCKS 清空删掉 REDSOCKS 链的所有规则,你看着办):
iptables -t nat -N REDSOCKS
iptables -t nat -A REDSOCKS -d DNS 服务器 -j RETURN
iptables -t nat -A REDSOCKS -d 宿主机 IP 地址 -j RETURN
iptables -t nat -A REDSOCKS -p tcp \! -o lo -j REDIRECT --to-port redsocks 监听端口
最后:
iptables -t nat -A OUTPUT -p tcp -j REDSOCKS
8158 次点击
所在节点    Android
1 条回复
ysc3839
2021-04-26 18:52:01 +08:00
可以试试用 clash,可以直接设置 http proxy 作为 upstream 。
https://lancellc.gitbook.io/clash/clash-config-file/proxies

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/773422

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX