Exploiting a debuggeable application
Explorando uma aplicação com modo de depuração
Burlando verificações de root e debuggeable
Esta seção do post é um resumo do post https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0
Passos para tornar um aplicativo Android debuggeable e burlar verificações
Tornando o Aplicativo Debuggeable
Conteúdo baseado em https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0
Descompilar o APK:
Utilize a ferramenta APK-GUI para descompilar o APK.
No arquivo android-manifest, insira
android:debuggable=true
para ativar o modo de depuração.Recompile, assine e zipalign o aplicativo modificado.
Instalar o Aplicativo Modificado:
Use o comando:
adb install <nome_do_aplicativo>
.
Recuperar o Nome do Pacote:
Execute
adb shell pm list packages –3
para listar aplicativos de terceiros e encontrar o nome do pacote.
Configurar o Aplicativo para Aguardar a Conexão do Depurador:
Comando:
adb shell am setup-debug-app –w <nome_do_pacote>
.Observação: Este comando deve ser executado sempre antes de iniciar o aplicativo para garantir que ele aguarde o depurador.
Para persistência, use
adb shell am setup-debug-app –w -–persistent <nome_do_pacote>
.Para remover todas as flags, use
adb shell am clear-debug-app <nome_do_pacote>
.
Preparar para Depuração no Android Studio:
Navegue no Android Studio para File -> Open Profile or APK.
Abra o APK recompilado.
Definir Pontos de Interrupção em Arquivos Java Chave:
Coloque pontos de interrupção em
MainActivity.java
(especificamente no métodoonCreate
),b.java
eContextWrapper.java
.
Burlando Verificações
O aplicativo, em determinados pontos, verificará se está em modo de depuração e também verificará binários que indicam um dispositivo com root. O depurador pode ser usado para modificar informações do aplicativo, desativar o bit de depuração e alterar os nomes dos binários pesquisados para burlar essas verificações.
Para a verificação de debuggeable:
Modificar Configurações de Flag:
Na seção de variáveis do console do depurador, navegue até:
this mLoadedAPK -> mApplicationInfo -> flags = 814267974
.Observação: A representação binária de
flags = 814267974
é11000011100111011110
, indicando que a "Flag_debuggable" está ativa.
Esses passos garantem coletivamente que o aplicativo possa ser depurado e que certas verificações de segurança possam ser burladas usando o depurador, facilitando uma análise ou modificação mais aprofundada do comportamento do aplicativo.
O Passo 2 envolve a alteração de um valor de flag para 814267972, que é representado em binário como 110000101101000000100010100.
Explorando uma Vulnerabilidade
Foi fornecida uma demonstração usando um aplicativo vulnerável contendo um botão e um textview. Inicialmente, o aplicativo exibe "Crack Me". O objetivo é alterar a mensagem de "Tentar Novamente" para "Hackeado" em tempo de execução, sem modificar o código-fonte.
Verificando a Vulnerabilidade
O aplicativo foi descompilado usando
apktool
para acessar o arquivoAndroidManifest.xml
.A presença de
android_debuggable="true"
no AndroidManifest.xml indica que o aplicativo é debuggeable e suscetível a exploração.Vale ressaltar que o
apktool
é usado exclusivamente para verificar o status de debug sem alterar nenhum código.
Preparando a Configuração
O processo envolveu iniciar um emulador, instalar o aplicativo vulnerável e usar
adb jdwp
para identificar as portas do Dalvik VM que estão ouvindo.O JDWP (Java Debug Wire Protocol) permite a depuração de um aplicativo em execução em uma VM, expondo uma porta única.
O encaminhamento de porta foi necessário para depuração remota, seguido pela conexão do JDB ao aplicativo de destino.
Injetando Código em Tempo de Execução
A exploração foi realizada configurando pontos de interrupção e controlando o fluxo do aplicativo.
Comandos como
classes
emethods <nome_da_classe>
foram usados para descobrir a estrutura do aplicativo.Um ponto de interrupção foi definido no método
onClick
, e sua execução foi controlada.Os comandos
locals
,next
eset
foram utilizados para inspecionar e modificar variáveis locais, especialmente alterando a mensagem "Tentar Novamente" para "Hackeado".O código modificado foi executado usando o comando
run
, alterando com sucesso a saída do aplicativo em tempo real.
Este exemplo demonstrou como o comportamento de um aplicativo debuggeable pode ser manipulado, destacando o potencial para exploits mais complexos, como obter acesso ao shell no dispositivo no contexto do aplicativo.
Referências
Last updated