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 offre aux développeurs un 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 propose des liaisons .NET pour 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 fonctionne en parallèle.

L'environnement d'exécution Mono appelle ces espaces de noms via des Managed Callable Wrappers (MCW) et fournit des Android Callable Wrappers (ACW) à l'ART.

Ces deux environnements fonctionnent sur le noyau Linux et invoquent diverses API pour le code utilisateur. Cette disposition permet aux développeurs d'accéder au système sous-jacent.

Projet Xamarin iOS

Les applications Xamarin.iOS fonctionnent sous l'environnement d'exécution Mono et utilisent une compilation complète Ahead of Time (AOT) pour compiler le code C# .NET en langage d'assemblage ARM.

Il fonctionne conjointement avec le Runtime Objective-C. Les environnements d'exécution fonctionnent sur un noyau de type UNIX et invoquent plusieurs API pour 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 Runtime .Net et le Framework Mono ?

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 Runtime .Net exécute le code compilé, et ce processus est appelé exécution de code géré. Le Runtime .NET offre plusieurs fonctionnalités qui garantissent l'indépendance de la plateforme et sont compatibles avec les versions antérieures du framework.

Le Framework Mono a été lancé en 2005 comme une 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 standards ECMA pour le Common Language Runtime et C#.

Techniques de Reverse Engineering 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 point de départ.

Pour ouvrir la fenêtre Modules, sélectionnez Debug > Windows > 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 en Fichier de Symboles". Cette action crée un fichier de symboles contenant une source décompilée qui, à son tour, vous permet d'entrer directement dans le code tiers à partir de votre code source.

Visual Studio décompile le code géré, même en l'absence de symboles, vous permettant de regarder le code, d'inspecter les variables et de placer des points d'arrêt. Pour extraire le code source sur le disque, faites un clic droit sur le module avec source intégrée et cliquez sur "Extraire la Source Intégrée". Cela exportera les fichiers source vers un dossier de fichiers divers pour une analyse plus approfondie.

Compilation JIT vs AOT des Applications Xamarin

Ces deux options pour compiler le code Xamarin basé sur C# en une application, c'est-à-dire, la compilation Juste à temps et la compilation à l'avance. La manière de compilation affecte la manière dont le code de l'application est livré dans le fichier apk ou ipa. Examinons cela rapidement ci-dessous :

- Android : Xamarin vous permet de compiler en utilisant à la fois les drapeaux JIT et AOT pour android. Il existe également un moyen intermédiaire pour obtenir la vitesse d'exécution la plus élevée en utilisant le mode AOT Hybride. Notez que le mode AOT complet n'est disponible que pour la licence Entreprise.

- iOS : Il n'y a qu'une seule option dans le cas d'iOS, la compilation à l'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 Full AOT, et si les fichiers d'assemblage IL sont supprimés pour réduire la taille de construction par le développeur, alors le reverse 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. Si c'est une application compilée en AOT Hybride, et que les fichiers IL sont toujours conservés dans le paquet de l'application, nous pouvons les utiliser pour rétroconcevoir 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 sous le répertoire des assemblages :

Dans le cas des APKs 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 qu'au lieu de fichiers dll, vous verrez assemblies.blob et assemblies.manifest dans le répertoire des assemblages. Il s'agit d'un Xamarin AssemblyStore et la méthode actuellement recommandée pour empaqueter les dll dans une application Android. Le fichier assemblies.manifest est un fichier texte décrivant le contenu du fichier binaire assemblies.blob. Pour décompresser ces fichiers, 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 chargés directement dans un décompilateur (pas besoin de décompresser quoi que ce soit).

La plupart du code de l'application peut être trouvée 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 builds de toutes les plateformes comme iOS et Android, etc.

D'après la capture d'écran ci-dessus listant les 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 les 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# à partir des DLLs. {% endhint %}

Analyse Dynamique

Essayez de vérifier si l'application a une sorte de SSL pinning en place. Si ce n'est pas le cas, utiliser Burp comme CA système 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 brancher dans les méthodes.

Fridax vous permet de modifier facilement le binaire .NET à l'intérieur d'une application Xamarin en temps réel. L'analyse statique vous aidera à identifier différentes méthodes présentes au sein de l'application, qui peuvent être branchées plus tard pour l'analyse dynamique en utilisant 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 🎥