| name | testing-mobile-applications |
| description | Pentest Android and iOS mobile applications including APK analysis, dynamic analysis, SSL pinning bypass, root/jailbreak detection bypass, and mobile-specific vulnerabilities. Use when testing mobile app security or performing mobile pentesting. |
Testing Mobile Applications
When to Use
- Android APK analysis and exploitation
- iOS application pentesting
- Mobile app security assessment
- Bypassing security controls (SSL pinning, root detection)
- Testing mobile-specific vulnerabilities
Android Pentesting
APK Analysis Tools
apktool d app.apk -o app_decompiled
d2j-dex2jar app.apk
jd-gui app-dex2jar.jar
mobsf
jadx app.apk
ADB (Android Debug Bridge)
adb devices
adb connect 192.168.1.100:5555
adb install app.apk
adb uninstall com.package.name
adb shell pm list packages
adb shell pm list packages | grep -i "keyword"
adb shell pm path com.package.name
adb pull /data/app/com.package.name-xxx/base.apk
adb shell am start -n com.package.name/.MainActivity
adb logcat
adb shell
Static Analysis
Search for Sensitive Data:
strings app.apk | grep -i password
strings app.apk | grep -i api
strings app.apk | grep -i token
strings app.apk | grep -i key
grep -r "password" app_decompiled/
grep -r "http://" app_decompiled/
grep -r "api_key" app_decompiled/
Check AndroidManifest.xml:
apktool d app.apk
cat app_decompiled/AndroidManifest.xml
Dynamic Analysis
Frida (Runtime Instrumentation):
frida-ps -U
frida -U -n "App Name"
frida -U -f com.package.name
frida -U -f com.package.name -l script.js
SSL Pinning Bypass:
Java.perform(function() {
var TrustManager = Java.use('javax.net.ssl.X509TrustManager');
TrustManager.checkServerTrusted.implementation = function() {};
var SSLContext = Java.use('javax.net.ssl.SSLContext');
SSLContext.init.overload('[Ljavax.net.ssl.KeyManager;', '[Ljavax.net.ssl.TrustManager;', 'java.security.SecureRandom').implementation = function(a,b,c) {
this.init.overload('[Ljavax.net.ssl.KeyManager;', '[Ljavax.net.ssl.TrustManager;', 'java.security.SecureRandom').call(this, a, null, c);
};
});
Root Detection Bypass:
Java.perform(function() {
var RootClass = Java.use('com.package.name.RootDetection');
RootClass.isRooted.implementation = function() {
return false;
};
});
Intercepting Traffic
Burp Suite Setup:
adb shell settings put global http_proxy 192.168.1.100:8080
adb shell settings put global http_proxy :0
mitmproxy:
mitmproxy --listen-port 8080
Modifying and Repackaging APK
apktool d app.apk -o app_mod
apktool b app_mod -o app_modified.apk
keytool -genkey -v -keystore my-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-key.keystore app_modified.apk alias_name
java -jar uber-apk-signer.jar -a app_modified.apk
adb install app_modified.apk
Common Vulnerabilities
Insecure Data Storage:
adb shell
cd /data/data/com.package.name/shared_prefs/
cat *.xml
cd /data/data/com.package.name/databases/
sqlite3 database.db
.tables
SELECT * FROM users;
cd /data/data/com.package.name/files/
ls -la
cat *
Exported Components:
adb shell dumpsys package com.package.name | grep -A 20 "Activity"
adb shell am start -n com.package.name/.ExportedActivity
adb shell am startservice -n com.package.name/.ExportedService
adb shell am broadcast -a com.package.name.ACTION
Insecure WebView:
webView.getSettings().setJavaScriptEnabled(true);
iOS Pentesting
Setup
Jailbreak Tools:
- checkra1n (iOS 12-14)
- unc0ver (iOS 11-14.8)
- Taurine (iOS 14-14.3)
SSH Access:
ssh root@<device-ip>
passwd
IPA Analysis
unzip app.ipa
otool -L Payload/App.app/App
strings Payload/App.app/App
class-dump Payload/App.app/App > classes.txt
frida-ios-dump -u App
Runtime Analysis
Frida on iOS:
frida-ps -Ua
frida -U -n "App Name"
frida -U -f com.company.app
objection -g "App Name" explore
ios sslpinning disable
Objection:
objection -g com.company.app explore
ios info binary
ios hooking list classes
ios hooking search methods MainActivity
ios sslpinning disable
ios jailbreak disable
ios keychain dump
ios nsuserdefaults get
File System Access
ssh root@device-ip
cd /var/mobile/Containers/Data/Application/<UUID>/
ipainstaller -l
ls /var/mobile/Containers/Data/Application/
Documents/
Library/
Library/Preferences/
Library/Caches/
tmp/
Keychain Access
ios keychain dump
./keychain_dumper
security find-generic-password -s "ServiceName"
Common iOS Vulnerabilities
Insecure Data Storage:
plutil -p Info.plist
ios nsuserdefaults get
sqlite3 database.db
.tables
SELECT * FROM sensitive_table;
Binary Protections:
otool -hv App | grep PIE
otool -I App | grep stack_chk
otool -I App | grep objc_release
Mobile-Specific Attacks
Deep Link Exploitation:
adb shell am start -a android.intent.action.VIEW -d "app://open?param=value"
xcrun simctl openurl booted "app://open?param=value"
Intent Injection:
adb shell am start -n com.package/.Activity --es "extra_key" "malicious_value"
Backup Extraction:
adb backup -f backup.ab com.package.name
java -jar abe.jar unpack backup.ab backup.tar
idevicebackup2 backup --full backup_directory
Tools
Android:
- APKTool - Decompile/recompile APKs
- dex2jar - Convert DEX to JAR
- JADX - APK to Java decompiler
- Frida - Dynamic instrumentation
- Objection - Frida-based toolkit
- MobSF - Automated analysis
- Drozer - Android security framework
iOS:
- Frida - Dynamic instrumentation
- Objection - Frida toolkit
- class-dump - Extract class info
- Hopper/Ghidra - Disassemblers
- frida-ios-dump - Decrypt binaries
- iproxy - Forward ports
Quick Testing Workflow
- Static Analysis - Decompile, search strings, analyze manifest/Info.plist
- Install - Install on emulator/device
- Intercept Traffic - Set up Burp/mitmproxy, bypass SSL pinning
- Dynamic Analysis - Use Frida to hook functions, bypass protections
- Test Components - Test exported components, deep links, intents
- Data Storage - Check for insecure data storage in files/DB/keychain
- Repackage - Modify and recompile to test additional scenarios
References