CheatSheet
Objectif : Présenter les différents outils et commandes associées, afin de réaliser votre TI IOS.
STRG_01 : Données stockées localement
Fichier.plist
Pour afficher le contenu d'un .plist file :
objection -g <identifiant-app> explore
ios plist cat filename.plist # Permet d'afficher les fichiers .plist
Les chemins de fichier .plist pouvant potentiellement stocker des données sensibles.
/var/mobile/Containers/Data/Application/<UUID>/Documents #userInfo.plist
/var/mobile/Containers/Data/Application/app_name/Library/Preferences #NSUserDefaults
/Info.plist # Info.plist Ă la racine de l'IPA.
NSUserDefault
objection -g <identifiant-app> explore
ios nsuserdefaults get
NSURLCredentialStorage
objection -g <identifiant-app> explore
ios nsurlcredentialstorage dump
KeyChain
objection -g <identifiant-app> explore
ios keychain dump #Permet de dump la keyChain
CoreData
Voici le chemin d'accès usuel du fichier contenant les CoreData
/var/mobile/Containers/Data/Application/<UUID>/Library/Application
Si aucune db sqlite n'est présente, connectez-vous en ssh et faite ceci :
cd /var/mobile/Containers/Data/Application/<UUID>
find . -name *.sqlite
Pour afficher le contenu du fichier .sqlite, objection intègre une feature qui permet de le faire.
objection -g <identifiant-app> explore
sqlite connect <filename>.sqlite
#Entrez ensuite votre requĂŞte SQL
Cache de l'application
objection -g <identifiant-app> explore
cd /var/mobile/Containers/Data/Application/<UUID>/Library/Caches/<Bundle Identifier>
sqlite connect Cache.db
Realm database
Le chemin des DB Realm est le suivant :
/var/mobile/Containers/Data/Application/app_id/Documents
Pour ouvrir le fichier, installez Realm Studio
Cookies
objection -g <identifiant-app> explore
ios cookies get --json
Couchbase Lite Database
TO DO
Yap Database
TO DO
Navigation dans le répertoire bundle et data de l'application
Lorsque vous testez cette partie, n'oubliez pas de naviguer dans les répertoires bundle et data de l'application. Vous pouvez réaliser ceci en utilisant objection et en navigant dans chaque répertoire :
Documents/
Library/
Library/Caches/
tmp/
STRG_02 : Informations dans le système de journalisation
Installer libimobiledevice afin d'accéder au log de l'application en temps réel.
Si pendant l'installation vous avez une erreur, elle est du au package libimobiledevice-glue. Installez libimobiledevice-glue.
La commande pour consulter en temps réel les logs est la suivante :
idevicesyslog -p app_name
STRG_03 : Données dans les fichiers sauvegardes
Pour vérifier ce point de test, il y a deux méthodes :
Version Linux/Windows:
Utilisez premièrement l'outil idevice_id pour identifier votre appareil
idevice_id -l
Ensuite créez une backup complète de votre ipad/iphone à l'aide de l'outil idevicebackup2
idevicebackup2 backup --full -u $(idevice_id -l) ./backup
Vous devez désormais télécharger le logiciel iExplorer sur votre hôte Windows. Ce logiciel dispose d'une version gratuite : https://macroplant.com/iexplorer
Une fois cela fait, récupérez votre fichier de backup précedemment générer et place dans le dossier suivant :
C:\Users\%USERNAME%\AppData\Roaming\Apple Computer\MobileSync\Backup
Il vous suffit désormais d'ouvrir le logiciel iExplorer et d'analyser si des fichiers sensibles sont stockés dans la backup.
Version MacOS :
Si vous disposez d'un mac, faites une sauvegarde avec itunes et naviguez sur cette sauvegarde.
STRG_04 : Données persistantes dans la Keychain
Pour verifier ce point, utilisez la commande suivante pour dump la Keychain :
objection -g <identifiant-app> explore
ios keychain dump #Permet de dump la keyChain
Désinstallez et réinstaller l'application et relancer les commandes précedentes afin de comparer le contenu de la KeyChain avec celle précedement dumper.
CACH_01 : Cache du clavier
Pour obtenir le cache du clavier :
objection -g <identifiant-app> explore
cd /private/var/mobile/Library/Keyboard/
file download dynamic-text.dat
Si aucun fichier dynamic-text.dat n'existe naviguez dans l'arborescence pour y trouver des fichiers .dat.
Une fois le fichier téléchargé, éxécuter la commande suivante :
strings dynamic-text.dat
CACH_02 : Presse-papier
Pour auditer cette vulnérabilité, lancez la commande suivante :
objection -g <identifiant-app> explore
ios pasteboard monitor
et réaliser une action "COPIER" sur un champs sensible.
PRIVA_01 : Exposition de données via l’UI
PRIVA_02 : Confidentialité lors de la mise en arrière-plan
Les screenshot peuvent être stocké :
var/mobile/Containers/Data/Application/UUID/Library/Caches/Snapshots/
var/mobile/Containers/Data/Application/UUID/Library/SplashBoard/Snapshots
objection -g <identifiant-app> explore
cd /var/mobile/Containers/Data/Application/UUID/Library/SplashBoard/Snapshots
#cd /var/mobile/Containers/Data/Application/UUID/Library/Caches/Snapshots/
cd <bundle-identifier> # C'est possible que cette étape ne soit pas nécessaire
file download <filename>.jpeg
PLATFORM_01 : Permissions demandées par l’application
Vous pouvez identifier les permissions demandées par l'application en utilisant MobSF.

PLATFORM_02 : Schémas d’URLs
Vous pouvez identifier les schémas d'URL de l'application en utilisant MobSF ou bien en consultant le fichier Info.plist situé à la racine de l'IPA.

PRO TIPS :
strings binary_file | grep -E '.*\/.*'
PLATFORM_03 : Domaines utilisés par l’application
Utilsez l'outils MobSF pour réaliser un "domain malware check" :

WEB_01 : Configuration non sécurisée des Webviews
La webview UIWebView est un type de Webview déprécié qui ne doit pas être utilisé.
Ainsi pour détecter le type de WebViews et leurs configuration, utilisez le script frida suivant :
if (ObjC.available) {
//Pour avoir des belles couleurs
var Reset = "\x1b[0m";
var FgRed = "\x1b[31m";
var FgGreen = "\x1b[32m";
var FgCyan = "\x1b[36m";
console.log(Reset + "\n[*] Analyse des WebViews ...\n");
//Création du resolver
var resolver = new ApiResolver('objc');
//Recherche des classes
var matchesUI = resolver.enumerateMatches('*[UIWebView *]');
var matchesWK = resolver.enumerateMatches('*[WKWebView *]');
var matchesSF = resolver.enumerateMatches('*[SFSafariViewController *]');
//Résultat
if (matchesUI.length > 0) {
console.log(FgRed + '[!] UIWebView détéctée');
console.log(Reset);
ObjC.choose(ObjC.classes['UIWebView'], {
onMatch: function (ui) {
console.log(' > URL: ', ui.request());
},
onComplete: function () {
}
});
} else {
console.log(FgGreen + '[-] UIWebView non détéctée');
}
if (matchesWK.length > 0) {
console.log(FgCyan + '\n[+] WKWebView détéctée');
console.log(Reset);
ObjC.choose(ObjC.classes['WKWebView'], {
onMatch: function (wk) {
console.log(' > URL: ', wk.URL());
console.log(' > javaScriptEnabled:', wk.configuration().preferences().javaScriptEnabled());
console.log(' > hasOnlySecureContent:', wk.hasOnlySecureContent().toString());
console.log(' > allowFileAccessFromFileURLs:', wk.configuration().preferences().valueForKey_('allowFileAccessFromFileURLs').toString());
console.log(' > allowUniversalAccessFromFileURLs:', wk.configuration().valueForKey_('allowUniversalAccessFromFileURLs').toString());
},
onComplete: function () {
}
});
} else {
console.log(FgCyan + '\n[-] WKWebView non détéctée');
}
if (matchesSF.length > 0) {
console.log(FgGreen + '\n[+] SFSafariViewController détéctée');
} else {
console.log(FgCyan + '\n[-] SFSafariViewController non détéctée');
}
console.log(Reset + "\n");
}
Last updated