hacktricks/mobile-pentesting/xamarin-apps.md

124 lines
11 KiB
Markdown

# Aplicações Xamarin
<details>
<summary><strong>Aprenda hacking no AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Outras formas de apoiar o HackTricks:
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios github do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>
## **Informações Básicas**
Xamarin é uma plataforma de código aberto que oferece aos desenvolvedores acesso a uma seleção abrangente de ferramentas e complementos, permitindo-lhes **criar aplicativos modernos para iOS, Android e Windows usando os frameworks .NET e C#**.
### Arquitetura Xamarin Android
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
Xamarin oferece vinculações .NET para os namespaces Android.\* e Java.\*. Xamarin.
Aplicações Android operam sob o ambiente de execução Mono, com a máquina virtual Android Runtime (ART) funcionando lado a lado.
O ambiente de execução Mono chama esses namespaces através de Managed Callable Wrappers (MCW) e fornece Android Callable Wrappers (ACW) para a ART.
Ambos os ambientes funcionam em cima do kernel Linux e invocam várias APIs para o código do usuário. O arranjo permite que os desenvolvedores acessem o sistema subjacente.
### Projeto Xamarin iOS
Aplicações Xamarin.iOS rodam sob o ambiente de execução Mono e usam a compilação completa Ahead of Time (AOT) para compilar códigos C# .NET para a linguagem de montagem ARM.
Funciona junto com o Objective-C Runtime. Os ambientes de execução funcionam em cima de um kernel semelhante ao UNIX e invocam várias APIs para o código do usuário, o que permite que os desenvolvedores acessem o sistema gerenciado ou nativo subjacente.
O diagrama abaixo ilustra esta arquitetura:
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
### O que é .Net Runtime e Mono Framework?
**.Net framework é um conjunto de assemblies, classes e namespaces** que os desenvolvedores podem usar para criar aplicações; .Net Runtime executa o código compilado, e o processo é chamado de execução de código gerenciado. .NET Runtime oferece várias funcionalidades que garantem independência de plataforma e são compatíveis com versões anteriores do framework.
**Mono Framework** foi iniciado em 2005 como uma implementação do .NET Framework para Linux (Ximian/SuSe/Novell). Patrocinado pela Microsoft e liderado pela Xamarin, Mono é a implementação de código aberto do .NET framework baseada nos padrões ECMA para Common Language Runtime e C#.
## Técnicas de Engenharia Reversa para Aplicações Xamarin
### Decompilação de Assemblies Xamarin
Decompilação é o processo usado para produzir código fonte a partir de código compilado. Para obter informações sobre os assemblies e executáveis atualmente na memória, Windows é um ótimo lugar.
Para abrir a janela de Módulos, selecione Debug > Windows > Modules. Uma vez que você detecte o módulo que requer decompilação, clique com o botão direito e selecione "Decompile Source to Symbol File". Esta ação **cria um arquivo de símbolos que contém uma fonte decompilada que**, por sua vez, permite que você entre diretamente no código de terceiros a partir do seu código fonte.
**Visual Studio** decompila o código gerenciado, mesmo na ausência de símbolos, permitindo que você olhe para o código, inspecione as variáveis e defina pontos de interrupção. Para extrair o código fonte para o disco, clique com o botão direito no módulo com fonte embutida e clique em "Extract Embedded Source ."Isso exportará os arquivos de fonte para uma pasta de Arquivos Diversos para análise posterior.
### JIT vs AOT Compilação de Aplicações Xamarin
Estas são duas opções para compilar o código Xamarin baseado em C# em uma aplicação, ou seja, **compilação Just in time e compilação ahead of time**. A forma de compilação afeta como o código da aplicação é enviado dentro do arquivo apk ou ipa. Vamos dar uma olhada rápida abaixo:
\- **Android**: Xamarin permite que você compile usando **ambas as flags JIT e AOT para android**. Há também uma maneira de ficar no meio termo para obter a maior velocidade de execução usando o modo Hybrid AOT. Note que o modo Full AOT está disponível apenas para a licença Enterprise.
\- **iOS**: Há apenas uma opção no caso do iOS, **compilação ahead-of-time**. Isso se deve às políticas da Apple que proíbem a execução de código gerado dinamicamente em um dispositivo.
{% hint style="info" %}
Se você encontrar uma aplicação compilada Full AOT, e se os arquivos IL Assembly forem removidos para reduzir o tamanho da compilação pelo desenvolvedor, então a reversão requer um passo extra de extração de arquivos dll dos arquivos .dll.so da pasta lib ou do arquivo `libmonodroid_bundle_app.so`. Se for uma aplicação compilada Hybrid AOT, e os arquivos IL ainda estiverem no pacote da aplicação, podemos usar isso para fazer engenharia reversa da aplicação.
{% endhint %}
## Obtendo os arquivos dll do APK/IPA
Apenas **descompacte o arquivo apk/ipa** e copie todos os arquivos presentes no diretório assemblies:
<figure><img src="../.gitbook/assets/image (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
No caso dos **APKs Android, esses arquivos dll são comprimidos** e não podem ser usados diretamente para decompilação. Felizmente, existem ferramentas que podemos usar para **descomprimir esses arquivos dll** como [XamAsmUnZ](https://github.com/cihansol/XamAsmUnZ) e [xamarin-decompress](https://github.com/NickstaDB/xamarin-decompress).
```
python3 xamarin-decompress.py -o /path/to/decompressed/apk
```
É possível que, em vez de arquivos dll, você veja `assemblies.blob` e `assemblies.manifest` no diretório de assemblies. Isso é um Xamarin AssemblyStore e a maneira atualmente recomendada de empacotar dlls em uma aplicação Android. O `assemblies.manifest` é um arquivo de texto que descreve o conteúdo do arquivo binário `assemblies.blob`. Para desempacotar esses arquivos, você precisará usar [pyxamstore](https://github.com/jakev/pyxamstore).
```
pyxamstore unpack -d /path/to/decompressed/apk/assemblies/
```
No caso do iOS, **arquivos dll dentro dos arquivos IPA podem ser carregados diretamente** em um descompilador (não é necessário descomprimir nada).
**A maior parte do código da aplicação pode ser encontrada quando descompilamos os arquivos dll.** Note também que aplicativos baseados no Xamarin Framework contêm 90% de código comum nas compilações de todas as plataformas, como iOS e Android etc.
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
A partir da captura de tela acima, listando os arquivos dll que estavam presentes no apk, podemos confirmar que é um aplicativo Xamarin. Ele contém arquivos dll específicos do aplicativo, juntamente com os arquivos de biblioteca necessários para a execução do aplicativo, como `Xamarin.Essentails.dll` ou `Mono.Security.dll`.
{% hint style="success" %}
Finalmente, você pode usar [**estas ferramentas recomendadas**](../reversing/reversing-tools-basic-methods/#net-decompiler) para acessar o **código C#** dos DLLs.
{% endhint %}
## Análise Dinâmica
Tente verificar se o aplicativo possui algum tipo de SSL pinning implementado. Se não, usar o Burp como um CA do sistema deve funcionar para interceptar solicitações. **Frida com runtime Java ou ObjC não funcionará** aqui, mas, felizmente, há uma ferramenta que pode ser usada para se conectar a métodos.
[**Fridax**](https://github.com/NorthwaveSecurity/fridax) permite que você **modifique o binário .NET dentro de um aplicativo Xamarin em tempo de execução**. A análise estática ajudará você a identificar diferentes métodos presentes dentro do aplicativo, que podem ser conectados posteriormente para análise dinâmica usando Fridax. Abaixo estão alguns scripts do Frida que podem nos ajudar a contornar a detecção de root ou 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)
## Referências
* [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><strong>Aprenda hacking no AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Outras maneiras de apoiar o HackTricks:
* Se você quiser ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Adquira o [**merchandising oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Compartilhe suas dicas de hacking enviando PRs para os repositórios do GitHub** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>