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 .plistLes 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 getNSURLCredentialStorage
objection -g <identifiant-app> explore
ios nsurlcredentialstorage dumpKeyChain
objection -g <identifiant-app> explore
ios keychain dump #Permet de dump la keyChainCoreData
Voici le chemin d'accès usuel du fichier contenant les CoreData
/var/mobile/Containers/Data/Application/<UUID>/Library/ApplicationSi aucune db sqlite n'est présente, connectez-vous en ssh et faite ceci :
cd /var/mobile/Containers/Data/Application/<UUID>
find . -name *.sqlitePour 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 SQLCache de l'application
objection -g <identifiant-app> explore
cd /var/mobile/Containers/Data/Application/<UUID>/Library/Caches/<Bundle Identifier>
sqlite connect Cache.dbRealm database
Le chemin des DB Realm est le suivant :
/var/mobile/Containers/Data/Application/app_id/DocumentsPour ouvrir le fichier, installez Realm Studio
Cookies
objection -g <identifiant-app> explore
ios cookies get --jsonCouchbase 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_nameSTRG_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 -lEnsuite créez une backup complète de votre ipad/iphone à l'aide de l'outil idevicebackup2
idevicebackup2 backup --full -u $(idevice_id -l) ./backupVous 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\BackupIl 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 keyChainDé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.datSi 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.datCACH_02 : Presse-papier
Pour auditer cette vulnérabilité, lancez la commande suivante :
objection -g <identifiant-app> explore
ios pasteboard monitoret 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>.jpegPLATFORM_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