R's Hacking Daily Log

SSRF - Lab (2) 본문

Port Swigger/SSRF

SSRF - Lab (2)

hanhxx 2023. 6. 28. 11:27

Against other back-end systems

두 번째로 살펴볼 케이스는 사용자가 직접 연결할 수 없는 다른 백엔드 시스템과 서버가 상호 작용하는 경우이다.

이런 경우에는 private IP를 사용하는 경우가 많은 데 백엔드 시스템은 일반적으로 네트워크 토폴로지에 의해 

보호되기 때문에 보안 상태가 약한 경우가 많다고 한다. 

 

** 이때 서버와 시스템은 서로 신뢰 관계에 있기 때문에 악의적인 요청(etc. 민감한 데이터)이라 할지라도

아무 생각 없이 처리해줄 것이다. 

 

 

 

 

Lab - Basic SSRF against another back-end system

어떤 application에서 http://192.168.0.68/admin이라는 url로 백엔드 관리 인터페이스에 접근한다고 한다.

POST /product/stock HTTP/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 118

stockApi=http://192.168.0.68/admin

이때 위와 같은 packet이 만들어진다는 걸 예상할 수 있다.

 

이번 Lab에서는 이처럼 private IP를 사용해서 내부 시스템으로부터 데이터를 가져오는 과정을 통해 

상품의 재고 확인이 이뤄진다고 한다.

 

이때 공격자는 192.168.0.x 범위 안에 있는 IP 중 admin panel로 접근하는 데에 사용되는 IP를 찾아

carlos 계정을 삭제하는 것이 최종 목표이다.

 

(+) admin panel interface는 8080 port를 사용한다고 한다. 

 

그렇다면 admin panel에 접근하기 위해 사용되는 url이 192.168.0.x:8080/admin이라는 거 까지 제공된 셈이다.

 

 

Lab에 들어가 상품 하나를 클릭해 보면 이전 Lab과 마찬가지로 재고 확인을 위한 form을 볼 수 있다.

 

 

이때 어떤 packet이 날아가나 봤더니 재고 확인 인터페이스는

192.168.0.1:8080이라는 url을 사용하고 있는 걸 알아냈다.

 

 

그렇다면 admin panel에 접근하기 위한 IP는 무엇일지..! 이 packet을 가져다가 확인해 보자.

Intruder로 payload를 설정해 주고 0~255까지 넣어보았다.

 

 

실행을 해보면 192.168.0.1은 재고 확인을 위해 사용되고 있기 때문에 응답 length가 2477이 아닌 게 당연하고

이를 제외한 나머지 중에서 217이 payload인 경우 정상적인 response를 받는 걸 알아냈다.

 

 

response에 포함된 admin panel의 모습은 위와 같다.

현재 상태에서는 계정을 삭제할 수는 없지만 delete 버튼을 눌렀을 때 어떤 url이 만들어지는 알 수 있다.

 

 

URL을 확인해 보면 /admin/delete?username=carlos.

username을 parameter로 전달하여 계정을 삭제하는 과정이 이뤄지는 듯하다.

 

 

이 값을 stockApi로 넣어 request가 처리되도록 packet forward!

위와 같은 Packet을 보낸 다는 건 Api에 들어간 내용대로 username이 carlos인 계정을 삭제하라는

명령을 내리는 거와 같다. 

 

 

위의 Packet을 보내고 나면 성공적으로 Lab이 풀린 걸 볼 수 있을 것이다!

 

 


이번 Lab에서 살펴본 바와 같이 private IP를 이용해서 통신하는 서버와 시스템이 있을 때 

그 IP로 임의의 동작이 실행되도록 URL을 만들면 SSRF 공격이 실행되는 걸 볼 수 있었다. 

 

사용자가 carlos계정을 삭제하는 명령을 보낸다고 한다면 이는 stockApi 값이 아닌 

Get /http://192.168.0.217:8080/admin/delete?username=carlos라는 packet이 만들어진다.

 

이는 서버와 시스템이 통신할 때 stockApi로 http://192.168.0.217:8080/admin/delete?username=carlos가 

전달되는 것과는 다름을 헷갈려서는 안 된다. 

 

그렇기 때문에 사용자가 시스템에 직접 연결을 할 수 없는 경우,

시스템과 서버의 신뢰 관계를 이용해 stockApi라는 값을 조작함으로써 SSRF 공격을 성공할 수 있었던 것이다!!

 

** stockApi는 서버와 시스템이 상호 작용할 때 주고 받는 값이므로 신뢰 관계에 있는 이 둘은 stockApi의 내용을 그대로 수행하게 되는 것이다.

'Port Swigger > SSRF' 카테고리의 다른 글

SSRF - Lab (5)  (0) 2023.07.11
SSRF - Lab (4)  (0) 2023.07.10
SSRF - Lab (3)  (0) 2023.07.09
SSRF - Lab(1)  (0) 2023.06.27
SSRF (1)  (0) 2023.06.27
Comments