Skip to main content

android-app-pentesting

Android 应用渗透测试方法论。涵盖 APK 静态分析(反编译/代码审计/Manifest分析)、动态分析(Frida Hook/SSL Pinning绕过/流量抓取)、数据存储安全、组件安全(Activity/Service/Provider/Receiver)、WebView 安全、Root 检测绕过。当 Agent 需要测试 Android 应用安全、分析 APK 文件、或绕过应用保护机制时触发。

Source facts

Repository
wgpsec/AboutSecurity
Last source activity
May 21, 2026 at 08:53
Detected SKILL.md language
Chinese
Stars
1,760
Forks
243

Install options

The review-first prompt is selected by default. You can switch to a direct command or download a local copy.

Review the source files

Read SKILL.md and any companion files shown by SkillsMP before deciding whether to install.

File Explorer
4 files

Showing SKILL.md

SKILL.md
Source instructions · Read-only preview
name
android-app-pentesting
description
Android 应用渗透测试方法论。涵盖 APK 静态分析(反编译/代码审计/Manifest分析)、动态分析(Frida Hook/SSL Pinning绕过/流量抓取)、数据存储安全、组件安全(Activity/Service/Provider/Receiver)、WebView 安全、Root 检测绕过。当 Agent 需要测试 Android 应用安全、分析 APK 文件、或绕过应用保护机制时触发。
metadata
{"tags":["android","apk","frida","jadx","移动安全","ssl-pinning","adb","组件安全"],"category":"mobile"}
# Android 应用渗透测试方法论 > **阶段流**: 环境准备 → APK静态分析 → 动态分析(Frida) → 组件安全测试 → 数据存储安全 → 网络通信安全 → 保护机制绕过 ## 深入参考 - APK 静态分析详细命令与 Manifest 审计要点 → [references/android-static-analysis.md](references/android-static-analysis.md) - Frida Hook 脚本与 SSL Pinning 绕过实战 → [references/android-frida-dynamic.md](references/android-frida-dynamic.md) - React Native / Flutter / native so / RMS / Appium 运行时分析 → [references/android-frameworks-and-runtime.md](references/android-frameworks-and-runtime.md) --- ## Phase 0: 环境准备 ### 设备/模拟器选择 ``` 测试设备选择? ├─ 真机(推荐 Pixel 系列) │ ├─ Magisk 刷入 → systemless root │ ├─ 启用 Zygisk + DenyList → Root 隐藏 │ └─ 保留原始 boot.img → OTA 恢复 ├─ Android Studio 模拟器 │ ├─ x86 镜像 + ARM 翻译层(速度优先) │ └─ Google APIs 镜像(需 Play Store 测试时) └─ Genymotion(免费个人版 + VirtualBox) └─ Bridge 网络模式 → 方便从其他 VM 连接 ``` ### 核心工具链 | 工具 | 用途 | 安装 | |------|------|------| | adb | 设备通信/安装/调试 | Android SDK Platform Tools | | jadx / jadx-gui | APK 反编译为 Java | `brew install jadx` | | apktool | 反编译为 Smali / 资源提取 | `brew install apktool` | | Frida + frida-tools | 动态 Hook / 运行时分析 | `pip install frida-tools` | | objection | Frida 自动化封装 | `pip install objection` | | Drozer | 组件安全测试 | GitHub Release | | Burp Suite | 流量拦截 | PortSwigger | | MobSF | 自动化静态+动态分析 | Docker 部署 | | APKiD | 识别编译器/加壳/混淆 | `pip install apkid` | ### APK 获取 ```bash # 从设备提取 adb shell pm list packages | grep target adb shell pm path com.target.app adb pull /data/app/com.target.app-.../base.apk # 多 Split APK 合并 mkdir splits adb shell pm path com.target.app | cut -d ':' -f 2 | xargs -n1 -I{} adb pull {} splits/ java -jar APKEditor.jar m -i splits/ -o merged.apk java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed # 在线下载 # APKPure / APKMirror / APKCombo / apkd (GitHub) # justapk: pip install justapk justapk download com.target.app justapk convert app.xapk -o output/ ``` --- ## Phase 1: APK 静态分析 ### 反编译与代码审计 ``` 反编译路径选择? ├─ 需要 Java 源码审计 → jadx -d output/ target.apk ├─ 需要修改并重打包 → apktool d target.apk -o decoded/ ├─ React Native 应用 → 解压 assets/index.android.bundle ├─ Xamarin 应用 → 解压 assemblies/ → dnSpy / ILSpy └─ 加壳应用 → APKiD 识别壳类型 → 对应脱壳方案 ``` ```bash # jadx 反编译 jadx -d jadx_output/ target.apk # 搜索敏感信息 grep -rn "password\|api_key\|secret\|token\|firebase" jadx_output/ # apktool 反编译(Smali 级别) apktool d target.apk -o apktool_output/ # APKiD 识别保护方案 apkid target.apk ``` ### Manifest.xml 审计要点 ```bash # 提取 Manifest aapt dump xmltree target.apk AndroidManifest.xml ``` 关键检查项: | 属性 | 风险 | 影响 | |------|------|------| | `android:debuggable="true"` | 高 | 可附加调试器/读取应用数据 | | `android:allowBackup="true"` | 中 | adb backup 可提取应用数据 | | `android:exported="true"` | 高 | 组件可被外部调用 | | `android:usesCleartextTraffic="true"` | 中 | 允许明文 HTTP | | `targetSdkVersion < 24` | 低 | 默认信任用户安装的 CA;>=24 时默认仅信任系统 CA,需检查 Network Security Config | ### 字符串与密钥搜索 ```bash # APK 中的 URL apkurlgrep -a target.apk # 泄露的密钥/凭据 apkleaks -f target.apk # Firebase 数据库检测 grep -rn "firebaseio.com" jadx_output/ # 尝试访问: curl https://xxx.firebaseio.com/.json ``` ### 自动化静态分析 ```bash # MobSF 静态分析 docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest # 上传 APK → 自动生成报告 # mariana-trench (Facebook) # 基于 source-sink 规则的漏洞扫描 mariana-trench --apk-path target.apk --output results/ ``` --- ## Phase 2: 动态分析 (Frida) ### Frida 基础操作 ```bash # 查看运行中的应用 frida-ps -Uai # 附加到进程 frida -U -f com.target.app # 使用脚本注入 frida -U -f com.target.app -l hook.js ``` ### 常用 Hook 场景 ``` 动态分析目标? ├─ SSL Pinning 绕过 → Phase 6 详述 ├─ Root 检测绕过 → Phase 7 详述 ├─ 加密算法监控 → Hook javax.crypto.Cipher ├─ 敏感 API 监控 → Hook 文件/网络/短信/位置 API ├─ 生物认证绕过 → Hook BiometricPrompt └─ 内存中搜索敏感数据 → Fridump ``` ### 内存 Dump 与搜索 ```bash # Fridump 内存提取 python3 fridump3.py -u com.target.app # 搜索敏感数据 strings dump/* | grep -E "password|token|Bearer" # 搜索助记词 strings dump/* | grep -E "^[a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+$" ``` ### Keystore 审计 ```bash # Hook Keystore 操作 frida -U -f com.target.app -l tracer-cipher.js # 脚本来源: github.com/WithSecureLabs/android-keystore-audit ``` --- ## Phase 3: 组件安全测试 ### 组件暴露面枚举 ```bash # Drozer 枚举 dz> run app.package.attacksurface com.target.app # 输出: X activities exported, Y services exported, ... ``` ### Activity 安全 ``` Exported Activity 测试? ├─ 直接启动 → adb shell am start -n com.target.app/.SensitiveActivity ├─ 是否绕过认证直接访问敏感页面? │ ├─ 是 → 认证绕过漏洞 │ └─ 否 → 检查 Intent 参数注入 ├─ Activity 是否返回敏感数据? → setResult() 泄露 └─ Tapjacking 测试 → filterTouchesWhenObscured / onFilterTouchEventForSecurity / overlay 遮挡触摸处理 ``` ### Content Provider 安全 ```bash # 枚举 Provider dz> run app.provider.info -a com.target.app # SQL 注入测试 dz> run app.provider.query content://com.target.app.provider/users --projection "* FROM sqlite_master--" # 路径穿越测试 dz> run app.provider.read content://com.target.app.provider/../../../../etc/hosts # 文件 Provider 检查 dz> run scanner.provider.traversal -a com.target.app ``` ### Service / Broadcast Receiver ```bash # Service 枚举与交互 dz> run app.service.info -a com.target.app dz> run app.service.start --action com.target.app.ACTION --component com.target.app/.MyService # Broadcast 测试 dz> run app.broadcast.info -a com.target.app dz> run app.broadcast.send --action com.target.app.CUSTOM_ACTION --extra string data "test" ``` ### Deep Link / URL Scheme ```bash # 枚举 scheme grep -rn "android:scheme" apktool_output/AndroidManifest.xml # 触发 deep link adb shell am start -a android.intent.action.VIEW -d "scheme://hostname/path?param=value" # 检查点: # 1. 参数是否接受路径穿越 → ../../unwanted-endpoint # 2. 是否传递敏感数据(密码/token)通过 URL 参数 # 3. 是否存在 Open Redirect ``` --- ## Phase 4: 数据存储安全 ### 检查清单 ``` 数据存储位置? ├─ SharedPreferences → /data/data/pkg/shared_prefs/*.xml │ └─ 是否存储明文密码/token? ├─ SQLite 数据库 → /data/data/pkg/databases/*.db │ └─ 是否加密? 密钥是否硬编码? ├─ 内部存储 → /data/data/pkg/files/ │ └─ MODE_WORLD_READABLE/WRITABLE? ├─ 外部存储 → /sdcard/ (全局可读写) │ └─ 是否存储敏感数据? ├─ Keystore → Android Keystore System │ └─ 密钥是否绑定设备? 是否需要认证? └─ 后台截图 → /data/system_ce/0/snapshots/ └─ FLAG_SECURE 是否设置? ``` ```bash # 检查 SharedPreferences adb shell run-as com.target.app cat /data/data/com.target.app/shared_prefs/*.xml # 检查数据库 adb shell run-as com.target.app ls /data/data/com.target.app/databases/ # 拉取并用 sqlite3 检查 adb pull /data/data/com.target.app/databases/app.db sqlite3 app.db ".tables" sqlite3 app.db ".schema users" sqlite3 app.db "SELECT * FROM users;" # 检查文件权限 adb shell run-as com.target.app ls -la /data/data/com.target.app/files/ ``` --- ## Phase 5: 网络通信安全 ### 流量抓取配置 ``` 流量抓取方案? ├─ 应用 targetSdkVersion < 24 → 默认信任用户安装的 CA,可直接设置 WiFi 代理到 Burp ├─ 应用 targetSdkVersion >= 24 → 默认不信任用户 CA,需检查/修改 Network Security Config │ ├─ 修改 network_security_config.xml 信任 user certificates │ └─ 重打包签名安装,或把 Burp CA 装入系统证书区(需 root) ├─ Flutter 应用 → 可能使用独立 TLS/CA 逻辑,需额外处理 │ └─ 参考 flutter SSL pinning bypass └─ 非 HTTP 流量 → tcpdump / iptables 转发 ``` ```bash # 安装 Burp CA 到系统(需 root) # 导出 Burp CA → DER 格式 → 转 PEM openssl x509 -inform DER -in cacert.der -out cacert.pem # 计算 hash HASH=$(openssl x509 -inform PEM -subject_hash_old -in cacert.pem | head -1) cp cacert.pem /system/etc/security/cacerts/${HASH}.0 chmod 644 /system/etc/security/cacerts/${HASH}.0 # 修改 network_security_config.xml(targetSdkVersion >= 24 时常见) # 在 res/xml/network_security_config.xml 中添加: # <trust-anchors><certificates src="user" /></trust-anchors> ``` ### SSL Pinning 检测与绕过 ``` SSL Pinning 类型? ├─ OkHttp CertificatePinner → Frida Hook ├─ 自定义 TrustManager → Frida Hook ├─ Network Security Config → 修改 XML 重打包 ├─ WebView SSL 处理 → Hook WebViewClient └─ 未知实现 → SSLPinDetect 静态扫描定位 ``` ```bash # 静态检测 Pinning 实现 python sslpindetect.py -f target.apk -a apktool.jar # apk-mitm 自动绕过(无需 root) npx apk-mitm target.apk # objection 绕过 objection --gadget com.target.app explore --startup-command "android sslpinning disable" # Frida 绕过(通用脚本) frida -U -f com.target.app -l ssl-pinning-bypass.js ``` --- ## Phase 6: 保护机制绕过 ### Root 检测绕过 ``` Root 检测机制? ├─ 文件检查 (/su, /system/xbin/su, Cydia 等) │ └─ Magisk DenyList 隐藏 ├─ SafetyNet / Play Integrity │ └─ 硬件级别 attestation 难以绕过 │ └─ 基本 attestation → Play Integrity Fix (Zygisk 模块) ├─ RootBeer / 自定义检测库 │ └─ Frida Hook 返回值 └─ 系统属性检查 (ro.debuggable, ro.secure) └─ MagiskHide Props Config ``` ```bash # objection 绕过 root 检测 objection --gadget com.target.app explore --startup-command "android root disable" # Frida Hook 通用 root 检测绕过 frida -U -f com.target.app -l anti-root.js ``` ### 模拟器检测绕过 ```bash # 检测点: Build.FINGERPRINT, Build.MODEL, CPU_ABI, /dev/qemu_pipe # Frida Hook Build 类属性 ``` ### 反调试/反 Frida 绕过 ``` 反 Frida 检测方式? ├─ 检查 frida-server 端口 (27042) │ └─ 更改监听端口: frida-server -l 0.0.0.0:1234 ├─ 检查 /proc/self/maps 中的 frida 库 │ └─ 使用 linjector 注入(无 ptrace) ├─ 检查 D-Bus 协议特征 │ └─ 使用自编译 Frida gadget └─ 自杀式 kill(getpid()) 反分析 └─ Hook Process.killProcess / exit ``` ### 截图/录屏保护绕过 ```bash # 关闭 FLAG_SECURE,便于截图、录屏和动态分析记录 objection --gadget com.target.app explore -s "android ui FLAG_SECURE false" ``` ### 生物认证绕过 ```bash # Frida 绕过指纹 frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f com.target.app ``` --- ## Phase 7: 客户端注入漏洞 ### WebView 安全 ``` WebView 配置检查? ├─ JavaScript 启用 → setJavaScriptEnabled(true) → XSS 风险 ├─ File 协议访问 → setAllowFileAccess(true) → LFI 风险 ├─ addJavascriptInterface → RCE(API < 17) └─ WebViewClient 证书处理 → 忽略 SSL 错误? ``` ### SQL 注入 - Content Provider 的 query/insert/update/delete 方法 - 自定义数据库操作是否参数化 ### Intent 注入 - 代理 Activity/Service 接收 Intent 后直接调用 `startActivity()` - WebView URL 通过 `Intent.parseUri()` 解析 → 恶意 Intent 构造 --- ## 自动化分析工具速查 | 工具 | 类型 | 用法 | |------|------|------| | MobSF | 静态+动态 | Docker 部署,Web UI | | Qark | 静态 | `qark --apk target.apk` | | AndroBugs | 静态 | `python androbugs.py -f target.apk` | | SUPER | 静态 | `super-analyzer target.apk` | | Androwarn | 静态(行为) | `python androwarn.py -i target.apk -r html` | | mariana-trench | 静态(数据流) | `mariana-trench --apk-path target.apk` | | ReverseAPK | 静态 | `reverse-apk target.apk` | --- ## 恶意软件分析要点 当分析可疑 APK 而非渗透测试时,额外关注: - 原生 so 库加载链: `System.loadLibrary` → 解密第二层 ELF → `InMemoryDexClassLoader` 无文件 DEX - `InMemoryDexClassLoader` 使用 → 内存级 DEX 加载(Frida Hook dump) - `AccessibilityService` 滥用 → 覆盖层攻击 / ACTION_SET_TEXT 劫持 - FCM 作为 C2 通道 → 检查 Firebase 消息触发条件 - 前台 Service + MediaPlayer 持久化 → 进程保活 --- ## 参考资源 - [OWASP Mobile Application Security](https://owasp.org/www-project-mobile-app-security/) - [OWASP MASTG - Android Testing Guide](https://mas.owasp.org/MASTG/) - [HackTricks - Android App Pentesting](https://book.hacktricks.wiki/mobile-pentesting/android-app-pentesting/) - [Frida CodeShare](https://codeshare.frida.re/)
View on GitHub