一个flutter框架的App渗透日记
字数 1510 2025-08-30 06:50:11
Flutter框架App渗透测试实战指南
1. 背景介绍
本文记录了一个针对Flutter框架开发的移动应用程序的渗透测试过程。该App最初表现为无法正常抓包,经过一系列分析后发现其使用了深信服SDK进行内网通信。本文将详细讲解整个渗透测试流程,包括遇到的问题、解决方法和最终发现的安全隐患。
2. 初始测试环境准备
2.1 代理设置尝试
- 使用Clash开启全局代理进行抓包测试
- 发现验证码未加载,怀疑App检测代理软件
- 尝试使用Clash透明代理将防火墙转发流量
2.2 初步抓包结果
- 成功抓到数据包但无法正常通信
- 数据包结构异常简单,不像典型App构造的请求
- 关键特征:特殊的User-Agent标识
3. Flutter框架识别与分析
3.1 Flutter特征识别
- 通过User-Agent信息确认是Flutter框架开发的App
- 检查so库特征(如libflutter.so)进一步确认
3.2 源码分析挑战
- App源码进行了高强度混淆(未加壳但混淆效果显著)
- 尝试关键词搜索(okhttp、libssl.so、JSON等)无果
- 无法找到与Dart发出请求相关的信息
4. Flutter抓包解决方案
4.1 SSL Bypass尝试
- 参考网上Flutter分析文章(如https://www.ctfiot.com/217117.html)
- 获取so的ssl bypass hook函数
- 初始hook测试失败
4.2 成功解决方案
- 使用GitHub项目frida-flutterproxy(https://github.com/hackcatml/frida-flutterproxy)
- 该脚本通过SO文件内存解析获取导出地址进行操作
- 成功实现抓包自由
5. 内网地址发现与处理
5.1 内网通信发现
- 抓取的请求目标是内网地址
- 使用mitm将内网地址替换为已知公网地址
- 成功获取验证码并登录系统
5.2 WebView请求分析
- App核心业务使用内置H5应用
- WebView发起的请求无法通过Flutter hook捕获
- 使用Frida hook WebView调试功能:
Java.perform(function () {
var WebView = Java.use('android.webkit.WebView');
WebView.$init.overload('android.content.Context').implementation = function (a) {
console.log("WebView.$init is called!1");
var retval = this.$init(a);
this.setWebContentsDebuggingEnabled(true);
return retval;
}
WebView.$init.overload('android.content.Context', 'android.util.AttributeSet').implementation = function (a, b) {
console.log("WebView.$init is called!2");
var retval = this.$init(a, b);
this.setWebContentsDebuggingEnabled(true);
return retval;
}
WebView.$init.overload('android.content.Context', 'android.util.AttributeSet', 'int').implementation = function (a, b, c) {
console.log("WebView.$init is called!3");
var retval = this.$init(a, b, c);
this.setWebContentsDebuggingEnabled(true);
return retval;
}
WebView.setWebContentsDebuggingEnabled.implementation = function () {
this.setWebContentsDebuggingEnabled(true);
console.log("setWebContentsDebuggingEnabled is called!");
}
});
6. 深信服SDK分析
6.1 SDK特征识别
- 请求中存在"SanforidClient"标识
- App组件包含大量深信服SDK
6.2 认证信息获取
- 通过分析SDK源码找到认证方法
- 成功获取VPN用户名、密码和服务器地址
- 可成功拨入VPN
7. 技术总结
7.1 抓包失败原因
- App使用深信服SDK进行通信
- 流量通过socket或回环接口转发
- PC无法直接访问内网地址导致抓包后仍无法通信
7.2 Flutter渗透关键点
- User-Agent和so库是识别Flutter应用的关键特征
- 高强度源码混淆是常见防护手段
- 需要特殊工具处理Flutter的SSL/TLS通信
7.3 深信服SDK渗透经验
- 关注"SanforidClient"等特征字符串
- 检查App中是否内置默认VPN凭证
- SDK可能提供直接的内网访问通道
8. 防御建议
8.1 对开发者的建议
- 避免在客户端硬编码内网地址
- 不要内置默认VPN凭证
- 对敏感信息进行有效保护
8.2 对安全人员的建议
- 收集Flutter应用特征库
- 建立常见SDK的识别方法
- 准备针对不同框架的专用测试工具链
9. 参考资源
- Flutter抓包分析文章:https://www.ctfiot.com/217117.html
- frida-flutterproxy项目:https://github.com/hackcatml/frida-flutterproxy
- Flutter逆向分析工具集