V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
acess
V2EX  ›  Android

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

  •  1
     
  •   acess · 2021-04-26 18:21:40 +08:00 · 4524 次点击
    这是一个创建于 1109 天前的主题,其中的信息可能已经有所发展或是发生改变。
    之前发过一帖 /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
    ysc3839
        1
    ysc3839  
       2021-04-26 18:52:01 +08:00 via Android   ❤️ 1
    可以试试用 clash,可以直接设置 http proxy 作为 upstream 。
    https://lancellc.gitbook.io/clash/clash-config-file/proxies
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3172 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 00:33 · PVG 08:33 · LAX 17:33 · JFK 20:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.