Android 7.0 及以上版本, https 抓包

前言

因为 Android 7.0 安全机制调整, 默认情况下 系统只信任内置的 CA 证书, 因此在使用 fiddler , Charlse 这种通过手动安装 CA 证书,利用中间人抓包的软件都失效了.

当然,道高一尺,魔高一丈, 对于已经 Root 过的手机依然可以绕过这一限制.

三种方案

手动

首先导出 Charlse(fiddler也类似)的证书
导出证书

在终端生成证书的md5 hash

1
openssl x509 -subject_hash_old -in charles-ssl-proxying-certificate.pem

alt

Android 系统内置的证书命名规则是 <Certificate_Hash>.<Number>
因此我们把导出的证书改名为 e06b48f3.0

1
mv charles-ssl-proxying-certificate.pem e06b48f3.0

改名后, 将证书移入到手机系统证书的目录 /system/etc/security/cacerts/

在设置中验证下, 是否出现 Charlse 的证书:

alt

不出意外,抓包工具就能正常抓取 https 了.

由于 fiddler 的证书格式 cer , 所以需要注意修改修下 -inform 参数, 然后计算 md5 hash值:

1
openssl x509 -inform DER -subject_hash_old -in FiddlerRoot.cer

半自动

在设置中,选择 “从存储设备安装”, 选择我们 fidder or Charlse 导出的证书.

当然此时,证书是安装在用户目录下的, 软件依然无法抓包.

我们使用文件管理工具, 譬如 Root Explorer, 将 /data/misc/user/0/cacerts-added 目录下的 证书文件 移动到系统证书目录下 /system/etc/security/cacerts/

alt

从安装后文件名其实可以看出,符合<Certificate_Hash>.<Number>规则.

当然,为了一眼能找到我们导入的证书, 我们先清除用户证书路径下的所有问题件.

全自动

对于安装了 Magisk 的同学可以选择安装 Move Certificates 模块,当用户安装证书, 会hook 该操作, 自动将证书移入到系统路径下.

1
mv -f /data/misc/user/0/cacerts-added/12abc345.0 $MODDIR/system/etc/security/cacerts

写在最后

对于大部分App, 替换证书后,利用中间人攻击,就可以抓包了.

但是部分App会进行客户端的证书校验, 因此,仅仅替换证书可能依然无法抓包, 装了Xposed的同学, 这里直接提供一个通用解决方案, 安装这个模块就OK.

原理就是hook掉通用的证书校验, 对于特殊的校验方法, 我们也可以自己编写Xposed模块破解.

作者

sadhu

发布于

2021-03-29

更新于

2021-03-29

许可协议