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

0x00 环境及工具

一、工具

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

二、环境

在这里插入图片描述

0x01 开始分析

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

一、flutter应用判断

如何判断一个应用为flutter应用?简单而快速的判定方式就是分析页面构成:
打开APP,执行命令:
adb shell dumpsys activity top
在这里插入图片描述命令执行完成后,输出的最后一段TASK,即当前手机最所显示的内容,即我们要逆向的APP的界面结构。显而易见是flutter的。同时可以通过日志grep flutter,如果有输出,自然也可以说明是flutter的。

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

设置代理,使用中间人攻击进行https解密抓包,打开flutter app,会出现断网提示。
在这里插入图片描述
同时抓包失败
在这里插入图片描述

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

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

2.双击跳到字符串定义
在这里插入图片描述3.查看交叉引用,运气不错,只有一个函数引用了该字符串:
在这里插入图片描述则猜测该函数即我们的目标函数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 <脚本名>
操作手机,刷新界面,期待成功。
在这里插入图片描述
然而,结果没有任何输出,说明未hook到任何函数。卧槽??
好家伙,研究了一天才知道,我分析的是32位so,但我测试机运行的是64位so。因此,换个so进行分析:
在这里插入图片描述同样的套路,找出函数偏移,进行分析,结果如下:
在这里插入图片描述

在这里插入图片描述在这里插入图片描述

很舒服!
事后我把我遇到的坑在群里吐槽了一下,在此特感谢肉丝姐(r0ysue),对32位so和64位so的判断方法给出了一个简单快捷的方案,为避免大家踩坑,直接放上肉丝姐的图
在这里插入图片描述

  • 5
    点赞
  • 31
    收藏
  • 打赏
    打赏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论 10

打赏作者

PaladinV

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值