hacktricks/mobile-pentesting/xamarin-apps.md

11 KiB

Aplicaciones Xamarin

Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

Información Básica

Xamarin es una plataforma de código abierto que proporciona a los desarrolladores acceso a una amplia selección de herramientas y complementos, permitiéndoles crear aplicaciones modernas para iOS, Android y Windows utilizando los frameworks .NET y C#.

Arquitectura de Xamarin Android

Xamarin ofrece enlaces .NET a los espacios de nombres Android.* y Java.*. Xamarin.

Las aplicaciones de Android funcionan bajo el entorno de ejecución Mono, con la máquina virtual Android Runtime (ART) ejecutándose en paralelo.

El entorno de ejecución Mono llama a estos espacios de nombres a través de Managed Callable Wrappers (MCW) y proporciona Android Callable Wrappers (ACW) al ART.

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

Proyecto Xamarin iOS

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

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

El siguiente diagrama muestra esta arquitectura:

¿Qué son el .Net Runtime y el 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 gestionado. .NET Runtime ofrece varias características que aseguran la independencia de la plataforma y son compatibles con versiones anteriores del framework.

Mono Framework comenzó 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

Decompilación de Ensamblados Xamarin

La decompilació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 actualmente en memoria, Windows es un excelente lugar.

Para abrir la ventana de Módulos, selecciona Debug > Windows > Modules. Una vez que detectes el módulo que requiere decompilación, haz clic derecho y selecciona "Decompile Source to Symbol File". Esta acción crea un archivo de símbolos que contiene una fuente decompilada que, a su vez, te permite entrar directamente en el código de terceros desde tu código fuente.

Visual Studio decompila el código gestionado, incluso en ausencia de símbolos, permitiéndote mirar 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 fuente incrustada y haz clic en "Extract Embedded Source ." Esto exportará los archivos fuente a una carpeta de archivos Misceláneos para un análisis posterior.

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 AOT para android. También hay una forma de encontrar un punto intermedio para obtener la mayor velocidad de ejecución utilizando el modo Hybrid AOT. Ten en cuenta que el modo Full AOT 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 Full AOT, y si los archivos IL Assembly son eliminados para reducir el tamaño de la compilación por el desarrollador, entonces la ingeniería inversa requiere un paso extra de extracción de archivos dll de los archivos .dll.so de la carpeta lib o del archivo libmonodroid_bundle_app.so. Si es una aplicación compilada Hybrid AOT, y los archivos IL todavía se mantienen en el paquete de la aplicación, podemos usar eso para hacer ingeniería inversa de la aplicación. {% endhint %}

Obtención de los archivos dll del APK/IPA

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

En el caso de los APKs de Android, estos archivos dll están comprimidos y no se pueden utilizar directamente para la decompilación. Afortunadamente, hay herramientas disponibles que podemos usar 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 Android. El assemblies.manifest es un archivo de texto que describe los contenidos del archivo binario assemblies.blob. Para desempaquetar estos 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 pueden cargarse directamente en un descompilador (no es necesario descomprimir nada).

La mayoría del código de la aplicación se puede encontrar cuando descompilamos los archivos dll. También tenga en cuenta que las aplicaciones basadas en el Framework de Xamarin contienen un 90% de código común en las compilaciones de todas las plataformas como iOS, Android, etc.

A partir de la captura de pantalla anterior que muestra los archivos dll presentes en el apk, podemos confirmar que es una aplicación Xamarin. Contiene archivos dll específicos de la aplicación junto con los archivos de biblioteca que se requieren para que la aplicación funcione, como Xamarin.Essentails.dll o Mono.Security.dll.

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

Análisis Dinámico

Intente verificar si la aplicación tiene algún tipo de SSL pinning implementado. Si no, usar Burp como un CA del sistema debería funcionar para interceptar solicitudes. Frida con el entorno de ejecución de Java o ObjC no funcionará aquí, pero afortunadamente hay una herramienta que se puede usar para engancharse a los métodos.

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

Referencias

Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks: