Home > Blog > Facilitando a engenharia reversa de Android com Badada

Facilitando a engenharia reversa de Android com Badada

Conhece o Frida? Preparamos uma interface mais amigável para essa ferramenta.

Publicado em 20 Sep 2019

Por: Fábio Sartorato e Vinícius Henrique Marangoni
O processo de Security Assessment tem como objetivo encontrar vulnerabilidades em um software que permitem a um atacante realizar operações que não foram previstas pelo programador. Dependendo da vulnerabilidade, a privacidade do usuário pode ficar completamente comprometida. A busca por vulnerabilidades pode ser bem complexa. A engenharia reversa de software pode auxiliar o analista de segurança a entender o funcionamento de um software a fim de encontrar bugs, mas essa tarefa pode ser dificultada quando o programador executou um ofuscador de código. Outras vezes é necessário partir de hipóteses para tentar encontrar uma falha, e essas hipóteses só podem ser testadas alterando parte do código original e recompilando o software, o que muitas vezes não é possível, como é o caso de aplicações que passam por checagem de assinatura. São essas dificuldades que estimulam muitas pessoas a desenvolverem ferramentas que auxiliam nesse tipo de tarefa. O Frida, por exemplo, nasceu com o objetivo de tornar a tarefa de engenharia reversa mais produtiva e interativa. O objetivo desse post é apresentar o Badada, uma ferramenta criada para auxiliar no processo de Security Assessment tanto em aplicações quanto no próprio framework do Android. Como este é um post inicial sobre o Badada, vamos exemplificar seu uso burlando uma checagem de segurança existente em uma aplicação simples.

Frida

Frida (https://www.frida.re) é um toolkit para instrumentação dinâmica de código. Essa ferramenta permite injetar código em aplicações que já estão sendo executadas com o objetivo de modificar seu comportamento original. Pensando nisso, vários entusiastas de segurança começaram a estudar essa ferramenta e utilizá-la em security assessments em busca de bugs. O poder do Frida não se limita apenas a instrumentar métodos, mas também é possível enumerar todas as classes instanciadas de um processo, bem como cada método presente em cada classe. O Frida possui diversos modos de operação que estão descritos em detalhes aqui. Nesse artigo falaremos sobre 1 dos 3 modos de operação usando o frida-gadget.O processo de instalação do Frida é descrito no seguite link: https://www.frida.re/docs/installation/

Badada

Apesar do Frida oferecer todas essas funcionalidades, não encontramos uma interface que disponibiliza esses recursos ao usuário final de forma simples. Pensando nisso, iniciamos o desenvolvimento de um cliente interativo para o Frida que chamamos de Badada (https://github.com/badadaf/badada). Este se comunica diretamente com o frida-server utilizando o módulo em Python feito pelo time de desenvolvimento do Frida.Os únicos pré-requisitos para que o Badada funcione são: Python 2.7, Frida e Android Debug Bridge (ADB). A documentação oficial do ADB pode ser encontrada no seguinte link: https://developer.android.com/studio/command-line/adb.html?hl=pt-br Para instalar o Badada, primeiro temos que clonar o repositório. Para isso, execute o comando abaixo:

git clone https://github.com/badadaf/badada

Agora, basta colocar o diretório do Badada em seu path. Para fazer isso no Linux, vamos editar o arquivo localizado em ~/.bashrc com seu editor de texto favorito de modo que ele contenha a seguinte linha:

export PATH=$PATH:/home/username/Tools/badada

Repare que o que vem após “$PATH:” é o diretório onde o Badada foi clonado. Por último, para carregar as alterações feitas no .bashrc basta executar o seguinte comando:

source ~/.bashrc

Agora você deve ser capaz de executar o Badada em seu terminal. Para testar, digite:

badada –help

Esse comando deverá retornar um texto de ajuda sobre o Badada.

Hands On

Abaixo mostraremos algumas das funcionalidades do Badada e como esta ferramenta pode tornar a tarefa de análise de aplicações Android um pouco mais fácil. Para isso, desenvolvemos uma simples aplicação. Nosso objetivo é burlar uma checagem de segurança realizada pela aplicação a fim de obter acesso a uma funcionalidade originalmente não autorizada.
O apk do aplicativo usado neste post pode ser baixado aqui e seu source está disponível em https://github.com/badadaf/BadadaPatos
Após baixar o apk, a primeira etapa é instalá-lo em nosso dispositivo Android. Para isso, execute o seguinte comando:

adb install BadadaPatos.apk

Após a instalação, o aplicativo deverá estar disponível no menu do Android com o nome de “BadadaPatos”. Ao abrir o aplicativo você irá se deparar com a seguinte tela:
Figura 1 – Main Activity
A tela apresenta uma mensagem que diz “Você gosta de patinhos de borracha?” e um botão que diz “Clique Aqui”. Ao clicar no botão, você se depara com a mensagem “Você não tem permissão para ver o pato de borracha!”, como mostra a imagem a seguir:
Figura 2 – Sem permissão de visualização
Para entender o que está acontecendo, vamos olhar para o código fonte da aplicação (https://github.com/badadaf/BadadaPatos/blob/master/app/src/main/java/com/badadaf/badadapatos/MainActivity.java#L24)
Ao clicar no botão, uma checagem de permissão é realizada, e, caso o método “hasPermission” retorne o valor “True”, a visibilidade da duckView é definida para “Visible”, como mostra o código a seguir (linha 4):
No código original, o método “hasPermission” sempre retorna false, como mostra o código abaixo:
Desta maneira, caso não alteremos algo no código original, nunca conseguiremos visualizar a duckView. É aqui que o Frida irá nos ajudar. A ponte entre o cliente e a aplicação será feita utilizando o frida-gadget. O frida-gadget é uma biblioteca dinâmica que é inserida no construtor da classe do entrypoint da aplicação que queremos instrumentar, e tem a finalidade de expor uma interface para um cliente do Frida. É uma alternativa interessante quando não se pode utilizar o frida-server. Em casos em que não se tem acesso root ao device (que é o cenário proposto neste post), o frida-gadget é nossa melhor opção. Nesse link você pode encontrar mais informações a respeito dos modos de funcionamento do Frida. Este gadget pode ser inserido usando a ferramenta apkpatcher, que está disponível em https://github.com/badadaf/apkpatcher
A primeira etapa após baixar o apkpatcher é atualizar a lista de gadgets. Os gadgets serão baixados de acordo com a versão do Frida instalada em seu computador. Para atualizar a lista de gadgets, execute o seguinte comando:

apkpatcher –update

 

O resultado deve ser parecido com o da imagem abaixo:
Figura 3 – Atualizando o apkpatcher
Agora, para inserir o gadget em nossa aplicação, conecte o seu smartphone em seu computador com o modo de depuração por USB ativo. Deste modo, o apkpatcher poderá reconhecer qual a arquitetura do smartphone para que possa selecionar o gadget correto. Após conectar o smartphone, execute o seguinte comando:

apkpatcher -a BadadaPatos.apk

 

O apkpatcher irá extrair o apk, inserir o frida-gadget e “reempacotar” os arquivos em um novo apk. O resultado deve ser parecido com o da imagem a seguir:

 

Figura 4 – apkpatcher em ação

 

Para instalar a aplicação, execute o comando abaixo:

adb install BadadaPatos_patched.apk

Lembre-se que, caso execute o apkpatcher em uma aplicação que foi distribuída por outro publisher, a assinatura do apk será diferente da original.

Nossa aplicação agora está preparada para ser instrumentada com o Frida e instalada em nosso smartphone. Quando ela for executada, inicialmente ficará “pausada” aguardando uma conexão do cliente. Quando este se conectar a aplicação continuará sua execução normalmente.
Agora vamos iniciar a instrumentação com o Frida, e para isso iremos utilizar o Badada para auxiliar em algumas tarefas. Primeiramente vamos iniciar a aplicação BadadaPatos instalada em nosso smartphone. Se tudo ocorrer bem, você irá se deparar com uma tela branca, como se a aplicação estivesse “travada”. Na verdade, isso é o frida-gadget aguardando nossa conexão. Agora vamos conectar com a aplicação utilizando o Badada. Para isso, vamos executar o seguinte comando:

badada Gadget

 

Isso fará com que o Badada (utilizando o módulo do Frida) conecte com a aplicação que possui o gadget. A imagem a seguir ilustra a execução do último comando:

 

Figura 5 – Tela inicial do Badada

 

Caso queira listar quais os comandos disponíveis você pode usar o comando help, bem como informações de um comando específico, por exemplo help getclasses. Além disso, o shell interativo também disponibiliza comandos de sistema. Para executá-los coloque um ponto de exclamação no início do comando, por exemplo, !ls /tmp listará o conteúdo no diretório /tmp.
Inicialmente, vamos listar as classes existentes em nosso aplicativo para começar a ter informações sobre o processo. Para isso, primeiro vamos descobrir o nome do pacote do BadadaPatos utilizando o comando abaixo.

!aapt dump badging BadadaPatos.apk | grep package

 

Isso executará através do shell de seu Linux o programa aapt e retornará o nome do pacote do BadadaPatos.apk. No nosso caso, com.badadaf.badadapatos. O resultado deverá se parecer com a imagem abaixo:

Figura 6 – Exibindo o nome do pacote

Podemos usar o comando getclasses do Badada para procurar as classes que existem neste pacote.

getclasses com.badadaf.badadapatos

 

O comando deverá retornar algo que se parece com a imagem abaixo:
Figura 7 – Enumerando as classes disponíveis no app
Vamos agora listar os métodos existentes na classe com.badadaf.badadapatos.MainActivity.

getmethods com.badadaf.badadapatos.MainActivity

 

O resultado deverá se parecer com o seguinte:

 

Figura 8 – Enumerando os métodos da classe MainActivity
Como podem perceber, o método hasPermission() foi listado. Originalmente, esse método sempre retorna False. Nosso objetivo é reescrever a implementação desse método, de modo que retorne True. Para isso, vamos abrir uma nova aba no terminal e escrever um script, que chamaremos de hook.js, o qual será responsável por reescrever o método hasPermission e fazê-lo retornar True. O conteúdo do nosso script hook.js deve ser o seguinte:


Java.perform(function(){
var MainClass = Java.use("com.badadaf.badadapatos.MainActivity");
MainClass.hasPermission.implementation = function(){
return true;
};
});

Para carregar o script, iremos utilizar o comando load hook.js, como ilustra a imagem abaixo:
Figura 9 – Carregando o script que instrumenta o método hasPermission()
Agora que o script foi carregado, vamos voltar para a aplicação e clicar no botão novamente. Se tudo ocorrer bem, a imagem de um patinho deverá ser exibida.
Figura 10 – Verificação burlada

 

AHA! Mas que belo patinho de borracha!