A-A+

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

2021年01月14日 文章转载 暂无评论 阅读 2,753 views 次

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

5.运行脚本:
frida -U <包名> -l <脚本名>
操作手机,刷新界面,期待成功。
在这里插入图片描述
然而,结果没有任何输出,说明未hook到任何函数。卧槽??
好家伙,研究了一天才知道,我分析的是32位so,但我测试机运行的是64位so。因此,换个so进行分析:
在这里插入图片描述同样的套路,找出函数偏移,进行分析,结果如下:
在这里插入图片描述

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

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

 

 

原文链接:https://blog.csdn.net/yhsnihao/article/details/110477720

标签:

给我留言