weeknessback-ben/ios-flutter-ssl-bypass

GitHub: weeknessback-ben/ios-flutter-ssl-bypass

一体化 Frida 工具,在越狱 iOS 设备上绕过 SSL 证书绑定并将忽略系统代理的应用流量重定向至 Burp Suite。

Stars: 0 | Forks: 0

# iOS SSL bypass + Burp 重定向工具包 这是一个基于 Frida 的一体化工具,用于将越狱 iOS 应用的 HTTPS 流量引入到 Burp Suite 中,即使在以下情况: - 应用针对自身硬编码的锚点集进行了证书绑定(例如调用 `SecTrustSetAnchorCertificatesOnly`),因此仅在 iOS “设置”应用中信任 Burp 的 CA 是不够的,**和/或** - 应用的网络栈完全忽略了 iOS 系统的 HTTP/HTTPS 代理设置 (已确认 Flutter/Dart 的 `dart:io` 存在此问题 —— 基于 Safari/CFNetwork 的 流量能正常识别系统代理,而 Dart 自带的 `HttpClient` 则不行),因此任何 VPN / `pf` 重定向 / Wi-Fi 代理配置都无法捕获该应用的流量。 它在目标应用自身的进程中结合了两个 Frida hook: 1. **SecTrust bypass** —— hook `Security` 模块中的 `SecTrustEvaluateWithError`、 `SecTrustGetTrustResult` 以及旧版的 `SecTrustEvaluate`,并强制它们返回成功。 2. **Burp 重定向** —— hook `libsystem_kernel.dylib` 中的 `connect()`,并在应用 尝试连接配置端口(默认为 80/443)时,将目标 `sockaddr_in` 原地重写为 Burp 的 IP:port。 完整的架构说明(每个 hook 的存在原因、时序图、字节级的 sockaddr 结构、设计权衡):**[`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md)**。 文件: - `ios_ssl_bypass_redirect.py` —— CLI 驱动程序(SSH 检查、frida-server 检查/启动、SSH 隧道、Frida 启动+hook)。 - `ios_ssl_bypass_redirect.js` —— Frida hook 脚本(基于模板,由 `.py` 驱动;也支持手动编辑并通过 `frida -l` 独立加载,只需 先自行替换 `__TOKEN__` 占位符即可)。 ## 前置条件 针对每台设备 / Burp 实例设置一次 —— 本工具不会自动化这些步骤: 1. **已在设备上安装并完全信任 Burp 的 CA 证书。** 在设备的 Wi-Fi 代理(或本工具,仅限重定向模式)已通过 Burp 路由的情况下,在设备上的 Safari 浏览器中访问 `http://burp/cert`,安装 配置文件,然后前往 **设置 → 通用 → 关于本机 → 证书信任 设置**,并为 PortSwigger CA 启用完全信任。 2. **Burp 监听器已启用“Support invisible proxying”** (Proxy → Proxy settings → 编辑监听器 → Request handling)。在此重定向设置中没有 `CONNECT` 方法 —— Burp 会根据 ClientHello 中的 TLS SNI 来确定真实的上游主机。 3. **笔记本电脑上已安装 `frida-tools`**,且版本与设备上已运行/可安装的 `frida-server` 版本匹配(或兼容)。 `frida --version` 显示的主版本号应与针对该设备运行 `frida-ps` 返回的主版本号一致。 4. **笔记本电脑上已安装 `sshpass`** (`apt install sshpass`)。 5. 设备与 Burp/笔记本电脑之间需要存在可路由的网络路径 (处于同一 Wi-Fi 子网最为简单)。需要设备的 SSH 访问权限 —— 越狱 默认用户为 `mobile`,密码为 `alpine`,除非已更改,否则 `sudo`/root 密码同样为 `alpine`。 ## 基本用法 ``` python3 ios_ssl_bypass_redirect.py \ --device-ip 192.168.1.100 \ --package com.example.targetapp \ --burp-ip 192.168.1.50 --burp-port 8080 ``` 此操作会通过 SSH 检查设备,确保 `frida-server` 正在运行(如果未运行,则以 root 身份启动),打开本地 SSH 隧道以连接 `frida-server`, 安装两个 hook 全新启动应用,并恢复其运行。在使用应用时保持其运行;按 Ctrl+C 停止(会干净地关闭 SSH 隧道)。 ## 使用场景 **默认 —— 在 80/443 上进行 bypass + 重定向(常见情况):** ``` python3 ios_ssl_bypass_redirect.py --device-ip 192.168.1.100 \ --package com.example.targetapp --burp-ip 192.168.1.50 ``` **仅重定向,无 SecTrust bypass** —— 应用未进行证书绑定,或者您已激活 其他 bypass 机制,仅需将流量路由至 Burp: ``` python3 ios_ssl_bypass_redirect.py --device-ip 192.168.1.100 \ --package com.example.app --burp-ip 192.168.1.50 --no-bypass ``` **仅 SecTrust bypass,无重定向** —— 应用已遵循 iOS 系统 代理(基于 CFNetwork/URLSession 的网络),因此将普通的 Wi-Fi 代理配置 指向 Burp 即可捕获流量,您只需处理证书绑定 bypass: ``` python3 ios_ssl_bypass_redirect.py --device-ip 192.168.1.100 \ --package com.example.app --burp-ip 192.168.1.50 --no-redirect ``` **非默认端口**(应用同时通过 TLS 与自定义端口上的内部服务进行通信,例如 8443): ``` python3 ios_ssl_bypass_redirect.py --device-ip 192.168.1.100 \ --package com.example.app --burp-ip 192.168.1.50 --redirect-ports 80,443,8443 ``` **自定义 SSH 凭据 / 已在非默认端口上运行的 frida-server:** ``` python3 ios_ssl_bypass_redirect.py --device-ip 192.168.1.100 \ --device-user mobile --device-password hunter2 --root-password hunter2 \ --frida-port 27043 --local-port 27043 \ --package com.example.app --burp-ip 192.168.1.50 ``` **诊断 / 详细模式** —— 打印应用发出的每一次 `connect()`(不仅限于 被重定向的连接),并记录每次 `SecTrustEvaluateWithError` 调用在被强制修改前的*原始*返回值。这在流量未显示在 Burp 中,且您需要判断 hook 是否针对相关连接触发时非常有用: ``` python3 ios_ssl_bypass_redirect.py --device-ip 192.168.1.100 \ --package com.example.app --burp-ip 192.168.1.50 --verbose ``` ## 参数参考 | 参数 | 默认值 | 用途 | |---|---|---| | `--device-ip` | *(必填)* | iPhone IP (Wi-Fi 或 USB 中继) | | `--device-user` | `mobile` | SSH 用户 | | `--device-password` | `alpine` | SSH 密码 | | `--root-password` | 同 `--device-password` | 如果需要(重新)启动 frida-server,用于 `sudo` | | `--ssh-port` | `22` | | | `--frida-port` | `27042` | 设备本地的 frida-server 监听端口 | | `--local-port` | 同 `--frida-port` | SSH 隧道的本地端口 | | `--frida-server-path` | 自动检测 | 设备上 frida-server 的路径 | | `--package` | *(必填)* | 要启动的 bundle ID,例如 `com.example.targetapp` | | `--burp-ip` | *(必填)* | Burp 监听器地址 | | `--burp-port` | `8080` | Burp 监听器端口 | | `--redirect-ports` | `80,443` | 要重定向的端口逗号列表 | | `--no-redirect` | 关闭 | 禁用 connect() 重定向 hook | | `--no-bypass` | 关闭 | 禁用 SecTrust bypass hook | | `-v, --verbose` | 关闭 | 记录透传连接 + 原始 SecTrust 返回值 | ## 故障排除 - **`SSH check failed`** —— 验证 `--device-ip`/凭据,并确保设备与 笔记本电脑能在 `--ssh-port` 上互通(处于同一 Wi-Fi 子网最为简单; 开启了客户端隔离的跨子网 Wi-Fi 或 VLAN 划分会无声地丢弃这些 连接)。 - **`frida-server binary not found on device`** —— 自行安装/复制 与您的 `frida-tools` 版本匹配的 `frida-server` 构建版本(在笔记本上 检查 `frida --version`),或指定 `--frida-server-path`。 - **Hook 已安装,但在 Burp 中毫无显示**,尽管笔记本上的 `ss -tn` 显示 设备到 `--burp-ip:--burp-port` 存在带有排队数据的 `ESTABLISHED` 连接: - 加上 `--verbose` 重新运行。如果看到 `[SecTrustEvaluateWithError] original=1`,说明应用已成功信任 Burp 的证书(CA 信任设置 正确)—— 此时缺少历史记录并不是绑定或 重定向问题。 - 检查 Burp 的 **Dashboard → Event log**(所有级别,包含 Debug)以查看 目标主机 —— `... is using HTTP/2` 的调试信息确认 Burp 已完成 TLS 握手并识别了协议,即使 HTTP 历史记录中的请求/响应 与您预期的不符。 ## 已知限制 - 仅限 IPv4 (`AF_INET` sockaddr 解析) —— 重定向 hook 不支持 IPv6。 - 每次运行都会全新启动应用(从不附加到已运行的 实例) —— 这是刻意为之,在测试中,附加到正在运行的进程 可靠性较低。 - 不会在设备上安装或信任 Burp 的 CA,也不会开启 Burp 的“Support invisible proxying”设置 —— 这两者都是一次性手动设置 步骤(见前置条件)。
标签:Docker支持, Frida, iOS安全, SSL Pinning绕过, 云资产清单, 内存分配, 数据可视化, 流量劫持, 逆向工具, 逆向工程