logo

Flutter逆向初探

作者:沙与沫2023.02.08 20:47浏览量:1256

简介:下面将为大家简单讲解如何在Android环境下逆向Flutter绕过APP证书链校验。

前言

最近应用市场有很多使用Flutter混合开发的APP,测试工作中难免会遇到,由于Flutter在构建APP时相对于Android或iOS是比较独立的,而且将Dart 编译为本机汇编代码使用的格式尚未公开,因此有些人认为用Flutter开发的业务部分是比较安全的。但我们依然可以通过逆向Flutter来揭开这层“安全”的面纱,下面将为大家简单讲解如何在Android环境下逆向Flutter绕过APP证书链校验。

Flutter简介

Flutter是Google构建在开源的Dart VM之上,使用Dart语言开发的移动应用开发框架,可以帮助开发者使用一套Dart代码就能快速在移动iOS 、Android上构建高质量的原生用户界面,同时还支持开发Web和桌面应用。

Flutter特征

在逆向分析前,我们首先要确定测试目标是否用Flutter开发的。当使用Flutter构建Android APP时,lib文件夹下的每个受支持的架构下会出现两个库:libapp.so和libflutter.so,如下图所示。如果出现这两个特殊的库,那可以判定这个APP是有部分或全部使用Flutter开发的。
图片.jpg
其中,libapp.so库包含了开发过程中编写的所有编译过的Dart业务代码。libflutter.so库则存放了flutter的一些基础类库。

逆向Flutter解决HTTPS抓包问题

应用市场上有些APP核心的业务逻辑代码使用了Flutter开发,实际测试过程中发现无法使用Burpsuite、Charles等工具拦截相关的请求数据包。这是因为Dart使用Mozilla的NSS库生成并编译自己的Keystore,导致我们不能通过将代理CA添加到系统CA存储的方式来绕过SSL验证。

我们可以通过一个小实验复现上面提到的场景,目标APP主页面包括了三个按钮:HTTP Request, HTTPS Request and Pinned Request,分别用来测试拦截三种类型的请求。
图片.jpg
其中的HTTP和HTTPS是通过HTTPClient类的getUrl方式发送指定请求,Pinned Request是通过使用Dio包执行SSLPinning,发送HTTPS请求并验证证书。主要的实现逻辑如下所示:
图片.jpg
首先像抓包Android APP一样拦截Flutter的请求包,但会发现三种请求都无法被拦截,因为Flutter APP默认情况下不使用系统的代理设置,所以可以使用Drony + BurpSuite,将手机上的目标APP的流量都重定向到Drony自身,再转发到BurpSuite上。发现只能拦截到HTTP请求,如下图所示。
图片.jpg
发送HTTPS和HTTPS (Pinned) 请求失败,可以用logcat看到相关报错信息,这部分我们之后分析:
图片.jpg
接下来就是通过逆向来绕过证书链校验,目前有两种方法可以解决这类场景:

(1) 使用reFlutter开源逆向分析工具;

(2) 使用Frida脚本hook libflutter.so中的函数。

相关文章推荐

发表评论