Memory Manipulation 2: RCE root no Android com Frida
Reversing do APK do BEERUS no JADX e um hook em Frida que transforma a compactação da sandbox em execução de comando como root.
Neste texto, irei abordar sobre a exploração feita em um app durante meus estudos em mobile hacking, o BEERUS, desenvolvido pela hakai offsensive security. Seu funcionamento é simples: na interface gráfica, escolhemos um aplicativo e então ele compacta todos os arquivos que estão na sua sandbox e envia para um host remoto, que também é informado na interface.
Apesar de ter o código-fonte completo para analisar, decidi somente baixar o APK e fazer o reversing.
0x00: static analysis
Vamos utilizar o JADX, ferramenta muito útil para fazer esse tipo de análise. Ele basicamente decompila o apk e faz a reconstrução do seu código Java a partir do código smali, que por sua vez seria um processo “intermediário” entre o bytecode do java e o dalvik bytecode , ou seja, podemos estabelecer um paralelo entre o smali e o assembly (obs: por processo intermediário, não entenda que a compilação de .class pra .dex envolve o código _smali_ , pois, na prática, isso não acontece).
Para poupar tempo, irei mostrar somente a parte que nos interessa, no caso, o método vulnerável. Recomendo que você baixe o apk e use o JADX ou outro decompilador e tente achar essa função.
Daqui, vamos focar apenas nessas 3 linhas:
Se você odeia java, o que está sendo feito aqui é uma execução de código como root, durante o processo de compactação dos arquivos da sandbox do app que selecionamos na UI. no próximo tópico, vamos utilizar o frida para fazer algumas modificações. Antes de prosseguir, pense que tipo de modificação seria interessante nesse contexto.
0x01: frying runtime
1.1: sobre o frida
Framework com várias ferramentas que nos permitem manipular aplicativos em runtime a partir da injeção de um hook no processo do app, que permite uma comunicação com a api do java, para manipulação de classes e também com a java native interface, para manipulação de bibliotecas nativas. Recomendo que acesse o site deixado no tópico anterior para dar seus primeiros passos com o frida.
1.2: construindo o script
A comunicação com o frida-server pode acontecer por diversos meios, mas o mais comum é pela javascript api. Para modificarmos o argumento da função writeBytes(), utilizaremos o método “overload” do java, para fazermos com que esse método aponte para a java.lang.String, assim, poderemos modificar sua implementação e passar uma string como parâmetro, o que nos permitirá triggar um RCE.
PoC:



