surf 允许你过滤主机列表,返回一份可行的 SSRF 候选列表。它的工作原理是从你的机器向每个主机发送 HTTP 请求,收集所有未响应的主机,然后将它们筛选为面向外部和面向内部的主机列表。
然后你可以在可能存在 SSRF 漏洞的地方尝试这些主机。由于大多数 SSRF 过滤器只关注内部或受限 IP 范围,当你从自己的机器无法通过 HTTP(s) 访问的外部 IP 上获得 SSRF 时,你会感到惊喜。
你经常会发现,拥有云环境的大公司会为内部 Web 应用使用外部 IP 地址。传统的 SSRF 过滤器无法捕获这一点,除非这些主机被专门添加到黑名单中(通常它们永远不会被添加)。这就是为什么这种技术可以如此强大。
此工具需要 Go 1.19 或更高版本,因为我们依赖 httpx 进行 HTTP 探测。
可以使用以下命令安装:
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
资产列表(主机或子域名)
--concurrency CONCURRENCY, -c CONCURRENCY
线程数(传递给 httpx)- 默认为 100 [默认值: 100]
--timeout SECONDS, -t SECONDS
超时秒数(传递给 httpx)- 默认为 3 [默认值: 3]
--retries RETRIES, -r RETRIES
失败重试次数(传递给 httpx)- 默认为 2 [默认值: 2]
--disablehttpx, -x 禁用 httpx,仅输出解析为内部 IP 地址的主机列表 - 默认为 false [默认值: false]
--disableanalysis, -d
禁用分析,仅输出主机列表 - 默认为 false [默认值: false]
--help, -h 显示此帮助信息并退出
运行 surf 时,它会将 SSRF 候选列表打印到 stdout,同时还会在运行它的文件夹中保存两个文件:
external-{timestamp}.txt - 外部可解析,但从你的机器无法发送 HTTP 请求的主机internal-{timestamp}.txt - 内部可解析,并且显然从你的机器无法发送 HTTP 请求的主机这两个文件包含最适合在目标上尝试的 SSRF 候选主机列表。外部目标列表比内部列表更有可能可用。
在底层,此工具利用 httpx 进行 HTTP 探测。它捕获 httpx 返回的错误,然后执行一些基本分析以确定最可行的 SSRF 候选。
此工具是为 HackerOne 的现场黑客活动(H1-4420 2023)而创建的。