mcpField
A
android-app-pentesting

android-app-pentesting

github.com/wgpsecSecurity1.8k53 installsUpdated 4d ago
Repository

About android-app-pentesting

android-app-pentesting is a methodology skill for security testers examining Android APKs. It organizes static and dynamic analysis, component and storage checks, network testing, and protection-bypass techniques with tool examples.

Key features

  1. 01APK static analysis and Manifest audits
  2. 02Frida-based runtime analysis
  3. 03Component exposure testing
  4. 04Local data storage security checks
  5. 05Network traffic and TLS testing
  6. 06Protection-mechanism bypass guidance

Use cases

  1. 01Audit an APK for exposed components
  2. 02Inspect app behavior during runtime
  3. 03Check storage for sensitive data
  4. 04Test app network protections in an authorized assessment

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/wgpsec/aboutsecurity --skill android-app-pentesting

After installing, type/android-app-pentestingin Claude Code to confirm it loaded.

Bundled files

References and scripts installed along with SKILL.md.

references/
android-frameworks-and-runtime.md
android-frida-dynamic.md
android-static-analysis.md

Details

From the project README

Android 应用渗透测试方法论

阶段流: 环境准备 → APK静态分析 → 动态分析(Frida) → 组件安全测试 → 数据存储安全 → 网络通信安全 → 保护机制绕过

深入参考


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
ASC (droidasc)按需反编译 + 交叉引用检索(先定位再整包)pip install droidasc
jadx / jadx-guiAPK 反编译为 Javabrew install jadx
apktool反编译为 Smali / 资源提取brew install apktool
Frida + frida-tools动态 Hook / 运行时分析pip install frida-tools
objectionFrida 自动化封装pip install objection
Drozer组件安全测试GitHub Release
Burp Suite流量拦截PortSwigger
MobSF自动化静态+动态分析Docker 部署
APKiD识别编译器/加壳/混淆pip install apkid
APK 获取
# 从设备提取
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 静态分析

反编译与代码审计

大 APK 不要上来就整包反编译。jadx 是全量展开(实测 98 MB 的包要 27.8 秒、产出 1374 个文件),而多数问题只需要看几个类或找一处引用;先用手上的线索定位,再决定是否整包。

反编译路径选择?
├─ 已知要找什么(类名/字符串/方法名) → ASC 按需查(getclass / findrefs),不落盘
│   └─ 定位到具体类后再决定要不要 jadx 整包读上下文
├─ 不知道找什么、要广搜 → jadx -d output/ target.apk 整包 + grep
├─ 需要修改并重打包 → apktool d target.apk -o decoded/
├─ React Native 应用 → 解压 assets/index.android.bundle
├─ Xamarin 应用 → 解压 assemblies/ → dnSpy / ILSpy
└─ 加壳应用 → APKiD 识别壳类型 → 对应脱壳方案
# 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
ASC 按需检索(大 APK 的默认入口)

ASC 把 APK 当只读数据库直接查,不预先展开,单类反编译和引用检索都是亚秒级。有类名、方法名、字符串或基类线索时先用它定位,再决定是否整包 jadx。第二个用途是按基类圈攻击面:混淆后类名不可搜,但系统父类名必须保留,findrefs extends 比 grep 类名可靠。

droidasc getmanifest target.apk -o AndroidManifest.xml      # 不需要 Android SDK
droidasc listclass target.apk --prefix com.target.pay      # 看包结构,避免盲搜
droidasc getclass target.apk com.target.pay.PayActivity -o PayActivity.java
droidasc findrefs target.apk string "sk-"                  # 这个字面量出现在哪些类
droidasc findrefs target.apk extends android.app.Service    # 所有子类
droidasc findrefs target.apk impl android.os.IInterface     # 所有 IPC 实现

两点限制:findrefs string 是模糊匹配,精确串可能返回空(空不代表不存在,换整包 grep);它输出引用点清单而非源码,读代码仍要 getclass 或 jadx。完整子命令与参数见 references/android-static-analysis.md。

Manifest.xml 审计要点
# 提取 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
字符串与密钥搜索
# APK 中的 URL
apkurlgrep -a target.apk

# 泄露的密钥/凭据
apkleaks -f target.apk

# Firebase 数据库检测
grep -rn "firebaseio.com" jadx_output/
# 尝试访问: curl https://xxx.firebaseio.com/.json
自动化静态分析
# 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 基础操作
# 查看运行中的应用
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 与搜索
# 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 审计
# Hook Keystore 操作
frida -U -f com.target.app -l tracer-cipher.js
# 脚本来源: github.com/WithSecureLabs/android-keystore-audit

Phase 3: 组件安全测试

组件暴露面枚举
# 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 安全
# 枚举 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
# 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
# 枚举 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 是否设置?
# 检查 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 转发
# 安装 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 静态扫描定位
# 静态检测 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
# 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
模拟器检测绕过
# 检测点: 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
截图/录屏保护绕过
# 关闭 FLAG_SECURE,便于截图、录屏和动态分析记录
objection --gadget com.target.app explore -s "android ui FLAG_SECURE false"
生物认证绕过
# 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 持久化 → 进程保活

参考资源

Comments

Markdown supported