
Фильтрует списки хостов для выявления жизнеспособных кандидатов SSRF путем проверки HTTP-доступности и разрешения внутренних/внешних IP-адресов, обходя традиционные черные списки в облачных средах.
surf позволяет отфильтровать список хостов, возвращая список жизнеспособных SSRF-кандидатов. Это делается путем отправки HTTP-запроса с вашего компьютера на каждый хост, сбора всех хостов, которые не ответили, и последующей фильтрации их на список внешне доступных и внутренне доступных хостов.
Затем вы можете опробовать эти хосты везде, где может присутствовать SSRF-уязвимость. Поскольку большинство SSRF-фильтров ориентированы только на внутренние или ограниченные диапазоны IP, вы будете приятно удивлены, когда получите SSRF на внешнем IP, который недоступен через HTTP(s) с вашего компьютера.
Часто вы обнаружите, что крупные компании с облачными средами имеют внешние IP-адреса для внутренних веб-приложений. Традиционные SSRF-фильтры не перехватят это, если только эти хосты не будут специально добавлены в черный список (чего обычно никогда не происходит). Вот почему этот метод может быть таким мощным.
Этот инструмент требует Go 1.19 или выше, так как мы полагаемся на httpx для выполнения HTTP-зондирования.
Его можно установить следующей командой:
go install github.com/assetnote/surf/cmd/surf@latest
Предположим, у вас есть поддомены для bigcorp.com в файле с именем bigcorp.txt, и вы хотите найти всех SSRF-кандидатов для этих поддоменов. Вот несколько примеров:
# find all ssrf candidates (including external IP addresses via HTTP probing)
surf -l bigcorp.txt
# find all ssrf candidates (including external IP addresses via HTTP probing) with timeout and concurrency settings
surf -l bigcorp.txt -t 10 -c 200
# find all ssrf candidates (including external IP addresses via HTTP probing), and just print all hosts
surf -l bigcorp.txt -d
# find all hosts that point to an internal/private IP address (no HTTP probing)
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).