Android

Estrutura

DIRETÓRIO
DESCRIÇÃO

/system/app

Aplicativos padrões (nativos), como Calculadora, Galeria, Maps, etc.

/data/app-private

Aplicativos de terceiro. Aqui podemos encontrar as APK's, caso tenho interesse.

/data/data

Estrutura dos aplicativos (nativos e de terceiros). Alguns dados dos app podem ser vistos aqui, incluindo arquivos de bando de dados.

data/app/<package.name>

Diretório onde ficam as APK's baixadas pela Play Store

/data/local/tmp

Diretório onde ficam os arquivos temporários

/data/system/gesture.key

Arquivo responsável por gerenciar o código de desbloqueio com sequência nos pontos.

/mnt/sdcard

Acesso ao cartão de memória

adb exec-out screencap -p > <output_screen.png>

Tira print da tela e salva em arquivo

Baixando APK

Maneira 1

A maneira mais prática que temos de pegar uma APK, é baixando pela play store e depois acessando o shell do android, navegando até /data/app/<package.name> e então baixado o <file.apk>. Aqui caímos em um cenário interessante... o nome do package terá um prefixo (exceto nos Androids mais antigos), então um usuário comum não consegue listar o seu nome, já que somente o root acessa o diretório /data/app. Porém, o arquivo apk é acesível para todos, que fica em /data/app/<package.name>/base.apk. Então iremos precisar fazer um macete para pegarmos essas APK's sem precisar utilizar o root.

Verificando nomes dos pacotes:

adb shell pm list packages -3 | cut -d':' -f2

Após termos em mãos os nomes dos pacotes, podemos pegar o caminho exato do arquivo apk (que temos acesso):

adb shell pm path '<package.name>' | cut -d':' -f2

Feito isso, basta baixá-lo:

Maneira 2

Primeiro acesse o site https://play.google.com/store, copie o link da página do app que deseja pegar a APK e então acesse o site https://apps.evozi.com/apk-downloader/ e informe a URL copiada.

Armazenamento de Dados

Shared Prefs

Este tipo consiste em armazenar informações localmente em /data/data/<package.name>/shared_prefs/<package.name>_preferences.xml (o app pode criar diversos arquivos, não se limite a olhar somente esse). Supondo que o app esteja armazenando o usuário e senha dessa maneira, tais credenciais podem ser comprometidas caso um atacante tenha acesso físico ao celular.

SQLite

Geralmente podemos encontrar o arquivo sqlite em /data/data/<desenvolvedor.do.app>/databases.

Tipos de Arquivos e Conversões

Compilando código java (converte file.java em file.class)

Para verificar se o arquivo está ok, basta executar o comando abaixo (não precisa do sufixo .class):

Por padrão, o Android não executa esse tipo de arquivo, então precisamos utilizar DVM (Dalvik Virtual Machine), e para isso, é necessário converter arquivo .class em .dex.

Para testar se está ok, faça upload desse arquivo para o Android via adb (pode ser em /data/local/tmp) e depois execute o seguinte comando:

Nas versões mais atuais do Android, a execução é feita através do ART (Android Runtime), então é preciso converter o arquivo .dex em oat.

Também podemos converter arquivos .java em .dex e depois em .smali.

Bypass em Tela de Bloqueio

Caso tenha acesso root ao Android via adb, podemos resetar a senha de desbloqueio (aquela que é preciso fazer uma determinada sequencia ligando os pontos). Para isso, basta executar o comando abaixo para deletar o arquivo responsável pelo gerenciamento dessa senha.

Feito isso, basta agora utilizar qualquer sequencia de desbloqueio, que o Android irá validar como correto.

Android Studio

Execute antes de instalar o Android Studio, execute:

Após a sua execução, abra o Android Studio, vá no menu Tools e clique em Create Desktop Entry, assim não é preciso entrar no diretório via terminal e chamar diretamente o arquivo studio.sh toda vez.

Emulator

Esse, assim como o adb, já faz parte do pacote do Android Studio e podemos utilizá-lo para iniciarmos um Android sem precisar abrir a GUI do Android Studio, que deve ser utilizado somente para criar os dispositivos antes.

Listando dispositivos disponíveis que já foram criados através do Android Studio

Iniciando um dispositivo

Fornece permissão de escrita nas pastas de sistema quando viramos root

adb

ATENÇÃO: Sempre que for utilizar o adb, certifique-se de emular o Android antes, através do ./emulator @<android>

COMANDO
DESCRIÇÃO

adb devices

Lista os devices disponíveis

adb -s <device_name> shell

Caso tenha mais de um device, é preciso passar o seu nome. Caso tenha somente um device, não é preciso especificar

adb shell getprop ro.product.cpu.abi

Descobrindo a arquitetura do Android

adb root

Reinicia o adb com permissões de root

adb unroot

Reinicia o adb sem permissões de root

adb shell

Conecta via shell no android (funciona somente quanto tem apenas 1 device)

adb -e shell

Conecta via shell no android emulado (funciona somente quanto tem apenas 1 device emulado)

adb -d shell

Conecta via shell no android físico (funciona somente quanto tem apenas 1 device físico)

adb shell <command>

Executa o comando no shell (sem entrar no modo interativo)

adb shell ps

Exibe os processos que estão em execução no Android

adb push <file> /data/local/tmp

Realiza upload de um arquivo para o tmp do Android

adb pull </path/to/file.txt>

Realiza download de um arquivo do Android para o diretório atual

adb pull </path/to/file.txt> </path/to/local/file.txt>

Realiza download de um arquivo do Android para um diretório personalizado

adb install <file.apk>

Instala um app manualmente

adb uninstall package

Desinstala um app. Utilize o comando ps para listar o nome do package

adb forward tcp:<port> tcp:<port>

Realiza um port forwarding

adb start-server

Inicia o serviço do adb

adb kill-server

Encerra o serviço do adb. As vezes o adb trava, então é útil parar o seu serviço e iniciar novamente, isso muitas vezes corrige as falhas

Package Manager

COMANDO
DESCRIÇÃO

adb shell pm list users

Lista os usuários

adb shell pm list packages

Lista todos os pacote

adb shell pm list packages -s

Lista todos os pacotes de sistema

adb shell pm list packages -3

Lista todos os pacotes de terceiros

adb shell pm path <package_name>

Mostra o caminho do APK

Activity Manager

COMANDO
DESCRIÇÃO

am start -a android.intent.action.VIEW <http://site.com>

Abre o navegador já com determinada URL

am start -a android.intent.action.VIEW geo:0,0?q=<Nome+da+Empresa>

Procura por uma empresa no Google Maps

am start -a android.intent.action.CALL -d tel:<number>

Realiza uma ligação para determinado número

am start -a android.intent.action.VIEW content://contacts/people

Abre a agenda de contatos telefônicos

am start -n com.android.music/com.android.music.MusicBrowserActivity

Abre o player de música

Services

COMANDO
DESCRIÇÃO

am startservice -n com.android.music/com.android.music.MediaPlaybackService

Iniciando um serviço em background

am stopservice -n com.android.music/com.android.music.MediaPlaybackService

Finaliza um serviço em background

Broadcast Receivers

COMANDO
DESCRIÇÃO

am broadcast -a android.intent.action.BOOT_COMPLETED

Exibe a mensagem (logo) quando liga o celular

Content Providers

COMANDO
DESCRIÇÃO

content query --uri content://sms/sent

Exibe no terminal todos os SMS que foram enviados e suas respectivas informações

SSL Pinning / Unpinning

No final dessa página, utilize o link de download para baixar o Frida Multiple Pinning, que resolve questões de Pinning e falhas de TrustManager, que geralmente vem acompanhando de erros como java.security.cert.CertPathValidatorException: Trust anchor for certification path not found ao realizarmos uma interceptação via Burp Suite.

Podemos procurar por pontos de pinagem em código ofuscado, extraindo o código com o apktool e depois procurando por palavras-chave, como no exemplo abaixo:

Manual

Após decompilar a APK com o apktool, vá na tag application dentro arquivo AndroidManifest.xml e adicione o seguinte conteúdo:

Vá em res/xml e crie um arquivo chamado network_security_config.xml, com o seguinte conteúdo:

Compile com o apktool e em seguida crie uma auto assinatura (todos esses passos estão nessa mesma página).

Proxy

Maneira 1

Essa é sem dúvidas a forma mais, pois iremos apenas criar um túnel via adb utilizando o comando abaixo. Não é preciso importar certificado do Burp nesse processo.

Verificando os túneis que estão ativos

Após isso, basta ir nas configuração do Wifi e adicionar um proxy para 127.0.0.1 na porta 8080. Com isso, possívelmente já deve ser capaz de interceptar as requisições via Burp, porém em alguns cenários isso não é o suficiente, já que o firewall pode barrar esse tipo de conexão. Para resolver este cenário, acesse o Android com root e execute os seguintes comandos:

Feito isso, vá no Burp Suite > Proxy > Options, selecione o Listener (127.0.0.1:8080), clique em Edit, vá na aba Request handling e selecione a opção Support invisble proxying (enable only if needed).

Maneira 2

Caso utilize algum proxy (por exemplo, o Burp Suite), utilize o comando abaixo. Lembre-se também de, alterar o proxy nas configurações de rede do próprio Android, seja editando a Rede Wifi ou a Rede Móvel (configurando o APN - Access Point Names). Configure um PIN de 4 dígitos para bloqueio de tela e importe também o certificado confiável do proxy para que possa os apps normalmente. Caso utilize o wifi em um Android Emulador, desabilite o 3G/4G.

Outra alternativa é, alterar as configurações no menu suspenso que fica do lado do mobile, onde é possível configurar o proxy.

Acessando como root

Ao utilizar o Android Studio e emular um novo Android, se atente ao ponto onde, imagens com o Google Play instalado não possui o root ativo, já os que não possuem o Google Play, podem ser acessados como root.

Maneira 1

Após iniciar o Android e acessar via adb shell, note que temos acesso de um usuário comum, mas podemos ter acesso root apenas digitando su no terminal. Se preferir, pode-se utilizar o comando adb root para ficar com acesso root diretamente, note que após isso, o comando adb shell id terá um resultado diferente.

Maneira 2

Outra maneira de fazermos o processo de root é executar o seguinte comando em um terminal:

E em outro terminal:

Diretórios e Arquivos Importantes (APK)

AndroidManifest.xml

NOTA: No final da página (na seção sites, há um link onde pode enviar conteúdo no AndroidManifest.xml e o site irá explicar cada permissão que o app está utilizando).

Este é o principal arquivo de configuração usado por todos os aplicativos Android. É usado pelo Android para obter informações sobre o aplicativo, bem como quais funcionalidades estão expostas a outros aplicativos (entre outras coisas).

Fique atento as seguintes informações:

  • package = Nome do app

  • platformBuildVersionCode = Versão do SDK que aplicativo foi compilado

  • android:allowBackup="true" = É possível fazer um backup do aplicativo via adb

  • android:exported="true" = Este serviço pode ser invocado por outros aplicativos

  • android.permission.SET_DEBUG_APP = Caso esse recurso esteja ativo (presente no AndroidManifest.xml, significa que o aplicativo pode realizar debug de outros aplicativos.

  • android.permission.DUMP = Permite que o aplicativo recupere o estado interno do sistema, permitindo recuperar uma grande variedade de informações privadas e seguras.

  • android.permission.MANAGE_ACCOUNTS = Permite que a aplicação permita criar e excluir contas

Um ponto importante também a ser notado, é que o podemos ver a tag activity no AndroidManifest.xml, e dentro dela, a tag intent-filter com sua respectiva action. Isso siginifica que essa action pode ser chamada por outros apps, ou até mesmo de forma manual, independente do app estar em execução ou não. Execute então o Activity Manager (am) para realizar tal chamada, substituindo o <activity_android:name> abaixo, com o valor de android:name, localizado na tag activity, porém adicionando um / antes do último ponto. Exemplo:

Podemos também chamá-lo de uma maneira diferente, passando o parâmetro -n para informar o Componente e o -a para informa a Action (valor de android:name dentro da tag action).

Em alguns casos, essas actions podem/devem receber parâmetros (que não são exibidas no AndroidManifest.xml), então deve adicionar o parâmetro --ez no comando acima. Para saber quais parâmetros são esses, devemos decompilar com o apktool e ler o código-fonte e, após isso, acessar res/values/strings.xml e verificar o nome real que deve ser passado pelo adb, como no exemplo abaixo:

Outro ponto importante de vermos são os respectivos donos (ID de grupo e usuário)

res/layout/activity_main.xml

Conteúdo em XML que contém um código fonte do frontend da aplicação.

res/values/strings.xml

String única que pode ser referenciada do aplicativo ou de outros arquivos de recurso (como um layout XML).

HardcodeActivity

Arquivo que podemos encontrar por chaves e demais valores que estão engessados no código. Caso use o apktool, este deve estar com a extensão smali.

LogActivity

Arquivo que gera saídas de log, que pode ser lida através do adb logcat.

Lendo Logs em Real Time

Isso é útil para identificarmos dados sensíveis que são disponíveis nos log's.

Flag Secure

Aplicativos com o Flag Secure ativo, bloqueia print do app quando ele está aberto e/ou quando a janela aparece na lista de apps abertos. Também é útil para barrar ferramentas que acessam um app físico remotamente, como Vysor.

Bypass de Flag Secure. Salve o código abaixo com o nome xpl.js

Agora execute:

NOTA: Até o momento não existe uma maneira 100% eficaz que barre esse tipo de bypass

Content Provider

Primeiro verifique se o AndroidManifest.xml possui a chave/valor android:exported="true" na tag provider, e caso seja positivo, execute o comando abaixo no código-fonte decompilado para buscar pelo content:

Caso localize algo com o grep acima, utilize o comando abaixo para ver os seu conteúdo:

MobSF

Executando via Docker

Drozer

Instalação

Instalando o Drozer no Android

Entre na GUI do Drozer, inicialize o serviço pelo próprio app e verifique a porta que foi aberta (geralmente é 31415).

Levando em conta que estamos utilizando a porta default (31415), vamos fazer um Port Forwarding via adb, com o seguinte comando:

Feito isso, vamos iniciar o Drozer no terminal Linux, com o comando abaixo. Adicione --server <phone-ip> caso não seja na mesma máquina que esteja executando o Drozer e o Android.

Utilização

Lista todos os módulos disponíveis

Help

Acessando Shell do dispositivo

Buscando por todos os pacotes

Informações sobre as activities do um package. Adicione -u no final para ver todas as activities, pois por padrão só serão exibidas as que são exportadas, pois são propensas a ataques.

Chamando uma activity

Buscando por todos os pacotes, porém utilizando um filtro pelo nome

Informações sobre o pacote

Exibindo o AndroidManifest.xml

Examina a superfície de ataques do pacote instalado

Procura por Providers que podem ser executadas via query

Decompilando APK

apktool

Baixe a APK que deseja decompilar, vá no terminal e execute o comando abaixo. Caso não especifique a saída, será utilizado o diretório local.

Disassemble sem o resources

Em alguns casos, é melhor baixar o apktool.jar e executá-lo, pois o que vem nativo no Kali as vezes pode apresentar alguns erros. Verifique no final dessa página a URL para download. Nesse caso, como se tratar de um arquivo .jar, precisamos executá-lo da seguinte forma:

Smali / BakSmali

Se executar o comando abaixo e não especificar o output, irá ser criado um diretório chamado out, onde irá conter os arquivos com extensão smali.

unzip

Outra maneira de descompactarmos uma apk (o resultado poderá diferente do comando anterior), é utilizando o unzip:

jadx

Extraindo arquivo com extensão .java

Abrindo apk em modo gráfico (IDE) em real time

Além fazer essa extração de .apk para .java, o jadx-gui também consegue abrir arquivos .apk e ler o seu conteúdo, decompilando em tempo de execução.

enjarify

Instalação

Converte .apk em .jar

Pós Decompilação

Arquivos dex

As vezes ao desmontarmos uma APK, podemos ter arquivos de classes com extensão dex. Para lermos esses arquivos, temos que converter esse arquivo em jar e então, descompactarmos ele com o unzip.

Lendo Arquivos class

O comando abaixo irá fazer uma cópia do arquivo .class para o diretório atual, com a extensão .jad (legível)

Caso tenha acesso ao GUI, utilize o comando abaixo para abrir uma ferramenta em modo gráfico:

NOTA: o jd-gui lê mais tipos de arquivos, como: .aar, .class, .ear, .jar, .java, .jmod, .log, .war e .zip

Manipulando Arquivos class

Depois de montar um arquivo .jad a partir um arquivo .class, podemos manipular o código com qualquer editor. Primeiro altere a extensão de .jad para .java e então execute o seguinte comando para converter em arquivo .java em .class. Atente-se que, caso tenha um arquivo com o mesmo nome e extensão .class, o mesmo será sobrescrito sem perguntar se deseja fazer isso ou não.

Feito isso, será criado um arquivo .class e partir do arquivo .java, o que nos permite agora executá-lo diretamente.

NOTA: O comando java irá buscar automaticamente por um arquivo com extensão .class, então coloque somente o nome do arquivo.

Compilando APK

Agora que APK já foi modificada, basta montá-la novamente, depois assiná-la e por fim, alinhá-la.

apktool

Se montar o APK e não definir o output, o APK estará localizado em <nome_do_diretório_com_codigo_extraído/dist/file.apk>.

smali

Certificado Auto-Assinado

Após ter montado o APK, precismos assiná-lo digitalmente para que possa ser instalado no Android. Talvez seja preciso ainda, fazer o alinhamento para que seja feito a instalação do APK com sucesso.

Gerando a chave e auto-assinando:

OBS.: Caso dê erro invalid entry compressed size ao executar o jarsigner, execute o comando abaixo e depois use o jarsigner novamente:

Verificar a assinatura (geralmente encontramos o jarsigner no diretório do Android Studio: ./android-studio/jre/bin/jarsigner)

Listando os certificados que tem dentro do keystore

Exportando o certificado para ter uma melhor visualização

Alinhamento do APK (Align)

Esse procedimento é realizado após compilar a APK e auto assiná-la. Isso é importante, pois em alguns casos não é possível instalar a APK mesmo depois de auto assinar.

Geralmente encontramos o zipalign em ./Android/Sdk/build-tools/<version>/zipalign.

Frida

Tem muitas dependências, então caso dê pau, utilize outras versões. De preferência, utilize a partir da 15.0.0. O recomendado é utilizar a mesma versão no Frida Server (Android) e no Frida Client (Computador).

IMPORTANTE: Antes de realizar o procedimento abaixo para instalar, certifique-se de baixar o frida para a arquitetura correta do Android. Verifique como fazer isso na seção acima de adb.

Instalando Frida Client (computador)

Certifique-se de que o python está na versão 3

Instalando Frida Server (android emulado)

Baixe e descompacte o frida.xz, envie para o Android em /data/local/tmp/ e dê a permissão com o seguinte comando:

Instalando Frida Server (android físico)

Baixe e descompacte o frida.xz, envie para o Android em /data/local/tmp/. Para dar permissão de execução, utilize um dos comandos abaixo:

Executando (android emulado)

Executando (android físico)

Execute um dos comandos abaixo:

Utilização

Verificando aplicativos que estão em execução no Android

Tunelamento / Proxy

Objection

Trabalha em cima do Frida, porém de uma forma mais automatizada, então certifique-se de executar o Frida Server (Android) antes de utilizar o Objection.

Instalação

Certifique-se de que o python está na versão 3

Utilização

Conectando no android a abrindo um app (execute o frida server antes)

Verificando variáveis de ambiente

Executando comandos no SO

Importando script do Frida

Versão do Frida

Baixando arquivo

Upload de arquivo

Tirando print da tela (somente se o app estiver em primeiro plano)

Listando as Activities

Listando os Services

Listando os Receivers

Verificando qual a Activity que está sendo exibida no exato momento na aplicação. Ao alterar de tela no app, verifique que o comando abaixo irá mudar a resposta, exibindo a respectiva Activity no momento

Abrindo uma Activity

Exibe todas as classes que são carregadas na aplicação

Semelhante ao comando anterior, porém este irá trazer somente as classes de um detereminado app. Note que o resultado irá trazer o nome (caminho) completo dessa classe, porém nos próximos comandos, utilize somente o final (o que está após o último ponto final) do resultado

Pegando os métodos de uma determinada classe de um determinado app

Verificando os parâmetros que um determinado método possui

Pegando um exemplo de Hooking. Depois de ver o resultado, altere a linha comentada com um console.log("Texto aqui"); e salve em um arquivo .js. Após isso, execute e verifique se a mensagem foi exibida com sucesso no terminal do Objection, materializando assim que o Hooking teve êxito. Note que, ao realizar o comando abaixo, será gerado um script com todos os métodos da classe MainActivity, então limpe/apague o código dos métodos que não for utilizar. Abaixo estamos utilizando o MainActivity, mas altere para a classe que deseja atacar.

Exemplo de código que deverá ser gerado:

Super-Analyzer

Ferramenta via terminal que exporta um HTML com vulnerabilidades encontradas.

Após o termino da execução do comando acima, leia o arquivo situado em ./results/owasp.mstg./index.html.

ClassyShark

Ferramenta desenvolvida em Java que permite ler código-fonte de APK.

Iniciando o ClassyShark

AATP2 (Android Asset Packaging Tool)

O AAPT2 (Android Asset Packaging Tool) é uma ferramenta de compilação que o Android Studio e o Plug-in do Android para Gradle usam para compilar e empacotar recursos de apps. O AAPT2 analisa, indexa e compila os recursos em um formato binário que é otimizado para a plataforma Android. Apesar de vermos o AAPT2 sendo utilizada em conjuntos com outras ferramentas, também podemos utilizá-la separadamente via terminal.

Verificando permissões do APK

Este na verdade irá ler o AndroidManifest.xml e extrair as devidas informações.

Lendo Arquivos ab

Arquivos com extensão .ab são usados para fazer backup. Para ver o seu conteúdo, execute:

Invadindo Android com Metasploit

Agora envie o arquivo gerado para a vítima e, assim que ele executar a APK, irá entrar no Meterpreter

Sites

Last updated

Was this helpful?