hacktricks/mobile-pentesting/xamarin-apps.md

11 KiB

Aplicações Xamarin

Aprenda hacking no AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Outras formas de apoiar o HackTricks:

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

Xamarin oferece vinculações .NET para os namespaces Android.* e Java.*. Aplicações Xamarin.

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 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:

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 framework .NET 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 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 de 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:

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 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 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 descompactar esses arquivos, será necessário usar 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.

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 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 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:

Referências

Aprenda hacking no AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Outras maneiras de apoiar o HackTricks: