最近看了很多flutter逆向绕过SSL验证的文章,发现有些细节比较模糊,新接触flutter的师傅们可能不太理解,所以搜到原文进行翻译加上自己的理解,简单梳理了下整个方法和逻辑。
Flutter是Google构建在开源的Dart VM之上,使用Dart语言开发的移动应用开发框架,可以帮助开发者使用一套Dart代码就能快速在移动iOS 、Android上构建高质量的原生用户界面,同时还支持开发Web和桌面应用。
在逆向分析前,我们首先要确定测试目标是否用Flutter开发的。当使用Flutter构建Android APP时,lib文件夹下的每个受支持的架构下会出现两个库:libapp.so和libflutter.so,如下图所示。如果出现这两个特殊的库,那可以判定这个APP是有部分或全部使用Flutter开发的。其中,libapp.so库包含了开发过程中编写的所有编译过的Dart业务代码。libflutter.so库则存放了flutter的一些基础类库。
应用市场上有些APP核心的业务逻辑代码使用了Flutter开发,实际测试过程中发现无法使用Burpsuite、Charles等工具拦截相关的请求数据包。这是因为Dart使用Mozilla的NSS库生成并编译自己的Keystore,导致我们不能通过将代理CA添加到系统CA存储的方式来绕过SSL验证。我们可以通过一个小实验复现上面提到的场景,目标APP主页面包括了三个按钮:HTTP Request, HTTPS Request and Pinned Request,分别用来测试拦截三种类型的请求。其中的HTTP和HTTPS是通过HTTPClient类的getUrl方式发送指定请求,Pinned Request是通过使用Dio包执行SSLPinning,发送HTTPS请求并验证证书。主要的实现逻辑如下所示:首先像抓包Android APP一样拦截Flutter的请求包,但会发现三种请求都无法被拦截,因为Flutter APP默认情况下不使用系统的代理设置,所以可以使用Drony + BurpSuite,将手机上的目标APP的流量都重定向到Drony自身,再转发到BurpSuite上。发现只能拦截到HTTP请求,如下图所示。发送HTTPS和HTTPS (Pinned) 请求失败,可以用logcat看到相关报错信息,这部分我们之后分析:接下来就是通过逆向来绕过证书链校验,目前有两种方法可以解决这类场景:
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
fjqisba 抓包只是最简单的一步,事实上有不少算法是放在dart层的,关键是怎么去阅读dart汇编,还原算法呢。
你好,有一个疑惑:”请问本文通过hook修改 session_verify_cert_chain函数的返回值为true来过证书检测,但是session_verify_cert_chain处于if-else语句中的else分支,如果else分支不走,仅走if分支呢?这样hook无效了,那么对之前报错结果没有改变呀?“ (这一部分我没有理解清楚)