hacktricks/mobile-pentesting/xamarin-apps.md

12 KiB

Applications Xamarin

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

Informations de base

Xamarin est une plateforme open-source qui donne aux développeurs accès à une sélection complète d'outils et d'add-ons, leur permettant de créer des applications modernes pour iOS, Android et Windows en utilisant les frameworks .NET et C#.

Architecture Xamarin Android

Xamarin offre des liaisons .NET vers les espaces de noms Android.* et Java.*. Les applications Xamarin Android fonctionnent sous l'environnement d'exécution Mono, avec la machine virtuelle Android Runtime (ART) qui s'exécute côte à côte.

L'environnement d'exécution Mono appelle ces espaces de noms via des wrappers d'appel managés (MCW) et fournit des wrappers d'appel Android (ACW) à l'ART.

Ces deux environnements s'exécutent sur le noyau Linux et invoquent diverses API vers le code utilisateur. Cette configuration permet aux développeurs d'accéder au système sous-jacent.

Projet Xamarin iOS

Les applications Xamarin.iOS s'exécutent sous l'environnement d'exécution Mono et utilisent une compilation complète en temps réel (AOT) pour compiler les codes C# .NET en langage d'assemblage ARM.

Il s'exécute avec le runtime Objective-C. Les environnements d'exécution s'exécutent sur un noyau de type UNIX et invoquent plusieurs API vers le code utilisateur, ce qui permet aux développeurs d'accéder au système géré ou natif sous-jacent.

Le diagramme ci-dessous illustre cette architecture :

Qu'est-ce que le .Net Runtime et le Mono Framework ?

Le framework .Net est un ensemble d'assemblages, de classes et d'espaces de noms que les développeurs peuvent utiliser pour créer des applications ; le .Net Runtime exécute le code compilé, et le processus s'appelle l'exécution de code géré. Le .NET Runtime offre plusieurs fonctionnalités qui garantissent l'indépendance de la plateforme et sont compatibles avec les anciennes versions du framework.

Le framework Mono a été lancé en 2005 en tant qu'implémentation du framework .NET pour Linux (Ximian/SuSe/Novell). Sponsorisé par Microsoft et dirigé par Xamarin, Mono est l'implémentation open-source du framework .NET basée sur les normes ECMA pour Common Language Runtime et C#.

Techniques de rétro-ingénierie pour les applications Xamarin

Décompilation des assemblages Xamarin

La décompilation est le processus utilisé pour produire du code source à partir de code compilé. Pour obtenir des informations sur les assemblages et les exécutables actuellement en mémoire, Windows est un excellent endroit.

Pour ouvrir la fenêtre Modules, sélectionnez Déboguer > Fenêtres > Modules. Une fois que vous avez détecté le module qui nécessite une décompilation, faites un clic droit et sélectionnez "Décompiler la source vers un fichier de symboles". Cette action crée un fichier de symboles contenant une source décompilée qui, à son tour, vous permet d'accéder directement au code tiers à partir de votre code source.

Visual Studio décompile le code managé, même en l'absence de symboles, ce qui vous permet de consulter le code, d'inspecter les variables et de définir des points d'arrêt. Pour extraire le code source sur le disque, faites un clic droit sur le module avec la source intégrée et cliquez sur "Extraire la source intégrée". Cela exportera les fichiers source dans un dossier de fichiers divers pour une analyse ultérieure.

Compilation JIT vs AOT des applications Xamarin

Ces deux options permettent de compiler le code Xamarin basé sur C# en une application, c'est-à-dire la compilation juste à temps et la compilation en avance. La méthode de compilation affecte la façon dont le code de l'application est distribué dans le fichier apk ou ipa. Jetons-y rapidement un coup d'œil :

- Android : Xamarin vous permet de compiler en utilisant à la fois les indicateurs JIT et AOT pour Android. Il existe également un moyen d'obtenir le meilleur rendement d'exécution en utilisant le mode hybride AOT. Notez que le mode AOT complet est disponible uniquement pour la licence Enterprise.

- iOS : Il n'y a qu'une seule option dans le cas d'iOS, la compilation en avance. Cela est dû aux politiques d'Apple qui interdisent l'exécution de code généré dynamiquement sur un appareil.

{% hint style="info" %} Si vous rencontrez une application compilée en AOT complet, et si les fichiers d'assembly IL sont supprimés pour réduire la taille de la construction par le développeur, la rétro-ingénierie nécessite une étape supplémentaire d'extraction des fichiers dll à partir des fichiers .dll.so du dossier lib ou du fichier libmonodroid_bundle_app.so. S'il s'agit d'une application compilée en AOT hybride, et que les fichiers IL sont toujours conservés dans le bundle de l'application, nous pouvons les utiliser pour rétro-ingénier l'application. {% endhint %}

Obtenir les fichiers dll à partir de l'APK/IPA

Il suffit de décompresser le fichier apk/ipa et de copier tous les fichiers présents dans le répertoire assemblies :

Dans le cas des APK Android, ces fichiers dll sont compressés et ne peuvent pas être directement utilisés pour la décompilation. Heureusement, il existe des outils que nous pouvons utiliser pour décompresser ces fichiers dll comme XamAsmUnZ et xamarin-decompress.

python3 xamarin-decompress.py -o /path/to/decompressed/apk

Il est possible que, au lieu de fichiers dll, vous trouviez des fichiers assemblies.blob et assemblies.manifest dans le répertoire des assemblies. Il s'agit d'un AssemblyStore Xamarin et de la méthode actuellement recommandée pour empaqueter des dll dans une application Android. Le fichier assemblies.manifest est un fichier texte décrivant le contenu du fichier binaire assemblies.blob. Pour les décompresser, vous devrez utiliser pyxamstore.

pyxamstore unpack -d /path/to/decompressed/apk/assemblies/

Dans le cas d'iOS, les fichiers DLL à l'intérieur des fichiers IPA peuvent être directement chargés dans un décompilateur (pas besoin de décompresser quoi que ce soit).

La plupart du code de l'application peut être trouvé lorsque nous décompilons les fichiers DLL. Notez également que les applications basées sur le framework Xamarin contiennent 90% de code commun dans les versions de toutes les plateformes telles que iOS et Android, etc.

À partir de la capture d'écran ci-dessus de la liste des fichiers DLL présents dans l'APK, nous pouvons confirmer qu'il s'agit d'une application Xamarin. Elle contient des fichiers DLL spécifiques à l'application ainsi que des fichiers de bibliothèque nécessaires au fonctionnement de l'application, tels que Xamarin.Essentails.dll ou Mono.Security.dll.

{% hint style="success" %} Enfin, vous pouvez utiliser ces outils recommandés pour accéder au code C# des DLL. {% endhint %}

Analyse dynamique

Essayez de vérifier si l'application a mis en place un quelconque SSL pinning. Si ce n'est pas le cas, en utilisant Burp en tant que système, CA devrait fonctionner pour intercepter les requêtes. Frida avec Java ou ObjC runtime ne fonctionnera pas ici, mais heureusement, il existe un outil qui peut être utilisé pour se connecter aux méthodes.

Fridax vous permet de modifier facilement le binaire .NET à l'intérieur d'une application Xamarin en temps d'exécution. L'analyse statique vous aidera à identifier les différentes méthodes présentes dans l'application, qui peuvent être accrochées ultérieurement pour une analyse dynamique à l'aide de Fridax. Voici quelques scripts Frida qui peuvent nous aider à contourner la détection de root ou le SSL pinning :

Références

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