Android 7.0 之后增加了对第三方证书的限制,也就是说 Android 6.0 及更低版本的系统上,默认是信任用户证书的,但 Android 6.0 以上的系统,则改成了不信任用户证书,而抓包工具(charles、fiddler等)提供的证书默认是安装在用户证书上的,所以证书都无法通过校验,也就无法抓取HTTPS请求了。
但是等等,有些小伙伴可能发现安卓系统是高于 6.0 的,有时也能抓取某些 APP 的HTTPS请求,这是为什么呢?
这是因为开发者在 APP 中做了如下配置:
第一种方案:
<!-- res/xml/network_security_config.xml -->
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true">
<certificates src="system"/>
<certificates src="user"/>
</base-config>
</network-security-config>
<!-- AndroidManifest.xml -->
<application
android:networkSecurityConfig="@xml/network_security_config"
>
</application>
老版本的微信(6.x)就是这样配置了信任用户证书的,所以在 Android 7.0 也可以抓公众号 HTTPS 的数据包
第二种方案:
<!-- res/xml/network_security_config.xml -->
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<debug-overrides>
<trust-anchors>
<certificatessrc="system"/>
<certificatessrc="user"/>
</trust-anchors>
</debug-overrides>
</network-security-config>
这种方式只有在android:debuggable为true时才生效, 缺点很明显,包上线了之后就不能再被抓包了
上面方案都是需要开发人员配合打包的,一般在测试环境可以用,但到了生产环境我们还想抓包怎么办呢?
其他方案:
- 将设备root,将证书安装到system分区
- 将设备root,利用Xposed框架,利用
JustTrustme
或SSL-killer
等模块绕过客户端的 SSL Pinning 校验 (科普文章)
更优雅的方案
上面介绍的方案要么是需要开发配合的,要么是需要 root 手机的,有没有更优雅便捷的方案呢?答案是肯定的
virtualXposed 了解下
imageVirtualXposed 是基于VirtualApp 和 epic 在非ROOT环境下运行Xposed模块的实现(支持5.0~10.0),
也就是说它提供了一个虚拟环境,类似虚拟机,这个环境下是默认信任用户证书的,所以安装在这个环境的 APP 基本上都能抓包,
另外也能使用 Xposed 安装一些模块,实现更强大的功能。
这里我以抓取最新版微信 7.0.15 中小程序的数据包为例
image设备: 华为 Honor 8X
Android 版本:10
微信版本:7.0.15
2. 打开后类似一个 Android 桌面启动程序, 我们可以看到已经有 Xposed 框架安装在上面了,并且也是激活的,当然这里我们不需管它
3. 长按虚拟桌面会出现添加应用选项,然后我们可以从系统已安装的 APP 中克隆一个或者从内部存储中直接安装 APK 包
image这里需要注意下,因为微信有分 64位的版本和32位的版本,经过测试,目前 VirtualXposed 只支持安装 32 位的, 64位的打开会闪退,如果你遇到其他
APP 也出现打开闪退的情况可能就是这个原因,另外也可以尝试重启手机,看是否解决
微信 APP 32未版本可以直接到官网下载
image4. 安装完微信,然后按照正常的抓包流程: 打开 fiddler——安装证书到手机端——开始抓取 VirtualXposed 中 APP 的数据包
还有更多的玩法,赶紧试试吧
作者:mocobk
链接:https://www.jianshu.com/p/554cc3133dad
网友评论