找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 122|回复: 0

最新某音抓包方案之修改so

[复制链接]

2万

主题

134

回帖

13万

积分

管理员

积分
134018
发表于 2024-6-12 19:12:18 | 显示全部楼层 |阅读模式 IP:山东省济南市 联通

登录后更精彩...O(∩_∩)O...

您需要 登录 才可以下载或查看,没有账号?立即注册

×
某音短视频APP 最新版(21.8)SSL PINNING 绕过

本文主要讲解在短视频APP上逆向抓包遇到的坑,通过本文方法可以顺利使用抓包工具抓到数据包,也可以通过文中介绍的获取proto文件的方法,使用编程语言解析数据包中的内容。

文末还会提供编译好的proto类,可以直接解析response

客户端抓包

一般抓包都是采用中间人的方式,即在客户端用户与网站服务器中间,安插一个代理。所有客户端发送的包与服务器返回的包都经过这个中间人代理转发。

对于https的应用,需要伪造信任证书,对客户端充当服务器,对服务器充当客户端。

初次尝试

开始下载了5.0版的安卓模拟器,下载了比较旧的某音APP 17.3版本,发现是可以抓到包的,但是无法登陆,提示版本过低。所以只能升级APP版本,但升级到最新版发现之前的抓包工具无法抓到包了,提示 SSL Handshake Failed。

SSL Pinning

[SSL Pinning]分为两种:

  • Certificate Pinning(证书锁定)证书锁定即APP仅接受指定域名的证书,而不接受其他任何证书。
  • Public Key Pinning(公钥锁定)公钥锁定则是提取证书中的公钥内置到移动端APP中,通过与服务器对比公钥值来验证连接的合法性。

在Android N(Android 7.0 API 24)及以后版本,由CA权威机构签发的证书,其根证书都内置在最新的[Android操作系统]中,因此默认情况下可不进行SSL证书锁定。因此该版本之前的安全性设置仍然需要使用证书锁定方法,即自建证书在客户端强制判断,以达到防止中间人攻击(MITM)的目的。

突破ssl pinning

客户端在收到服务器的证书后,对该证书进行强校验,验证该证书是不是客户端承认的证书,如果不是,则直接断开连接。所以会出现 SSL Handshake Failed 的情况。想破解客户端证书锁定有以下几种方式:

  • 将证书安装到系统证书中
  • xposed(virtualxposed) 及其插件 [JustTrustMe]
  • 修改app中的证书判断源码
  • 使用动态插桩框架如Frida、Unidbg
系统证书

如果是安卓7以上,因为有系统功能限制,可以尝试将mitm证书安装到系统目录。

系统证书的目录是:/system/etc/security/cacerts/

每个证书的命名规则为:<Certificate_Hash>.<Number>

<Certificate_Hash> 表示证书文件的 hash 值, 是为了防止证书文件的 hash 值一致而增加的后缀;

证书的 hash 值可以由命令计算出来,在终端输入 openssl x509 -subject_hash_old -in <Certificate_File>,其中 <Certificate_File> 为证书路径,将证书重命名为 hash.0 放入系统证书目录,之后你就可以正常抓包了。

抖音是使用自建证书,此方法无效

Xposed

Xposed框架是一套开源的、在Android root模式下运行的框架,它可以在不修改APP源码的情况下通过Hook方式去影响程序的运行。

JustTrustMe 是一个用来禁用、绕过 SSL 证书检查的基于 Xposed 模块。JustTrustMe 是将 APK 中所有已知用于校验 SSL 证书的 API 都进行了 Hook,从而绕过证书检查。

安装xposed需要root手机,且安装繁琐,启动APP时需要同时启动该框架。

但是抖音是采用自建证书来实现,JustTrustMe内置方法无法匹配到关键函数名。

修改用于证书校验的native层

使用IDA PRO打开so文件,通过搜索cert等关键字,一顿搜索之后发现。看返回值是1,但是经过查阅发现 返回值为0的时候才是 ssl_verify_ok


所以我们动下小手给他改成0,然后apply patchs,将so文件保存。

1.png

然后把修改过的so复制到你的安卓手机上,这种方案,手机必须ROOT,因为我们要替换lib下面的libsscronet.so,修改一下文件权限重启APP即可抓包

替换so文件

联想模拟器:adb connect 127.0.0.1:11509
mumu模拟器:adb connect 127.0.0.1:7555

[Bash shell] 纯文本查看 复制代码
adb connect 127.0.0.1:11509
adb push ./libsscronet20.7.so /data/app/com.ss.android.ugc.aweme-1/lib/arm

adb shell 
rm -rf /data/app/com.ss.android.ugc.aweme-1/lib/arm/libsscronet.so

mv /data/app/com.ss.android.ugc.aweme-1/lib/arm/libsscronet20.7.so /data/app/com.ss.android.ugc.aweme-1/lib/arm/libsscronet.so 

chmod 777 /data/app/com.ss.android.ugc.aweme-1/lib/arm/libsscronet.so 

protobuf

拿到数据包之后发现里面文字显示都不正常,通过请求头发现,原来使用的谷歌的protobuf协议,类似json和xml用于两端数据传输,因为protobuf更节省空间,传输过程中将变量名省略,变量名都以文件的方式存储在服务器和客户端上,所以我们需要使用Python的
blackboxprotobuf库来解析。

[Python] 纯文本查看 复制代码
import blackboxprotobuf

with open('./douyin_.txt', 'rb') as f:
    print(blackboxprotobuf.protobuf_to_json(f.read()))

或者也可以使用官方protoc解析。需要先下载[protoc]

[Python] 纯文本查看 复制代码
import subprocess

def decodes(data):
    """
    如果上传到linux线上服务器,需要chmod+x protoc赋予权限。
    """
    process = subprocess.Popen([r'protoc', '--decode_raw'],
                               stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

    output = error = None
    try:
        output, error = process.communicate(data)
    except OSError as e:
        pass
    finally:
        if process.poll() != 0:
            process.wait()
    return output

with open('./douyin_.txt', 'rb') as f:
    data = str(decodes(f.read()), encoding='utf8')
    print(data)

但是以上方法均不能拿到对应键值,取数据时比较麻烦。

逆向获取proto

方法来源于这个帖子[抖音直播间弹幕protocbuf分析]

首先用jadx反编译apk包。因为某音最新版(21.8)安装包较大。本人的16G机器hold不住。所以本人用的是低版本的apk包(之后借用了公司服务器,将反编译代码下载下来了,这里可以提供下载地址)。反编译后通过搜索抓包抓到的接口地址。

1.png

之后查看这个类,需要的字段以及类型都在这里了。13.9版本的proto文件都在这个文件夹里,提取会很方便 。



抖音apk采用了SSLPinning,然后用的是非系统SLL库,所以 用 frida过SSLPinning无效最新版的抖音用上了sslpinng技术,而且还是so层,所以采用修改so的方式实现方便快捷的抓包

用IDA PRO 打开某音的 libttboringssl.so
搜索 ssl相关函数 确认函数是 SSL_CTX_set_custom_verify全局搜索 SSL_CTX_set_custom_verify 调用地方 发现



1.png


第三个参数就是校验的地方 并且是个回调函数,那我们就进去看看那这里没有ollvm混淆,据说混淆了效率太低 用了之后网络各种超时 只能放弃
然后进入该函数分析后发现返回值为0的时候才是 ssl_verify_ok所以要要把返回值改成0修改要利用这么网站了http://armconverter.com 可以将arm指令转换成16进制
定位到返回值的地方

1.png

将  MOV R0, R4 修改成 MOV R0 ,#0据转换网站可知 指令16进制为0020
然后将跳转函数 直接改修跳转POP即 BL              sub_1CCD28 改成 B sub_1CCD28
BL              sub_1CCD28 对应是16进制是 00 F0 3C F8而B指令对应的长度是 4位 所以先加一条空指令 NOP 16进制为 C0 46然后pop 返回值函数的地址向下偏移了2位b #2 对应16进制是FF E7故修改成C0 46 FF E7修改后的结果如下图


1.png

接return 0了此时修改完毕!
下面要操作的就是用adb 连接手机后 替换安装目录下的so文件即目录data/app/com.ss.android.ugc.aweme-1/lib/arm将此目录so文件直接替换然后给权限然后打开某音就会神奇的发现自己可以抓包啦!



from : https://www.52pojie.cn/thread-1505299-1-1.html
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|时间戳|加密|CTF WiKi|CTF平台汇总|CTF show|ctfhub|棱角安全|rutracker|攻防世界|php手册|peiqi文库|CyberChef|猫捉鱼铃|手机版|小黑屋|cn-sec|IOTsec-Zone|在线工具|分享屋 ( 鲁ICP备2021028754号 )

GMT+8, 2024-9-8 11:26

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表