hacktricks/mobile-pentesting/xamarin-apps.md

12 KiB

Aplicativos Xamarin

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

Informações básicas

Xamarin é uma plataforma de código aberto que oferece aos desenvolvedores acesso a uma ampla seleção de ferramentas e complementos, permitindo-lhes criar aplicativos modernos para iOS, Android e Windows usando .NET e C#.

Arquitetura do Xamarin Android

O Xamarin oferece ligações .NET para os namespaces Android.* e Java.*. As aplicações Xamarin Android operam sob o ambiente de execução Mono, com a máquina virtual Android Runtime (ART) em execução lado a lado.

O ambiente de execução Mono chama esses namespaces por meio de Invólucros Chamáveis Gerenciados (MCW) e fornece Invólucros Chamáveis Android (ACW) para o ART.

Ambos esses ambientes são executados em cima do kernel Linux e invocam várias APIs para o código do usuário. Essa estrutura permite que os desenvolvedores acessem o sistema subjacente.

Projeto Xamarin iOS

As aplicações Xamarin.iOS são executadas sob o ambiente de execução Mono e usam a compilação Ahead of Time (AOT) completa para compilar códigos .NET C# para a linguagem de montagem ARM.

Ele é executado junto com o Objective-C Runtime. Os ambientes de execução são executados 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 representa essa arquitetura:

O que é o .Net Runtime e o Mono Framework?

O framework .Net é um conjunto de assemblies, classes e namespaces que os desenvolvedores podem usar para criar aplicativos; o .Net Runtime executa o código compilado, e o processo é chamado de execução de código gerenciado. O .NET Runtime oferece várias funcionalidades que garantem a independência de plataforma e são compatíveis com versões mais antigas do framework.

O 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, o Mono é a implementação de código aberto do framework .NET com base nos padrões ECMA para Common Language Runtime e C#.

Técnicas de Engenharia Reversa para Aplicativos Xamarin

Descompilação de Assemblies Xamarin

A descompilaçã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, o Windows é um ótimo lugar.

Para abrir a janela Módulos, selecione Depurar > Janelas > Módulos. Assim que você detectar o módulo que requer descompilação, clique com o botão direito e selecione "Decompile Source to Symbol File". Essa ação cria um arquivo de símbolo que contém um código-fonte descompilado que, por sua vez, permite que você entre no código de terceiros diretamente do seu código-fonte.

O Visual Studio descompila o código gerenciado, mesmo na ausência de símbolos, permitindo que você visualize 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 o código-fonte incorporado e clique em "Extract Embedded Source". Isso exportará os arquivos de origem para uma pasta de arquivos diversos para análise posterior.

Compilação JIT vs AOT de Aplicativos Xamarin

Existem duas opções para compilar código Xamarin baseado em C# em um aplicativo, ou seja, compilação just-in-time e compilação ahead-of-time. A forma de compilação afeta como o código do aplicativo é enviado dentro do arquivo apk ou ipa. Vamos dar uma olhada rápida nisso abaixo:

- Android: O Xamarin permite que você compile usando as opções JIT e AOT para Android. Também há uma maneira de obter a maior velocidade de execução usando o modo Hybrid AOT. Observe que o modo Full AOT está disponível apenas para a licença Enterprise.

- iOS: Existe apenas uma opção no caso do iOS, compilação ahead-of-time. Isso ocorre devido à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 um aplicativo compilado com Full AOT e se os arquivos de assembly IL forem removidos para reduzir o tamanho da compilação pelo desenvolvedor, a engenharia reversa exigirá uma etapa adicional de extração dos arquivos dll dos arquivos .dll.so da pasta lib ou do arquivo libmonodroid_bundle_app.so. Se for um aplicativo compilado com Hybrid AOT e os arquivos IL ainda estiverem presentes no pacote do aplicativo, podemos usá-los para engenharia reversa do aplicativo. {% endhint %}

Obtendo os arquivos dll do APK/IPA

Basta descompactar o arquivo apk/ipa e copiar todos os arquivos presentes no diretório assemblies:

No caso dos APKs do Android, esses arquivos dll estão comprimidos e não podem ser diretamente usados para descompilação. Felizmente, existem ferramentas disponíveis que podemos usar para descomprimir esses arquivos dll como XamAsmUnZ e 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 forma atualmente recomendada de empacotar DLLs em um aplicativo Android. O assemblies.manifest é um arquivo de texto que descreve o conteúdo do arquivo binário assemblies.blob. Para desempacotá-los, você precisará usar o pyxamstore.

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

No caso do iOS, os arquivos DLL dentro dos arquivos IPA podem ser carregados diretamente em um descompilador (não é necessário descompactar nada).

A maioria do código do aplicativo pode ser encontrado ao descompilar os arquivos DLL. Além disso, observe que os aplicativos baseados no Framework Xamarin contêm 90% do código comum nas compilações de todas as plataformas, como iOS e Android, etc.

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 essas ferramentas recomendadas para acessar o código C# dos DLLs. {% endhint %}

Análise Dinâmica

Tente verificar se o aplicativo possui algum tipo de SSL pinning. Se não tiver, usando o Burp como um sistema, o CA deve funcionar para interceptar as solicitações. O Frida com tempo de execução Java ou ObjC não funcionará aqui, mas felizmente existe uma ferramenta que pode ser usada para fazer hook em métodos.

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á a identificar diferentes métodos presentes no aplicativo, que podem ser conectados posteriormente para análise dinâmica usando o Fridax. Abaixo estão alguns scripts do Frida que podem nos ajudar a contornar a detecção de root ou SSL pinning:

Referências

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