hacktricks/mobile-pentesting/android-app-pentesting/drozer-tutorial
2024-05-05 22:04:08 +00:00
..
exploiting-content-providers.md Translated ['README.md', 'binary-exploitation/arbitrary-write-2-exec/aw2 2024-05-05 22:04:08 +00:00
README.md Translated ['README.md', 'binary-exploitation/arbitrary-write-2-exec/aw2 2024-05-05 22:04:08 +00:00

Tutorial do Drozer

Aprenda a hackear a AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Outras maneiras de apoiar o HackTricks:

Dica de recompensa por bugs: cadastre-se no Intigriti, uma plataforma premium de recompensa por bugs criada por hackers, para hackers! Junte-se a nós em https://go.intigriti.com/hacktricks hoje e comece a ganhar recompensas de até $100.000!

{% embed url="https://go.intigriti.com/hacktricks" %}

APKs para testar

Partes deste tutorial foram extraídas da documentação em pdf do Drozer.

Instalação

Instale o Cliente Drozer dentro do seu host. Baixe-o das últimas versões.

pip install drozer-2.4.4-py2-none-any.whl
pip install twisted
pip install service_identity

Baixe e instale o arquivo APK do drozer nas últimas versões. Neste momento, é este.

adb install drozer.apk

Iniciando o Servidor

O agente está em execução na porta 31415, precisamos fazer encaminhamento de porta para estabelecer a comunicação entre o Cliente Drozer e o Agente, aqui está o comando para fazer isso:

adb forward tcp:31415 tcp:31415

Finalmente, inicie o aplicativo e pressione o botão "ON"

E conecte-se a ele:

drozer console connect

Comandos Interessantes

Comandos Descrição
Help MODULE Mostra a ajuda do módulo selecionado
list Mostra uma lista de todos os módulos do drozer que podem ser executados na sessão atual. Isso oculta módulos para os quais você não tem permissões adequadas para executar.
shell Inicia um shell Linux interativo no dispositivo, no contexto do Agente.
clean Remove arquivos temporários armazenados pelo drozer no dispositivo Android.
load Carrega um arquivo contendo comandos do drozer e os executa em sequência.
module Encontra e instala módulos adicionais do drozer da Internet.
unset Remove uma variável nomeada que o drozer passa para quaisquer shells Linux que ele inicia.
set Armazena um valor em uma variável que será passada como variável de ambiente para quaisquer shells Linux iniciados pelo drozer.
shell Inicia um shell Linux interativo no dispositivo, no contexto do Agente.
run MODULE Executa um módulo do drozer.
exploit O Drozer pode criar exploits para serem executados no dispositivo. drozer exploit list
payload Os exploits precisam de um payload. drozer payload list

Pacote

Encontre o nome do pacote filtrando por parte do nome:

dz> run app.package.list -f sieve
com.mwr.example.sieve

Informações básicas do pacote:

dz> run app.package.info -a com.mwr.example.sieve
Package: com.mwr.example.sieve
Process Name: com.mwr.example.sieve
Version: 1.0
Data Directory: /data/data/com.mwr.example.sieve
APK Path: /data/app/com.mwr.example.sieve-2.apk
UID: 10056
GID: [1028, 1015, 3003]
Shared Libraries: null
Shared User ID: null
Uses Permissions:
- android.permission.READ_EXTERNAL_STORAGE
- android.permission.WRITE_EXTERNAL_STORAGE
- android.permission.INTERNET
Defines Permissions:
- com.mwr.example.sieve.READ_KEYS
- com.mwr.example.sieve.WRITE_KEYS

Leia Manifesto:

run app.package.manifest jakhar.aseem.diva

Superfície de ataque do pacote:

dz> run app.package.attacksurface com.mwr.example.sieve
Attack Surface:
3 activities exported
0 broadcast receivers exported
2 content providers exported
2 services exported
is debuggable
  • Atividades: Talvez você consiga iniciar uma atividade e contornar algum tipo de autorização que deveria impedir você de lançá-la.
  • Provedores de conteúdo: Talvez você consiga acessar dados privados ou explorar alguma vulnerabilidade (SQL Injection ou Traversal de Caminho).
  • Serviços:
  • is debuggable: Saiba mais

Atividades

O valor "android:exported" de um componente de atividade exportado está definido como "true" no arquivo AndroidManifest.xml:

<activity android:name="com.my.app.Initial" android:exported="true">
</activity>

Listar atividades exportadas:

dz> run app.activity.info -a com.mwr.example.sieve
Package: com.mwr.example.sieve
com.mwr.example.sieve.FileSelectActivity
com.mwr.example.sieve.MainLoginActivity
com.mwr.example.sieve.PWList

Iniciar atividade:

Talvez você possa iniciar uma atividade e contornar algum tipo de autorização que deveria impedir você de lançá-la.

{% code overflow="wrap" %}

dz> run app.activity.start --component com.mwr.example.sieve com.mwr.example.sieve.PWList

{% endcode %}

Você também pode iniciar uma atividade exportada pelo adb:

  • PackageName é com.example.demo
  • Nome da Atividade Exportada é com.example.test.MainActivity
adb shell am start -n com.example.demo/com.example.test.MainActivity

Fornecedores de Conteúdo

Este post era tão extenso para estar aqui, então você pode acessá-lo em sua própria página aqui.

Serviços

Um serviço exportado é declarado dentro do Manifest.xml:

{% code overflow="wrap" %}

<service android:name=".AuthService" android:exported="true" android:process=":remote"/>

{% endcode %}

Dentro do código verifique a função **handleMessage** que irá receber a mensagem:

Listar serviço

dz> run app.service.info -a com.mwr.example.sieve
Package: com.mwr.example.sieve
com.mwr.example.sieve.AuthService
Permission: null
com.mwr.example.sieve.CryptoService
Permission: null

Interagir com um serviço

app.service.send            Send a Message to a service, and display the reply
app.service.start           Start Service
app.service.stop            Stop Service

Exemplo

Dê uma olhada na ajuda do drozer para app.service.send:

Note que você estará enviando primeiro os dados dentro de "msg.what", depois "msg.arg1" e "msg.arg2", você deve verificar dentro do código quais informações estão sendo usadas e onde.
Usando a opção --extra você pode enviar algo interpretado por "msg.replyTo", e usando --bundle-as-obj você cria um objeto com os detalhes fornecidos.

No exemplo a seguir:

  • what == 2354
  • arg1 == 9234
  • arg2 == 1
  • replyTo == object(string com.mwr.example.sieve.PIN 1337)
run app.service.send com.mwr.example.sieve com.mwr.example.sieve.AuthService --msg 2354 9234 1 --extra string com.mwr.example.sieve.PIN 1337 --bundle-as-obj

Receptores de Transmissão

Na seção de informações básicas do Android, você pode ver o que é um Receptor de Transmissão.

Após descobrir esses Receptores de Transmissão, você deve verificar o código deles. Preste atenção especial na função onReceive pois será responsável por lidar com as mensagens recebidas.

Detectar todos os receptores de transmissão

run app.broadcast.info #Detects all

Verificar receptores de transmissão de um aplicativo

#Check one negative
run app.broadcast.info -a jakhar.aseem.diva
Package: jakhar.aseem.diva
No matching receivers.

# Check one positive
run app.broadcast.info -a com.google.android.youtube
Package: com.google.android.youtube
com.google.android.libraries.youtube.player.PlayerUiModule$LegacyMediaButtonIntentReceiver
Permission: null
com.google.android.apps.youtube.app.common.notification.GcmBroadcastReceiver
Permission: com.google.android.c2dm.permission.SEND
com.google.android.apps.youtube.app.PackageReplacedReceiver
Permission: null
com.google.android.libraries.youtube.account.AccountsChangedReceiver
Permission: null
com.google.android.apps.youtube.app.application.system.LocaleUpdatedReceiver
Permission: null

Interações de Transmissão

app.broadcast.info          Get information about broadcast receivers
app.broadcast.send          Send broadcast using an intent
app.broadcast.sniff         Register a broadcast receiver that can sniff particular intents

Enviar uma mensagem

Neste exemplo, abusando do apk FourGoats Content Provider, você pode enviar um SMS arbitrário para qualquer destino não premium sem pedir permissão ao usuário.

Se você ler o código, os parâmetros "phoneNumber" e "message" devem ser enviados para o Content Provider.

run app.broadcast.send --action org.owasp.goatdroid.fourgoats.SOCIAL_SMS --component org.owasp.goatdroid.fourgoats.broadcastreceivers SendSMSNowReceiver --extra string phoneNumber 123456789 --extra string message "Hello mate!"

Está depurável

Um APK de produção nunca deve estar depurável.
Isso significa que você pode anexar um depurador Java à aplicação em execução, inspecioná-la em tempo de execução, definir pontos de interrupção, avançar passo a passo, reunir valores de variáveis e até mesmo alterá-los. O InfoSec Institute tem um excelente artigo sobre aprofundar quando sua aplicação está depurável e injetar código em tempo de execução.

Quando uma aplicação está depurável, ela aparecerá no Manifesto:

<application theme="@2131296387" debuggable="true"

Você pode encontrar todas as aplicações depuráveis com o Drozer:

run app.package.debuggable

Tutoriais

Mais informações

Dica de recompensa por bugs: inscreva-se na Intigriti, uma plataforma premium de recompensas por bugs criada por hackers, para hackers! Junte-se a nós em https://go.intigriti.com/hacktricks hoje e comece a ganhar recompensas de até $100,000!

{% embed url="https://go.intigriti.com/hacktricks" %}

Aprenda hacking na AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Outras maneiras de apoiar o HackTricks: