在我们最近的胖客户端应用程序渗透测试之一中, Sanjay遇到了这样一种情况:该应用程序是在Flutter框架之上构建的,并且在其中一个嵌入式库中进行了SSL固定检查。由于进行了此检查,因此在使用Burp进行配置时,该应用程序提供了SSL固定错误。
为了分享我们的经验以及本博客的目的,我们将使用“ thickclient.example.com”作为Mac OSX胖客户端应用程序的后端API URL。
TL; DR
通过在Mac OSX胖客户端应用程序中挂钩Frida脚本,绕过基于Flutter的Mac OSX胖客户端应用程序的SSL固定实现。
问题声明
挑战在于渗透或修改由Mac OSX胖客户端应用程序在Burp代理中生成的网络流量,因为使用Burp进行配置时,该应用程序提供了SSL固定错误。
问题分析
在Mac OSX胖客户端应用程序渗透测试过程中,为了捕获应用程序的HTTP流量,我们使用了Burp Suite,Charles Proxy和Proxyman等著名工具,这些工具使用了众所周知的代理配置技术进行了配置。据观察,没有任何工具和技术可以捕获Mac OSX胖客户端应用程序的流量。
使用Wireshark分析胖客户端应用程序的网络流量,我们观察到该应用程序通过TCP和TLSv1.2进行通信,这意味着Wireshark中的加密流量。当我们使用Wireshark的“ follow tcp stream”功能进一步分析流量时,发现域名为“ thickclient.example.com”。
然后,我们尝试使用命令提示符运行该应用程序,并观察到该应用程序的日志记录,例如“ flutter:$ STRING $”,并根据分析得出结论,该应用程序是在Flutter中构建的。
根据 本文,我们观察到可以设置环境变量以转发基于Flutter的Mac OSX胖客户端应用程序的流量。
export HTTP_PROXY=localhost:8080
export HTTPS_PROXY=localhost:8080
但是我们还观察到,在设置环境变量时,我们收到了“ thickclient.example.com”的SSL固定错误,如下所示:
为了列出Mac OSX胖客户端应用程序使用的模块,我们使用了以下Frida 脚本:https://github.com/poxyran/misc/blob/master/frida-enumerate-modules.py
我们将Frida脚本挂接到胖客户端应用程序中,并观察到该应用程序已在其中加载了'FlutterMacOS'库。Android和iOS应用程序可能对基于Flutter的应用程序使用“ libflutter.so”。
如先前在博客中所述,当使用任何代理进行配置时,该应用程序将在“ handshake.cc:line:354”处验证“证书验证”。
我们在Google上快速搜索了“ handshake.cc:line:354 ” 关键字,并 在 Github的“ boringSSL ” 源代码中找到了“ handshake.cc ”文件。然后,我们 分析 了开源的 boringSSL 代码库,以检查“ handshake.cc ”中的内容。在线354,它被观察到,“ session_verify_cert_chain ”功能被从“称为ssl_verify_peer_cert ”功能,验证SSL钉扎,并返回“枚举ssl_verify_result_t ”。
此外,我们 在基于Flutter的Android应用程序中基于SSL Pinning旁路分析了该 博客,并在“ Ghidra”逆向工程工具中打开了“ FlutterMacOS”。
我们捕获了函数“ ssl_verify_peer_cert”的前27个字节。
接下来,我们运行Binwalk工具以确认该函数的前27个字节,并发现该函数为函数“ ssl_verify_peer_cert”提供了一个条目。
有时可能会发生多个函数使用相同的27个字节序列的情况,在这种情况下,我们必须添加实际函数的更多字节序列以仅将特定函数挂接到结果中。例如,让我们用前24个字节的序列挂接函数,因此,对前24个字节运行Binwalk时,它将导致超过25个实例,如下图所示;当我们使用前24个字节的序列挂接Frida时,它将钩挂所有可能导致应用程序崩溃或无法正常工作的功能。
对于这种情况,我们必须增加字节顺序才能获得确切的功能,如以上步骤所示:
我们使用弗里达脚本从 文章到它挂在厚厚的客户端应用程序。如果该函数被钩住,它将记录以下消息:
Disabling SS validation
Retval: 0xADDRESS
我们运行了该应用程序,并挂接了Frida脚本,并针对胖客户端应用程序执行了登录活动。
繁荣…。
该函数已被Frida脚本钩住,返回值从'0x2'替换为'0x0'。这意味着当设置代理并返回函数时,它将返回'ssl_verify_retry'-> 0x02,并通过Frida钩子将返回'ssl_verify_ok'-> 0x0。
现在,我们终于可以在代理中捕获基于Flutter的Mac OSX胖客户端应用程序的流量。
Reference 参考:
-
https://blog.nviso.eu/2019/08/13/intercepting-traffic-from-android-flutter-applications/
-
https://github.com/poxyran/misc/blob/master/frida-enumerate-modules.py
-
https://github.com/google/boringssl/blob/master/ssl/handshake.cc
-
https://api.flutter.dev/flutter/dart-io/HttpClient/findProxyFromEnvironment.html
-
https://commondatastorage.googleapis.com/chromium-boringssl-docs/ssl.h.html#ssl_verify_result_t
-
https://portswigger.net/burp/documentation/desktop/tools/proxy/options/invisible
-
https://www.charlesproxy.com/documentation/
原文始发于微信公众号(Ots安全):基于Flutter的Mac OSX 客户端SSL固定绕过
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论