1. 前言
Android7.0以上版本更新了安全策略,软件可以选择不信任用户证书了,这就导致抓包一些APP的HTTPS流量时无法正常捕获其数据包
如何在高Android的版本中抓包HTTPS?解决方案据查阅相关资料如下,按难度主观排序一下
- 使用低于7.0版本的Android系统(部分APP不支持过低的Android版本号)
- 使用VirtraulXposed + TrustMeAlready方法 (无需Root)
- 证书内置到系统证书中(需Root)
- 反编译APK替换证书
本文着重介绍一下第2种与第3种方法,手机以可以解锁Bootloader的小米系列为例,这里不展开讲如何Root手机,相关资源很丰富,可自行搜索
2. VirtraulXposed + TrustMeAlready
方法优点
- 无需Root
- 支持高版本的Android
- 操作简单
方法缺点
- 导入程序后有一定概率无法运行,此问题无解
2.1. 安装
相关资源
- VirtualXposed框架仓库地址:https://github.com/android-hacker/VirtualXposed/releases
- TrustAleady仓库地址: https://github.com/ViRb3/TrustMeAlready/releases
提示:TrustAleady模块启用之后可以有效禁用证书校验跟客户端SSL Pinning
下载VirtualXposed APK后直接安装,紧接着再下载TrustAleady APK,TrustAleady APK需要使用VirtualXposed进行安装
之后在模块管理中勾选TrustAleady模块并启用,如图所示
接下来就是添加需要抓包的程序,然后回到VirtualXposed设置选项并选择重启
这个方法通吃绝大部分APP,唯一的缺点是如果在VirtualXposed中导入程序后,程序无法正常运行起来
则该方法无效
3. 证书内置
如果VirtraulXposed无法运行程序,则需要考虑别的方法了
IOS抓包或者Android低版本抓包都是办法,但也有自己的局限性,例如没有IOS客户端或者应用并不支持低版本的Android系统
如果我们可以将抓包软件提供的证书从用户证书变成系统证书,就可以解决这个问题
此方法需要ROOT过的Android系统,鉴于越来越少的国内Android手机支持ROOT,国外的二手手机不失为好的考虑,或者虚拟机也是一个不错的方案
3.1. 步骤
无论是使用任何代理软件,抓取HTTPS流量的思路都是替换证书(中间人攻击),对于APP来讲,有2个难点
- Android7.0以上版本大部分APP默认不信任用户证书
- 数据安全等级严格的客户端都内置了SSL Pinning
因此,内置证书只能解决第一点,针对第二点,则需要安装第三方ExXposed+插件通过HOOK的方式来绕过SSL Pinning了
本文对SSL Pinning不展开讲,只对内置证书步骤进行分解,大致如下
- 下载代理软件证书
- 转换代理软件证书为Android内置证书格式
- 使用adb shell调试手机,挂载/system分区为可读(需ROOT)
- 将证书推送至内置证书区域
- 重启Android系统
3.2. 实践
以MitmProxy抓包Android APP为例子,在运行MitmWeb之后访问 http://mitm.it 并下载代理证书,如图所示
下载的证书是CER格式的,我们将其转换为PEM格式
➜ openssl x509 -inform der -in mitmproxy-ca-cert.cer -out mitmproxy-ca-cert.pem
此处如果报错"unable to load certificate 140640294299008:error:0D0680A8:asn1 encoding …",则直接将cer更改为pem即可
接下来我们需要以这张代理的PEM证书制作Android内置证书
# 制作Android的内置证书(一)
➜ openssl x509 -inform PEM -subject_hash_old -in mitmproxy-ca-cert.pem | head -1
e5c3944b
➜ cat mitmproxy-ca-cert.pem > e5c3944b.0
➜ openssl x509 -inform PEM -text -in mitmproxy-ca-cert.pem -out /dev/null >> e5c3944b.0
# 制作Android的内置证书(二)
➜ openssl x509 -inform PEM -subject_hash -in mitmproxy-ca-cert.pem | head -1
82635c12
➜ cat mitmproxy-ca-cert.pem > 82635c12.0
➜ openssl x509 -inform PEM -text -in mitmproxy-ca-cert.pem -out /dev/null >> 82635c12.0
根据以上步骤我们将得到2张证书,接下来连接Android手机,使用adb将证书推送至Android内置空间中
➜ adb push 82635c12.0 /sdcard/
82635c12.0: 1 file pushed, 0 skipped. 7.6 MB/s (1322 bytes in 0.000s)
➜ adb push e5c3944b.0 /sdcard/
e5c3944b.0: 1 file pushed, 0 skipped. 5.3 MB/s (1322 bytes in 0.000s)
接下来我们使用adb shell挂载/system分区为可读,然后复制证书到系统内置证书文件夹中
➜ adb shell
polaris:/ su
# 挂载system分区,然后复制2张Android证书到系统内部,更改其权限后重启机器
:/ mount -o remount,rw /system
:/ cp /sdcard/e5c3944b.0 /system/etc/security/cacerts/
:/ cp /sdcard/82635c12.0 /system/etc/security/cacerts/
更改我们导入的证书权限,然后重启手机
:/ chmod 644 /system/etc/security/cacerts/e5c3944b.0
:/ chmod 644 /system/etc/security/cacerts/82635c12.0
:/ reboot
重启完成之后查看内置证书区域,可以看到mitmproxy的证书已经在内置证书区域中,如图所示
4. 结束
对于Android APP抓包来说没有IOS来的简单快捷,毕竟现在IOS还可以信任用户证书,APP针对反抓包的也是越来越严格,例如
- 强制移动数据网络访问
- 检测Wifi代理,如果有代理则提示网络异常
- 检测机器是否开启root
- APP打包服务端证书做SSL Pinning检测
对于抓包数据来说,没有破解不了的应用,只有破解代价高到无法承受的APP