问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

绕过Android SSL Pinning的两种方法

创作时间:
作者:
@小白创作中心

绕过Android SSL Pinning的两种方法

引用
CSDN
1.
https://blog.csdn.net/Innocence_0/article/details/138683949

SSL Pinning是Android应用中常用的一种安全机制,用于防止中间人攻击。但是,在进行应用安全分析和逆向工程时,有时需要绕过这种机制。本文将介绍两种常见的绕过方法:重打包APK和使用Injection + Hook。

SSL Pinning指的是,对于target sdk version > 23的Android App,App默认只信任系统的根证书或App内指定的证书,而不信任用户添加的第三方证书。这会导致我们在对App做逆向分析的时候,使用Charles无法抓https包。

针对SSL Pinning,常见的绕过方法有两种:

  1. 重打包APK,修改AndroidManifest的配置:优点是一次重打包永久有效,在其他手机/电脑上抓包时不需要重复搭建环境,而且也不需要手机有root权限。缺点是因为重打包后APK签名被改了,容易被检测出来,可能需要进一步绕过签名校验。

  2. 使用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包:

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号