arkanzasfeziii/Pulse
GitHub: arkanzasfeziii/Pulse
Pulse 是一款移动端攻击框架,覆盖 Android 与 iOS 应用的静态分析、动态插桩、SSL Pinning 绕过、组件利用与流量拦截,帮助安全测试人员从 APK 到完整攻击链实现端到端的安全评估。
Stars: 0 | Forks: 0
# Pulse — 移动攻击框架
**针对 Android 和 iOS 目标的静态分析、动态插桩和流量拦截 —— 从 APK 到完整的攻击链。**
## 威胁模型
每次移动端测试都始于同一个问题:实际的攻击面究竟是什么样的?Pulse 会对它进行系统性梳理。
| 攻击面 | Pulse 发现的内容 | 风险 |
|---|---|
| `debuggable=true` 的 APK | 通过 ADB 获得完整的 runtime 访问权限 —— 附加调试器、dump 内存、修改执行流程 | 严重 |
| 无权限的导出组件 | 设备上的任何应用均可访问的 Activities、services、receivers 和 content providers | 高危 |
| 二进制字符串中的硬编码 API 密钥 | AWS 密钥 (`AKIA...`)、Google API 密钥 (`AIza...`)、Firebase URL、内置于 DEX 中的 JWT | 严重 |
| 缺失或可绕过的 SSL pinning | 仅凭一个 Frida hook 即可失效的证书校验 —— OkHttp、Flutter、React Native、Xamarin | 高危 |
| `usesCleartextTraffic=true` | 生产环境中的 HTTP endpoint、混合内容、缺失的 network security config | 高危 |
| 接受任意数据的自定义 URL scheme | 接受未校验输入的 Deeplink —— intent 重定向、参数注入 | 中危 |
| 不安全的 iOS ATS 异常 | `NSAllowsArbitraryLoads`、弱 TLS 版本、特定域名的 HTTP 异常 | 高危 |
| 未受保护的 content provider | 无需权限即可查询的 `content://` URI —— 数据窃取、SQL 注入 | 严重 |
### MITRE ATT&CK 移动端映射
| 技术 | ID | Pulse 模块 |
|---|---|---|
| 输入捕获 | T1417 | `frida`(剪贴板监控,SharedPreferences dump) |
| 存储的应用数据 | T1409 | `static`(字符串提取,backup 标记),`frida`(SQLite 拦截) |
| 系统网络连接发现 | T1421 | `traffic`(API endpoint 提取,proxy 配置) |
| 系统网络配置发现 | T1422 | `static`(network security config),`traffic`(proxy 检测) |
| 应用层协议 | T1437 | `traffic`(HTTP 分析,mitmproxy addon),`sslpin`(pinning 绕过) |
| 窃听不安全的网络通信 | T1439 | `sslpin`(通用绕过),`traffic`(明文检测) |
**覆盖的战术:** TA0028(收集),TA0030(网络效果),TA0032(发现)
### CWE 覆盖范围
| CWE | 描述 | 检测模块 |
|---|---|---|
| CWE-312 | 敏感信息的明文存储 | `static`, `frida` |
| CWE-319 | 敏感信息的明文传输 | `traffic`, `static` |
| CWE-926 | Android 应用组件的不当导出 | `static`, `intent` |
| CWE-939 | 自定义 URL Scheme 处理程序中的授权不当 | `intent`, `ios` |
| CWE-295 | 证书校验不当 | `sslpin`, `traffic` |
## 为什么会有这个工具
移动应用处理的数据与其对应的 Web 应用一样敏感 —— 身份验证 token、支付详情、个人信息、内部 API endpoint —— 但对其进行测试的严格程度却远远不及。二进制文件被分发到用户的设备上。网络流量经过开发者无法控制的基础设施。操作系统提供了 Web 应用完全无需担忧的进程间通信通道。
大多数团队执行了 Web 应用渗透测试,就声称移动应用已经“覆盖测试”了。其实并没有。APK 中包含在 Web 前端永远不会出现的硬编码机密。Manifest 导出了接受任意 intent 的组件。SSL pinning 实现只需一个十行的 Frida 脚本就能被攻破。Deeplink 处理程序在不进行校验的情况下就信任 URL 参数。
Pulse 之所以存在,是因为这些发现需要专门的工具支持,它们必须了解 Android manifest 格式、Frida 插桩 API、iOS plist 结构,以及针对每种 SSL pinning 框架的具体绕过技术。它能生成你所需要的确切脚本 —— 可直接运行,而不是伪代码。
## 功能
### 模块 1:静态分析 (`static`)
将 APK 作为 ZIP 压缩包解析,解码二进制的 AndroidManifest.xml,并在不执行应用的情况下提取安全相关数据。
| 功能 | 提取内容 |
|---|---|
| Manifest 解析 | 包名、版本、minSdkVersion、targetSdkVersion、所有声明的组件 |
| 权限审计 | 标记危险权限(CAMERA、RECORD_AUDIO、SEND_SMS、READ_CONTACTS、ACCESS_FINE_LOCATION 等) |
| 导出组件检测 | 带有 `exported=true` 且没有 `permission` 属性的 Activities、services、receivers 和 providers |
| 安全标记分析 | `debuggable`、`allowBackup`、`usesCleartextTraffic`、`networkSecurityConfig` |
| 字符串提取 | 硬编码的 URL、API 密钥(AIza、AKIA、sk-、ghp_)、私有 IP、电子邮件、Firebase endpoint |
| 证书分析 | 来自 APK 签名证书的 SHA-256 指纹、颁发者、有效期 |
| DEX 分析 | 类/方法计数、混淆检测(如 `La/b/c;` 的短类路径) |
### 模块 2:Frida Hook 生成 (`frida`)
生成可直接用于 Frida 插桩的 JavaScript 文件。每个脚本都针对特定的攻击向量,并包含运行它的 `frida -U -f -l script.js` 命令。
| 脚本 | 用途 |
|---|---|
| `frida_method_trace.js` | Hook 任何方法 —— 记录参数和返回值 |
| `frida_return_bypass.js` | 强制方法返回 true/false |
| `frida_root_bypass.js` | 绕过 root 检测(Runtime.exec、File.exists、Build.TAGS) |
| `frida_shared_prefs.js` | Dump 所有 SharedPreferences 键值对 |
| `frida_sqlite_intercept.js` | 记录所有 rawQuery 和 execSQL 调用 |
| `frida_crypto_extract.js` | 从 Cipher.init 和 SecretKeySpec 中提取加密密钥 |
| `frida_network_log.js` | 记录 OkHttp/HttpURLConnection 请求及其标头 |
| `frida_clipboard_monitor.js` | 监控剪贴板写入操作 |
### 模块 3:SSL Pinning 绕过 (`sslpin`)
生成针对特定框架的绕过脚本和 proxy 配置指南。
| 目标框架 | 绕过技术 |
|---|---|
| OkHttp3 | Hook `CertificatePinner.check`,直接返回而不抛出异常 |
| Android WebView | Hook `onReceivedSslError`,调用 `handler.proceed()` |
| 自定义 TrustManager | 用绕过实现替换 `X509TrustManager` |
| Flutter/Dart | Hook BoringSSL 中的 `ssl_crypto_x509_session_verify_cert_chain` |
| React Native | Hook `OkHttpClientProvider.createClient` |
| Xamarin | Hook `ServicePointManager.ServerCertificateValidationCallback` |
| 通用 | 组合 TrustManager + CertificatePinner + HostnameVerifier 绕过 |
此外还生成 Objection 命令(`android sslpinning disable`)以及 Burp Suite/mitmproxy CA 证书安装指南。
### 模块 4:Intent 与 Deeplink 利用 (`intent`)
解析 manifest 以获取所有进程间通信入口点,并生成 ADB 命令对其进行利用。
| 功能 | 输出 |
|---|---|
| 导出 Activity 枚举 | `adb shell am start -n /` 命令 |
| Deeplink 测试 | 带有注入 payload 的 `adb shell am start -a android.intent.action.VIEW -d "scheme://host/path"` |
| 广播注入 | 针对未受保护 receiver 的 `adb shell am broadcast` 命令 |
| Content provider 枚举 | 带有 SQL 注入测试用例的 `content://` URI 查询 |
| Intent 重定向检测 | 标记名称中带有 redirect/forward/dispatch 的导出 Activity |
| PendingIntent 分析 | 标记可能创建隐式 PendingIntent 的导出消息服务 |
### 模块 5:iOS 分析 (`ios`)
提取并分析 IPA 内容 —— Info.plist、entitlements、内嵌框架和二进制字符串。
| 功能 | 发现内容 |
|---|---|
| Info.plist 解析 | Bundle ID、版本、最低 iOS 版本、请求的权限及其用途描述 |
| ATS 异常检测 | `NSAllowsArbitraryLoads`、特定域的不安全 HTTP 异常、弱 TLS 版本 |
| Entitlements 提取 | App groups、keychain access groups、推送通知环境 |
| 二进制字符串分析 | 来自 Mach-O 二进制文件的 URL、API 密钥、Firebase/AWS endpoint |
| 框架检测 | Alamofire、AFNetworking、Firebase、Realm 以及其他 16 种已知框架 |
| URL scheme 枚举 | 来自 `CFBundleURLTypes` 的自定义 scheme,附带 `xcrun simctl openurl` 测试命令 |
### 模块 6:流量拦截分析 (`traffic`)
生成 proxy 配置、流量分析脚本和合规性映射。
| 功能 | 输出 |
|---|---|
| Proxy 配置 | ADB proxy 设置、WiFi 手动 proxy、iptables 透明 proxy、iOS 手动 proxy |
| HTTP 模式分析 | 明文 HTTP endpoint 检测,从 APK 字符串中标记混合内容 |
| API endpoint 提取 | 基于正则表达式提取 `/api/`、`/rest/`、`/graphql`、`/auth/`、`/oauth/` 路径 |
| JWT 分析器 | 独立的 Python 脚本 —— 解码标头/payload,检查算法,验证过期时间 |
| 敏感数据检测器 | 流量中的信用卡、社会安全号码 (SSN)、电子邮件、电话号码、API 密钥、Bearer token |
| mitmproxy addon | 拦截所有流量并实时标记敏感数据的即插即用型 addon |
| OWASP MASVS 映射 | 将每个发现类别映射到 MASVS 验证要求 |
## 架构
```
┌─────────────────────────────────────────────────────────────────┐
│ pulse.py │
│ │
│ ┌──────────┐ ┌───────────────────────────────────────────┐ │
│ │ CLI / │ │ EngagementContext │ │
│ │ argparse │──│ apk_path, package_name, proxy_host/port, │ │
│ │ │ │ results[], frida_scripts[], output_dir │ │
│ └──────────┘ └───────────────┬───────────────────────────┘ │
│ │ │
│ ┌────────────────────────┼────────────────────────┐ │
│ │ │ │ │
│ ┌────▼─────┐ ┌──────────────▼──────┐ ┌─────────────▼───┐ │
│ │ Static │ │ Frida SSL Pin │ │ Intent iOS │ │
│ │ Analysis │ │ Hooks Bypass │ │ Exploit Anlys │ │
│ └────┬─────┘ └──────────┬──────────┘ └────────┬────────┘ │
│ │ │ │ │
│ │ ┌──────────▼──────────┐ │ │
│ │ │ Traffic Module │ │ │
│ │ └──────────┬──────────┘ │ │
│ │ │ │ │
│ ┌────▼───────────────────▼───────────────────────▼────────┐ │
│ │ AttackResult[] │ │
│ │ module | action | status | severity | notes | ts │ │
│ └─────────────────────────┬───────────────────────────────┘ │
│ │ │
│ ┌────────▼────────┐ │
│ │ JSON Export / │ │
│ │ Rich Console │ │
│ └─────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
Input: APK/IPA file ──► Binary XML parser ──► Module pipeline
Output: pulse_output/ ──► Frida .js scripts + exploit .sh + JSON report
```
## 攻击流程
使用 Pulse 进行典型的移动端测试遵循以下顺序:
1. **获取 APK** —— 从设备拉取(`adb shell pm path com.target.app && adb pull `)或从应用商店镜像下载。
2. **静态分析** —— 运行 `pulse --apk target.apk --modules static` 以提取 manifest,标记危险权限,识别导出组件,并发现硬编码的机密。
3. **生成 Frida hook** —— 运行 `--modules frida` 以生成插桩脚本。将 `frida-server` 推送到设备,附加到目标进程,并加载生成的 `.js` 文件。
4. **绕过 SSL pinning** —— 运行 `--modules sslpin` 以生成特定于框架的绕过脚本。在设备上安装你的 proxy 的 CA 证书。通过 Frida 加载相应的绕过脚本。
5. **利用 Intent 和 Deeplink** —— 运行 `--modules intent` 生成 ADB 命令,触发每个导出的 Activity,使用注入 payload 测试每个注册的 deeplink,并探测 content provider 的数据泄露。
6. **拦截流量** —— 运行 `--modules traffic` 生成 proxy 配置命令和 mitmproxy addon。通过你的 proxy 路由设备流量并监控传输中的敏感数据。
7. **分析 iOS 目标** —— 对于 IPA 文件,运行 `--modules ios` 解析 Info.plist,检测 ATS 异常,枚举 URL scheme,并从二进制文件中提取机密。
8. **导出结果** —— 添加 `--output report.json` 以生成包含严重性分类和 OWASP MASVS 映射的结构化 JSON 报告。
## 用法
```
# 安装依赖
pip install -r requirements.txt
# Android APK 完整分析
python pulse.py --apk target.apk --modules all --output report.json
# 仅静态分析 — 无需设备
python pulse.py --apk target.apk --modules static -y
# 为特定 package 生成 Frida 脚本
python pulse.py --apk target.apk --modules frida,sslpin --package com.target.app -y
# 使用自定义输出目录进行 Intent exploitation
python pulse.py --apk target.apk --modules intent --output-dir ./engagement_output -y
# iOS IPA 分析
python pulse.py --apk target.ipa --modules ios -y
# 使用自定义 proxy 进行流量分析
python pulse.py --modules traffic --proxy-host 192.168.1.100 --proxy-port 8082 -y
# Android 综合测试
python pulse.py --apk target.apk --modules static,frida,sslpin,intent,traffic --output full_report.json
# 跳过法律警告以供脚本化使用
python pulse.py --apk target.apk --modules all -y --output report.json
```
### 模块选择
| 标记 | 模块 |
|---|---|
| `--modules all` | 运行所有 6 个模块 |
| `--modules static` | 仅进行 APK 静态分析 |
| `--modules frida` | 生成 Frida 插桩脚本 |
| `--modules sslpin` | SSL pinning 绕过脚本 |
| `--modules intent` | Intent 和 deeplink 漏洞利用生成 |
| `--modules ios` | iOS IPA 分析 |
| `--modules traffic` | 流量拦截设置与分析 |
| `--modules static,frida,sslpin` | 使用逗号组合任意模块 |
## 输出
### 终端
```
____ __
/ __ \__ __/ /___ ___
/ /_/ / / / / / __ / _ \
/ ____/ /_/ / /__ / __/
/_/ \__,_/_/____/\___/
Pulse Framework v1.0.0 — Mobile Offensive Framework
Author: arkanzasfeziii
[INFO] Selected modules: static, frida, sslpin, intent, traffic
[INFO] Target: target.apk
[INFO] Output directory: pulse_output
━━━ Module: Static Analysis ━━━
[INFO] Analyzing APK: target.apk
[INFO] Package: com.example.bankapp
[INFO] Version: 3.2.1 (code 45)
[INFO] SDK — min: 21, target: 33
[INFO] Components — activities: 24, services: 8, receivers: 5, providers: 3
[OK] [static] manifest_parse: Manifest parsed — 24 activities, 8 services, 5 receivers, 3 providers
[CRIT] [static] dangerous_permission: Dangerous permission: android.permission.ACCESS_FINE_LOCATION
[CRIT] [static] dangerous_permission: Dangerous permission: android.permission.CAMERA
[CRIT] [static] dangerous_permission: Dangerous permission: android.permission.READ_CONTACTS
[CRIT] [static] exported_component: Exported activity without permission protection: .ui.DeeplinkActivity
[CRIT] [static] exported_component: Exported service without permission protection: .sync.DataSyncService
[CRIT] [static] debuggable: android:debuggable=true — full runtime access via ADB
[CRIT] [static] allow_backup: android:allowBackup=true — app data extractable via adb backup
[WARN] [static] hardcoded_urls: Found 14 hardcoded URLs
[INFO] URL: https://api.example.com/v2/auth
[INFO] URL: https://bankapp-prod.firebaseio.com
[INFO] URL: http://10.0.2.15:8080/debug
[CRIT] [static] hardcoded_secret: Google API Key: AIzaSyDQX8f29a...
[CRIT] [static] firebase_url: Firebase URL: https://bankapp-prod.firebaseio.com
━━━ Module: Frida Hook Generation ━━━
[INFO] Generating Frida scripts for package: com.example.bankapp
[OK] [frida] script_method_trace: Generated: frida_method_trace.js — Method tracing
[OK] [frida] script_root_bypass: Generated: frida_root_bypass.js — Root detection bypass
[OK] [frida] script_crypto_extract: Generated: frida_crypto_extract.js — Crypto key extraction
[OK] Generated 8 Frida scripts in pulse_output/frida_scripts/
━━━ Module: SSL Pinning Bypass ━━━
[OK] [sslpin] bypass_ssl_universal_bypass.js: Universal SSL pinning bypass
[OK] [sslpin] bypass_ssl_okhttp_bypass.js: OkHttp3 CertificatePinner bypass
[OK] [sslpin] bypass_ssl_flutter_bypass.js: Flutter/Dart BoringSSL bypass
[OK] [sslpin] objection_cmds: Objection commands written
[OK] [sslpin] proxy_setup: Proxy setup guide generated
━━━ Module: Intent & Deeplink Exploitation ━━━
[INFO] Intent filters: 12
[INFO] Actions: 8, Categories: 5
[INFO] URL schemes: bankapp, https
[WARN] [intent] custom_scheme: Custom URL scheme registered: bankapp://
[CRIT] [intent] exported_activities: 3 exported activities — ADB launch commands generated
[CRIT] [intent] deeplinks: 4 deeplinks found — test commands generated
[CRIT] [intent] unprotected_provider: Exported provider without permission: com.example.bankapp.provider
━━━ Engagement Summary ━━━
┌──────────┬───────┐
│ Severity │ Count │
├──────────┼───────┤
│ CRITICAL │ 11 │
│ HIGH │ 4 │
│ MEDIUM │ 3 │
│ LOW │ 2 │
│ INFO │ 14 │
└──────────┴───────┘
Total findings: 34
Generated scripts: 15
Output directory: pulse_output
[OK] Report exported to report.json
Pulse Framework v1.0.0 — engagement complete
```
### JSON 报告结构
```
{
"tool": "Pulse Framework",
"version": "1.0.0",
"timestamp": "2026-06-20T14:32:00+00:00",
"target": {
"apk_path": "target.apk",
"package_name": "com.example.bankapp",
"proxy": "127.0.0.1:8080"
},
"summary": {
"total_findings": 34,
"critical": 11,
"high": 4,
"medium": 3,
"low": 2,
"info": 14
},
"findings": [
{
"module": "static",
"action": "debuggable",
"status": "critical",
"severity": "critical",
"notes": "android:debuggable=true — full runtime access via ADB",
"timestamp": "2026-06-20T14:32:01+00:00"
}
],
"generated_scripts": [
"pulse_output/frida_scripts/frida_root_bypass.js",
"pulse_output/ssl_bypass/ssl_universal_bypass.js"
]
}
```
### 生成的文件树
```
pulse_output/
├── frida_scripts/
│ ├── frida_method_trace.js
│ ├── frida_return_bypass.js
│ ├── frida_root_bypass.js
│ ├── frida_shared_prefs.js
│ ├── frida_sqlite_intercept.js
│ ├── frida_crypto_extract.js
│ ├── frida_network_log.js
│ ├── frida_clipboard_monitor.js
│ └── SETUP.md
├── ssl_bypass/
│ ├── ssl_universal_bypass.js
│ ├── ssl_okhttp_bypass.js
│ ├── ssl_webview_bypass.js
│ ├── ssl_trustmanager_bypass.js
│ ├── ssl_flutter_bypass.js
│ ├── ssl_reactnative_bypass.js
│ ├── ssl_xamarin_bypass.js
│ ├── objection_commands.sh
│ └── proxy_setup.md
├── intent_exploits/
│ ├── launch_activities.sh
│ ├── deeplink_tests.sh
│ ├── broadcast_injection.sh
│ └── content_providers.sh
├── ios_analysis/
│ └── ios_deeplinks.sh
├── traffic_analysis/
│ ├── proxy_config.sh
│ ├── api_endpoints.txt
│ ├── jwt_analyzer.py
│ ├── sensitive_data_detector.py
│ ├── mitmproxy_addon.py
│ └── masvs_mapping.md
└── report.json
```
## 法律声明
此工具专为**授权的安全评估渗透测试**设计和使用,前提是已获得系统所有者的明确书面许可。
未经授权访问计算机系统、网络和移动应用在适用法律下是非法的,包括但不限于《计算机欺诈和滥用法》(CFAA)、英国《计算机滥用法》以及其他司法管辖区的同等立法。
使用 Pulse 即表示你承认:
- 你拥有测试目标系统的明确书面授权
- 你了解所采用技术的潜在影响
- 你将负责任地处理所有发现和生成的脚本
- 你将遵守所在组织的交战规则 (ROE)
如果你没有获得适当的授权,**请勿使用此工具**。
标签:Android安全, Docker支持, Frida, iOS安全, SSL绕过, 云安全监控, 云资产清单, 移动端安全, 逆向工具, 逆向工程, 静态分析