| name | mobile-pentesting-ios |
| description | Guide complet de pentest iOS — IPA reverse engineering, Frida, Objection, SSL pinning bypass, jailbreak detection, dynamic analysis |
| category | cybersecurite |
Mobile Pentesting iOS — Guide Avancé
Prérequis
Environnement macOS
xcode-select --install
git clone https://github.com/theos/theos.git ~/theos
brew install ldid class-dump
Device Jailbreaké (Recommandé)
Installation des Outils
ssh root@192.168.1.10
wget https://build.frida.re/frida/ios/Frida_16.5.6.deb
dpkg -i Frida_16.5.6.deb
pip install frida-tools object
pip install objection
Reverse Engineering d'IPA
Extraction d'IPA (Depuis App Store)
ipatool download -b com.target.app -o target.ipa
frida-ios-dump -u -o target.ipa com.target.app
clutch -d com.target.app
Extraction d'IPA (Depuis Device)
frida-ps -U -a
frida-ios-dump -U com.target.app -o target.ipa
Analyse du Binaire
Désassemblage:
lipo -info target.app/target
strings target.app/target | grep -i "key\|token\|secret\|http\|password"
class-dump target.app/target -H -o headers/
Analyse avec radare2/cutter:
radare2 -A target.app/target
> aaaa
> afl
> is
> izz
> ii
> axf
Analyse du Plist et Ressources
plutil -p target.app/Info.plist
ibtool --dump target.app/Base.lproj/Main.storyboard
ls -la target.app/*.nib
ls -la target.app/*.png
SSL Pinning Bypass
Objection — Simple
objection -g com.target.app explore
ios sslpinning disable
ios keychain dump
Frida — TrustKit / AFNetworking / Alamofire
if (ObjC.available) {
var NSURLSession = ObjC.classes.NSURLSession;
var TrustKit = ObjC.classes.TrustKit;
if (TrustKit) {
TrustKit['+ sharedInstance'].implementation = function() {
return null;
};
}
var AFSecurityPolicy = ObjC.classes.AFSecurityPolicy;
if (AFSecurityPolicy) {
AFSecurityPolicy['- setSSLPinningMode:'] = function(mode) {
console.log('[+] AFSecurityPolicy pinning blocked');
};
AFSecurityPolicy['- allowInvalidCertificates'] = function() {
return 1;
};
AFSecurityPolicy['- validatesDomainName'] = function() {
;
};
}
= ..;
() {
[] = () {
;
};
}
= ..;
[] = () {
.();
};
}
Frida Script — NSURLSession Challenge Bypass
if (ObjC.available) {
var delegate = ObjC.classes.NSObject;
delegate['- URLSession:didReceiveChallenge:completionHandler:'].implementation = function(
session, challenge, completionHandler
) {
console.log('[+] Challenge received: ' + challenge.NSURLAuthenticationMethod());
var protectionSpace = challenge.protectionSpace();
var host = protectionSpace.host();
console.log('[+] Host: ' + host);
var disposition = 1;
var credential = ObjC.classes.NSURLCredential.credentialForTrust_(challenge.protectionSpace().serverTrust());
var block = new ObjC.Block({
retType: 'void',
argTypes: ['int', 'object'],
implementation: function(disp, cred) {
console.();
}
});
(disposition, credential);
};
}
Jailbreak Detection Bypass
Methodes de détection
Frida — Shadow Bypass
if (ObjC.available) {
var NSFileManager = ObjC.classes.NSFileManager;
NSFileManager['- fileExistsAtPath:'].implementation = function(path) {
var blocklist = [
'/Applications/Cydia.app',
'/Library/MobileSubstrate/',
'/bin/bash', '/usr/sbin/sshd',
'/etc/apt', '/private/var/lib/apt/'
];
for (var i = 0; i < blocklist.length; i++) {
if (path.isEqualToString(blocklist[i])) {
console.log('[+] Blocked jailbreak check: ' + path);
return 0;
}
}
return this['- fileExistsAtPath:'](path);
};
var NSTask = ObjC.classes.NSTask;
if (NSTask) {
NSTask['- launch'].implementation = function() {
path = .();
(path.() || path.()) {
.( + path);
;
}
[]();
};
}
= {};
. = () { ; };
dlopen = (.(, ), , [, ]);
}
Shadow (iOS Tweak)
Analyse Dynamique
Network Traffic
mitmproxy -p 8080
rvictl -s <UDID>
sudo tcpdump -i rvi0 -w capture.pcap
sudo ifconfig rvi0
Keychain Analysis
if (ObjC.available) {
var secItemCopyMatching = Module.findExportByName('Security', 'SecItemCopyMatching');
Interceptor.attach(secItemCopyMatching, {
onEnter: function(args) {
console.log('[+] SecItemCopyMatching called');
},
onLeave: function(retval) {
console.log('[+] Ret: ' + retval);
}
});
}
# Objection — keychain dump
objection -g com.target.app explore
ios keychain dump
Frida — Crypto Operations
if (ObjC.available) {
var CCCrypt = Module.findExportByName('libcommonCrypto.dylib', 'CCCrypt');
Interceptor.attach(CCCrypt, {
onEnter: function(args) {
console.log('[+] CCCrypt called');
console.log('Operation: ' + args[0]);
console.log('Algorithm: ' + args[1]);
console.log('Options: ' + args[2]);
console.log('Key data: ' + Memory.readByteArray(args[5], 32));
}
});
var NSData = ObjC.classes.NSData;
NSData['- base64EncodedStringWithOptions:'].implementation = function(opts) {
result = [](opts);
.( + result);
result;
};
= ..;
[]. = () {
.( + obj);
[](obj, secure, err);
};
}
Outils Essentiels
| Outil | Description |
|---|
| Frida | Dynamic instrumentation (iOS + macOS) |
| Objection | Mobile exploration framework |
| frida-ios-dump | Dump décrypté d'IPA |
| class-dump | Export des headers Objective-C |
| Ghidra | Reverse engineering suite |
| Hopper | Disassembler/decompiler |
| Needle | iOS security testing framework |
| iOS-Analysis-Toolkit | iOS pentest automation |
| IPATool | Téléchargement IPA CLI |
| Cycript | Objective-C runtime inspection |
iOS App Security Checklist
- IPA extraction et décryptage
- Analyse Info.plist (ATS, URL schemes)
- Reverse engineering du binaire (strings, class-dump)
- SSL pinning bypass
- Jailbreak detection bypass
- Keychain data analysis
- NSUserDefaults / plist inspection
- SQLite / CoreData analysis
- Network traffic interception
- Deep link injection
- Cryptographic weakness assessment
- UIPasteboard data leakage
- TouchID/FaceID bypass
- Insecure data storage (cache, cookies)
- Third-party SDK analysis (crashlytics, analytics)
Ressources