Flutter框架APP绕过SSL验证
声明:Tide安全团队原创文章,转载请声明出处!文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途给予盈利等目的,否则后果自行承担!
0x01 前言
之前听说过Flutter框架APP没有通用的抓包方案,但一直没找到相关APP进行测试,正巧手头遇到了一个APP尝试用了之前写的方法都抓不到包,所以联想到有可能使用了Flutter框架。
0x02 Flutter介绍
Flutter是Google构建在开源的Dart VM之上,使用Dart语言开发的移动应用开发框架,可以帮助开发者使用一套Dart代码就能快速在移动iOS 、Android上构建高质量的原生用户界面,同时还支持开发Web和桌面应用。
0x03 Flutter特征
当使用Flutter构建Android APP时,lib文件夹下的每个受支持的架构下会出现两个库:libapp.so和libflutter.so,libapp.so库包含了开发过程中编写的所有编译过的Dart业务代码。libflutter.so库则存放了flutter的一些基础类库。
0x04 Flutter抓取HTTPS
使用正常抓包测试流程发现该类APP不走系统代理、不支持设置代理、不信任系统证书
后续了解才发现证书校验写死在SO文件里,所以导致JustTrustMe,SSLUnpinning等一些常规SSL绕过模块失效。通过配置postern代理发现报错如下。通过搜索报错信息发现该错误提示指向Flutter框架的SSL证书验证。
HandshakeException: Handshake error in client (OS Error: CERTIFICATE_VERIFY_FAILED: self signed certificate in certificate chain(handshake.cc:393))
正巧这次机会来了一探究竟。查找boringssl库中ssl里Handshake.cc,看到在392行包含执行证书验证的逻辑
之所以报错,可以看到是验证失败了
ret == ssl_verify_invalid
按照之前的方式hook函数返回值,但是后续发现hook该函数修改ret的值为ssl_verify_ok发现并不能成功绕过。问了下chatgpt发现可以hook session_verify_cert_chain函数
查找资料发现网上也有很多分析libflutter.so中ssl的文章,基本也是同一套方法。针对证书校验问题,利用Frida去hook libflutter.so中的ssl_client函数,然后回过头来分析下客户端,找到libflutter.so使用IDA打开app中的libflutter.so文件,打开后先转为字符串(view-open subviews-strings),然后搜索ssl_client
进入查看函数调用位置
查看该函数代码逻辑
sub_8695CB
确定目标函数
复制函数的前10个以上的字节,然后使用Frida脚本检测该模式出现的频率。如果只发生一次,说明找到该了函数,可以进行hook
下面就是编写frida脚本
https://github.com/G123N1NJ4/c2hack/blob/master/Mobile/flutter-ssl-bypass.md
function hook_ssl_verify_result(address) { Interceptor.attach(address, { onEnter: function(args) { console.log("Disabling SSL validation") }, onLeave: function(retval) { console.log("Retval: " + retval); retval.replace(0x1); } }); } function hookFlutter() { var m = Process.findModuleByName("libflutter.so"); var pattern = "FF C3 01 D1 FD 7B 01 A9 FC 6F 02 A9FA 67 03 A9 F8 5F 04 A9 F6 57 05 A9 F4 4F 06 A9 08 0A 80 52 48 00 00 39"; var res = Memory.scan(m.base, m.size, pattern, { onMatch: function(address, size){ console.log('[+] ssl_verify_result found at: ' + address.toString()); // Add 0x01 because it's a THUMB function // Otherwise, we would get 'Error: unable to intercept function at 0x9906f8ac; please file a bug' hook_ssl_verify_result(address); }, onError: function(reason){ console.log('[!] There was an error scanning memory'); }, onComplete: function() { console.log("All done") } }); } function main() { Java.perform(function(){ hookFlutter(); }); } setImmediate(main);
加载执行js文件,发现返回正常提示
burp成功显示抓取的数据包
0x05 参考链接
https://blog.csdn.net/weixin_44777218/article/details/134029395
https://mp.weixin.qq.com/s/Xc6Qmf4AAlp29JwvzF1-9A
https://github.com/G123N1NJ4/c2hack/blob/master/Mobile/flutter-ssl-bypass.md
文章来源:Tide安全团队
黑白之道发布、转载的文章中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途及盈利等目的,否则后果自行承担!
如侵权请私聊我们删文
END