绕过Android SSL Pinning的两种方法
绕过Android SSL Pinning的两种方法
SSL Pinning是Android应用中常用的一种安全机制,用于防止中间人攻击。但是,在进行应用安全分析和逆向工程时,有时需要绕过这种机制。本文将介绍两种常见的绕过方法:重打包APK和使用Injection + Hook。
SSL Pinning指的是,对于target sdk version > 23的Android App,App默认只信任系统的根证书或App内指定的证书,而不信任用户添加的第三方证书。这会导致我们在对App做逆向分析的时候,使用Charles无法抓https包。
针对SSL Pinning,常见的绕过方法有两种:
重打包APK,修改AndroidManifest的配置:优点是一次重打包永久有效,在其他手机/电脑上抓包时不需要重复搭建环境,而且也不需要手机有root权限。缺点是因为重打包后APK签名被改了,容易被检测出来,可能需要进一步绕过签名校验。
使用injection + hook的办法绕过client端的证书校验,常见的native注入框架xposed, frida和objection都有相关的工具:优缺点和重打包恰好相反。
重打包
重打包是绕过SSL Pinning比较常见且实用的办法。因为在APK的target sdk version <= 23时,默认是信任用户添加的第三方证书的,因此我们的目标是修改AndroidManifest里的targetSdkVersion为23(APK当前设置的是29)。
1. 使用apktool直接重打包
- 第一步:解包。因为我们只需要修改AndroidManifest的配置,因此不需要decode source,只需要decode resource,因此使用的命令是:
apktool d -s origin.apk
第二步:修改AndroidManifest的targetSdkVersion
第三步:重打包。命令
apktool b <decode output directory>
在对某个App做实验的时候,第三步重打包时出现了以下error。搜索了一下,大概知道是apktool编译资源文件时的问题,并且没有找到相应的解决办法。
2. 只decode AndroidManifest
因为重新编译资源的时候会失败,那我们可否不deocde资源文件而只decode AndroidManifest?然而apktool目前也不支持这个功能,官方的回答(github.com/iBotPeaches…%25E6%2598%25AF “https://github.com/iBotPeaches/Apktool/issues/1135)%E6%98%AF”) AndroidManifest也会依赖其他资源(如strings, drawable等),如果只decode AndroidManifest的effort会很大。
3. 直接修改AndroidManifest的binary
因为我们对AndroidManifest只需要做很小的修改,既然不能decode资源文件,我们可以直接修改AndroidManifest的binary。上述解包的命令变为
apktool d -r -s origin.apk
然后参考这个博客文章(juejin.cn/post/684490…%E7%90%86%E6%B8%85%E6%A5%9A “https://juejin.cn/post/6844903747169026061)%E7%90%86%E6%B8%85%E6%A5%9A”) AndroidManifest文件的binary格式,加上010 editor的AndroidManifest模板,即可轻松实现修改。修改后用命令apktool b重打包,然后用apksigner进行重签名即可得到重打包完成后的APK。签名的命令为
apksigner sign --ks spykey.keystore --out signed.apk --ks-pass pass:spykey --ks-key-alias spykey --key-pass pass:spykey --v2-signing-enabled true rebuilt.apk
其中spykey.keystore可以在AndroidStudio或其他工具生成。
安装重打包后的APK,APK可以正常打开,然而在点击同意使用条款之后APP就crash了。看logcat并没有明显的log指示错误原因,但能大概猜想到是APP里做了APK签名校验。因为logcat没有明显的线索,需要绕过签名校验可能需要较大的effort。因此到此决定放弃重打包的办法。
Injection + Hook
如果App在Android 11的x86模拟器上能正常运行,因此有很好的root环境,很方便做Injection和Hook。Objection框架提供了现成的SSL Pinning Bypassing功能,因此我们采用了该框架:github.com/sensepost/o…。具体的原理和操作步骤可以参考这个博客文章:www.hackingarticles.in/android-hoo…
这里简单记录一下各个步骤:
第一步:Mac上安装objection:pip3 install objection
第二步:下载Frida server for Android并且push到手机
/data/local/tmp
上,root权限下把frida server运行起来。下载地址是github.com/frida/frida…,x86 Android模拟器下载的是frida-server-14.2.13-android-x86.xz (github.com/frida/frida…)。Mac端需要执行的命令
adb push frida-server-14.2.13-android-x86 /data/local/tmp
手机端进入adb shell并进入su后,需要执行的命令:
chmod 0755 /data/local/tmp/frida-server-14.2.13-android-x86 && /data/local/tmp/frida-server-14.2.13-android-x86
第三步:启动App
第四步:注入App进程,Mac上执行命令:
objection -g <app package name>
- 第五步:第四步命令执行后会进入一个objection的shell,执行命令
android sslpinning disable
即可disable APP的SSL Pinning。
上述步骤执行完之后,这时再用Charles即可顺利抓https包: