浅谈安卓14APP抓包证书配置

问题背景

IMPORTANT:如果你的设备没有ROOT,下面的内容可以不用阅读
最近在面试,面试中聊到APP爬虫相关的内容。其实如果把APP爬虫的内容说的再直白一点,就是APP的破解、攻防问题。当我们从爬虫本身出发,爬取数据就是抓APP向该服务器的HTTPS请求(此处HTTP请求不提)。涉及到HTTPS请求时,如果不配置证书,通过charles和fiddler的请求获取HTTP请求的content都是经过加密的。因此,如果我们要使用“中间人攻击”来劫持HTTPS,从而解密内容,就必须再设备上(安卓或ios)安装对应的证书。
但是,从Android7之后,无法通过直接安装证书的方式安装自己的证书,即使安装上之后软件也无法通过“用户”的证书进行访问,因此我们要将charles和fiddler的证书安装到“系统”中。
那么我们就可以把问题简化为如何将证书安装在系统中或通过其他方式被系统信任,既然问题简化了,在这里也总结两个方法。

解决过程

1 方法一:将证书文件移动至系统信任的证书目录

1.1 安卓版本小于7

首先,无论是fiddler还是charles,他们的ssl证书都是pem格式,可以通过如下命令首先查看证书的散列值

openssl x509 -subject_hash_old -in

执行后输出为下图:

接着,我们将要移动至安卓手机的证书文件命名为 a14ca8d8.0 ,重命名之后,我们使用adb命令将文件push到安卓设备的

/system/etc/security/cacerts

目录内,如果遇到提示权限不足的情况,在adb的shell内执行

mount -o rw,remount /system
将.0证书文件移动至cacerts目录后,使用如下命令为证书赋予权限
chmod 644 /system/etc/security/cacerts/a14ca8d8.0
之后重启手机即可愉快的抓包拉~

1.2 安卓版本大于10小于14

其实从安卓10开始,/system就是不可读写的,即使你拥有root权限,那么你就需要在手机上刷入magisk之后再刷入magic_overlayfs该模块将多个不同的底层挂载点合并为一个,从而形成包含来自所有来源的底层文件和子目录的单一目录结构。刷入该模块之后,就可以轻松的通过1.1 的方法将.0证书文件移动至系统的cacerts目录内。

1.3 安卓版本大于等于14

如果你的安卓版本大于14,比如小米的澎湃os,那么你就会面临新的问题。因为自从安卓14开始,将系统根CA证书,从系统目录/system/etc/security/cacerts迁移到com.android.conscrypt.apex中,apex的挂载后的目录/apex/com.android.conscrypt/cacerts。在原来基于magisk模块overlay /system/etc/security/cacerts方案的基础上,可以在magisk模块的post-fs-data.sh增加一句bind mount即可解决问题。亲测使用HttpCanary在Android 14可以抓仅信任系统根CA证书的应用的包。命令如下:

mount -o bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts

当然也可以直接在模块中判断是否存在apex目录,如果存在则直接overlay apex目录,否则overlay system目录。

我们通过wuxianlin大佬的方法可以搞定安卓14的证书问题。

2 方法二:将用户自行安装的证书设置为可信任的

如果你嫌上述方法都很复杂,那么还有一个办法是“将用户的证书设置为系统可信任的证书”,通过magisk的MagiskTrustUserCerts模块,安装该模块之后就不用来回复制证书文件了,直接将fiddler或charles证书安装即可。这个方法未测试,据说是可行的。

2024-09-27 wicos


浅谈安卓14APP抓包证书配置
https://www.wicos.me/jishu/1157/
作者
Wicos
发布于
2024年9月27日
许可协议