15、Objection绕过证书绑定:Objection工具介绍、Objection绕过证书绑定、Objection自动化测试

好,咱们今天聊点硬核的。证书绑定这堵墙,很多安全测试人员都撞过。你配置好了代理,装好了证书,满心欢喜打开App——结果一片空白,或者直接弹窗「网络异常」。嗯,这就是证书绑定在作祟。

我个人习惯,遇到这种场景第一反应就是掏出Objection。为什么?因为它快,而且不需要你改APK重打包。你想想看,每次改APK都要重新签名、对齐、安装,调试一次半小时就没了。Objection直接运行时Hook,省事太多了。

Objection工具介绍

Objection,说白了就是一个基于Frida的运行时探索工具。它把Frida那些复杂的JavaScript脚本封装成了命令行指令。你不需要写一行Hook代码,就能完成很多操作。

我记得第一次用Objection的时候,心里还嘀咕:「这玩意儿靠谱吗?」结果一条命令下去,证书绑定直接绕过了。那一刻的感觉,嗯,挺爽的。

Objection的核心能力包括:

  • 内存搜索与修改:直接搜索内存中的字符串、类、方法
  • 类与方法的动态追踪:监控某个方法被调用的时机和参数
  • SSL Pinning绕过:一键禁用证书校验
  • 文件系统操作:在运行时读写App的沙盒文件
  • SQLite数据库操作:直接查询App的本地数据库

安装也很简单,一条pip命令搞定:

pip3 install objection

前提是你得先把Frida装好,并且手机端要运行frida-server。这个基础环境我就不展开了,之前章节应该都讲过了。

小提示: 如果你用的是模拟器,记得用x86版本的frida-server。我当初在模拟器上折腾了半天,最后发现是架构选错了——这种低级错误,希望大家别犯。

Objection绕过证书绑定

好,进入正题。绕过证书绑定,Objection提供了两种方式:

方式一:一键绕过(推荐)

这是最常用的方式。你只需要在启动App时加上一个参数:

objection -g com.example.app explore --startup-command "android sslpinning disable"

这条命令做了什么呢?它会在App启动的瞬间,Hook掉所有常见的证书校验方法。包括:

  • javax.net.ssl.HttpsURLConnection 的校验逻辑
  • okhttp3.CertificatePinner 的校验逻辑
  • TrustManager 的自定义实现
  • WebView的证书校验

说白了,Objection把你能想到的证书校验点全给堵上了。我在项目中遇到过一些App,用了自定义的证书校验逻辑,结果Objection照样能绕过去——因为它Hook的是底层的JNI调用,不是上层代码。

方式二:手动Hook特定类

有时候一键绕过不管用,可能是App用了非主流的证书校验库。这时候就需要手动介入了。

先列出App中所有与SSL相关的类:

objection -g com.example.app explore
> android hooking list classes | grep -i ssl

然后针对特定类进行Hook:

android hooking watch class com.example.app.CustomSSLSocketFactory

这样你就能看到这个类中所有方法的调用情况。找到关键方法后,直接让它返回true或者空值即可。

注意: 手动Hook需要你对App的代码结构有一定了解。我建议先用jadx反编译看看,找到证书校验的关键类,再动手。别一上来就瞎Hook,浪费时间。

Objection自动化测试

手动测试一次两次还行,但如果你要测几十个App,或者同一个App要反复测试不同版本,那就得自动化了。

Objection支持通过脚本批量执行命令。你可以写一个简单的Python脚本:

import subprocess
import time

apps = [
    "com.example.app1",
    "com.example.app2",
    "com.example.app3"
]

for app in apps:
    print(f"正在测试: {app}")
    cmd = f"objection -g {app} explore --startup-command 'android sslpinning disable'"
    subprocess.Popen(cmd, shell=True)
    time.sleep(10)  # 等待App启动
    # 这里可以添加抓包验证逻辑
    print(f"{app} 测试完成")

当然,这只是最基础的自动化。真正生产环境中,我一般会结合mitmproxy的API来做自动化验证。流程是这样的:

  1. 启动mitmproxy,开启API监听
  2. 用Objection启动App并绕过证书绑定
  3. 通过mitmproxy的API检查是否有HTTPS流量经过
  4. 如果没有流量,说明绕过失败,记录日志
  5. 如果有流量,抓取数据包进行分析

我曾经用这套流程,一晚上测了30多个金融类App。第二天早上看报告,有8个App的证书绑定没绕过去——嗯,这些就需要进一步分析了。

核心要点: 自动化测试的关键不是「跑起来」,而是「能验证结果」。你绕过了证书绑定,但怎么确认真的绕过了?一定要有自动化的验证环节,否则就是自欺欺人。

下面这张图展示了Objection绕过证书绑定的完整流程:

Objection绕过证书绑定流程图 启动目标App Objection注入Frida Agent Hook SSL相关类与方法 绕过成功? 抓包验证流量 手动Hook特定类

最后说一句,Objection虽然强大,但它不是万能的。有些App用了Native层的证书校验,或者用了Google Play Integrity这样的服务,Objection就绕不过去了。这时候就需要结合Frida写自定义脚本,或者直接修改APK了。

嗯,这些高级玩法,咱们后面的章节再细聊。


公众号:蓝海资料掘金营,微信deep3321