hacktricks/mobile-pentesting/xamarin-apps.md

121 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 a tu **empresa anunciada en HackTricks**? o ¿quieres acceder a la **última versión de PEASS o descargar HackTricks en PDF**? Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
* Consigue el [**merchandising 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 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
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
Xamarin ofrece enlaces .NET a los espacios de nombres Android.\* y Java.\*. Xamarin.
Las aplicaciones Android funcionan bajo el entorno de ejecución Mono, con la máquina virtual Android Runtime (ART) ejecutándose al lado.
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:
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
### ¿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 .NET framework 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 gran 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 varios 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 quedarse en medio 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:
<figure><img src="../.gitbook/assets/image (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
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 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 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](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 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.
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
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 son necesarios para que la aplicación funcione, como `Xamarin.Essentails.dll` o `Mono.Security.dll`.
{% hint style="success" %}
Finalmente, puede usar [**estas herramientas recomendadas**](../reversing/reversing-tools-basic-methods/#net-decompiler) 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 Java o el entorno de ejecución de ObjC no funcionará** aquí, pero afortunadamente hay una herramienta que se puede usar para engancharse en los métodos.
[**Fridax**](https://github.com/NorthwaveSecurity/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 presentan algunos scripts de Frida que pueden ayudarnos a eludir la detección de root o el 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>
* ¿Trabaja en una **empresa de ciberseguridad**? ¿Quiere ver su **empresa anunciada en HackTricks**? o ¿quiere tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? Consulte los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Descubra [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
* Obtenga el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
* **Únase al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígame** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Comparta sus 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>