
호스트 목록을 필터링하여 HTTP 연결 가능성을 확인하고 내부/외부 IP를 확인함으로써 실행 가능한 SSRF 후보를 식별하며, 클라우드 환경에서 전통적인 블랙리스트를 우회합니다.
surf를 사용하면 호스트 목록을 필터링하여 유효한 SSRF 후보 목록을 반환할 수 있습니다. 이 도구는 사용자 머신에서 각 호스트로 HTTP 요청을 보내 응답하지 않은 모든 호스트를 수집한 후, 외부 및 내부 호스트 목록으로 필터링합니다.
그런 다음 SSRF 취약점이 있을 수 있는 모든 곳에서 이 호스트들을 시도할 수 있습니다. 대부분의 SSRF 필터는 내부 또는 제한된 IP 범위에만 초점을 맞추기 때문에, 사용자 머신에서 HTTP(s)로 접근할 수 없는 외부 IP에서 SSRF를 발견하면 놀랄 것입니다.
대규모 클라우드 환경을 갖춘 회사들은 내부 웹 앱에 외부 IP를 사용하는 경우가 많습니다. 전통적인 SSRF 필터는 이러한 호스트가 블랙리스트에 명시적으로 추가되지 않는 한(보통 추가되지 않음) 이를 포착하지 못합니다. 이것이 이 기법이 매우 강력할 수 있는 이유입니다.
이 도구는 HTTP 프로빙을 위해 httpx에 의존하므로 go 1.19 이상이 필요합니다.
다음 명령어로 설치할 수 있습니다:
go install github.com/assetnote/surf/cmd/surf@latest
bigcorp.txt 파일에 bigcorp.com의 하위 도메인 목록이 있고, 이 하위 도메인에 대한 모든 SSRF 후보를 찾고 싶다고 가정해 보겠습니다. 몇 가지 예시는 다음과 같습니다:
# 모든 ssrf 후보 찾기 (HTTP 프로빙을 통한 외부 IP 주소 포함)
surf -l bigcorp.txt
# 타임아웃 및 동시성 설정으로 모든 ssrf 후보 찾기 (HTTP 프로빙을 통한 외부 IP 주소 포함)
surf -l bigcorp.txt -t 10 -c 200
# 모든 ssrf 후보 찾기 (HTTP 프로빙을 통한 외부 IP 주소 포함) 및 모든 호스트 출력
surf -l bigcorp.txt -d
# 내부/비공개 IP 주소를 가리키는 모든 호스트 찾기 (HTTP 프로빙 없음)
surf -l bigcorp.txt -x
전체 설정 목록은 아래에서 확인할 수 있습니다:
❯ surf -h
███████╗██╗ ██╗██████╗ ███████╗
██╔════╝██║ ██║██╔══██╗██╔════╝
███████╗██║ ██║██████╔╝█████╗
╚════██║██║ ██║██╔══██╗██╔══╝
███████║╚██████╔╝██║ ██║██║
╚══════╝ ╚═════╝ ╚═╝ ╚═╝╚═╝
by shubs @ assetnote
Usage: surf [--hosts FILE] [--concurrency CONCURRENCY] [--timeout SECONDS] [--retries RETRIES] [--disablehttpx] [--disableanalysis]
Options:
--hosts FILE, -l FILE
List of assets (hosts or subdomains)
--concurrency CONCURRENCY, -c CONCURRENCY
Threads (passed down to httpx) - default 100 [default: 100]
--timeout SECONDS, -t SECONDS
Timeout in seconds (passed down to httpx) - default 3 [default: 3]
--retries RETRIES, -r RETRIES
Retries on failure (passed down to httpx) - default 2 [default: 2]
--disablehttpx, -x Disable httpx and only output list of hosts that resolve to an internal IP address - default false [default: false]
--disableanalysis, -d
Disable analysis and only output list of hosts - default false [default: false]
--help, -h display this help and exit
surf를 실행하면 SSRF 후보가 stdout에 출력되지만, 실행한 폴더 내에 두 개의 파일도 저장됩니다:
external-{timestamp}.txt - 외부에서 확인되지만 사용자 머신에서 HTTP 요청을 보낼 수 없는 호스트internal-{timestamp}.txt - 내부에서 확인되며 당연히 사용자 머신에서 HTTP 요청을 보낼 수 없는 호스트이 두 파일에는 대상에서 시도하기에 이상적인 SSRF 후보 호스트 목록이 포함됩니다. 외부 대상 목록이 내부 목록보다 유효할 가능성이 더 높습니다.
내부적으로 이 도구는 HTTP 프로빙을 위해 httpx를 활용합니다. httpx에서 반환된 오류를 캡처한 후 기본 분석을 수행하여 SSRF에 가장 적합한 후보를 결정합니다.
이 도구는 HackerOne (H1-4420 2023)의 라이브 해킹 이벤트 결과로 만들어졌습니다.