MASTG-TECH-0109: 拦截 Flutter HTTPS 流量
Flutter 是一个由 Google 创建的开源 UI 软件开发工具包 (SDK)。它用于从单个代码库构建移动、Web 和桌面平台的原生编译应用程序。Flutter 使用 Dart,Dart 不支持代理,并且使用自己的证书存储。Flutter 移动应用程序不使用系统的代理配置,而是将数据直接发送到服务器。连接会针对内置证书进行验证,因此系统上安装的任何证书都会被忽略。这使得通过标准的 MiTM 设置拦截 HTTPS 请求成为不可能,因为代理的证书永远不会被信任。
要拦截来自 Flutter 应用程序的 HTTPS 流量,我们必须处理两个挑战
- 确保流量发送到代理。
- 禁用任何 HTTPS 连接上的 TLS 验证。
通常有两种方法: reFlutter 和 Android 的 Frida。
- reFlutter:此工具创建一个修改后的 Flutter 模块,然后将其重新打包到 APK 中。它配置内部库以使用指定的代理并禁用 TLS 验证。
- Frida:disable-flutter-tls.js 脚本可以动态删除 TLS 验证,而无需重新打包。因为它不修改代理配置,所以需要额外的步骤(例如 ProxyDroid、DNS、iptables,...)。
使用 reFlutter 拦截流量¶
-
修补应用程序以启用流量拦截。
运行命令以修补应用程序,然后选择选项流量监控和拦截,然后输入运行拦截代理的机器的 IP。
$ reflutter demo.apk Choose an option: Traffic monitoring and interception Display absolute code offset for functions [1/2]? 1 Example: (192.168.1.154) etc. Please enter your BurpSuite IP: 192.168.29.216
这将在输出文件夹中创建一个 release.RE.apk 文件。
-
签名修补后的 release.RE.apk 文件(例如,使用 uber-apk-signer)。
java -jar uber-apk-signer.jar -a release.RE.apk --out demo-signed
这将在输出文件夹中创建一个 release.RE-aligned-debugSigned.apk 文件。
-
在移动设备上安装签名的修补应用程序。
-
配置拦截代理。例如,在 Burp Suite
-
在 Proxy -> Proxy settings -> Add new Proxy setting 下。
- 将监听端口绑定到
8083
。 - 选择
Bind to address
到All interfaces
。 -
请求处理 -> 支持隐形代理。
-
打开应用程序并开始拦截流量。
使用 ProxyDroid / iptables 和 Frida 拦截流量¶
您可以配置 ProxyDroid或创建 iptables
规则以将 HTTP 请求重定向到 Burp。
-
如果您未使用 ProxyDroid,请在已 root 的 Android 设备上执行以下命令,以配置
iptables
以将来自应用程序的传入请求重定向到 Burp Suite$ iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to-destination <Your-Proxy-IP>:8080 $ iptables -t nat -A OUTPUT -p tcp --dport 443 -j DNAT --to-destination <Your-Proxy-IP>:8080
-
配置拦截代理,如 Burp Suite
- 在 Proxy -> Proxy settings -> Add new Proxy setting 下。
- 将监听端口绑定到
8080
。 - 选择
Bind to address
到All interfaces
。 - 请求处理 -> 支持隐形代理。
-
运行 disable-flutter-tls-verification Frida 脚本。
$ frida -U -f eu.nviso.flutterPinning -l disable-flutter-tls.js
-
使用应用程序,您应该能够拦截 Flutter 应用程序的 HTTP 流量。
有关此设置的更多说明,请参见 Nviso 的博客文章。