hacktricks/mobile-pentesting/xamarin-apps.md

12 KiB

Aplicaciones Xamarin

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

Información básica

Xamarin es una plataforma de código abierto que brinda a los desarrolladores acceso a una amplia selección de herramientas y complementos, lo que les permite crear aplicaciones modernas para iOS, Android y Windows utilizando los marcos .NET y C#.

Arquitectura de Xamarin Android

Xamarin ofrece enlaces .NET a los espacios de nombres Android.* y Java.*. Las aplicaciones de Xamarin Android funcionan bajo el entorno de ejecución Mono, con la máquina virtual Android Runtime (ART) ejecutándose junto a él.

El entorno de ejecución Mono llama a estos espacios de nombres a través de los Envoltorios Llamables Administrados (MCW) y proporciona Envoltorios Llamables de Android (ACW) al ART.

Ambos entornos se ejecutan sobre el kernel de Linux e invocan varias API para el código de usuario. Esta disposición permite a los desarrolladores acceder al sistema subyacente.

Proyecto Xamarin iOS

Las aplicaciones de Xamarin.iOS se ejecutan bajo el entorno de ejecución Mono y utilizan la compilación completa de Ahead of Time (AOT) para compilar los códigos .NET de C# a lenguaje ensamblador ARM.

Se ejecuta junto con el tiempo de ejecución Objective-C. Los entornos de tiempo de ejecución se ejecutan sobre un kernel similar a UNIX e invocan varias API para el código de usuario, lo que permite a los desarrolladores acceder al sistema administrado o nativo subyacente.

El diagrama que se muestra a continuación representa esta arquitectura:

¿Qué es .Net Runtime y Mono Framework?

.Net framework es un conjunto de ensamblados, clases y espacios de nombres que los desarrolladores pueden utilizar para crear aplicaciones; .Net Runtime ejecuta el código compilado, y el proceso se llama ejecución de código administrado. .NET Runtime proporciona varias características que garantizan la independencia de la plataforma y son compatibles con versiones anteriores del framework.

Mono Framework se inició en 2005 como una implementación del .NET Framework para Linux (Ximian/SuSe/Novell). Patrocinado por Microsoft y liderado por Xamarin, Mono es la implementación de código abierto del framework .NET basada en los estándares ECMA para Common Language Runtime y C#.

Técnicas de ingeniería inversa para aplicaciones Xamarin

Descompilación de ensamblados Xamarin

La descompilación es el proceso utilizado para producir código fuente a partir de código compilado. Para obtener información sobre los ensamblados y ejecutables que se encuentran actualmente en memoria, Windows es un buen lugar.

Para abrir la ventana Módulos, selecciona Depurar > Ventanas > Módulos. Una vez que detectes el módulo que requiere descompilación, haz clic derecho y selecciona "Descompilar fuente a archivo de símbolos". Esta acción genera un archivo de símbolos que contiene un código fuente descompilado que, a su vez, te permite ingresar al código de terceros directamente desde tu código fuente.

Visual Studio descompila el código administrado, incluso en ausencia de símbolos, lo que te permite ver el código, inspeccionar las variables y establecer puntos de interrupción. Para extraer el código fuente al disco, haz clic derecho en el módulo con el código fuente incrustado y haz clic en "Extraer origen incrustado". Esto exportará los archivos fuente a una carpeta de archivos varios para su posterior análisis.

Compilación JIT vs AOT de aplicaciones Xamarin

Estas dos opciones para compilar código Xamarin basado en C# en una aplicación, es decir, compilación Just in Time y compilación Ahead of Time. La forma de compilación afecta cómo se envía el código de la aplicación dentro del archivo apk o ipa. Echemos un vistazo rápido a continuación:

- Android: Xamarin te permite compilar utilizando tanto las banderas JIT como las banderas AOT para Android. También hay una forma de ir entre ambos para obtener la mayor velocidad de ejecución utilizando el modo híbrido AOT. Ten en cuenta que el modo AOT completo solo está disponible para la licencia Enterprise.

- iOS: Solo hay una opción en el caso de iOS, compilación ahead-of-time. Esto se debe a las políticas de Apple que prohíben la ejecución de código generado dinámicamente en un dispositivo.

{% hint style="info" %} Si te encuentras con una aplicación compilada con AOT completo y si los archivos de ensamblado IL se eliminan para reducir el tamaño de compilación por parte del desarrollador, entonces el proceso de reversión requiere un paso adicional de extraer archivos dll de los archivos .dll.so de la carpeta lib o del archivo libmonodroid_bundle_app.so. Si es una aplicación compilada con AOT híbrido y los archivos IL aún se mantienen en el paquete de la aplicación, podemos utilizar eso para ingeniería inversa de la aplicación. {% endhint %}

Obtención de los archivos dll desde el APK/IPA

Simplemente descomprime el archivo apk/ipa y copia todos los archivos presentes en el directorio de ensamblados:

En el caso de los APK de Android, estos archivos dll están comprimidos y no se pueden utilizar directamente para la descompilación. Afortunadamente, existen herramientas que podemos utilizar para descomprimir estos archivos dll como XamAsmUnZ y xamarin-decompress.

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

Es posible que en lugar de archivos dll veas assemblies.blob y assemblies.manifest en el directorio de ensamblados. Esto es un Xamarin AssemblyStore y la forma actualmente recomendada de empaquetar dlls en una aplicación de Android. El archivo assemblies.manifest es un archivo de texto que describe el contenido del archivo binario assemblies.blob. Para desempaquetarlos, necesitarás usar pyxamstore.

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

En el caso de iOS, los archivos DLL dentro de los archivos IPA se pueden cargar directamente en un descompilador (no es necesario descomprimir nada).

La mayoría del código de la aplicación se puede encontrar al descompilar los archivos DLL. También hay que tener en cuenta que las aplicaciones basadas en el marco de trabajo Xamarin contienen un 90% de código común en las compilaciones de todas las plataformas como iOS y Android, etc.

A partir de la captura de pantalla anterior que muestra la lista de archivos DLL presentes en el APK, podemos confirmar que se trata de una aplicación Xamarin. Contiene archivos DLL específicos de la aplicación junto con los archivos de biblioteca necesarios para que la aplicación se ejecute, como Xamarin.Essentails.dll o Mono.Security.dll.

{% hint style="success" %} Finalmente, puedes utilizar estas herramientas recomendadas para acceder al código C# de los DLL. {% endhint %}

Análisis Dinámico

Intenta verificar si la aplicación tiene algún tipo de SSL pinning. Si no lo tiene, utilizando Burp como sistema, CA debería funcionar para interceptar las solicitudes. Frida con tiempo de ejecución de Java u ObjC no funcionará aquí, pero afortunadamente hay una herramienta que se puede utilizar para engancharse a los métodos.

Fridax te permite modificar fácilmente el binario .NET dentro de una aplicación Xamarin en tiempo de ejecución. El análisis estático te ayudará a identificar los diferentes métodos presentes en la aplicación, que luego se pueden enganchar para el análisis dinámico utilizando Fridax. A continuación se muestran algunos scripts de Frida que pueden ayudarnos a eludir la detección de root o SSL pinning:

Referencias

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