Android7.0+高版本抓包失败的解决方案
由于新安全机制的引入,在Android 6.0 (API level 23)及以前,APP默认信任系统自带的CA证书以及用于导入的CA证书,Android 6.0 (API level 23)以后系统不再信任用户安装的证书。
查看Android官方文档说明:https://developer.android.com/training/articles/security-config.html
By default, secure connections (using protocols like TLS and HTTPS) from all apps trust the pre-installed system CAs, and apps targeting Android 6.0 (API level 23) and lower also trust the user-added CA store by default.
也就是说,关于network-security-config
,在Android 6.0 (API level 23)及以前默认是这样的:
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
<certificates src="user" />
</trust-anchors>
</base-config>
Android 7.0 (API level 24) 及以后是这样的:
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</base-config>
解决方案如下:
① 重新打包目标APK,修改AndroidManifest.xml
我们可以使用Apktool等工具对目标APK进行解包,在Android项目的res文件夹下创建 net_security_config.xml
内容添加如下内容:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config xmlns:android="http://schemas.android.com/apk/res/android">
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" overridePins="true" />
<certificates src="user" overridePins="true" />
</trust-anchors>
</base-config>
</network-security-config>
然后在AndroidManifest.xml
中的application标签下添加:
android:networkSecurityConfig="@xml/net_security_config.xml"
编译安装,然后该APP就信任用户添加的CA证书,从而Fiddler就可以抓到它的HTTPS包并解密内容。
但是现在很多应用都做了防打包处理,要么利用Apktool弱点,制造错误让Apktool抛异常,要么重新打包后程序校验自身证书,校验失败无法启动。
② Root手机,安装Xposed框架,使用JustTrustMe模块
Xposed的JustTrustMe模块Hook了Android SDK的HTTP库,强制跳过SSL证书验证,不管是真证书还是假证书,一律验证通过,于是Fiddler作为中间人攻击制造的假证书也被通过了。 JustTrustMe项目源代码:https://github.com/Fuzion24/JustTrustMe 需要注意的是JustTrustMe有个坑,不要下载它Github中编译的Latest release版本,其实那是一个很古老的版本,对于APP内嵌的WebView没有做处理,安装以后,URLConnection、OkHttp通信的HTTPS是可以抓到了,但是APP内嵌的WebView仍然出错。所以最好git clone它的最新源代码,然后自行编译。 当然这个方案也有缺点,毕竟手机被Root后,还安装了Xposed框架,有的APP可是会检测的,发现手机被Root,或者自身被Xposed Hook,就罢工了。
③回退,使用Android5.1 Android6.0的手机来抓包分析
④终极大法,购入Google亲儿子手机,比如Nexus Pixel,下载Android AOSP代码,直接修改Android系统源代码,强行验证所有SSL证书为真,编译,刷机,愉快工作。
⑤把 Fiddler 或 Charles 或 BrupSuite 的证书塞入系统中
这里我选择第五种方法,更安全隐蔽实际,并且一劳永逸
0x01 安装 Fiddler
Fiddler 官网下载安装:https://www.telerik.com/fiddler
导出 Fiddler 证书 将 Fiddler 或者其他抓包程序的证书导出,一般为xxx.cer或者xxx.pem 在 Fiddler 中点击 [Tools] — [Options] — [HTTPS] — [Actions]选择[Export Root Certificate to Desktop]:
0x02 安装 openssl
下载地址:Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions (slproweb.com) 一路next安装就行了 添加openssl至系统环境变量Path中 然后在控制台输入:
openssl
有信息出来就是ok了
0x03 转换证书
使用openssl的x509指令进行cer证书转pem证书 和 用md5方式显示pem证书的hash值 证书转换
已经是pem格式的证书不需要执行这一步
openssl x509 -inform DER -in FiddlerRoot.cer -out fiddler.pem
进行MD5的hash显示
openssl x509 -inform PEM -subject_hash_old -in fiddler.pem | head -1
# 得到类似字符串:269953fb
重命名成系统证书格式
cat fiddler.pem > 269953fb.0
0x04 安装证书
切换到有adb的目录(没有的请自己去安装,最好加入到环境变量,模拟器 一般根目录就自带了)
推送证书到安卓手机(模拟器) /system/etc/security/cacerts
目录下
使用
adb push
是不可以的,因为adb push没办法提权,需要使用su权限才能操作system系统
我这里是先把文件push到手机上,再用拥有root权限的文件管理器复制过去
adb push C:\Users\AMDYES\Desktop\fd\269953fb.0 "/storage/emulated/0/Download/"
设置文件权限
adb shell
cd /system/etc/security/cacerts
chmod 644 269953fb.0
重启手机
二选一
adb reboot
reboot
如果生成的文件正确,可以在 信任的凭据 -> 系统 中找到如下 Fiddler 的证书
0x05 抓包测试
1、Fiddler 配置
在 Fiddler 中点击 [Tools] — [Options] — [HTTPS] 勾选如下设置:
然后在Connections
选项卡中勾选Allow remote computers to connect
我们知道 Fiddler 默认在8888端口开启HTTP/HTTPS代理服务,不管是Android、IPhone还是PC等等设备和程序,只要设置了HTTP/HTTPS代理,流量从Fiddler走,就可以抓包分析。此处开启远程访问,使得我们的Android/Iphone手机可以在WLAN设置上设置它为HTTP/HTTPS代理,从而手机上的应用的HTTP/HTTPS流量将从Fiddler走,Fiddler就能捕获它们。
2、手机代理配置
确保手机和PC在同一个局域网中,在手机上设置WLAN代理
至此可以愉快的抓包啦~
文章参考
Android抓包指南①: 使用Fiddler抓HTTP/HTTPS包_encoderlee的博客-CSDN博客_android http抓包