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

android 禁止SSL 引脚被绕过 绕开安卓src_android

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

1.重打包 APK,修改 AndroidManifest 的配置:优点是一次重打包永久有效,在其他手机/电脑上抓包时不需要重复搭建环境,而且也不需要手机有 root 权限。缺点是因为重打包后 APK 签名被改了,容易被检测出来,可能需要进一步绕过签名校验。
2.使用 injection + hook 的办法绕过 client 端的证书校验,常见的 native 注入框架 xposed, frida 和 objection 都有相关的工具:优缺点和重打包恰好相反。

重打包

重打包是绕过 SSL Pinning 比较常见且实用的办法。因为在 APK 的 target sdk version <= 23 时,默认是信任用户添加的第三方证书的,因此我们的目标是修改 AndroidManifest 里的 target sdk version 为 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 编译资源文件时的问题,并且没有找到相应的解决办法。

android 禁止SSL 引脚被绕过 绕开安卓src_android 禁止SSL 引脚被绕过_02

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。然后参考这个博客文章 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 包:

android 禁止SSL 引脚被绕过 绕开安卓src_App_03


android 禁止SSL 引脚被绕过 绕开安卓src_android_04

网络安全基础入门需要学习哪些知识?

网络安全学习路线

这是一份网络安全从零基础到进阶的学习路线大纲全览,小伙伴们记得点个收藏!

android 禁止SSL 引脚被绕过 绕开安卓src_android 禁止SSL 引脚被绕过_05


阶段一:基础入门

android 禁止SSL 引脚被绕过 绕开安卓src_android_06


网络安全导论

渗透测试基础

网络基础

操作系统基础

Web安全基础

数据库基础

编程基础

CTF基础

该阶段学完即可年薪15w+

阶段二:技术进阶(到了这一步你才算入门)

android 禁止SSL 引脚被绕过 绕开安卓src_android_07


弱口令与口令爆破

XSS漏洞

CSRF漏洞

SSRF漏洞

XXE漏洞

SQL注入

任意文件操作漏洞

业务逻辑漏洞

该阶段学完年薪25w+

阶段三:高阶提升

android 禁止SSL 引脚被绕过 绕开安卓src_网络协议_08


反序列化漏洞

RCE

综合靶场实操项目

内网渗透

流量分析

日志分析

恶意代码分析

应急响应

实战训练

该阶段学完即可年薪30w+

阶段四:蓝队课程

android 禁止SSL 引脚被绕过 绕开安卓src_ssl_09


蓝队基础

蓝队进阶

该部分主攻蓝队的防御,即更容易被大家理解的网络安全工程师。

攻防兼备,年薪收入可以达到40w+

阶段五:面试指南&阶段六:升级内容

android 禁止SSL 引脚被绕过 绕开安卓src_App_10