hacktricks/mobile-pentesting/xamarin-apps.md

120 lines
12 KiB
Markdown
Raw Normal View History

# Aplicaciones Xamarin
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtén el [**swag oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>
## **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&#x20;
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
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 al 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 de C# .NET 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 al código de usuario, lo que permite a los desarrolladores acceder al sistema administrado o nativo subyacente.&#x20;
El diagrama que se muestra a continuación representa esta arquitectura:
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
### ¿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#.&#x20;
## 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 de 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:
<figure><img src="../.gitbook/assets/image (2) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
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](https://github.com/cihansol/XamAsmUnZ) y [xamarin-decompress](https://github.com/NickstaDB/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](https://github.com/jakev/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.&#x20;
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
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**](../reversing/reversing-tools-basic-methods/#net-decompiler) 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 implementado. Si no es así, utilizando Burp como un sistema, CA debería funcionar para interceptar las solicitudes. **Frida con tiempo de ejecución Java o ObjC no funcionará** aquí, pero afortunadamente hay una herramienta que se puede utilizar para engancharse a los métodos.
[**Fridax**](https://github.com/NorthwaveSecurity/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:
* [**xamarin-antiroot**](https://codeshare.frida.re/@Gand3lf/xamarin-antiroot/)
* [**xamarin-root-detect-bypass**](https://codeshare.frida.re/@nuschpl/xamarin-root-detect-bypass/)
* [**Frida-xamarin-unpin**](https://github.com/GoSecure/frida-xamarin-unpin)
## Referencias
* [https://www.appknox.com/security/xamarin-reverse-engineering-a-guide-for-penetration-testers](https://www.appknox.com/security/xamarin-reverse-engineering-a-guide-for-penetration-testers)
* [https://thecobraden.com/posts/unpacking_xamarin_assembly_stores/](https://thecobraden.com/posts/unpacking_xamarin_assembly_stores/)
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Comparte tus trucos de hacking enviando PR al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>