iOS Pentesting
Utilisez Trickest pour construire facilement et automatiser des flux de travail alimentés par les outils communautaires les plus avancés au monde. Accédez dès aujourd'hui :
Bases d'iOS
iOS BasicsEnvironnement de test
Sur cette page, vous trouverez des informations sur le simulateur iOS, les émulateurs et le jailbreak :
iOS Testing EnvironmentAnalyse initiale
Opérations de test iOS de base
Pendant le test, plusieurs opérations seront suggérées (connexion à l'appareil, lecture/écriture/téléchargement de fichiers, utilisation de certains outils...). Par conséquent, si vous ne savez pas comment effectuer l'une de ces actions, veuillez commencer par lire la page :
iOS Basic Testing OperationsPour les étapes suivantes, l'application doit être installée sur l'appareil et vous devez déjà avoir obtenu le fichier IPA de l'application. Consultez la page Opérations de test iOS de base pour apprendre comment faire cela.
Analyse statique de base
Il est recommandé d'utiliser l'outil MobSF pour effectuer une analyse statique automatique du fichier IPA.
Identification des protections présentes dans le binaire :
PIE (Executable à adresses indépendantes) : Lorsqu'il est activé, l'application se charge à une adresse mémoire aléatoire à chaque lancement, ce qui rend plus difficile de prédire son adresse mémoire initiale.
Canaris de pile : Pour valider l'intégrité de la pile, une valeur de « canari » est placée sur la pile avant d'appeler une fonction et est validée à nouveau une fois que la fonction se termine.
ARC (Comptage automatique des références) : Pour prévenir les défauts courants de corruption de mémoire
Binaire chiffré : Le binaire devrait être chiffré
Identification des fonctions sensibles/non sécurisées
Algorithmes de hachage faibles
Fonctions de génération aléatoire non sécurisées
Fonction 'Malloc' non sécurisée
Fonctions non sécurisées et vulnérables
Analyse dynamique de base
Consultez l'analyse dynamique effectuée par MobSF. Vous devrez naviguer à travers les différentes vues et interagir avec elles, mais il accrochera plusieurs classes et fera d'autres choses, puis préparera un rapport une fois que vous aurez terminé.
Liste des applications installées
Utilisez la commande frida-ps -Uai
pour déterminer l'identifiant de bundle des applications installées :
Énumération de base & Hooking
Apprenez à énumérer les composants de l'application et comment accrocher facilement les méthodes et les classes avec objection:
iOS Hooking With ObjectionStructure de l'IPA
La structure d'un fichier IPA est essentiellement celle d'un paquet compressé. En renommant son extension en .zip
, il peut être décompressé pour révéler son contenu. Dans cette structure, un Bundle représente une application entièrement empaquetée prête pour l'installation. À l'intérieur, vous trouverez un répertoire nommé <NOM>.app
, qui encapsule les ressources de l'application.
Info.plist
: Ce fichier contient des détails de configuration spécifiques de l'application._CodeSignature/
: Ce répertoire inclut un fichier plist qui contient une signature, assurant l'intégrité de tous les fichiers dans le bundle.Assets.car
: Une archive compressée qui stocke des fichiers d'actifs tels que des icônes.Frameworks/
: Ce dossier contient les bibliothèques natives de l'application, qui peuvent être sous forme de fichiers.dylib
ou.framework
.PlugIns/
: Cela peut inclure des extensions de l'application, appelées fichiers.appex
, bien qu'ils ne soient pas toujours présents.Core Data
: Il est utilisé pour sauvegarder les données permanentes de votre application pour une utilisation hors ligne, mettre en cache des données temporaires, et ajouter une fonctionnalité d'annulation à votre application sur un seul appareil. Pour synchroniser les données sur plusieurs appareils dans un seul compte iCloud, Core Data reflète automatiquement votre schéma dans un conteneur CloudKit.PkgInfo
: Le fichierPkgInfo
est une façon alternative de spécifier les codes de type et de créateur de votre application ou bundle.en.lproj, fr.proj, Base.lproj: Sont les packs de langues qui contiennent des ressources pour ces langues spécifiques, et une ressource par défaut au cas où une langue n'est pas prise en charge.
Sécurité: Le répertoire
_CodeSignature/
joue un rôle critique dans la sécurité de l'application en vérifiant l'intégrité de tous les fichiers regroupés via des signatures numériques.Gestion des actifs: Le fichier
Assets.car
utilise la compression pour gérer efficacement les actifs graphiques, essentielle pour optimiser les performances de l'application et réduire sa taille globale.Frameworks et PlugIns: Ces répertoires soulignent la modularité des applications iOS, permettant aux développeurs d'inclure des bibliothèques de code réutilisables (
Frameworks/
) et d'étendre la fonctionnalité de l'application (PlugIns/
).Localisation: La structure prend en charge plusieurs langues, facilitant la portée mondiale de l'application en incluant des ressources pour des packs de langues spécifiques.
Info.plist
Le Info.plist sert de pierre angulaire pour les applications iOS, encapsulant les données de configuration clés sous forme de paires clé-valeur. Ce fichier est requis non seulement pour les applications, mais aussi pour les extensions d'application et les frameworks inclus. Il est structuré en XML ou en format binaire et contient des informations critiques allant des autorisations d'application aux configurations de sécurité. Pour une exploration détaillée des clés disponibles, on peut se référer à la Documentation du développeur Apple.
Pour ceux qui souhaitent travailler avec ce fichier dans un format plus accessible, la conversion en XML peut être réalisée facilement en utilisant plutil
sur macOS (disponible nativement sur les versions 10.2 et ultérieures) ou plistutil
sur Linux. Les commandes de conversion sont les suivantes:
Pour macOS:
Pour Linux:
Parmi la myriade d'informations que le fichier Info.plist peut divulguer, les entrées notables incluent les chaînes d'autorisation de l'application (UsageDescription
), les schémas d'URL personnalisés (CFBundleURLTypes
), et les configurations pour la sécurité du transport de l'application (NSAppTransportSecurity
). Ces entrées, ainsi que d'autres comme les types de documents personnalisés exportés/importés (UTExportedTypeDeclarations
/ UTImportedTypeDeclarations
), peuvent être facilement localisées en inspectant le fichier ou en utilisant une simple commande grep
:
Chemins des données
Dans l'environnement iOS, les répertoires sont spécifiquement désignés pour les applications système et les applications installées par l'utilisateur. Les applications système résident dans le répertoire /Applications
, tandis que les applications installées par l'utilisateur sont placées sous /private/var/containers/
. Ces applications se voient attribuer un identifiant unique connu sous le nom d'UUID de 128 bits, rendant la tâche de localiser manuellement le dossier d'une application difficile en raison du caractère aléatoire des noms de répertoire.
Pour faciliter la découverte du répertoire d'installation d'une application installée par l'utilisateur, l'outil objection fournit une commande utile, env
. Cette commande révèle des informations détaillées sur le répertoire de l'application en question. Voici un exemple d'utilisation de cette commande:
Alternativement, le nom de l'application peut être recherché dans /private/var/containers
en utilisant la commande find
:
Les commandes telles que ps
et lsof
peuvent également être utilisées pour identifier le processus de l'application et lister les fichiers ouverts, respectivement, fournissant des informations sur les chemins d'accès actifs de l'application :
Répertoire du bundle :
AppName.app
Il s'agit du Bundle de l'application tel que vu précédemment dans l'IPA, il contient des données essentielles de l'application, du contenu statique ainsi que le binaire compilé de l'application.
Ce répertoire est visible par les utilisateurs, mais les utilisateurs ne peuvent pas écrire dedans.
Le contenu de ce répertoire n'est pas sauvegardé.
Les contenus de ce dossier sont utilisés pour valider la signature du code.
Répertoire des données :
Documents/
Contient toutes les données générées par l'utilisateur. L'utilisateur final de l'application initie la création de ces données.
Visible par les utilisateurs et les utilisateurs peuvent écrire dedans.
Le contenu de ce répertoire est sauvegardé.
L'application peut désactiver les chemins en définissant
NSURLIsExcludedFromBackupKey
.Library/
Contient tous les fichiers qui ne sont pas spécifiques à l'utilisateur, tels que les caches, les préférences, les cookies et les fichiers de configuration de liste de propriétés (plist).
Les applications iOS utilisent généralement les sous-répertoires
Application Support
etCaches
, mais l'application peut créer des sous-répertoires personnalisés.Library/Caches/
Contient des fichiers mis en cache semi-persistants.
Invisible pour les utilisateurs et les utilisateurs ne peuvent pas écrire dedans.
Le contenu de ce répertoire n'est pas sauvegardé.
Le système d'exploitation peut supprimer automatiquement les fichiers de ce répertoire lorsque l'application ne s'exécute pas et que l'espace de stockage est insuffisant.
Library/Application Support/
Contient des fichiers persistants nécessaires à l'exécution de l'application.
Invisible pour les utilisateurs et les utilisateurs ne peuvent pas écrire dedans.
Le contenu de ce répertoire est sauvegardé.
L'application peut désactiver les chemins en définissant
NSURLIsExcludedFromBackupKey
.Library/Preferences/
Utilisé pour stocker des propriétés qui peuvent persister même après le redémarrage d'une application.
Les informations sont enregistrées, non chiffrées, à l'intérieur du bac à sable de l'application dans un fichier plist appelé [BUNDLE_ID].plist.
Toutes les paires clé/valeur stockées à l'aide de
NSUserDefaults
peuvent être trouvées dans ce fichier.tmp/
Utilisez ce répertoire pour écrire des fichiers temporaires qui n'ont pas besoin de persister entre les lancements de l'application.
Contient des fichiers mis en cache non persistants.
Invisible pour les utilisateurs.
Le contenu de ce répertoire n'est pas sauvegardé.
Le système d'exploitation peut supprimer automatiquement les fichiers de ce répertoire lorsque l'application ne s'exécute pas et que l'espace de stockage est insuffisant.
Jetons un coup d'œil plus attentif au répertoire du Bundle de l'Application (.app) d'iGoat-Swift à l'intérieur du répertoire du Bundle (/var/containers/Bundle/Application/3ADAF47D-A734-49FA-B274-FBCA66589E67/iGoat-Swift.app
) :
Réversing binaire
À l'intérieur du dossier <nom-de-l'application>.app
, vous trouverez un fichier binaire appelé <nom-de-l'application>
. C'est le fichier qui sera exécuté. Vous pouvez effectuer une inspection de base du binaire avec l'outil otool
:
Vérifiez si l'application est chiffrée
Vérifiez s'il y a une sortie pour :
Désassemblage du binaire
Désassemblez la section texte :
Pour imprimer le segment Objective-C de l'application d'exemple, on peut utiliser :
Pour obtenir un code Objective-C plus compact, vous pouvez utiliser class-dump :
Cependant, les meilleures options pour désassembler le binaire sont : Hopper et IDA.
Utilisez Trickest pour construire facilement et automatiser des flux de travail alimentés par les outils communautaires les plus avancés au monde. Accédez dès aujourd'hui :
Stockage de données
Pour en savoir plus sur la manière dont iOS stocke les données sur l'appareil, consultez cette page :
iOS BasicsLes emplacements suivants pour stocker des informations doivent être vérifiés juste après l'installation de l'application, après avoir vérifié toutes les fonctionnalités de l'application et même après déconnexion d'un utilisateur et connexion d'un autre. L'objectif est de trouver des informations sensibles non protégées de l'application (mots de passe, jetons), de l'utilisateur actuel et des utilisateurs précédemment connectés.
Plist
Les fichiers plist sont des fichiers XML structurés qui contiennent des paires clé-valeur. C'est une façon de stocker des données persistantes, donc parfois vous pouvez trouver des informations sensibles dans ces fichiers. Il est recommandé de vérifier ces fichiers après l'installation de l'application et après l'avoir utilisée intensivement pour voir si de nouvelles données sont écrites.
La manière la plus courante de persister les données dans les fichiers plist est par l'utilisation de NSUserDefaults. Ce fichier plist est enregistré à l'intérieur du bac à sable de l'application dans Library/Preferences/<appBundleID>.plist
La classe NSUserDefaults
fournit une interface programmatique pour interagir avec le système par défaut. Le système par défaut permet à une application de personnaliser son comportement en fonction des préférences de l'utilisateur. Les données enregistrées par NSUserDefaults
peuvent être consultées dans le bundle de l'application. Cette classe stocke des données dans un fichier plist, mais elle est destinée à être utilisée avec de petites quantités de données.
Ces données ne peuvent pas être directement consultées via un ordinateur de confiance, mais peuvent être consultées en effectuant une sauvegarde.
Vous pouvez extraire les informations enregistrées en utilisant NSUserDefaults
en utilisant ios nsuserdefaults get
d'objection.
Pour trouver tous les plist utilisés par l'application, vous pouvez accéder à /private/var/mobile/Containers/Data/Application/{APPID}
et exécuter :
Pour convertir des fichiers du format XML ou binaire (bplist) en XML, diverses méthodes sont disponibles en fonction de votre système d'exploitation :
Pour les utilisateurs de macOS : Utilisez la commande plutil
. C'est un outil intégré dans macOS (10.2+), conçu à cet effet :
Pour les utilisateurs de Linux : Installez d'abord libplist-utils
, puis utilisez plistutil
pour convertir votre fichier :
Au sein d'une session Objection : Pour analyser les applications mobiles, une commande spécifique vous permet de convertir directement les fichiers plist :
Core Data
Core Data
est un framework pour gérer la couche modèle des objets dans votre application. Core Data peut utiliser SQLite comme son magasin persistant, mais le framework lui-même n'est pas une base de données. CoreData n'encrypte pas ses données par défaut. Cependant, une couche d'encryption supplémentaire peut être ajoutée à CoreData. Consultez le GitHub Repo pour plus de détails.
Vous pouvez trouver les informations SQLite Core Data d'une application dans le chemin /private/var/mobile/Containers/Data/Application/{APPID}/Library/Application Support
Si vous pouvez ouvrir le SQLite et accéder à des informations sensibles, alors vous avez trouvé une mauvaise configuration.
YapDatabase
YapDatabase est un magasin de clés/valeurs construit sur SQLite. Comme les bases de données Yap sont des bases de données sqlite, vous pouvez les trouver en utilisant la commande proposée dans la section précédente.
Autres bases de données SQLite
Il est courant que les applications créent leur propre base de données sqlite. Elles peuvent stocker des données sensibles et les laisser non cryptées. Par conséquent, il est toujours intéressant de vérifier chaque base de données à l'intérieur du répertoire des applications. Allez donc dans le répertoire de l'application où les données sont enregistrées (/private/var/mobile/Containers/Data/Application/{APPID}
).
Bases de données en temps réel Firebase
Les développeurs peuvent stocker et synchroniser des données dans une base de données hébergée dans le cloud NoSQL via Firebase Real-Time Databases. Stockées au format JSON, les données sont synchronisées en temps réel avec tous les clients connectés.
Vous pouvez trouver comment vérifier les bases de données Firebase mal configurées ici:
Firebase DatabaseBases de données Realm
Realm Objective-C et Realm Swift offrent une alternative puissante pour le stockage de données, non fournie par Apple. Par défaut, elles stockent les données non chiffrées, avec le chiffrement disponible via une configuration spécifique.
Les bases de données se trouvent à : /private/var/mobile/Containers/Data/Application/{APPID}
. Pour explorer ces fichiers, on peut utiliser des commandes comme :
Pour visualiser ces fichiers de base de données, l'outil Realm Studio est recommandé.
Pour implémenter le chiffrement dans une base de données Realm, le code suivant peut être utilisé :
Bases de données Couchbase Lite
Couchbase Lite est décrit comme un moteur de base de données léger et intégré qui suit l'approche orientée document (NoSQL). Conçu pour être natif d'iOS et de macOS, il offre la capacité de synchroniser les données de manière transparente.
Pour identifier les bases de données Couchbase potentielles sur un appareil, le répertoire suivant doit être inspecté :
Cookies
iOS stocke les cookies des applications dans le Library/Cookies/cookies.binarycookies
à l'intérieur du dossier de chaque application. Cependant, les développeurs décident parfois de les sauvegarder dans le trousseau car le fichier de cookies mentionné peut être accédé dans les sauvegardes.
Pour inspecter le fichier de cookies, vous pouvez utiliser ce script python ou utiliser la commande ios cookies get
d'objection.
Vous pouvez également utiliser objection pour convertir ces fichiers en format JSON et inspecter les données.
Cache
Par défaut, NSURLSession stocke des données, telles que les requêtes et réponses HTTP dans la base de données Cache.db. Cette base de données peut contenir des données sensibles, si des jetons, des noms d'utilisateur ou toute autre information sensible ont été mises en cache. Pour trouver les informations mises en cache, ouvrez le répertoire de données de l'application (/var/mobile/Containers/Data/Application/<UUID>
) et allez à /Library/Caches/<Bundle Identifier>
. Le cache WebKit est également stocké dans le fichier Cache.db. Objection peut ouvrir et interagir avec la base de données avec la commande sqlite connect Cache.db
, car il s'agit d'une base de données SQLite normale.
Il est recommandé de désactiver la mise en cache de ces données, car elles peuvent contenir des informations sensibles dans la requête ou la réponse. La liste ci-dessous montre différentes façons d'y parvenir :
Il est recommandé de supprimer les réponses mises en cache après la déconnexion. Cela peut être fait avec la méthode fournie par Apple appelée
removeAllCachedResponses
Vous pouvez appeler cette méthode comme suit :
URLCache.shared.removeAllCachedResponses()
Cette méthode supprimera toutes les requêtes et réponses mises en cache du fichier Cache.db. 2. Si vous n'avez pas besoin d'utiliser les cookies, il est recommandé d'utiliser simplement la propriété de configuration .ephemeral de URLSession, qui désactivera l'enregistrement des cookies et des caches.
Un objet de configuration de session éphémère est similaire à un objet de configuration de session par défaut (voir default), sauf que l'objet de session correspondant ne stocke pas de caches, de magasins de certificats ou de données liées à la session sur le disque. Au lieu de cela, les données liées à la session sont stockées en RAM. La seule fois où une session éphémère écrit des données sur le disque est lorsque vous lui demandez d'écrire le contenu d'une URL dans un fichier.
3. Le cache peut également être désactivé en définissant la politique de cache sur .notAllowed. Cela désactivera le stockage du cache de quelque manière que ce soit, que ce soit en mémoire ou sur disque.
Snapshots
Chaque fois que vous appuyez sur le bouton d'accueil, iOS prend un instantané de l'écran actuel pour pouvoir effectuer la transition vers l'application de manière beaucoup plus fluide. Cependant, si des données sensibles sont présentes à l'écran actuel, elles seront enregistrées dans l'image (qui persiste après les redémarrages). Ce sont les instantanés auxquels vous pouvez également accéder en double-cliquant sur l'écran d'accueil pour passer d'une application à l'autre.
Sauf si l'iPhone est jailbreaké, l'attaquant doit avoir accès au dispositif débloqué pour voir ces captures d'écran. Par défaut, le dernier instantané est stocké dans le sandbox de l'application dans le dossier Library/Caches/Snapshots/
ou Library/SplashBoard/Snapshots
(les ordinateurs de confiance ne peuvent pas accéder au système de fichiers à partir de iOS 7.0).
Une façon de prévenir ce comportement indésirable est de mettre un écran vide ou de supprimer les données sensibles avant de prendre l'instantané en utilisant la fonction ApplicationDidEnterBackground()
.
Voici une méthode de remédiation d'exemple qui définira une capture d'écran par défaut.
Swift:
Objective-C:
Cela définit l'image d'arrière-plan sur overlayImage.png
chaque fois que l'application passe en arrière-plan. Cela empêche les fuites de données sensibles car overlayImage.png
remplacera toujours la vue actuelle.
Trousseau
Pour accéder et gérer le trousseau iOS, des outils comme Keychain-Dumper sont disponibles, adaptés aux appareils jailbreakés. De plus, Objection fournit la commande ios keychain dump
à des fins similaires.
Stockage des identifiants
La classe NSURLCredential est idéale pour enregistrer des informations sensibles directement dans le trousseau, contournant ainsi le besoin de NSUserDefaults ou d'autres wrappers. Pour stocker les identifiants après la connexion, le code Swift suivant est utilisé:
Pour extraire ces informations d'identification stockées, la commande ios nsurlcredentialstorage dump
d'Objection est utilisée.
Claviers personnalisés et cache du clavier
À partir d'iOS 8.0, les utilisateurs peuvent installer des extensions de clavier personnalisées, gérables sous Réglages > Général > Clavier > Claviers. Bien que ces claviers offrent une fonctionnalité étendue, ils posent un risque de journalisation des frappes et de transmission de données à des serveurs externes, bien que les utilisateurs soient informés des claviers nécessitant un accès réseau. Les applications peuvent, et doivent, restreindre l'utilisation des claviers personnalisés pour la saisie d'informations sensibles.
Recommandations en matière de sécurité :
Il est conseillé de désactiver les claviers tiers pour une sécurité renforcée.
Soyez conscient des fonctionnalités de correction automatique et de suggestions automatiques du clavier iOS par défaut, qui pourraient stocker des informations sensibles dans des fichiers cache situés dans
Library/Keyboard/{locale}-dynamic-text.dat
ou/private/var/mobile/Library/Keyboard/dynamic-text.dat
. Ces fichiers cache doivent être régulièrement vérifiés pour des données sensibles. Il est recommandé de réinitialiser le dictionnaire du clavier via Réglages > Général > Réinitialiser > Réinitialiser le dictionnaire du clavier pour effacer les données mises en cache.L'interception du trafic réseau peut révéler si un clavier personnalisé transmet des frappes à distance.
Prévention de la mise en cache des champs de texte
Le protocole UITextInputTraits offre des propriétés pour gérer la correction automatique et la saisie de texte sécurisée, essentielles pour prévenir la mise en cache d'informations sensibles. Par exemple, la désactivation de la correction automatique et l'activation de la saisie de texte sécurisée peuvent être réalisées avec :
De plus, les développeurs doivent s'assurer que les champs de texte, en particulier ceux destinés à saisir des informations sensibles telles que des mots de passe et des NIP, désactivent la mise en cache en définissant autocorrectionType
sur UITextAutocorrectionTypeNo
et secureTextEntry
sur YES
.
Journaux
Le débogage du code implique souvent l'utilisation de journaux. Il y a un risque car les journaux peuvent contenir des informations sensibles. Auparavant, dans iOS 6 et les versions antérieures, les journaux étaient accessibles à toutes les applications, posant un risque de fuite de données sensibles. Maintenant, les applications sont limitées à l'accès uniquement à leurs journaux.
Malgré ces restrictions, un attaquant ayant un accès physique à un appareil déverrouillé peut toujours exploiter cela en connectant l'appareil à un ordinateur et en lisant les journaux. Il est important de noter que les journaux restent sur le disque même après la désinstallation de l'application.
Pour atténuer les risques, il est conseillé d'interagir pleinement avec l'application, en explorant toutes ses fonctionnalités et ses entrées pour s'assurer qu'aucune information sensible n'est enregistrée involontairement.
Lors de l'examen du code source de l'application pour des fuites potentielles, recherchez à la fois les déclarations de journalisation prédéfinies et personnalisées en utilisant des mots-clés tels que NSLog
, NSAssert
, NSCAssert
, fprintf
pour les fonctions intégrées, et toute mention de Logging
ou Logfile
pour les implémentations personnalisées.
Surveillance des journaux système
Les applications enregistrent diverses informations qui peuvent être sensibles. Pour surveiller ces journaux, des outils et des commandes comme :
Sont utiles. De plus, Xcode fournit un moyen de collecter les journaux de la console :
Ouvrez Xcode.