Exploiting a debuggeable application

Exploiting a debuggeable application

Support HackTricks

Contornando 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 debugável e contornar verificações

Tornando o App Debuggable

Conteúdo baseado em https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0

  1. Decompile o APK:

  • Utilize a ferramenta APK-GUI para decompilar o APK.

  • No arquivo android-manifest, insira android:debuggable=true para habilitar o modo de depuração.

  • Recompile, assine e zipalign a aplicação modificada.

  1. Instale a Aplicação Modificada:

  • Use o comando: adb install <application_name>.

  1. Recupere o Nome do Pacote:

  • Execute adb shell pm list packages –3 para listar aplicativos de terceiros e encontrar o nome do pacote.

  1. Configure o App para Aguardar Conexão do Depurador:

  • Comando: adb shell am setup-debug-app –w <package_name>.

  • Nota: Este comando deve ser executado toda vez antes de iniciar a aplicação para garantir que ela aguarde o depurador.

  • Para persistência, use adb shell am setup-debug-app –w -–persistent <package_name>.

  • Para remover todas as flags, use adb shell am clear-debug-app <package_name>.

  1. Prepare-se para Depuração no Android Studio:

  • Navegue no Android Studio para File -> Open Profile or APK.

  • Abra o APK recompilado.

  1. Defina Breakpoints em Arquivos Java Chave:

  • Coloque breakpoints em MainActivity.java (especificamente no método onCreate), b.java e ContextWrapper.java.

Contornando Verificações

A aplicação, em certos pontos, verificará se é debugável e também verificará binários que indicam um dispositivo com root. O depurador pode ser usado para modificar informações do app, desmarcar o bit de debugável e alterar os nomes dos binários pesquisados para contornar essas verificações.

Para a verificação de debugável:

  1. Modifique Configurações de Flag:

  • Na seção de variáveis do console do depurador, navegue até: this mLoadedAPK -> mApplicationInfo -> flags = 814267974.

  • Nota: A representação binária de flags = 814267974 é 11000011100111011110, indicando que a "Flag_debuggable" está ativa.

https://miro.medium.com/v2/resize:fit:1400/1*-ckiSbWGSoc1beuxxpKbow.png

Esses passos garantem coletivamente que a aplicação pode ser depurada e que certas verificações de segurança podem ser contornadas usando o depurador, facilitando uma análise ou modificação mais aprofundada do comportamento da aplicação.

O passo 2 envolve mudar um valor de flag para 814267972, que é representado em binário como 110000101101000000100010100.

Explorando uma Vulnerabilidade

Uma demonstração foi fornecida usando uma aplicação vulnerável contendo um botão e um textview. Inicialmente, a aplicação exibe "Crack Me". O objetivo é alterar a mensagem de "Try Again" para "Hacked" em tempo de execução, sem modificar o código-fonte.

Verificando a Vulnerabilidade

  • A aplicação foi decompilada usando apktool para acessar o arquivo AndroidManifest.xml.

  • A presença de android_debuggable="true" no AndroidManifest.xml indica que a aplicação é debugável e suscetível à exploração.

  • Vale ressaltar que apktool é empregado apenas para verificar o status de debugável sem alterar nenhum código.

Preparando o Setup

  • O processo envolveu iniciar um emulador, instalar a aplicação 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 uma aplicação em execução em uma VM, expondo uma porta única.

  • O encaminhamento de porta foi necessário para depuração remota, seguido pela anexação do JDB à aplicação alvo.

Injetando Código em Tempo de Execução

  • A exploração foi realizada definindo breakpoints e controlando o fluxo da aplicação.

  • Comandos como classes e methods <class_name> foram usados para descobrir a estrutura da aplicação.

  • Um breakpoint foi definido no método onClick, e sua execução foi controlada.

  • Os comandos locals, next e set foram utilizados para inspecionar e modificar variáveis locais, particularmente mudando a mensagem "Try Again" para "Hacked".

  • O código modificado foi executado usando o comando run, alterando com sucesso a saída da aplicação em tempo real.

Este exemplo demonstrou como o comportamento de uma aplicação debugável pode ser manipulado, destacando o potencial para explorações mais complexas, como obter acesso ao shell no dispositivo no contexto da aplicação.

Referências

Support HackTricks

Last updated