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

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