Por: Fábio Sartorato e Vinícius Henrique Marangoni
Para a versão em inglês, clique aqui.
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.
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/
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:
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:
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:
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):
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
btnClickMe.setOnClickListener(new View.OnClickListener() { | |
@Override | |
public void onClick(View v) { | |
if(hasPermission()){ | |
noDucks.setVisibility(View.INVISIBLE); | |
duckView.setVisibility(View.VISIBLE); | |
} | |
else{ | |
noDucks.setVisibility(View.VISIBLE); | |
duckView.setVisibility(View.INVISIBLE); | |
} | |
} | |
}); |
No código original, o método “hasPermission” sempre retorna false, como mostra o código abaixo:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
protected boolean hasPermission(){ | |
return 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
O resultado deve ser parecido com o da imagem abaixo:
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:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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!
Referências:
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
No comments:
Post a Comment