0x01 前言:
在 Android 6 之前, 手机系统既信任系统内置的证书, 也信任用户自己安装的证书, 但是在 Android 7 之后,却发生了变化, 手机系统只信任系统内置的根证书。当然了,这是为了手机系统更安全, 但是这样一来, 我们就无法使用 burpsuite, charles, fidder 抓包 app 的 HTTPS 请求。这里我将以 Charles 抓包工具的证书来演示如何讲抓包证书写入到系统根证书目录下。
0x02 前提准备:
windows 已安装 openssl (也可以使用 linux, 其自带 openssl)
已获得 root 的手机 (可以是模拟器如:夜神,雷电、逍遥) windows 已安装 adb 驱动 (安装过程请参考
0x03 导出 Charles 证书:
0x04 使用 openssl 将 pem 证书转成系统根证书 (.0 结尾文件):
windows 不自带openssl, 需自行安装。而linux自带,因此我这里把证书存到 linux 中进行转换。
执行命令: openssl x509 -subject_hash_old -in 证书名
执行命令后将 Charles.pem 文件重命名为 9d4a1b5a.0 (9d4a1b5a 需要根据自己生成的结果进行命名)
将更改后的证书转移到安卓模拟器的根路径下:
0x05 使用 adb 连接安卓模拟器终端 (夜神模拟器为例)
- 找到 NoxVMHandle.exe 进程的 PID, 输入命令:
tasklist | findstr "NoxVMHandle.exe"
- 寻找此进程开放的端口,输入命令:
netstat -ano | findstr 9204
- 找到62xxx的端口,并进行连接adb链接, 输入命令:
adb connect 127.0.0.1:62026
0x06 将证书写入系统根证书目录下:
小贴士: 由于Android是基于Linux的自由及开放源代码的操作系统,Android Shell是Linux操作系统命令的缩小版, 所以大部分命令是和linux一样的。
- 连接模拟器 adb shell, 输入命令:
adb -s 127.0.0.1:62026 shell
- 将根目录下的证书转入系统根证书目录下,执行命令:
mv 9d4a1b5a.0 /system/etc/security/cacerts/
⚠️上述问题解决: ⚠️
1、如果是已经root的实体机,/dev/root 挂载在 /,以读写权限重新挂载
HWDUK:/ # cat /proc/mounts | grep "/"
/dev/root / ext4 ro,seclabel,relatime,data=ordered 0 0
HWDUK:/ # mount -o remount,rw /
2、如果是已经root的模拟器,/dev/block/sda6 挂载在 /system
d2q:/ # cat /proc/mounts | grep "/system "
/dev/block/sda6 /system ext4 rw,seclabel,noatime 0 0
1|d2q:/ # mount -o remount,rw /system
- 修改证书权限为 644, 执行命令:
chmod 644 /system/etc/security/cacerts/9d4a1b5a.0
0x07 设置代理,测试HTTPS抓包:
- 查看 charles 监听的 ip 与端口:
- 模拟器设置对应代理,adb 执行命令:
settings put global http_proxy 192.168.0.101:8888
- 测试抓包 HTTPS:
前提先设置允许代理 SSL,代理所有 443 端口链接