Surf允许我们输入一个目标主机列表,工具会自动过滤主机列表,并返回可能存在SSRF漏洞的主机信息(列表)。该工具可以使用本地主机向输入列表中的每一台目标主机发送一个HTTP请求,并收集所有未响应的主机信息,然后将它们分别转储到面向外部和面向内部的主机列表,以此来实现SSRF漏洞识别。
接下来,我们就可以对这些潜在的目标主机执行进一步分析,以确认SSRF漏洞存在的准确位置。由于大多数SSRD过滤器只关注内部网络或受限的IP地址范围,但是当你无法使用本地设备并通过HTTP(S)从外部IP访问并利用SSRF时,那就会打开新世界的大门。一般来说,拥有云环境的大型组织都会为内部网络应用程序提供一个外部IP,传统的SSRF过滤器并不会关注这一点,这也就是Surf的强大之处。
Go v1.19
httpx
由于该工具基于Go v1.19开发,因此我们首先需要在本地设备上安装并配置好Go v1.19环境。该工具还会使用httpx来进行HTTP探测,因此我们也需要安装好httpx。
接下来,广大研究人员就可以直接使用下列命令将该项目源码克隆至本地了:
git clone https://github.com/assetnote/surf.git
或者也可以使用go命令直接安装Surf:
go install github.com/assetnote/surf/cmd/surf@latest
假设,一个名为bigcorp.txt的文件中已经包含了bigcorp.com的子域名列表,此时你需要扫描子域名列表中可能存在SSRF漏洞的目标域名,那么我们就可以直接通过下列方法来实现扫描:
# 搜索所有可能包含SSRF漏洞的目标域名
surf -l bigcorp.txt
# 搜索所有可能包含SSRF漏洞的目标域名,并设置超时时间和并发线程数
surf -l bigcorp.txt -t 10 -c 200
# 搜索所有可能包含SSRF漏洞的目标域名,并打印所有主机信息
surf -l bigcorp.txt -d
# 搜索指向一个内部/私有IP地址的全部主机信息
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 目标列表(主机地址或子域名)
--concurrency CONCURRENCY, -c CONCURRENCY 并发线程数 [默认: 100]
--timeout SECONDS, -t SECONDS 任务超时时间秒数 [默认: 3]
--retries RETRIES, -r RETRIES 失败重新尝试次数 [默认: 2]
--disablehttpx, -x 禁用httpx,仅输出地址解析为内部IP的所有主机信息 [默认: false]
--disableanalysis, -d 禁用分析功能,仅输出主界列表 [默认: false]
--help, -h 显示工具帮助信息和退出
在运行Surf时,工具会将所有可能存在SSRF漏洞的目标信息打印到STDOUT,同时将结果存储在以下两个文件中:
external-{timestamp}.txt
internal-{timestamp}.txt
这两个文件都会包含可能存在SSRF漏洞的目标信息列表,但外部目标列表中目标存在SSRF漏洞的可能性要高得多。
Surf:https://github.com/assetnote/surf