MOBILE-PENTESTING
Authorized use only. Offensive reference for systems you own or are explicitly permitted to test. You are responsible for staying within the law.
Comprehensive guide to mobile application security testing covering both Android and iOS platforms.
ENVIRONMENT SETUP#
Android Lab:
Emulators:
- Android Studio AVD (official)
- Genymotion (fast, rooted by default)
- Corellium (cloud-based, ARM)
Physical device:
- Rooted Android device recommended
- Magisk for systemless root
- Developer Options > USB Debugging enabled
Key tools:
pip install frida-tools objection
apt install adb apktool jadx dex2jar
Proxy setup (Burp Suite):
1. Set Burp proxy to listen on all interfaces
2. Device WiFi > Proxy > Manual > host_IP:8080
3. Visit http://burp/ on device to install CA cert
4. For Android 7+: need to install as system cert
iOS Lab:
Requirements:
- macOS with Xcode
- Jailbroken iOS device (checkra1n, unc0ver, palera1n)
- Corellium (cloud-based alternative)
Key tools:
brew install libimobiledevice ideviceinstaller
pip install frida-tools objection
# On jailbroken device: install Cydia/Sileo packages
Proxy setup:
1. Install Burp CA cert via Safari
2. Settings > General > About > Certificate Trust Settings
3. Enable full trust for Burp cert
4. WiFi settings > HTTP Proxy > Manual
ADB COMMANDS (ANDROID)#
# Device management adb devices # list connected devices adb connect <IP>:5555 # connect wirelessly adb shell # interactive shell adb root # restart adb as root # Package management adb shell pm list packages # list all packages adb shell pm list packages -3 # third-party apps only adb shell pm list packages | grep <app> # find specific app adb shell pm path <package> # get APK path adb shell dumpsys package <package> # detailed package info # File operations adb pull <remote> <local> # download file adb push <local> <remote> # upload file adb shell ls /data/data/<package>/ # app data directory # App management adb install app.apk # install APK adb install -r app.apk # reinstall keeping data adb uninstall <package> # uninstall adb shell am start -n <package>/<activity> # launch activity adb shell am start -a android.intent.action.VIEW -d "http://evil.com" # Logging adb logcat # view all logs adb logcat | grep <package> # filter by app adb logcat -c # clear log buffer adb logcat *:E # errors only # Screenshots and recording adb shell screencap /sdcard/screen.png adb shell screenrecord /sdcard/video.mp4 # Database access adb shell run-as <package> sqlite3 databases/app.db ".tables" adb shell run-as <package> sqlite3 databases/app.db "SELECT * FROM users;"
APK EXTRACTION AND DECOMPILATION#
# Pull APK from device adb shell pm path com.example.app adb pull /data/app/com.example.app-1/base.apk ./app.apk # Or use apk-extractor apps on device Apktool (smali disassembly + resources): apktool d app.apk -o app_decoded/ # decode APK apktool b app_decoded/ -o modified.apk # rebuild APK # Directory structure after decode: # AndroidManifest.xml - permissions, components, intent filters # smali/ - Dalvik bytecode (smali format) # res/ - resources (layouts, strings, drawables) # assets/ - raw assets # lib/ - native libraries (.so files) JADX (Java decompilation): jadx app.apk -d app_java/ # decompile to Java source jadx-gui app.apk # GUI decompiler # Search decompiled code for: grep -r "api_key\|apikey\|API_KEY" app_java/ grep -r "password\|secret\|token" app_java/ grep -r "http://\|https://" app_java/ grep -r "MODE_WORLD_READABLE\|MODE_WORLD_WRITABLE" app_java/ grep -r "SharedPreferences" app_java/ grep -r "SQLiteDatabase" app_java/ grep -r "Log\.\|System\.out" app_java/ dex2jar + JD-GUI: d2j-dex2jar app.apk -o app.jar # convert to JAR jd-gui app.jar # view in JD-GUI # Re-sign modified APK keytool -genkey -v -keystore test.keystore -alias test -keyalg RSA -keysize 2048 apksigner sign --ks test.keystore modified.apk # or jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore test.keystore modified.apk test
FRIDA BASICS#
# Install Frida server on device
adb push frida-server-<version>-android-arm64 /data/local/tmp/
adb shell chmod 755 /data/local/tmp/frida-server
adb shell /data/local/tmp/frida-server &
# List running processes
frida-ps -U # USB-connected device
frida-ps -Ua # running apps only
frida-ps -Uai # installed apps
# Attach to running process
frida -U -n "App Name"
frida -U -f com.example.app # spawn and attach
# Run a script
frida -U -f com.example.app -l hook.js
# Basic Java hook script (hook.js):
Java.perform(function() {
var Activity = Java.use("com.example.app.LoginActivity");
Activity.checkPassword.implementation = function(password) {
console.log("Password: " + password);
return true; // bypass check
};
});
# Hook all overloads of a method:
Java.perform(function() {
var cls = Java.use("com.example.app.Crypto");
cls.encrypt.overloads.forEach(function(overload) {
overload.implementation = function() {
console.log("encrypt called with: " + JSON.stringify(arguments));
return overload.apply(this, arguments);
};
});
});
CERTIFICATE PINNING BYPASS#
Method 1: Frida script
# Universal SSL pinning bypass (Android)
frida -U -f com.example.app -l ssl_pinning_bypass.js
# Popular scripts:
# - https://codeshare.frida.re/@pcipolloni/universal-android-ssl-pinning-bypass/
# - https://codeshare.frida.re/@akabe1/frida-multiple-unpinning/
Method 2: Objection
objection -g com.example.app explore
android sslpinning disable
Method 3: Magisk module
- Install MagiskTrustUserCerts module
- Moves user CA certs to system trust store
Method 4: Apktool modification
1. Decompile: apktool d app.apk
2. Edit res/xml/network_security_config.xml:
<network-security-config>
<base-config>
<trust-anchors>
<certificates src="user" />
<certificates src="system" />
</trust-anchors>
</base-config>
</network-security-config>
3. Rebuild and re-sign
Method 5: Android proxy with iptables (rooted)
iptables -t nat -A OUTPUT -p tcp --dport 443 -j DNAT --to-destination <proxy_ip>:<proxy_port>
IOS JAILBREAK TESTING#
Jailbreak tools: - checkra1n: A5-A11 (hardware exploit, semi-tethered) - palera1n: A8-A11, iOS 15-17 (checkm8-based) - Dopamine: A12+ iOS 15 (KFD + kopen based) Post-jailbreak setup: 1. Install Cydia/Sileo package manager 2. Install OpenSSH 3. Install Frida from repo 4. Change default passwords (root:alpine, mobile:alpine) File system analysis: ssh root@<device_ip> # App sandbox: /var/mobile/Containers/Data/Application/<UUID>/ # App binary: /var/containers/Bundle/Application/<UUID>/ # Keychain: /var/Keychains/keychain-2.db # Find app directories find /var/mobile/Containers -name "*.plist" | grep <app> # Check for sensitive data in: # Documents/ - user files # Library/ - preferences, caches, cookies # tmp/ - temporary files # Library/Preferences/*.plist - NSUserDefaults # Keychain dumper keychain-dumper # dump all keychain items
OBJECTION COMMANDS#
# Start Objection objection -g <package_or_bundleid> explore # Android commands android sslpinning disable # disable SSL pinning android root disable # bypass root detection android hooking list activities # list activities android hooking list services # list services android hooking list receivers # list receivers android hooking search classes <query> # search classes android hooking watch class <class> # monitor all methods android hooking watch class_method <method> --dump-args --dump-return android clipboard monitor # monitor clipboard android intent launch_activity <activity> # iOS commands ios sslpinning disable # disable SSL pinning ios jailbreak disable # bypass jailbreak detection ios hooking list classes # list classes ios hooking search classes <query> ios hooking watch method "<class> <method>" --dump-args ios keychain dump # dump keychain ios plist cat <path> # read plist files ios cookies get # get cookies ios nsurlcredentialstorage dump # stored credentials # Cross-platform env # environment info file download <remote> <local> # download file file upload <local> <remote> # upload file sqlite connect <db_path> # connect to SQLite DB memory dump all <output_file> # dump process memory import <frida_script.js> # load custom Frida script
MOBSF (MOBILE SECURITY FRAMEWORK)#
# Install and run docker pull opensecurity/mobile-security-framework-mobsf docker run -it --rm -p 8000:8000 opensecurity/mobile-security-framework-mobsf # Access at http://localhost:8000 # Upload APK/IPA for automated analysis # Results include: # - Manifest analysis (permissions, exported components) # - Code analysis (hardcoded secrets, insecure APIs) # - Binary analysis (PIE, stack canary, ARC) # - Network security configuration # - Certificate analysis # - Malware indicators
TRAFFIC INTERCEPTION#
Burp Suite setup: 1. Configure proxy listener (all interfaces, port 8080) 2. Install CA cert on device 3. Configure device proxy settings 4. For HTTPS: bypass certificate pinning (see above) 5. Scope: target only the app's domains mitmproxy (CLI alternative): mitmproxy -p 8080 # interactive mode mitmdump -p 8080 -w traffic.flow # save traffic mitmweb -p 8080 # web interface # Inline script to log requests mitmdump -s script.py Key things to intercept: - Authentication tokens and session management - API endpoints and parameters - Hardcoded credentials in requests - Sensitive data in plaintext - Insecure HTTP connections - Certificate validation issues
COMMON MOBILE VULNERABILITIES#
1. Insecure data storage - SharedPreferences/NSUserDefaults with sensitive data - SQLite databases with plaintext credentials - Hardcoded API keys in source code - Sensitive data in application logs - Cache and clipboard data leakage 2. Insecure communication - Missing certificate pinning - HTTP used for sensitive data - Weak TLS configuration - Ignoring certificate errors 3. Authentication/Authorization - Weak password policies - Missing session timeout - Client-side authentication logic - Insecure token storage 4. Code tampering - No integrity checks - No obfuscation - Debug mode enabled in production - Missing root/jailbreak detection 5. Reverse engineering - Hardcoded secrets - Exposed API keys - Business logic in client code - No code obfuscation (ProGuard/R8)
ANDROID SPECIFIC CHECKS#
[ ] Review AndroidManifest.xml for over-privileged permissions [ ] Check for exported activities/services/receivers/providers [ ] Test deep links and intent handling [ ] Check WebView settings (JavaScript enabled, file access) [ ] Verify backup flag (android:allowBackup="false") [ ] Check for debuggable flag in production [ ] Test content provider SQL injection [ ] Check for tapjacking (filterTouchesWhenObscured)
IOS SPECIFIC CHECKS#
[ ] Check ATS (App Transport Security) exceptions [ ] Verify binary protections (PIE, stack canary, ARC) [ ] Test URL scheme handling [ ] Check for sensitive data in keychain (accessibility flags) [ ] Verify snapshot/screenshot protection [ ] Test pasteboard/clipboard data leakage [ ] Check for third-party keyboard data [ ] Review entitlements file
REFERENCES#
- OWASP Mobile Testing Guide (MASTG): https://mas.owasp.org/MASTG/ - OWASP Mobile Application Security: https://mas.owasp.org/ - Frida Documentation: https://frida.re/docs/ - Objection: https://github.com/sensepost/objection - MobSF: https://github.com/MobSF/Mobile-Security-Framework-MobSF