439 lines
8.7 KiB
Markdown
439 lines
8.7 KiB
Markdown
---
|
|
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
|
|
|
|
```bash
|
|
# Decompile APK
|
|
apktool d app.apk -o app_decompiled
|
|
|
|
# Convert DEX to JAR
|
|
d2j-dex2jar app.apk
|
|
|
|
# View JAR with JD-GUI
|
|
jd-gui app-dex2jar.jar
|
|
|
|
# Automated analysis
|
|
mobsf # Mobile Security Framework
|
|
jadx app.apk # APK to Java decompiler
|
|
```
|
|
|
|
### ADB (Android Debug Bridge)
|
|
|
|
```bash
|
|
# List devices
|
|
adb devices
|
|
|
|
# Connect over network
|
|
adb connect 192.168.1.100:5555
|
|
|
|
# Install APK
|
|
adb install app.apk
|
|
|
|
# Uninstall
|
|
adb uninstall com.package.name
|
|
|
|
# List packages
|
|
adb shell pm list packages
|
|
adb shell pm list packages | grep -i "keyword"
|
|
|
|
# Get APK path
|
|
adb shell pm path com.package.name
|
|
|
|
# Pull APK from device
|
|
adb pull /data/app/com.package.name-xxx/base.apk
|
|
|
|
# Start activity
|
|
adb shell am start -n com.package.name/.MainActivity
|
|
|
|
# View logs
|
|
adb logcat
|
|
|
|
# Shell access
|
|
adb shell
|
|
```
|
|
|
|
### Static Analysis
|
|
|
|
**Search for Sensitive Data:**
|
|
```bash
|
|
# Extract strings
|
|
strings app.apk | grep -i password
|
|
strings app.apk | grep -i api
|
|
strings app.apk | grep -i token
|
|
strings app.apk | grep -i key
|
|
|
|
# Search in decompiled code
|
|
grep -r "password" app_decompiled/
|
|
grep -r "http://" app_decompiled/
|
|
grep -r "api_key" app_decompiled/
|
|
```
|
|
|
|
**Check AndroidManifest.xml:**
|
|
```bash
|
|
# Decompile and view
|
|
apktool d app.apk
|
|
cat app_decompiled/AndroidManifest.xml
|
|
|
|
# Look for:
|
|
# - android:debuggable="true"
|
|
# - android:allowBackup="true"
|
|
# - Exported activities/services
|
|
# - Custom permissions
|
|
# - URL schemes
|
|
```
|
|
|
|
### Dynamic Analysis
|
|
|
|
**Frida (Runtime Instrumentation):**
|
|
```bash
|
|
# List running apps
|
|
frida-ps -U
|
|
|
|
# Attach to app
|
|
frida -U -n "App Name"
|
|
frida -U -f com.package.name
|
|
|
|
# Load script
|
|
frida -U -f com.package.name -l script.js
|
|
|
|
# Common scripts
|
|
# - Bypass SSL pinning
|
|
# - Bypass root detection
|
|
# - Hook functions
|
|
# - Dump memory
|
|
```
|
|
|
|
**SSL Pinning Bypass:**
|
|
```javascript
|
|
// Frida script - Universal 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:**
|
|
```javascript
|
|
// Frida - Bypass root detection
|
|
Java.perform(function() {
|
|
var RootClass = Java.use('com.package.name.RootDetection');
|
|
RootClass.isRooted.implementation = function() {
|
|
return false;
|
|
};
|
|
});
|
|
```
|
|
|
|
### Intercepting Traffic
|
|
|
|
**Burp Suite Setup:**
|
|
```bash
|
|
# 1. Install Burp CA certificate
|
|
# Download from http://burp:8080 on device
|
|
# Install in Settings -> Security -> Install from storage
|
|
|
|
# 2. Configure proxy
|
|
adb shell settings put global http_proxy 192.168.1.100:8080
|
|
|
|
# 3. For apps with SSL pinning, use Frida bypass
|
|
|
|
# 4. Clear proxy when done
|
|
adb shell settings put global http_proxy :0
|
|
```
|
|
|
|
**mitmproxy:**
|
|
```bash
|
|
# Start mitmproxy
|
|
mitmproxy --listen-port 8080
|
|
|
|
# Install certificate on device
|
|
# http://mitm.it
|
|
|
|
# Set device proxy to attacker IP:8080
|
|
```
|
|
|
|
### Modifying and Repackaging APK
|
|
|
|
```bash
|
|
# 1. Decompile
|
|
apktool d app.apk -o app_mod
|
|
|
|
# 2. Modify smali code
|
|
# Edit files in app_mod/smali/
|
|
|
|
# 3. Recompile
|
|
apktool b app_mod -o app_modified.apk
|
|
|
|
# 4. Sign APK
|
|
# Generate keystore (first time only)
|
|
keytool -genkey -v -keystore my-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000
|
|
|
|
# Sign
|
|
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-key.keystore app_modified.apk alias_name
|
|
|
|
# Or use uber-apk-signer
|
|
java -jar uber-apk-signer.jar -a app_modified.apk
|
|
|
|
# 5. Install
|
|
adb install app_modified.apk
|
|
```
|
|
|
|
### Common Vulnerabilities
|
|
|
|
**Insecure Data Storage:**
|
|
```bash
|
|
# Check shared preferences
|
|
adb shell
|
|
cd /data/data/com.package.name/shared_prefs/
|
|
cat *.xml
|
|
|
|
# Check databases
|
|
cd /data/data/com.package.name/databases/
|
|
sqlite3 database.db
|
|
.tables
|
|
SELECT * FROM users;
|
|
|
|
# Check files
|
|
cd /data/data/com.package.name/files/
|
|
ls -la
|
|
cat *
|
|
```
|
|
|
|
**Exported Components:**
|
|
```bash
|
|
# List exported activities
|
|
adb shell dumpsys package com.package.name | grep -A 20 "Activity"
|
|
|
|
# Start exported activity
|
|
adb shell am start -n com.package.name/.ExportedActivity
|
|
|
|
# Call exported service
|
|
adb shell am startservice -n com.package.name/.ExportedService
|
|
|
|
# Broadcast to receiver
|
|
adb shell am broadcast -a com.package.name.ACTION
|
|
```
|
|
|
|
**Insecure WebView:**
|
|
```bash
|
|
# Check for JavaScript enabled
|
|
# Look in code for:
|
|
webView.getSettings().setJavaScriptEnabled(true);
|
|
|
|
# Check for addJavascriptInterface
|
|
# Can lead to RCE if exposed
|
|
```
|
|
|
|
## iOS Pentesting
|
|
|
|
### Setup
|
|
|
|
**Jailbreak Tools:**
|
|
- checkra1n (iOS 12-14)
|
|
- unc0ver (iOS 11-14.8)
|
|
- Taurine (iOS 14-14.3)
|
|
|
|
**SSH Access:**
|
|
```bash
|
|
# Default credentials
|
|
ssh root@<device-ip>
|
|
# password: alpine
|
|
|
|
# Change default password!
|
|
passwd
|
|
```
|
|
|
|
### IPA Analysis
|
|
|
|
```bash
|
|
# Extract IPA
|
|
unzip app.ipa
|
|
|
|
# View binary
|
|
otool -L Payload/App.app/App
|
|
strings Payload/App.app/App
|
|
|
|
# Class dump
|
|
class-dump Payload/App.app/App > classes.txt
|
|
|
|
# Decrypt binary (on jailbroken device)
|
|
frida-ios-dump -u App
|
|
|
|
# Static analysis with Hopper/Ghidra
|
|
```
|
|
|
|
### Runtime Analysis
|
|
|
|
**Frida on iOS:**
|
|
```bash
|
|
# List apps
|
|
frida-ps -Ua
|
|
|
|
# Attach
|
|
frida -U -n "App Name"
|
|
frida -U -f com.company.app
|
|
|
|
# SSL pinning bypass (iOS)
|
|
objection -g "App Name" explore
|
|
ios sslpinning disable
|
|
```
|
|
|
|
**Objection:**
|
|
```bash
|
|
# Launch objection
|
|
objection -g com.company.app explore
|
|
|
|
# Common commands
|
|
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
|
|
|
|
```bash
|
|
# Connect via SSH
|
|
ssh root@device-ip
|
|
|
|
# App data location
|
|
cd /var/mobile/Containers/Data/Application/<UUID>/
|
|
|
|
# Find app UUID
|
|
ipainstaller -l # List apps
|
|
ls /var/mobile/Containers/Data/Application/
|
|
|
|
# Common paths
|
|
Documents/
|
|
Library/
|
|
Library/Preferences/ # plist files
|
|
Library/Caches/
|
|
tmp/
|
|
```
|
|
|
|
### Keychain Access
|
|
|
|
```bash
|
|
# Using objection
|
|
ios keychain dump
|
|
|
|
# Manual (requires keychain-dumper on device)
|
|
./keychain_dumper
|
|
|
|
# Specific item
|
|
security find-generic-password -s "ServiceName"
|
|
```
|
|
|
|
### Common iOS Vulnerabilities
|
|
|
|
**Insecure Data Storage:**
|
|
```bash
|
|
# Check plist files
|
|
plutil -p Info.plist
|
|
|
|
# Check UserDefaults
|
|
ios nsuserdefaults get
|
|
|
|
# Check SQLite databases
|
|
sqlite3 database.db
|
|
.tables
|
|
SELECT * FROM sensitive_table;
|
|
```
|
|
|
|
**Binary Protections:**
|
|
```bash
|
|
# Check for PIE
|
|
otool -hv App | grep PIE
|
|
|
|
# Check for stack canaries
|
|
otool -I App | grep stack_chk
|
|
|
|
# Check for ARC
|
|
otool -I App | grep objc_release
|
|
```
|
|
|
|
## Mobile-Specific Attacks
|
|
|
|
**Deep Link Exploitation:**
|
|
```bash
|
|
# Android
|
|
adb shell am start -a android.intent.action.VIEW -d "app://open?param=value"
|
|
|
|
# iOS
|
|
xcrun simctl openurl booted "app://open?param=value"
|
|
```
|
|
|
|
**Intent Injection:**
|
|
```bash
|
|
# Send malicious intent
|
|
adb shell am start -n com.package/.Activity --es "extra_key" "malicious_value"
|
|
```
|
|
|
|
**Backup Extraction:**
|
|
```bash
|
|
# Android backup
|
|
adb backup -f backup.ab com.package.name
|
|
# Extract
|
|
java -jar abe.jar unpack backup.ab backup.tar
|
|
|
|
# iOS backup
|
|
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
|
|
|
|
1. **Static Analysis** - Decompile, search strings, analyze manifest/Info.plist
|
|
2. **Install** - Install on emulator/device
|
|
3. **Intercept Traffic** - Set up Burp/mitmproxy, bypass SSL pinning
|
|
4. **Dynamic Analysis** - Use Frida to hook functions, bypass protections
|
|
5. **Test Components** - Test exported components, deep links, intents
|
|
6. **Data Storage** - Check for insecure data storage in files/DB/keychain
|
|
7. **Repackage** - Modify and recompile to test additional scenarios
|
|
|
|
## References
|
|
|
|
- https://book.hacktricks.xyz/mobile-pentesting
|
|
- https://github.com/OWASP/owasp-mstg
|
|
- https://mobile-security.gitbook.io/
|