
Filtre les listes d'hôtes pour identifier les candidats SSRF viables en sondant l'accessibilité HTTP et en résolvant les IP internes/externes, contournant les listes noires traditionnelles dans les environnements cloud.
surf vous permet de filtrer une liste d'hôtes, renvoyant une liste de candidats SSRF viables. Il le fait en envoyant une requête HTTP depuis votre machine à chaque hôte, en collectant tous les hôtes qui n'ont pas répondu, puis en les filtrant en une liste d'hôtes exposés en externe et d'hôtes exposés en interne.
Vous pouvez ensuite tenter d'atteindre ces hôtes là où une vulnérabilité SSRF pourrait être présente. Comme la plupart des filtres SSRF se concentrent uniquement sur les plages d'adresses IP internes ou restreintes, vous serez agréablement surpris quand vous obtiendrez un SSRF sur une IP externe qui n'est pas accessible via HTTP(s) depuis votre machine.
Souvent, vous constaterez que les grandes entreprises ayant des environnements cloud possèdent des IP externes pour des applications web internes. Les filtres SSRF traditionnels ne captureront pas cela, à moins que ces hôtes ne soient spécifiquement ajoutés à une liste noire (ce qui n'est généralement jamais le cas). C'est pourquoi cette technique peut être si puissante.
Cet outil nécessite Go 1.19 ou supérieur car nous nous appuyons sur httpx pour effectuer les sondages HTTP.
Il peut être installé avec la commande suivante :
go install github.com/assetnote/surf/cmd/surf@latest
Supposons que vous ayez des sous-domaines pour bigcorp.com dans un fichier nommé bigcorp.txt, et que vous souhaitiez trouver tous les candidats SSRF pour ces sous-domaines. Voici quelques exemples :
# 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
La liste complète des paramètres se trouve ci-dessous :
❯ 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
Lors de l'exécution de surf, il affichera les candidats SSRF sur stdout, mais il sauvegardera également deux fichiers dans le dossier à partir duquel il est exécuté :
external-{timestamp}.txt - Résolution externe, mais impossible d'envoyer des requêtes HTTP depuis votre machineinternal-{timestamp}.txt - Résolution interne, et évidemment impossible d'envoyer des requêtes HTTP depuis votre machineCes deux fichiers contiendront la liste des hôtes qui sont des candidats SSRF idéaux à tester sur votre cible. La liste des cibles externes a plus de chances d'être viable que la liste interne.
Sous le capot, cet outil utilise httpx pour effectuer les sondages HTTP. Il capture les erreurs renvoyées par httpx, puis effectue une analyse de base pour déterminer les candidats les plus viables pour le SSRF.
Cet outil a été créé à la suite d'un événement de hacking en direct pour HackerOne (H1-4420 2023).