Skip to content

Facilitando a engenharia reversa de Android com Badada

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 uma tela. Ela 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!”

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”. 

No código original, o método hasPermission sempre retorna false.

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

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. 

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. 

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

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

getclasses com.badadaf.badadapatos

Vamos agora listar os métodos existentes na classe com.badadaf.badadapatos.MainActivity.

getmethods com.badadaf.badadapatos.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

Para carregar o script, iremos utilizar o comando load hook.js. 

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.

AHA! Mas que belo patinho de borracha!

Referências:

https://www.frida.re/docs/hacking/
https://www.frida.re/docs/modes/
https://www.frida.re/docs/javascript-api/
https://www.frida.re/docs/presentations/osdc-2015-the-engineering-behind-the-reverse-engineering.pdf
https://www.youtube.com/watch?v=uc1mbN9EJKQ
https://en.wikipedia.org/wiki/Reverse_engineering#Reverse_engineering_of_software
https://en.wikipedia.org/wiki/Code_signing
https://github.com/badadaf/badada
https://developer.android.com/studio/command-line/adb.html?hl=pt-br
https://github.com/badadaf/BadadaPatos
https://github.com/badadaf/apkpatcher