Android Mobile Application Penetration Testing
Thin router for full MASTG-aligned Android assessments via ADB + Frida + Mobile MCP. Load workflow / methodology / reference files on demand; do not attempt to memorise the whole skill up front.
When to Use
- Start a new Android app security assessment
- Bypass SSL pinning, root detection, anti-tamper, or biometric checks
- Extract/triage local storage (SharedPreferences, DBs, files, logs)
- Test exported activities, services, providers, receivers, deep links
- Hook crypto / auth / session / keystore at runtime
- Map a build to OWASP MASVS / MASTG for compliance evidence
- Produce structured findings + remediation guidance
Trigger Phrases
"pentest this Android app" • "security test the APK" • "bypass SSL pinning on <app>" • "extract data from <app>" • "test Android authentication" • "fuzz Android intents" • "MASTG testing for <app>" • "mobile app security assessment"
When NOT to Use This Skill
- iOS apps → use
ios-pentest (if available) or generic mobile skill
- Server-side API fuzzing of mobile backends → use
api-security / web-pentest
- Decompiling Android malware for IR → use
malware-analysis, not this pentest-focused skill
- Supply-chain / SCA on third-party SDKs → use
sca / dependency-audit
- Cloud backend of the mobile app → use
cloud-pentest
Decision Tree
Do you have the APK or only package name?
├─ package only → get_app_info + pull_apk (parallel), then branch on protections
└─ APK on disk → static analysis first (jadx, apktool), then dynamic
└─ App runs? → frida_spawn → bypass_ssl → bypass_root → proxy
└─ App crashes on root? → see references/troubleshooting.md (Root detection)
└─ TLS still not decrypted? → workflows/ssl_pinning_bypass.md Methods 2→3
What's the objective?
├─ Full assessment → workflows/complete_assessment.md
├─ SSL pinning only → workflows/ssl_pinning_bypass.md
├─ Auth / session → workflows/auth_testing.md
├─ Deep links / IPC / fuzz → workflows/deeplink_intent_testing.md
├─ Crypto audit → workflows/crypto_analysis.md
└─ Data storage / exfil → workflows/data_exfiltration.md
Parallelism Hints
Run concurrently (independent, same device):
getappinfo + pullapk + listexported_components
dumpdatabases + dumpsharedprefs + dumpinternalstorage + dumpexternalstorage + getlogcat
- Multiple
fridarunscript calls against the same PID (cryptohooks.js ∥ credentialhooks.js ∥ intent_monitor.js)
- Static APK analysis (decompile, secrets scan) ∥ dynamic runtime hooks
Must be sequential:
fridaspawn → fridabypassssl → fridabypass_root (scripts need the PID and must attach before the app finishes its protection init)
setup_proxy before any traffic-capture or network workflow
installcacert before setup_proxy on a fresh device
capturetrafficstart → drive app → capturetrafficstop
Sub-Agent Delegation
- Spawn a static-analysis sub-agent on the pulled APK (jadx decompile → secrets grep → manifest review → native-lib inventory) while the main agent runs dynamic Frida hooks. Rejoin before reporting.
- Spawn a per-component sub-agent when fuzzing many exported components: one agent per activity/provider/service batch; each owns its own Frida PID and logcat filter. Avoids cross-contamination of hook state.
- Spawn a reporting sub-agent to normalise findings into
schemas/finding.json and render templates once the main testing pass completes.
Reasoning Budget
- Extended thinking (high): triaging findings across evidence, classifying severity, writing CWE/MASTG mappings, designing custom Frida hooks for obfuscated classes, reverse-engineering native SSL-pinning paths.
- Low / no extended thinking: repetitive Frida hook runs, standard dumps, canned payload fuzzing, applying the universal SSL bypass, invoking known MCP tool sequences.
- Don't burn tokens reasoning about which universal bypass to try first — just run
fridabypassssl(pid) and escalate on failure.
Multimodal Hooks
- Use Mobile MCP
getscreenstate + screenshot for UI-driven auth flows (biometric prompts, OAuth redirects, MFA steps). Attach screenshots as evidence.screenshot on the finding.
- Capture a screenshot at the point of bypass (e.g., authenticated home screen after biometric spoof) — visual evidence strengthens severity justification.
- For deep-link repros, screenshot the resulting activity to prove the unintended state is reachable.
Structured Output
All findings MUST validate against [schemas/finding.json](schemas/finding.json). Android-specific required/common fields: packagename, appversion, targetsdk, deviceid, fridapid, mastgid, masvscontrol, component.{type,classname,exported}, evidence.{logcat,frida_output,screenshot,pcap}.
Workflow Index
| Workflow |
When |
| [workflows/completeassessment.md](workflows/completeassessment.md) |
End-to-end MASTG pass |
| [workflows/sslpinningbypass.md](workflows/sslpinningbypass.md) |
Enable TLS interception |
| [workflows/authtesting.md](workflows/authtesting.md) |
Login, session, biometric, JWT |
| [workflows/deeplinkintenttesting.md](workflows/deeplinkintenttesting.md) |
IPC fuzz, deep links, providers |
| [workflows/cryptoanalysis.md](workflows/cryptoanalysis.md) |
Weak algos, hardcoded keys, keystore |
| [workflows/dataexfiltration.md](workflows/dataexfiltration.md) |
Local storage + logcat leakage |
Methodology Index
| Document |
Coverage |
| [methodology/recon.md](methodology/recon.md) |
Info gathering, attack-surface map |
| [methodology/staticanalysis.md](methodology/staticanalysis.md) |
APK/smali/secrets review |
| [methodology/dynamicanalysis.md](methodology/dynamicanalysis.md) |
Runtime hooking, instrumentation |
| [methodology/networktesting.md](methodology/networktesting.md) |
Traffic, API, TLS verification |
| [methodology/datastorage.md](methodology/datastorage.md) |
Local storage, DBs, file perms |
| [methodology/cryptotesting.md](methodology/cryptotesting.md) |
Encryption and key management |
| [methodology/authtesting.md](methodology/authtesting.md) |
Auth, session, biometric |
| [methodology/clientsideinjection.md](methodology/clientsideinjection.md) |
WebViews, deep links, providers |
Payloads Index
| File |
Use |
| [payloads/intentinjection.txt](payloads/intentinjection.txt) |
Intent/IPC fuzz inputs |
| [payloads/pathtraversal.txt](payloads/pathtraversal.txt) |
File/provider path escapes |
| [payloads/sqlinjection.txt](payloads/sqlinjection.txt) |
Content provider SQLi |
| [payloads/xsspayloads.txt](payloads/xsspayloads.txt) |
WebView XSS |
| [payloads/xxepayloads.txt](payloads/xxepayloads.txt) |
XML parsers in-app |
Examples Index
| Example |
Scenario |
| [examples/newassessment.md](examples/newassessment.md) |
Kickoff blueprint for a new target |
| [examples/datastorageinvestigation.md](examples/datastorageinvestigation.md) |
Enumerating local sensitive data |
| [examples/authbypass.md](examples/authbypass.md) |
Biometric / session / JWT bypass |
References Index
| Document |
Coverage |
| [references/owaspmobiletop10.md](references/owaspmobiletop10.md) |
OWASP Mobile Top 10 mapping |
| [references/androidsecuritychecklist.md](references/androidsecuritychecklist.md) |
Testing checklist |
| [references/fridasnippets.md](references/fridasnippets.md) |
Reusable Frida one-liners |
| [references/troubleshooting.md](references/troubleshooting.md) |
Frida / SSL / root / ADB / SQLCipher fixes |
| [references/bountypatterns20242026.md](references/bountypatterns20242026.md) |
Post-2023 bounty TTPs (deep-link hijack / App-Links bypass, WebView deep-link XSS, unprotected broadcast-receiver leakage) |
Checklists
| File |
Purpose |
| [checklists/owaspmastgfull.md](checklists/owaspmastgfull.md) |
Full MASTG compliance |
| [checklists/quickwins.md](checklists/quickwins.md) |
Fast-vuln sweep |
| [checklists/preengagement.md](checklists/preengagement.md) |
Setup verification |
| [checklists/reportitems.md](checklists/reportitems.md) |
Report completeness |
Templates
| Template |
Purpose |
| [templates/findingtemplate.md](templates/findingtemplate.md) |
Per-finding doc |
| [templates/executivesummary.md](templates/executivesummary.md) |
Management summary |
| [templates/technicalreport.md](templates/technicalreport.md) |
Full technical report |
| [templates/remediationguide.md](templates/remediationguide.md) |
Developer-facing fixes |
MCP Tool Reference
Device interaction
| Tool |
Purpose |
getscreenstate() |
Current screen / UI tree |
tapelement(x,y) / longpress(x,y) |
Tap / long-press |
input_text(text) |
Type into focused field |
press_key(keycode) |
BACK=4 HOME=3 ENTER=66 |
swipe(x1,y1,x2,y2) |
Scroll, pattern unlock |
Frida instrumentation
| Tool |
Purpose |
fridaspawn(pkg) / fridaattach(pkg) |
Start or attach |
fridarunscript(pid, script) |
Load JS hooks |
fridabypassssl(pid) / fridabypassroot(pid) |
Universal bypasses |
fridahookmethod(pid, class, method) |
Trace a single method |
fridatracecrypto(pid) / fridadumpcredentials(pid) |
Canned traces |
fridaenumerateclasses(pid, pattern) |
Class discovery under obfuscation |
fridamemorysearch(pid, pattern) |
Find secrets / keys in process memory |
Network
| Tool |
Purpose |
setupproxy(device, host, port) / clearproxy(device) |
Proxy wiring |
installcacert(device, path) |
Trust Burp CA (system store) |
capturetrafficstart(pkg) / capturetrafficstop() |
PCAP |
Data extraction
| Tool |
Purpose |
dumpdatabases(pkg) / dumpshared_prefs(pkg) |
SQLite + prefs |
dumpinternalstorage(pkg) / dumpexternalstorage(pkg) |
Files |
get_logcat(pkg) |
Package-filtered logs |
Components
| Tool |
Purpose |
listexportedcomponents(pkg) |
Attack surface |
launchactivity(pkg, activity, extras, datauri) |
Deep link / intent |
send_broadcast(action, extras) |
Broadcast injection |
start_service(pkg, service, extras) |
Service abuse |
querycontentprovider(uri) |
Provider SQLi / leakage |
fuzzintentextra(pkg, comp, key, payloads) |
Automated fuzz |
App management
| Tool |
Purpose |
installapk(path) / uninstallapp(pkg) |
Deploy / remove |
clearappdata(pkg) |
Fresh state |
getappinfo(pkg) |
Metadata, permissions, SDK |
listinstalledapps() / pull_apk(pkg) |
Discovery / extraction |
Frida Script Library (scripts/)
sslpinningbypass.js, rootbypass.js, cryptohooks.js, credentialhooks.js, networkhooks.js, biometricbypass.js, antitamperingbypass.js, intentmonitor.js, webviewhooks.js, dynamicdexhooks.js, keystorehooks.js, method_tracer.js.
Tools
| Tool |
Purpose |
Install |
| ADB |
Device comms |
apt install adb (Android SDK platform-tools) |
| Frida / frida-tools |
Dynamic instrumentation |
pip install frida-tools (≥16.4) |
| Objection |
Mobile exploration |
pip install objection |
| apktool |
APK decompile |
apt install apktool (≥2.9) |
| jadx |
Java decompile |
github.com/skylot/jadx releases (≥1.5) |
| Burp Suite |
Traffic interception |
portswigger.net |
| Android Studio |
Emulator, SDK |
developer.android.com |
Setup scripts: setup/setuppentestenv.sh, setup/setupphysicaldevice.sh, setup/setupemulator.py, setup/fridaservermanager.py, setup/burpcertinstaller.sh, setup/checkenvironment.py.
MCP servers expected: android-pentest (Android Dynamic MCP), mobile-mcp (mobile-next for UI). Configure in ~/.claude/mcp.json.
Related Resources
Last Validated
2026-04 — minimum versions: Frida ≥16.4, apktool ≥2.9, jadx ≥1.5, Android platform-tools ≥35.