# 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 <a href="#strg_01-donnees-stockees-localement" id="strg_01-donnees-stockees-localement"></a>

#### Fichier.plist <a href="#fichierplist" id="fichierplist"></a>

Pour afficher le contenu d'un .plist file :

```bash
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.

```bash
/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 <a href="#nsuserdefault" id="nsuserdefault"></a>

```bash
objection -g <identifiant-app> explore
ios nsuserdefaults get
```

#### NSURLCredentialStorage <a href="#nsurlcredentialstorage" id="nsurlcredentialstorage"></a>

```bash
objection -g <identifiant-app> explore
ios nsurlcredentialstorage dump
```

#### KeyChain <a href="#keychain" id="keychain"></a>

```bash
objection -g <identifiant-app> explore
ios keychain dump #Permet de dump la keyChain
```

#### CoreData <a href="#coredata" id="coredata"></a>

Voici le chemin d'accès usuel du fichier contenant les CoreData

```bash
/var/mobile/Containers/Data/Application/<UUID>/Library/Application
```

Si aucune db sqlite n'est présente, connectez-vous en ssh et faite ceci :

```bash
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.

```bash
objection -g <identifiant-app> explore
sqlite connect <filename>.sqlite
#Entrez ensuite votre requête SQL
```

#### Cache de l'application <a href="#cache-de-lapplication" id="cache-de-lapplication"></a>

```bash
objection -g <identifiant-app> explore
cd /var/mobile/Containers/Data/Application/<UUID>/Library/Caches/<Bundle Identifier>
sqlite connect Cache.db
```

#### Realm database <a href="#realm-database" id="realm-database"></a>

Le chemin des DB Realm est le suivant :

```bash
/var/mobile/Containers/Data/Application/app_id/Documents
```

Pour ouvrir le fichier, installez [**Realm Studio**](https://github.com/realm/realm-studio)

#### Cookies <a href="#cookies" id="cookies"></a>

```bash
objection -g <identifiant-app> explore
ios cookies get --json
```

#### Couchbase Lite Database <a href="#couchbase-lite-database" id="couchbase-lite-database"></a>

TO DO

#### Yap Database <a href="#yap-database" id="yap-database"></a>

TO DO

#### Navigation dans le répertoire bundle et data de l'application <a href="#navigation-dans-le-repertoire-bundle-et-data-de-lapplication" id="navigation-dans-le-repertoire-bundle-et-data-de-lapplication"></a>

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 <a href="#strg_02-informations-dans-le-systeme-de-journalisation" id="strg_02-informations-dans-le-systeme-de-journalisation"></a>

Installer [**libimobiledevice**](https://github.com/libimobiledevice/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**](https://github.com/libimobiledevice/libimobiledevice-glue).

La commande pour consulter en temps réel les logs est la suivante :

```bash
idevicesyslog -p app_name
```

### STRG\_03 : Données dans les fichiers sauvegardes <a href="#strg_03-donnees-dans-les-fichiers-sauvegardes" id="strg_03-donnees-dans-les-fichiers-sauvegardes"></a>

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

```bash
idevice_id -l
```

Ensuite créez une backup complète de votre ipad/iphone à l'aide de l'outil idevicebackup2

```bash
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 <a href="#strg_04-donnees-persistantes-dans-la-keychain" id="strg_04-donnees-persistantes-dans-la-keychain"></a>

Pour verifier ce point, utilisez la commande suivante pour dump la Keychain :

```bash
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 <a href="#cach_01-cache-du-clavier" id="cach_01-cache-du-clavier"></a>

Pour obtenir le cache du clavier :

```bash
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 :

```bash
strings dynamic-text.dat
```

### CACH\_02 : Presse-papier <a href="#cach_02-presse-papier" id="cach_02-presse-papier"></a>

Pour auditer cette vulnérabilité, lancez la commande suivante :

```bash
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 <a href="#priva_01-exposition-de-donnees-via-lui" id="priva_01-exposition-de-donnees-via-lui"></a>

### PRIVA\_02 : Confidentialité lors de la mise en arrière-plan <a href="#priva_02-confidentialite-lors-de-la-mise-en-arriere-plan" id="priva_02-confidentialite-lors-de-la-mise-en-arriere-plan"></a>

Les screenshot peuvent être stocké :

* var/mobile/Containers/Data/Application/UUID/Library/Caches/Snapshots/
* var/mobile/Containers/Data/Application/UUID/Library/SplashBoard/Snapshots

```bash
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 <a href="#platform_01-permissions-demandees-par-lapplication" id="platform_01-permissions-demandees-par-lapplication"></a>

Vous pouvez identifier les permissions demandées par l'application en utilisant [**MobSF**](https://github.com/MobSF/Mobile-Security-Framework-MobSF).

<figure><img src="https://1236449586-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnLNcn403FNHCLyLwYmTO%2Fuploads%2FuFJoId6pFuUjqpBRgY7L%2Fimage.png?alt=media&#x26;token=85183525-1551-4b72-b1dd-d778e2b06040" alt=""><figcaption></figcaption></figure>

### PLATFORM\_02 : Schémas d’URLs <a href="#platform_02-schemas-durls" id="platform_02-schemas-durls"></a>

Vous pouvez identifier les schémas d'URL de l'application en utilisant [**MobSF**](https://github.com/MobSF/Mobile-Security-Framework-MobSF) ou bien en consultant le fichier Info.plist situé à la racine de l'IPA.

<figure><img src="https://1236449586-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnLNcn403FNHCLyLwYmTO%2Fuploads%2Fb7A82WHYyR5TFM8bRhGx%2Fimage.png?alt=media&#x26;token=5b5584fc-1399-4cef-a2f9-5c7763ef428a" alt=""><figcaption></figcaption></figure>

PRO TIPS :

```bash
strings binary_file | grep -E '.*\/.*'
```

### PLATFORM\_03 : Domaines utilisés par l’application <a href="#platform_03-domaines-utilises-par-lapplication" id="platform_03-domaines-utilises-par-lapplication"></a>

Utilsez l'outils [**MobSF**](https://github.com/MobSF/Mobile-Security-Framework-MobSF) pour réaliser un "domain malware check" :&#x20;

<figure><img src="https://1236449586-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnLNcn403FNHCLyLwYmTO%2Fuploads%2FKL5cH6ilpRepZg85obgD%2Fimage.png?alt=media&#x26;token=b66108f3-6899-451c-9066-418512aeada7" alt=""><figcaption></figcaption></figure>

### WEB\_01 : Configuration non sécurisée des Webviews <a href="#web_01-configuration-non-securisee-des-webviews" id="web_01-configuration-non-securisee-des-webviews"></a>

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 :&#x20;

```javascript
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");

}
```
