Android7.0+高版本抓包失败的解决方案

警告
本文最后更新于 2022-04-21,文中内容可能已过时。

由于新安全机制的引入,在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)及以前默认是这样的:

text

<base-config cleartextTrafficPermitted="true">
    <trust-anchors>
        <certificates src="system" />
        <certificates src="user" />
    </trust-anchors>
</base-config>

Android 7.0 (API level 24) 及以后是这样的:

text

<base-config cleartextTrafficPermitted="true">
    <trust-anchors>
        <certificates src="system" />
    </trust-anchors>
</base-config>

解决方案如下: ① 重新打包目标APK,修改AndroidManifest.xml 我们可以使用Apktool等工具对目标APK进行解包,在Android项目的res文件夹下创建 net_security_config.xml 内容添加如下内容:

text

<?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标签下添加:

text

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 的证书塞入系统中

这里我选择第五种方法,更安全隐蔽实际,并且一劳永逸

Fiddler 官网下载安装:https://www.telerik.com/fiddler

导出 Fiddler 证书 将 Fiddler 或者其他抓包程序的证书导出,一般为xxx.cer或者xxx.pem 在 Fiddler 中点击 [Tools] — [Options] — [HTTPS] — [Actions]选择[Export Root Certificate to Desktop]: image-20220512180306017

下载地址:Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions (slproweb.com) 一路next安装就行了 添加openssl至系统环境变量Path中 image-20220414160816377.png 然后在控制台输入:

text

openssl

有信息出来就是ok了 image-20220414160913036.png

使用openssl的x509指令进行cer证书转pem证书 和 用md5方式显示pem证书的hash值 证书转换

已经是pem格式的证书不需要执行这一步

text

openssl x509 -inform DER -in FiddlerRoot.cer -out fiddler.pem

进行MD5的hash显示

text

openssl x509 -inform PEM -subject_hash_old -in fiddler.pem | head -1
# 得到类似字符串:269953fb

重命名成系统证书格式

text

cat fiddler.pem > 269953fb.0

切换到有adb的目录(没有的请自己去安装,最好加入到环境变量,模拟器 一般根目录就自带了) 推送证书到安卓手机(模拟器) /system/etc/security/cacerts 目录下

使用adb push是不可以的,因为adb push没办法提权,需要使用su权限才能操作system系统

我这里是先把文件push到手机上,再用拥有root权限的文件管理器复制过去

text

adb push C:\Users\AMDYES\Desktop\fd\269953fb.0 "/storage/emulated/0/Download/"

设置文件权限

text

adb shell
cd /system/etc/security/cacerts
chmod 644 269953fb.0

重启手机

text

二选一
adb reboot
reboot

如果生成的文件正确,可以在 信任的凭据 -> 系统 中找到如下 Fiddler 的证书 image-202205121808162.png

在 Fiddler 中点击 [Tools] — [Options] — [HTTPS] 勾选如下设置: image-20220512180401968 然后在Connections选项卡中勾选Allow remote computers to connect image-20220512180426109 我们知道 Fiddler 默认在8888端口开启HTTP/HTTPS代理服务,不管是Android、IPhone还是PC等等设备和程序,只要设置了HTTP/HTTPS代理,流量从Fiddler走,就可以抓包分析。此处开启远程访问,使得我们的Android/Iphone手机可以在WLAN设置上设置它为HTTP/HTTPS代理,从而手机上的应用的HTTP/HTTPS流量将从Fiddler走,Fiddler就能捕获它们。

确保手机和PC在同一个局域网中,在手机上设置WLAN代理 04738280be9d421e97dc4bbba02deb8c.png

至此可以愉快的抓包啦~

Android抓包指南①: 使用Fiddler抓HTTP/HTTPS包_encoderlee的博客-CSDN博客_android http抓包