安卓 flutter app证书绑定校验抓包绕过

目录

  • 0x00 环境及工具
    • 一、工具
    • 二、环境
  • 0x01 开始分析
    • 一、flutter应用判断
    • 二、正餐开始,flutter应用逆向分析绕过证书绑定

0x00 环境及工具

一、工具

1.抓包工具 charles
2.逆向分析 IDA
3.hook工具 Frida

二、环境

安卓 flutter app证书绑定校验抓包绕过_第1张图片

0x01 开始分析

偶然遇到一个app,抓不到包,各种unpinning姿势也过不去。花了一早上时间一顿研究和学习,才知道是flutter应用。第一次遇到flutter应用,不知所措,查资料学习之。

一、flutter应用判断

如何判断一个应用为flutter应用?简单而快速的判定方式就是分析页面构成:
打开APP,执行命令:
adb shell dumpsys activity top
安卓 flutter app证书绑定校验抓包绕过_第2张图片命令执行完成后,输出的最后一段TASK,即当前手机最所显示的内容,即我们要逆向的APP的界面结构。显而易见是flutter的。同时可以通过日志grep flutter,如果有输出,自然也可以说明是flutter的。

二、正餐开始,flutter应用逆向分析绕过证书绑定

设置代理,使用中间人攻击进行https解密抓包,打开flutter app,会出现断网提示。
安卓 flutter app证书绑定校验抓包绕过_第3张图片
同时抓包失败
安卓 flutter app证书绑定校验抓包绕过_第4张图片

我也是第一次遇到flutter应用,先搜一下也没有现成文章,搜到一篇关于flutter过证书绑定的文章。
学习前人的姿势,分析日志:如下图:
执行命令
adb shell logcat |grep flutter
看到错误日志如下:
安卓 flutter app证书绑定校验抓包绕过_第5张图片错误产生在handshake.cc文件的第354行。flutter是开源的,可以直接查看源代码,如下:
安卓 flutter app证书绑定校验抓包绕过_第6张图片

看起来也像是在做证书链校验,可以想到,使用frida hook让程序通过证书链校验即可,通过前面查阅的资料知道,这里不是最好的hook点,在文件ssl_x509.cc上有一个更好的函数可以让我们去hook。那么我们踏上前人搭好的桥梁,去更好的点,函数ssl_crypto_x509_session_verify_cert_chain上查看一下:
安卓 flutter app证书绑定校验抓包绕过_第7张图片如资料中所说,该函数返回值为布尔型,因此猜测,证书链校验成功,则该函数放回true,否则false。大致浏览了一下该函数,发现有字符串: ssl_clientssl_server
前人告诉我们,flutter开发的app,证书校验链在libflutter.so中。于是可以想到,只要通过frida,hook住该函数的返回值,就可以unpinning,前人使用内存search的方式,基本来说是不太靠谱的,我们选择函数偏移的方式去hook,那么开始。上IDA。
1.搜索字符串:ssl_client或者ssl_server
安卓 flutter app证书绑定校验抓包绕过_第8张图片

2.双击跳到字符串定义
安卓 flutter app证书绑定校验抓包绕过_第9张图片3.查看交叉引用,运气不错,只有一个函数引用了该字符串:
安卓 flutter app证书绑定校验抓包绕过_第10张图片则猜测该函数即我们的目标函数ssl_crypto_x509_session_verify_cert_chain

4.尝试hook:
根据交叉引用获得了函数的偏移地址(即函数名3d087c)
编写hook脚本

function hook_ssl() {
	var base = Module.findBaseAddress("libflutter.so");
    var ssl_crypto_x509_session_verify_cert_chain = base.add(0x3d087c);
	Interceptor.attach(ssl_crypto_x509_session_verify_cert_chain, {
        onEnter: function(args) {
            console.log("\n解除证书绑定校验")
        },
        onLeave: function(retval) {
            console.log("校验函数返回值: " + retval);
            retval.replace(0x1);
            console.log("解除成功\n---------------------");
      }
  });
}
setImmediate(hook_ssl)

5.运行脚本:
frida -U <包名> -l <脚本名>
操作手机,刷新界面,期待成功。
安卓 flutter app证书绑定校验抓包绕过_第11张图片
然而,结果没有任何输出,说明未hook到任何函数。卧槽??
好家伙,研究了一天才知道,我分析的是32位so,但我测试机运行的是64位so。因此,换个so进行分析:
安卓 flutter app证书绑定校验抓包绕过_第12张图片同样的套路,找出函数偏移,进行分析,结果如下:
安卓 flutter app证书绑定校验抓包绕过_第13张图片

安卓 flutter app证书绑定校验抓包绕过_第14张图片安卓 flutter app证书绑定校验抓包绕过_第15张图片

很舒服!
事后我把我遇到的坑在群里吐槽了一下,在此特感谢肉丝姐(r0ysue),对32位so和64位so的判断方法给出了一个简单快捷的方案,为避免大家踩坑,直接放上肉丝姐的图
安卓 flutter app证书绑定校验抓包绕过_第16张图片

你可能感兴趣的:(安卓逆向,抓包,逆向,flutter,安卓,android)