hacktricks/mobile-pentesting/ios-pentesting/basic-ios-testing-operations.md

28 KiB

Opérations de base de test iOS

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

Obtenir l'UDID d'un appareil iOS

{% hint style="info" %} Effectuez ces actions en ayant connecté l'appareil à l'ordinateur via USB et en ayant déverrouillé l'appareil. {% endhint %}

L'UDID est une séquence unique de 40 chiffres et lettres permettant d'identifier un appareil iOS. Vous pouvez trouver l'UDID de votre appareil iOS sur macOS Catalina et ultérieur dans l'application Finder, car iTunes n'est plus disponible dans Catalina. Il suffit de sélectionner l'appareil iOS connecté dans Finder et de cliquer sur les informations sous le nom de l'appareil iOS pour les parcourir. En plus de l'UDID, vous pouvez trouver le numéro de série, l'IMEI et d'autres informations utiles.

Si vous utilisez une version de macOS antérieure à Catalina, vous pouvez trouver l'UDID de votre appareil iOS via iTunes, en sélectionnant votre appareil et en cliquant sur "Numéro de série" dans l'onglet Résumé. En cliquant dessus, vous parcourrez les différentes métadonnées de l'appareil iOS, y compris son UDID.

Il est également possible d'obtenir l'UDID via divers outils en ligne de commande sur macOS lorsque l'appareil est connecté via USB :

$ ioreg -p IOUSB -l | grep "USB Serial"
|         "USB Serial Number" = "9e8ada44246cee813e2f8c1407520bf2f84849ec"
$ brew install ideviceinstaller
$ idevice_id -l
316f01bd160932d2bf2f95f1f142bc29b1c62dbc
  • En utilisant le system_profiler :
$ system_profiler SPUSBDataType | sed -n -e '/iPad/,/Serial/p;/iPhone/,/Serial/p;/iPod/,/Serial/p' | grep "Serial Number:"
2019-09-08 10:18:03.920 system_profiler[13251:1050356] SPUSBDevice: IOCreatePlugInInterfaceForService failed 0xe00002be
Serial Number: 64655621de6ef5e56a874d63f1e1bdd14f7103b1
  • En utilisant instruments :
$ instruments -s devices

Accéder à l'interpréteur de commandes de l'appareil

Après avoir jailbreaké l'appareil, vous devriez avoir installé un nouveau gestionnaire d'applications comme Cydia.

SSH

Pour activer l'accès SSH à votre appareil iOS, vous pouvez installer le paquet OpenSSH. Une fois installé, vous pouvez accéder à votre appareil via ssh en exécutant ssh root@<adresse_ip_de_l'appareil>, ce qui vous connectera en tant qu'utilisateur root :

$ ssh root@192.168.197.234
root@192.168.197.234's password:
iPhone:~ root#

Lorsque vous accédez à votre appareil iOS via SSH, tenez compte des éléments suivants :

  • Les utilisateurs par défaut sont root et mobile.
  • Le mot de passe par défaut pour les deux est alpine.

N'oubliez pas de changer le mot de passe par défaut pour les utilisateurs root et mobile, car toute personne sur le même réseau peut trouver l'adresse IP de votre appareil et se connecter avec le mot de passe par défaut bien connu, ce qui leur donnera un accès root à votre appareil.

Se connecter à un appareil via SSH via USB

Lors d'un test en boîte noire réel, une connexion Wi-Fi fiable peut ne pas être disponible. Dans cette situation, vous pouvez utiliser usbmuxd pour vous connecter au serveur SSH de votre appareil via USB.

Connectez macOS à un appareil iOS en installant et en lançant iproxy :

$ brew install libimobiledevice
$ iproxy 2222 22
waiting for connection

La commande ci-dessus mappe le port 22 de l'appareil iOS sur le port 2222 de localhost. Vous pouvez également faire en sorte que iproxy s'exécute automatiquement en arrière-plan si vous ne souhaitez pas exécuter le binaire à chaque fois que vous souhaitez utiliser SSH via USB.

Avec la commande suivante dans une nouvelle fenêtre de terminal, vous pouvez vous connecter à l'appareil :

$ ssh -p 2222 root@localhost
root@localhost's password:
iPhone:~ root#

Petite note sur l'USB d'un iDevice : sur un appareil iOS, vous ne pouvez plus établir de connexions de données après 1 heure d'inactivité, à moins de le déverrouiller à nouveau en raison du mode restreint USB, qui a été introduit avec iOS 11.4.1.

Application Shell sur l'appareil

Bien que l'utilisation d'un shell sur l'appareil (émulateur de terminal) puisse être très fastidieuse par rapport à un shell distant, elle peut s'avérer pratique pour le débogage en cas, par exemple, de problèmes de réseau ou de vérification de certaines configurations. Par exemple, vous pouvez installer NewTerm 2 via Cydia à cette fin (il prend en charge iOS 6.0 à 12.1.2 au moment de la rédaction de ceci).

De plus, il existe quelques jailbreaks qui désactivent explicitement SSH entrant pour des raisons de sécurité. Dans ces cas, il est très pratique d'avoir une application shell sur l'appareil, que vous pouvez utiliser pour d'abord établir une connexion SSH sortante depuis l'appareil avec un shell inversé, puis vous connecter depuis votre ordinateur hôte.

Ouvrir un shell inversé via SSH peut être fait en exécutant la commande ssh -R <remote_port>:localhost:22 <username>@<host_computer_ip>.

Sur l'application shell sur l'appareil, exécutez la commande suivante et, lorsque vous y êtes invité, saisissez le mot de passe de l'utilisateur mstg de l'ordinateur hôte :

ssh -R 2222:localhost:22 mstg@192.168.197.235

Sur votre ordinateur hôte, exécutez la commande suivante et, lorsque vous y êtes invité, saisissez le mot de passe de l'utilisateur root de l'appareil iOS :

$ ssh -p 2222 root@localhost

Mot de passe oublié

Si vous oubliez votre mot de passe et souhaitez le réinitialiser par défaut alpine :

  1. Modifiez le fichier /private/etc/master.passwd sur votre appareil iOS jailbreaké à l'aide d'un terminal sur l'appareil ou en utilisant des applications comme Filza ou iFile.
  2. Trouvez les lignes :
root:xxxxxxxxx:0:0::0:0:System Administrator:/var/root:/bin/sh
mobile:xxxxxxxxx:501:501::0:0:Mobile User:/var/mobile:/bin/sh
  1. Changez xxxxxxxxx en /smx7MYTQIi2M (qui est le mot de passe haché alpine).
  2. Enregistrez et quittez.

Transfert de données

Copie des fichiers de données de l'application via SSH et SCP

Comme nous le savons maintenant, les fichiers de notre application sont stockés dans le répertoire Data. Vous pouvez maintenant simplement archiver le répertoire Data avec tar et le récupérer depuis l'appareil avec scp :

iPhone:~ root# tar czvf /tmp/data.tgz /private/var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8EF8-8F5560EB0693
iPhone:~ root# exit
$ scp -P 2222 root@localhost:/tmp/data.tgz .

Utilisation de iFunbox

iFunbox est une application GUI qui peut être utilisée pour plusieurs choses (y compris le téléchargement/téléversement de fichiers).
Un autre outil GUI à cette fin est iExplorer.

{% hint style="info" %} À partir de la version iOS 8.4, Apple a restreint l'accès des gestionnaires tiers au sandbox de l'application, donc des outils comme iFunbox et iExplorer n'affichent plus/récupèrent plus les fichiers des applications installées sur l'appareil si celui-ci n'est pas jailbreaké. {% endhint %}

Utilisation de Objection

Lorsque vous démarrez objection (objection --gadget com.apple.mobilesafari explorer), vous trouverez l'invite dans le répertoire Bundle.

org.owasp.MSTG on (iPhone: 10.3.3) [usb] # pwd print
Current directory: /var/containers/Bundle/Application/DABF849D-493E-464C-B66B-B8B6C53A4E76/org.owasp.MSTG.app

Utilisez la commande env pour obtenir les répertoires de l'application et naviguez vers le répertoire Documents.

org.owasp.MSTG on (iPhone: 10.3.3) [usb] # cd /var/mobile/Containers/Data/Application/72C7AAFB-1D75-4FBA-9D83-D8B4A2D44133/Documents
/var/mobile/Containers/Data/Application/72C7AAFB-1D75-4FBA-9D83-D8B4A2D44133/Documents

Avec la commande file download <nom du fichier>, vous pouvez télécharger un fichier depuis l'appareil iOS vers votre ordinateur hôte et l'analyser par la suite.

org.owasp.MSTG on (iPhone: 10.3.3) [usb] # file download .com.apple.mobile_container_manager.metadata.plist
Downloading /var/mobile/Containers/Data/Application/72C7AAFB-1D75-4FBA-9D83-D8B4A2D44133/.com.apple.mobile_container_manager.metadata.plist to .com.apple.mobile_container_manager.metadata.plist
Streaming file from device...
Writing bytes to destination...
Successfully downloaded /var/mobile/Containers/Data/Application/72C7AAFB-1D75-4FBA-9D83-D8B4A2D44133/.com.apple.mobile_container_manager.metadata.plist to .com.apple.mobile_container_manager.metadata.plist

Vous pouvez également télécharger des fichiers sur l'appareil iOS avec file upload <chemin_fichier_local>.

Obtention et extraction des applications

Obtenir le fichier IPA à partir d'un lien de distribution OTA

Pendant le développement, les applications sont parfois fournies aux testeurs via une distribution over-the-air (OTA). Dans cette situation, vous recevrez un lien itms-services, comme celui-ci :

itms-services://?action=download-manifest&url=https://s3-ap-southeast-1.amazonaws.com/test-uat/manifest.plist

Vous pouvez utiliser l'outil ITMS services asset downloader pour télécharger l'IPA à partir d'une URL de distribution OTA. Installez-le via npm :

$ npm install -g itms-services

Enregistrez le fichier IPA localement avec la commande suivante :

# itms-services -u "itms-services://?action=download-manifest&url=https://s3-ap-southeast-1.amazonaws.com/test-uat/manifest.plist" -o - > out.ipa

Acquisition du binaire de l'application

  1. À partir d'un IPA :

Si vous avez l'IPA (probablement incluant un binaire d'application déjà décrypté), décompressez-le et vous êtes prêt à commencer. Le binaire de l'application se trouve dans le répertoire principal du bundle (.app), par exemple Payload/Telegram X.app/Telegram X. Consultez la sous-section suivante pour plus de détails sur l'extraction des listes de propriétés.

Dans le Finder de macOS, les répertoires .app sont ouverts en faisant un clic droit dessus et en sélectionnant "Afficher le contenu du paquet". Dans le terminal, vous pouvez simplement vous déplacer avec la commande cd.

  1. À partir d'un appareil jailbreaké :

Si vous n'avez pas l'IPA d'origine, vous avez besoin d'un appareil jailbreaké sur lequel vous allez installer l'application (par exemple via l'App Store). Une fois installée, vous devez extraire le binaire de l'application de la mémoire et reconstruire le fichier IPA. En raison de la gestion des droits numériques (DRM), le fichier binaire de l'application est chiffré lorsqu'il est stocké sur l'appareil iOS, il ne suffit donc pas de le récupérer depuis le bundle (que ce soit via SSH ou Objection) pour le rétro-ingénierer (lire la section suivante).

Décryptage (Manuel)

Contrairement à une application Android, le binaire d'une application iOS ne peut être que désassemblé et non décompilé.
Lorsqu'une application est soumise à l'App Store, Apple vérifie d'abord le comportement de l'application et, avant de la publier sur l'App Store, Apple chiffre le binaire à l'aide de FairPlay. Ainsi, le téléchargement du binaire depuis l'App Store est chiffré, ce qui complique les tâches de rétro-ingénierie.

Cependant, notez qu'il existe d'autres logiciels tiers pouvant être utilisés pour obfusquer les binaires résultants.

Pour exécuter le binaire chiffré, l'appareil doit le décrypter en mémoire. Ensuite, il est possible de dump le binaire décrypté depuis la mémoire.

Tout d'abord, vérifiez si le binaire est compilé avec le drapeau PIE (Position Independent Code) :

otool -Vh Original_App #Check the last word of the last line of this code
Home:
Mach header
magic  cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
MH_MAGIC_64   X86_64        ALL  0x00     EXECUTE    47       6080   NOUNDEFS DYLDLINK TWOLEVEL PIE

Si elle est définie, vous pouvez utiliser le script change_macho_flags.py pour la supprimer avec python2 :

python change_mach_o_flags.py --no-pie Original_App
otool -Vh Hello_World
Hello_World:
Mach header
magic  cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
MH_MAGIC      ARM         V7  0x00     EXECUTE    22       2356   NOUNDEFS DYLDLINK TWOLEVEL MH_NO_HEAP_EXECUTION

Maintenant que le drapeau PIE n'est pas activé, le système d'exploitation chargera le programme à un emplacement de départ fixe à chaque fois. Pour trouver cet emplacement, vous pouvez utiliser :

otool -l Original_App | grep -A 3 LC_SEGMENT | grep -A 1 __TEXT
segname __TEXT
vmaddr 0x00004000

Ensuite, il est nécessaire d'extraire la plage de mémoire qui doit être dumpée :

otool -l Original_App | grep -A 4 LC_ENCRYPTION_INFO
cmd LC_ENCRYPTION_INFO
cmdsize 20
cryptoff 16384
cryptsize 17416192
cryptid 0

La valeur de cryptoff indique l'adresse de départ du contenu chiffré et cryptsize indique la taille du contenu chiffré.

Ainsi, l'adresse de départ pour le vidage sera vmaddr + cryptoff et l'adresse de fin sera l'adresse de départ + cryptsize.
Dans ce cas : adresse_de_départ = 0x4000 + 0x4000 = 0x8000 __ et adresse_de_fin = 0x8000 + 0x109c000 = 0x10a4000

Avec ces informations, il suffit d'exécuter l'application sur l'appareil jailbreaké, de se connecter au processus avec gdb (gdb -p <pid>) et de vider la mémoire :

dump memory dump.bin 0x8000 0x10a4000

Félicitations ! Vous avez déchiffré la section chiffrée dans dump.bin. Maintenant, transférez cette sauvegarde sur votre ordinateur et remplacez la section chiffrée par la version déchiffrée :

dd bs=1 seek=<starting_address> conv=notrunc if=dump.bin of=Original_App

Il reste une étape à accomplir. L'application indique toujours dans ses métadonnées qu'elle est cryptée, mais ce n'est pas le cas. Ensuite, lors de l'exécution, l'appareil va essayer de décrypter la section déjà décryptée et cela va échouer.
Cependant, vous pouvez utiliser des outils comme MachOView pour modifier cette information. Il suffit d'ouvrir le binaire et de définir le cryptid à 0 :

Décryptage (Automatiquement)

frida-ios-dump

Vous pouvez utiliser des outils comme frida-ios-dump pour supprimer automatiquement le chiffrement d'une application.

Tout d'abord, assurez-vous que la configuration dans Frida-ios-dump dump.py est définie soit sur localhost avec le port 2222 lorsque vous utilisez iproxy, soit sur l'adresse IP réelle et le port de l'appareil à partir duquel vous souhaitez extraire le binaire.

Maintenant, vous pouvez utiliser en toute sécurité l'outil pour énumérer les applications installées :

$ python dump.py -l
PID  Name             Identifier
----  ---------------  -------------------------------------
860  Cydia            com.saurik.Cydia
1130  Settings         com.apple.Preferences
685  Mail             com.apple.mobilemail
834  Telegram         ph.telegra.Telegraph
-  Stocks           com.apple.stocks
...

et vous pouvez extraire un des binaires répertoriés :

$ python3 dump.py -u "root" -p "<PASSWORD>" ph.telegra.Telegraph

Start the target app ph.telegra.Telegraph
Dumping Telegram to /var/folders/qw/gz47_8_n6xx1c_lwq7pq5k040000gn/T
[frida-ios-dump]: HockeySDK.framework has been loaded.
[frida-ios-dump]: Load Postbox.framework success.
[frida-ios-dump]: libswiftContacts.dylib has been dlopen.
...
start dump /private/var/containers/Bundle/Application/14002D30-B113-4FDF-BD25-1BF740383149/Telegram.app/Frameworks/libswiftsimd.dylib
libswiftsimd.dylib.fid: 100%|██████████| 343k/343k [00:00<00:00, 1.54MB/s]
start dump /private/var/containers/Bundle/Application/14002D30-B113-4FDF-BD25-1BF740383149/Telegram.app/Frameworks/libswiftCoreData.dylib
libswiftCoreData.dylib.fid: 100%|██████████| 82.5k/82.5k [00:00<00:00, 477kB/s]
5.m4a: 80.9MB [00:14, 5.85MB/s]
0.00B [00:00, ?B/s]Generating "Telegram.ipa"

Après cela, le fichier Telegram.ipa sera créé dans votre répertoire actuel. Vous pouvez valider le succès du dump en supprimant l'application et en la réinstallant (par exemple, en utilisant ios-deploy ios-deploy -b Telegram.ipa). Notez que cela ne fonctionnera que sur des appareils jailbreakés, car sinon la signature ne sera pas valide.

flexdecrypt

Pour obtenir le fichier ipa d'une application installée, vous pouvez également utiliser l'outil flexdecrypt ou un wrapper de l'outil appelé flexdump.
Dans tous les cas, vous devrez installer flexdecrypt sur l'appareil en exécutant quelque chose comme :

wget https://github.com/JohnCoates/flexdecrypt/releases/download/1.1/flexdecrypt.deb
dpkg -i flexdecrypt.deb
rm flexdecrypt.deb

et pour utiliser flexdump :

apt install zip unzip
wget https://gist.githubusercontent.com/defparam/71d67ee738341559c35c684d659d40ac/raw/30c7612262f1faf7871ba8e32fbe29c0f3ef9e27/flexdump -P /usr/local/bin; chmod +x /usr/local/bin/flexdump
flexdump list #List apps
flexdump dump Twitter.app #Create .ipa file from app

bagbak

Encore un décrypteur d'application basé sur Frida. Nécessite un appareil iOS jailbreaké et frida.re

bagbak --raw Chrome

r2flutch

r2flutch est un outil qui utilise radare et frida pour décrypter et extraire les applications iOS.

Consultez le github pour plus d'informations.

Installation des applications

Lorsque vous installez une application sans utiliser l'App Store d'Apple, on parle de sideloading. Il existe différentes façons de faire du sideloading, qui sont décrites ci-dessous. Sur l'appareil iOS, le processus d'installation réel est ensuite géré par le démon installd, qui va décompresser et installer l'application. Pour intégrer des services d'application ou être installées sur un appareil iOS, toutes les applications doivent être signées avec un certificat délivré par Apple. Cela signifie que l'application ne peut être installée qu'après une vérification réussie de la signature du code. Sur un téléphone jailbreaké, cependant, vous pouvez contourner cette fonctionnalité de sécurité avec AppSync, un package disponible dans le magasin Cydia. Il contient de nombreuses applications utiles qui exploitent les privilèges root fournis par le jailbreak pour exécuter des fonctionnalités avancées. AppSync est un tweak qui patche installd, permettant l'installation de packages IPA signés de manière frauduleuse.

Différentes méthodes existent pour installer un package IPA sur un appareil iOS, qui sont décrites en détail ci-dessous.

Veuillez noter qu'iTunes n'est plus disponible dans macOS Catalina. Si vous utilisez une version plus ancienne de macOS, iTunes est toujours disponible, mais depuis iTunes 12.7, il n'est pas possible d'installer des applications.

Cydia Impactor

Cydia Impactor a été initialement créé pour jailbreaker les iPhones, mais a été réécrit pour signer et installer des packages IPA sur les appareils iOS via le sideloading (et même des fichiers APK sur les appareils Android). Cydia Impactor est disponible pour Windows, macOS et Linux. Un guide étape par étape et des étapes de dépannage sont disponibles sur yalujailbreak.net.

libimobiledevice

Sur Linux et macOS, vous pouvez également utiliser libimobiledevice, une bibliothèque de protocoles logiciels multiplateformes et un ensemble d'outils pour la communication native avec les appareils iOS. Cela vous permet d'installer des applications via une connexion USB en exécutant ideviceinstaller. La connexion est mise en œuvre avec le démon de multiplexage USB usbmuxd, qui fournit un tunnel TCP via USB.

Le package pour libimobiledevice sera disponible dans votre gestionnaire de paquets Linux. Sur macOS, vous pouvez installer libimobiledevice via brew:

$ brew install libimobiledevice
$ brew install ideviceinstaller

Après l'installation, vous disposez de plusieurs nouveaux outils en ligne de commande, tels que ideviceinfo, ideviceinstaller ou idevicedebug.

# The following command will show detailed information about the iOS device connected via USB.
$ ideviceinfo
# The following command will install the IPA to your iOS device.
$ ideviceinstaller -i iGoat-Swift_v1.0-frida-codesigned.ipa
...
Install: Complete
# The following command will start the app in debug mode, by providing the bundle name. The bundle name can be found in the previous command after "Installing".
$ idevicedebug -d run OWASP.iGoat-Swift

ipainstaller

L'IPA peut également être installé directement sur l'appareil iOS via la ligne de commande avec ipainstaller. Après avoir copié le fichier sur l'appareil, par exemple via scp, vous pouvez exécuter ipainstaller avec le nom de fichier de l'IPA :

$ ipainstaller App_name.ipa

ios-deploy

Sur macOS, vous pouvez également utiliser l'outil ios-deploy pour installer des applications iOS à partir de la ligne de commande. Vous devrez décompresser votre IPA car ios-deploy utilise les bundles d'applications pour installer les applications.

$ unzip Name.ipa
$ ios-deploy --bundle 'Payload/Name.app' -W -d -v

Après l'installation de l'application sur l'appareil iOS, vous pouvez simplement la démarrer en ajoutant le drapeau -m qui lancera directement le débogage sans réinstaller l'application.

$ ios-deploy --bundle 'Payload/Name.app' -W -d -v -m

Xcode

Il est également possible d'utiliser l'IDE Xcode pour installer des applications iOS en suivant les étapes suivantes :

  1. Lancez Xcode
  2. Sélectionnez Window/Devices and Simulators
  3. Sélectionnez l'appareil iOS connecté et cliquez sur le signe + dans Installed Apps.

Autoriser l'installation d'une application sur un appareil non iPad

Parfois, une application peut nécessiter d'être utilisée sur un appareil iPad. Si vous n'avez que des appareils iPhone ou iPod touch, vous pouvez forcer l'application à accepter d'être installée et utilisée sur ce type d'appareils. Vous pouvez le faire en modifiant la valeur de la propriété UIDeviceFamily à la valeur 1 dans le fichier Info.plist.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>

<key>UIDeviceFamily</key>
<array>
<integer>1</integer>
</array>

</dict>
</plist>

Il est important de noter que modifier cette valeur rompra la signature originale du fichier IPA, vous devez donc resigner l'IPA, après la mise à jour, afin de l'installer sur un appareil sur lequel la validation de la signature n'a pas été désactivée.

Cette méthode de contournement peut ne pas fonctionner si l'application nécessite des fonctionnalités spécifiques aux iPad modernes alors que votre iPhone ou iPod est un peu plus ancien.

Les valeurs possibles pour la propriété UIDeviceFamily peuvent être trouvées dans la documentation du développeur Apple.

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥