声明:本文分析的样例 app、相关分析工具均来源于互联网,仅供研究测试之用,严禁传播和用于非法用途。否则所产生的一切后果由读者自行承担,本网站及发帖人不承担任何责任。样例 app 已于发文后删除。

0x00 问题

最近尝试抓某 app 的接口,此 app 使用 HTTPS 协议通讯,并且做了 SSL pinning 阻止用户使用自定义的第三方证书,导致所有抓包工具均无解。经过尝试一些主流的 xposed 模块均无法绕过,一旦检测到用户使用第三方证书,app 就不再进行网络连接:

Snipaste_2019-12-16_22-35-20.jpg

0x01 原因

使用 jadx 反编译 app,搜索TrustManagerX509Certificate等关键字后发现自定义的 SSL 握手认证相关业务代码:

Snipaste_2019-12-16_22-30-24.jpg

n 类实现了 Java 自带的 X509TrustManager 接口,checkServerTrusted 方法中的红框内为证书认证通过逻辑,可以发现认证通过该方法直接 return,未通过则会抛出“握手失败”的异常,由相关方法捕捉后弹出禁止联网的 Dialog 并停止发出请求。

0x02 解决

逆向到具体的认证方法后就可以使用相关工具 hook 这个方法,不管三七二十一直接 return 就可以。

使用 Frida 工具,adb push frida-server 将 frida 服务端二进制传到 Android 系统里,进入 adb shell 更改文件权限,执行此二进制就可以进行 hook 了。

frida 是一款为安全研究人员打造的 hook 工具,简单看了一下介绍,可以 hook 很多平台的程序,找到对应的 server 二进制在想要 hook 的设备上执行即可(需要 root / 管理员权限)。

对应的 server 二进制可以在 https://github.com/frida/frida/releases 页找到,下载对应的系统架构,在目标机器上运行,然后通过客户端编写具体的 hook 方法。

确保 server 端开启后,转发相应的通讯端口到本机:

adb forward tcp:27042 tcp:27042
adb forward tcp:27043 tcp:27043

27042 端口用于与 frida-server 通信,之后的每个端口对应每个注入的进程。

本机使用 python 作为连接层,js 作为代码逻辑层,编写相应的 hook 方法:

import frida
import sys

rdev = frida.get_remote_device()
session = rdev.attach('com.example.app')
# com.example.app 为需要 hook 的 app 包名
print(session)

# 下面为需要 hook 的方法定位及逻辑实现
src = '''
Java.perform(function() {
    var c = Java.use("com.example.app.utils.c.n");
    // com.example.app.utils.c.n 为需要 hook 的类名
    c.checkServerTrusted.implementation = function(x509CertificateArr, str) {
        // 此处编写需要 hook 的操作,根据上面的分析,直接 return 即可
        send("aaa");
        return;
    }
});
'''

script = session.create_script(src)
def on_message(message, data):
    if message['type'] == 'send':
        print("[*] {0}".format(message['payload']))
    else:
        print(message)
script.on("message", on_message)
script.load()
sys.stdin.read()

客户端跑起来之后,会通过上述端口和服务端通讯,hook 掉相关方法为你想要的返回。

至此,就可以愉快的安装第三方证书使用抓包工具进行中间人攻击抓包而不被“发现”了。

标签: https, SSL, 渗透

已有 2 条评论

  1. Tessa Tessa

    支持博主!不懂也要点个赞,继续加油💪

    1. syf syf

      多谢捧场 加油 奥利给!

添加新评论