首页
社区
课程
招聘
[原创]一种基于frida和drony的针对flutter抓包的方法
发表于: 2020-9-9 16:50 34767

[原创]一种基于frida和drony的针对flutter抓包的方法

2020-9-9 16:50
34767




参考:https://www.jianshu.com/p/ada10d2976f2


Flutter是Google使用Dart语言开发的移动应用开发框架,使用一套Dart代码就能快速构建高性能、高保真的iOS和Android应用程序。

由于Dart使用Mozilla的NSS库生成并编译自己的Keystore,导致我们就不能通过将代理CA添加到系统CA存储来绕过SSL验证。为了解决这个问题,就必需要研究libflutter.so。

当向Burp发送HTTPS流量时,Flutter应用程序会抛出一个错误,可以将其作为起点进行溯源:

E/flutter (10371): [ERROR:flutter/runtime/dart_isolate.cc(805)] Unhandled exception:

 E/flutter (10371): HandshakeException: Handshake error in client (OS Error: 

 E/flutter (10371):  NO_START_LINE(pem_lib.c:631)

 E/flutter (10371):  PEM routines(by_file.c:146)

 E/flutter (10371):  NO_START_LINE(pem_lib.c:631)

 E/flutter (10371):  PEM routines(by_file.c:146)

 E/flutter (10371):  CERTIFICATE_VERIFY_FAILED: self signed certificate in certificate chain(handshake.cc:352))

 E/flutter (10371): #0      _rootHandleUncaughtError. (dart:async/zone.dart:1112:29)

 E/flutter (10371): #1      _microtaskLoop (dart:async/schedule_microtask.dart:41:21)

 E/flutter (10371): #2      _startMicrotaskLoop (dart:async/schedule_microtask.dart:50:5)

 E/flutter (10371): #3      _runPendingImmediateCallback (dart:isolate-patch/isolate_patch.dart:116:13)

 E/flutter (10371): #4      _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:173:5)

该错误显示了触发错误的位置:handshake.cc:352,代码如下所示。


if (ret == ssl_verify_invalid) {

    OPENSSL_PUT_ERROR(SSL, SSL_R_CERTIFICATE_VERIFY_FAILED);

    ssl_send_alert(ssl, SSL3_AL_FATAL, alert);

  }

这是ssl_verify_peer_cert函数的一部分,该函数返回ssl_verify_result_t的枚举,枚举定义在ssl.h的第2290行:

enum ssl_verify_result_t BORINGSSL_ENUM_INT {

  ssl_verify_ok,

  ssl_verify_invalid,

  ssl_verify_retry,

};

经过试验,将ssl_verify_peer_cert的返回值更改为ssl_verify_ok (=0)的话仍会因为上面的ssl_send_alert()函数调用而失败,因此需要找另一个hook点。handshake.cc的代码段上方有一段验证证书链的方法:


ret = ssl->ctx->x509_method->session_verify_cert_chain(

              hs->new_session.get(), hs, &alert)

              ? ssl_verify_ok

              : ssl_verify_invalid;

session_verify_cert_chain函数定义在ssl_x509.cc,此函数返回布尔值类型,并且没有像ssl_verify_peer_cert函数那样的问题,可以作为hook的目标。在该方法里可以看到有两个字符串可以辅助定位方法,如图1-1所示。

图1-1  所需hook函数中有辨识度较高字符串


之后在ida中的strings可以找到并定位函数为sub_3A5564,过程如图1-2到1-4所示。


图1-2  stirngs搜索到目标字符串


图1-3  查看调用函数


图1-4  确定本函数为目标函数


图1-5  利用前10字节定位函数


后面可以在frida中编写脚本,使用函数前10字节定位,在运行时将返回函数改为true即可绕过证书链检查实现抓包,示例如下。


function hook_ssl_verify_result(address)

{

  Interceptor.attach(address, {

    onEnter: function(args) {

      send("Disabling SSL validation")

    },

    onLeave: function(retval)

    {

      send("Retval: " + retval)

      retval.replace(0x1);

 

    }

  });

}

function disablePinning()

{

 var m = Process.findModuleByName("libflutter.so"); 

 var pattern = "2d e9 f0 4f a3 b0 81 46 50 20 10 70"

 var res = Memory.scan(m.base, m.size, pattern, {

  onMatch: function(address, size){

      send('[+] ssl_verify_result found at: ' + address.toString());

 

      // Add 0x01 because it's a THUMB function

      hook_ssl_verify_result(address.add(0x01));

       

    }, 


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2020-9-9 16:55 被beimingyouyu编辑 ,原因:
收藏
免费 19
支持
分享
最新回复 (29)
雪    币: 13
活跃值: (33)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
大佬 可以留个联系方式吗
2020-9-10 18:55
0
雪    币: 1985
活跃值: (1800)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
 感谢分享。 刚需,试试
2020-9-10 19:39
0
雪    币: 1867
活跃值: (3958)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
4
牛逼
2020-9-10 20:26
0
雪    币: 16501
活跃值: (6382)
能力值: ( LV13,RANK:923 )
在线值:
发帖
回帖
粉丝
5

将arm64-v8a里面的libflutter.so 替换成下面的so,即可实现抓包

最后于 2020-9-11 15:34 被大帅锅编辑 ,原因:
2020-9-11 15:24
1
雪    币: 16501
活跃值: (6382)
能力值: ( LV13,RANK:923 )
在线值:
发帖
回帖
粉丝
6

0.0

上传的附件:
2020-9-11 15:36
1
雪    币: 6112
活跃值: (1212)
能力值: (RANK:30 )
在线值:
发帖
回帖
粉丝
7
感谢分享!
2020-9-11 16:21
0
雪    币: 1385
活跃值: (5609)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
8
666
2020-9-11 18:29
0
雪    币: 1867
活跃值: (3958)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
9
大帅锅 0.0
老哥有没有32位的
2020-9-12 08:51
0
雪    币: 16501
活跃值: (6382)
能力值: ( LV13,RANK:923 )
在线值:
发帖
回帖
粉丝
10
virjar 老哥有没有32位的

等我空再改一个吧

最后于 2020-9-12 11:49 被大帅锅编辑 ,原因:
2020-9-12 11:49
0
雪    币: 0
活跃值: (18)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
virjar 老哥有没有32位的
你这个id好熟悉
2020-9-12 13:53
0
雪    币: 1867
活跃值: (3958)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
12
大帅锅 virjar 老哥有没有32位的 等我空再改一个吧
或者,有没有so的静态hook框架,就是直接通过修改so的方式完成hook功能封装。这样可以基于这篇帖子的思路,对所有的so实现鲁棒性更强的hook。再通过替换so完成这一大类问题的自动化解决
2020-9-12 17:52
0
雪    币: 977
活跃值: (435)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
13
感谢分享 我一般用 drozer 结合 burpsuite 
2020-9-12 21:32
0
雪    币: 634
活跃值: (1503)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
14
之前有人通过添加系统CA(不是导入证书)的方式实现抓包,我试了也是可以。
但是flutter应用里自己做签名校验的,还是没什么好办法。
2020-9-14 15:06
0
雪    币: 27
活跃值: (1638)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
那么问题来了,什么app用的是这个so的?
2020-9-17 23:27
0
雪    币: 27
活跃值: (1638)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
@all,libliger.so 用这个 https://plainsec.org/how-to-bypass-instagram-ssl-pinning-on-android-v78/
2020-9-17 23:37
0
雪    币: 386
活跃值: (1047)
能力值: ( LV9,RANK:145 )
在线值:
发帖
回帖
粉丝
17
bluegatar 那么问题来了,什么app用的是这个so的?
使用flutter开发的应用都会用吧
2020-9-18 16:10
0
雪    币: 386
活跃值: (1047)
能力值: ( LV9,RANK:145 )
在线值:
发帖
回帖
粉丝
18
你说的是导入CA证书而不是导入用户证书吗?不太明白添加系统CA是什么操作
2020-9-18 16:13
0
雪    币: 27
活跃值: (1638)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
beimingyouyu 使用flutter开发的应用都会用吧
具体一个app的名称
2020-9-19 12:10
0
雪    币: 6084
活跃值: (5490)
能力值: ( LV5,RANK:65 )
在线值:
发帖
回帖
粉丝
20
感谢分享!
2020-9-19 12:32
0
雪    币: 1
活跃值: (127)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
谢谢分享!刚好有这个需求!
2020-9-21 17:42
0
雪    币: 235
活跃值: (520)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
22
大帅锅 virjar 老哥有没有32位的 等我空再改一个吧
老哥,能共享下libflutter.so 32位的吗?
2020-11-27 14:53
0
雪    币: 6
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
23
大佬,有个APP,frida进不去,替换so闪退,吐了,有时间淦它一波嘛
2021-6-19 20:46
0
雪    币: 1937
活跃值: (584)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
留名 有戏 还得是beimingyouyu
2021-12-14 17:49
0
雪    币: 44
活跃值: (524)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
yyds
2022-3-19 14:30
0
游客
登录 | 注册 方可回帖
返回
//