Flutter框架APP绕过SSL验证

华盟原创文章投稿奖励计划

自动草稿

声明:Tide安全团队原创文章,转载请声明出处!文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途给予盈利等目的,否则后果自行承担!

自动草稿

0x01 前言

之前听说过Flutter框架APP没有通用的抓包方案,但一直没找到相关APP进行测试,正巧手头遇到了一个APP尝试用了之前写的方法都抓不到包,所以联想到有可能使用了Flutter框架。

APP抓包姿势总结

记一次APP双向认证抓包

强混淆APP SSLPinning Bypass

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, {
        onEnterfunction(args{
            console.log("Disabling SSL validation")
        },
        onLeavefunction(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, {
        onMatchfunction(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);
        },
        onErrorfunction(reason){
            console.log('[!] There was an error scanning memory');
        },
        onCompletefunction({
            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

本文来源Tide安全团队,经授权后由华盟君发布,观点不代表华盟网的立场,转载请联系原作者。

发表评论