hacktricks/mobile-pentesting/android-app-pentesting/drozer-tutorial/README.md

22 KiB

Tutorial do Drozer

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

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

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

APKs para testar

Instalação

Instale o Cliente Drozer em seu host. Faça o download da última versão.

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

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

adb install drozer.apk

Iniciando o Servidor

O agente está sendo executado na porta 31415, precisamos fazer um redirecionamento 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 os 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 qualquer shell Linux que ele inicia.
set Armazena um valor em uma variável que será passada como uma variável de ambiente para qualquer shell Linux iniciado 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 executar 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ê possa iniciar uma atividade e contornar algum tipo de autorização que deveria impedir você de lançá-la.
  • Provedores de conteúdo: Talvez você possa acessar dados privados ou explorar alguma vulnerabilidade (Injeção de SQL ou Traversão de Caminho).
  • Serviços:
  • is debuggable: Saiba mais

Atividades

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

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

Listar atividades exportadas:

To list the exported activities of an Android application, you can use the drozer tool. This tool allows you to perform various security assessments on Android apps.

To list the exported activities, follow these steps:

  1. Install drozer on your machine.

  2. Connect your Android device to your machine using a USB cable.

  3. Enable USB debugging on your Android device.

  4. Open a terminal or command prompt and navigate to the drozer installation directory.

  5. Run the following command to start the drozer console:

    drozer console connect
    
  6. Once the drozer console is open, run the following command to start the app you want to assess:

    run app.package.list -f <package_name>
    

    Replace <package_name> with the package name of the app you want to assess.

  7. After the app is started, run the following command to list the exported activities:

    run app.activity.info -a <package_name>
    

    Replace <package_name> with the package name of the app you want to assess.

  8. The drozer tool will display a list of exported activities along with their corresponding details, such as the activity name, package name, and intent filters.

By listing the exported activities of an Android app, you can identify potential security vulnerabilities and assess the app's overall security posture.

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:

  • O nome do pacote é com.example.demo
  • O nome da atividade exportada é com.example.test.MainActivity
adb shell am start -n com.example.demo/com.example.test.MainActivity

Provedores de Conteúdo

Este post era muito grande 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

To interact with a service, you can use the run command in drozer. This command allows you to execute various actions on the target application.

Para interagir com um serviço, você pode usar o comando run no drozer. Esse comando permite que você execute várias ações no aplicativo alvo.

The basic syntax for the run command is as follows:

A sintaxe básica para o comando run é a seguinte:

run <module> <action> [options]

Where:

  • <module> is the name of the module you want to run.
  • <action> is the action you want to perform on the module.
  • [options] are additional options or parameters required by the module.

Onde:

  • <module> é o nome do módulo que você deseja executar.
  • <action> é a ação que você deseja realizar no módulo.
  • [options] são opções ou parâmetros adicionais necessários pelo módulo.

For example, to list all the activities in the target application, you can use the following command:

Por exemplo, para listar todas as atividades no aplicativo alvo, você pode usar o seguinte comando:

run app.activity.info

This will display a list of activities along with their corresponding package names.

Isso exibirá uma lista de atividades juntamente com seus respectivos nomes de pacote.

You can also specify additional options or parameters depending on the module and action you are using. For example, to launch a specific activity, you can use the following command:

Você também pode especificar opções ou parâmetros adicionais dependendo do módulo e ação que você está usando. Por exemplo, para iniciar uma atividade específica, você pode usar o seguinte comando:

run app.activity.start --component <package_name> <activity_name>

Replace <package_name> with the package name of the target application and <activity_name> with the name of the activity you want to launch.

Substitua <package_name> pelo nome do pacote do aplicativo alvo e <activity_name> pelo nome da atividade que você deseja iniciar.

By using the run command, you can interact with various services and components of the target application, allowing you to perform actions such as starting activities, sending intents, accessing content providers, and more.

Ao usar o comando run, você pode interagir com vários serviços e componentes do aplicativo alvo, permitindo que você execute ações como iniciar atividades, enviar intents, acessar provedores de conteúdo e muito mais.

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:

Observe 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

Os aplicativos Android podem enviar ou receber mensagens de transmissão do sistema Android e de outros aplicativos Android, semelhante ao padrão de design publicar-assinar. Essas transmissões são enviadas quando ocorre um evento de interesse. Por exemplo, o sistema Android envia transmissões quando vários eventos do sistema ocorrem, como quando o sistema é inicializado ou o dispositivo começa a carregar. Os aplicativos também podem enviar transmissões personalizadas, por exemplo, para notificar outros aplicativos sobre algo que possa ser do seu interesse (por exemplo, algum novo dado foi baixado).

Os aplicativos podem se registrar para receber transmissões específicas. Quando uma transmissão é enviada, o sistema automaticamente encaminha as transmissões para os aplicativos que se inscreveram para receber aquele tipo específico de transmissão.

Isso pode aparecer dentro do arquivo Manifest.xml:

<receiver android:name=".MyBroadcastReceiver"  android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.intent.action.INPUT_METHOD_CHANGED" />
</intent-filter>
</receiver>

De: https://developer.android.com/guide/components/broadcasts

Após descobrir esses Receptores de Transmissão, você deve verificar o código deles. Preste atenção especial na função onReceive, pois ela 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

To check the broadcast receivers of an app, you can use the drozer tool. Broadcast receivers are components in an Android app that listen for system-wide events or custom events sent by other apps. They can be potential entry points for attackers to exploit.

To list the broadcast receivers of an app, follow these steps:

  1. Install and set up drozer on your machine.

  2. Connect your Android device to your machine using a USB cable.

  3. Open a terminal and run the following command to start a drozer session:

    drozer console connect
    
  4. Once the session is started, run the following command to list the broadcast receivers of the target app:

    run app.broadcast.info -a <package_name>
    

    Replace <package_name> with the package name of the app you want to test.

  5. drozer will display a list of broadcast receivers along with their corresponding permissions and exported status. Analyze the output to identify any potential security vulnerabilities.

By checking the broadcast receivers of an app, you can identify any insecure or misconfigured receivers that may pose a risk to the app's security.

#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 Broadcast

Broadcasts são uma forma de comunicação entre componentes de um aplicativo Android. Eles permitem que um componente envie uma mensagem para todos os outros componentes registrados para receber esse tipo específico de mensagem. Essas mensagens podem ser usadas para iniciar ações em outros componentes, como iniciar uma atividade, exibir uma notificação ou executar um serviço em segundo plano.

No contexto da segurança, os broadcasts podem ser explorados por hackers para realizar ataques em aplicativos Android. Os hackers podem interceptar e manipular broadcasts para obter acesso não autorizado a informações confidenciais ou para executar ações maliciosas no dispositivo.

Neste tutorial, vamos explorar técnicas de pentesting para identificar e explorar vulnerabilidades relacionadas a interações de broadcast em aplicativos Android. Vamos usar a ferramenta Drozer, uma poderosa ferramenta de teste de segurança para aplicativos Android, para realizar esses testes.

Vamos começar examinando os diferentes tipos de interações de broadcast e como eles podem ser explorados em um contexto de pentesting.

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 do 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, coletar valores de variáveis e até mesmo alterá-los. O InfoSec Institute tem um excelente artigo sobre como investigar mais a fundo 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 todos os aplicativos 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 recompensa por bugs criada por hackers, para hackers! Junte-se a nós em https://go.intigriti.com/hacktricks hoje mesmo e comece a ganhar recompensas de até $100.000!

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

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥