일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- php login page
- active reconnaissance
- file upload
- THM
- Cryptography
- ssrf
- php file upload
- php 파일 업로드하기
- SQLi
- OS Command Injection
- php
- War Game
- Reconnaissance
- Cookie
- sql injection
- Leviathan
- FTZ
- over the wire
- php 로그인 페이지 만들기
- overthewire
- Authentication
- tryhackme
- php To Do List
- 파일 업로드 취약점
- BANDiT
- access control
- Server Side Request Forgery
- active recon
- privilege escalation
- Recon
- Today
- Total
R's Hacking Daily Log
SSRF - Lab (2) 본문
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 |