mirror of
https://github.com/carlospolop/hacktricks
synced 2024-12-19 09:34:03 +00:00
308 lines
16 KiB
Markdown
308 lines
16 KiB
Markdown
# Tutorial Drozer
|
|
|
|
<details>
|
|
|
|
<summary><strong>Aprenda hacking no AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
|
|
|
Outras formas de apoiar o HackTricks:
|
|
|
|
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
|
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
|
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
|
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios github do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
|
|
|
</details>
|
|
|
|
<img src="../../../.gitbook/assets/i3.png" alt="" data-size="original">
|
|
|
|
**Dica para 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**](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
|
|
|
|
* [Sieve](https://github.com/mwrlabs/drozer/releases/download/2.3.4/sieve.apk) (da mrwlabs)
|
|
* [DIVA](https://payatu.com/wp-content/uploads/2016/01/diva-beta.tar.gz)
|
|
|
|
## Instalação
|
|
|
|
Instale o Cliente Drozer no seu host. Baixe-o a partir das [últimas versões](https://github.com/mwrlabs/drozer/releases).
|
|
```bash
|
|
pip install drozer-2.4.4-py2-none-any.whl
|
|
pip install twisted
|
|
pip install service_identity
|
|
```
|
|
Baixe e instale o APK do drozer a partir dos [últimos lançamentos](https://github.com/mwrlabs/drozer/releases). No momento, é [este](https://github.com/mwrlabs/drozer/releases/download/2.3.4/drozer-agent-2.3.4.apk).
|
|
```
|
|
adb install drozer.apk
|
|
```
|
|
### Iniciando o Servidor
|
|
|
|
O Agent está rodando na porta 31415, precisamos fazer o [encaminhamento de porta](https://en.wikipedia.org/wiki/Port\_forwarding) para estabelecer a comunicação entre o Cliente Drozer e o Agent, aqui está o comando para fazer isso:
|
|
```
|
|
adb forward tcp:31415 tcp:31415
|
|
```
|
|
Finalmente, **inicie** o **aplicativo** e pressione o botão "**ON**"
|
|
|
|
![](<../../../.gitbook/assets/image (63).png>)
|
|
|
|
E conecte-se a ele:
|
|
```
|
|
drozer console connect
|
|
```
|
|
## Comandos Interessantes
|
|
|
|
| **Comandos** | **Descrição** |
|
|
| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
| **Help MODULE** | Mostra a ajuda do módulo selecionado |
|
|
| **list** | Exibe uma lista de todos os módulos drozer que podem ser executados na sessão atual. Isso oculta módulos que 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 drozer e executa-os em sequência. |
|
|
| **module** | Encontra e instala módulos drozer adicionais 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 uma 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 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
|
|
```
|
|
Ler **Manifest**:
|
|
```
|
|
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
|
|
```
|
|
* **Activities**: Talvez você possa iniciar uma atividade e contornar algum tipo de autorização que deveria impedir o lançamento dela.
|
|
* **Content providers**: Talvez você possa acessar dados privados ou explorar alguma vulnerabilidade (SQL Injection ou Path Traversal).
|
|
* **Services**:
|
|
* **is debuggable**: [Saiba mais](./#is-debuggeable)
|
|
|
|
### Activities
|
|
|
|
O valor "android:exported" de um componente de atividade exportado está definido como **"true"** no arquivo AndroidManifest.xml:
|
|
```markup
|
|
<activity android:name="com.my.app.Initial" android:exported="true">
|
|
</activity>
|
|
```
|
|
**Listar atividades exportadas**:
|
|
```bash
|
|
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 o lançamento dela.
|
|
|
|
{% code overflow="wrap" %}
|
|
```bash
|
|
dz> run app.activity.start --component com.mwr.example.sieve com.mwr.example.sieve.PWList
|
|
```
|
|
{% endcode %}
|
|
|
|
Você também pode iniciar uma atividade exportada a partir do **adb**:
|
|
|
|
* PackageName é com.example.demo
|
|
* Exported ActivityName é com.example.test.MainActivity
|
|
```bash
|
|
adb shell am start -n com.example.demo/com.example.test.MainActivity
|
|
```
|
|
### Provedores de Conteúdo
|
|
|
|
Este post era tão grande para estar aqui que **você pode** [**acessá-lo em sua própria página aqui**](exploiting-content-providers.md).
|
|
|
|
### Serviços
|
|
|
|
Um serviço exportado é declarado dentro do Manifest.xml:
|
|
|
|
{% code overflow="wrap" %}
|
|
```markup
|
|
<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**:
|
|
|
|
![](<../../../.gitbook/assets/image (194).png>)
|
|
|
|
#### Listar serviço
|
|
```bash
|
|
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`:
|
|
|
|
![](<../../../.gitbook/assets/image (196) (1).png>)
|
|
|
|
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
|
|
```
|
|
```markdown
|
|
![](<../../../.gitbook/assets/image (195).png>)
|
|
|
|
### Receptores de Broadcast
|
|
|
|
Aplicativos Android podem enviar ou receber mensagens broadcast do sistema Android e de outros aplicativos Android, similar ao padrão de design [publish-subscribe](https://en.wikipedia.org/wiki/Publish%E2%80%93subscribe\_pattern). Esses broadcasts são enviados quando um evento de interesse ocorre. Por exemplo, o sistema Android envia broadcasts quando vários eventos do sistema ocorrem, como quando o sistema é iniciado ou o dispositivo começa a carregar. Aplicativos também podem enviar broadcasts personalizados, por exemplo, para notificar outros aplicativos sobre algo que possa ser do interesse deles (por exemplo, novos dados foram baixados).
|
|
|
|
Aplicativos podem se registrar para receber broadcasts específicos. Quando um broadcast é enviado, o sistema automaticamente encaminha os broadcasts para os aplicativos que se inscreveram para receber aquele tipo particular de broadcast.
|
|
|
|
Isso poderia aparecer dentro do arquivo Manifest.xml:
|
|
```
|
|
```markup
|
|
<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](https://developer.android.com/guide/components/broadcasts)
|
|
|
|
Após descobrir estes Broadcast Receivers, você deve **verificar o código** deles. Preste atenção especial à função **`onReceive`**, pois ela será responsável por lidar com as mensagens recebidas.
|
|
|
|
#### **Detectar todos** os broadcast receivers
|
|
```bash
|
|
run app.broadcast.info #Detects all
|
|
```
|
|
#### Verificar os receptores de transmissão de um app
|
|
```bash
|
|
#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**
|
|
```
|
|
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 Content Provider do [FourGoats apk](https://github.com/linkedin/qark/blob/master/tests/goatdroid.apk), você pode **enviar um SMS arbitrário** para qualquer destino não-premium **sem pedir** permissão ao usuário.
|
|
|
|
![](<../../../.gitbook/assets/image (199).png>)
|
|
|
|
![](<../../../.gitbook/assets/image (197) (1).png>)
|
|
|
|
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!"
|
|
```
|
|
### É depurável
|
|
|
|
Um APK de produção nunca deve ser depurável.\
|
|
Isso significa que você pode **anexar um depurador Java** à aplicação em execução, inspecioná-la em tempo real, 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](../exploiting-a-debuggeable-applciation.md) sobre aprofundamento quando sua aplicação é depurável e injetando código em tempo de execução.
|
|
|
|
Quando uma aplicação é depurável, isso aparecerá no Manifest:
|
|
```html
|
|
<application theme="@2131296387" debuggable="true"
|
|
```
|
|
Você pode encontrar todos os aplicativos depuráveis com **Drozer**:
|
|
```bash
|
|
run app.package.debuggable
|
|
```
|
|
## Tutoriais
|
|
|
|
* [https://resources.infosecinstitute.com/android-penetration-tools-walkthrough-series-drozer/#gref](https://resources.infosecinstitute.com/android-penetration-tools-walkthrough-series-drozer/#gref)
|
|
* [https://github.com/mgcfish/mobiletools/blob/master/_posts/2016-08-01-Using-Drozer-for-application-security-assessments.md](https://github.com/mgcfish/mobiletools/blob/master/_posts/2016-08-01-Using-Drozer-for-application-security-assessments.md)
|
|
* [https://www.hackingarticles.in/android-penetration-testing-drozer/](https://www.hackingarticles.in/android-penetration-testing-drozer/)
|
|
* [https://medium.com/@ashrafrizvi3006/how-to-test-android-application-security-using-drozer-edc002c5dcac](https://medium.com/@ashrafrizvi3006/how-to-test-android-application-security-using-drozer-edc002c5dcac)
|
|
|
|
## Mais informações
|
|
|
|
* [https://blog.dixitaditya.com/android-pentesting-cheatsheet/](https://blog.dixitaditya.com/android-pentesting-cheatsheet/)
|
|
|
|
<img src="../../../.gitbook/assets/i3.png" alt="" data-size="original">
|
|
|
|
**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**](https://go.intigriti.com/hacktricks) hoje e comece a ganhar recompensas de até **$100,000**!
|
|
|
|
{% embed url="https://go.intigriti.com/hacktricks" %}
|
|
|
|
<details>
|
|
|
|
<summary><strong>Aprenda hacking no AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
|
|
|
Outras formas de apoiar o HackTricks:
|
|
|
|
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
|
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-me no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
|
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios do GitHub** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
|
|
|
</details>
|