Updated Jul 15, 2026

Fuzzing

Find name-based sites behind one shared IP

Host-header fuzzing packaged for vhost discovery.

Agent

overview

What ffuf-virtual-hosts does

Point the node at a live IP or apex URL and a hostname wordlist. It places FUZZ in the Host header (-H) so sites that share the origin but never appear in public DNS show up as distinct responses.

Drop the catch-all default page with -fs on its size, keep real codes with -mc, or enable -ac so filters calibrate against the unknown-host reply. -t and -rate keep shared hosting and reverse proxies from rate-limiting the sweep.

Run after an HTTP prober confirms the origin is live, then hand confirmed vhosts to content discovery or scanning so each site gets its own follow-on pass.

source github.com/ffuf/ffuf

use cases

Where ffuf-virtual-hosts fits

Discover virtual hosts behind one IP

Fuzz the Host header against a live target so internal apps, staging sites, and admin panels that share its IP but never resolve in DNS show up as real hits.

Separate real vhosts from the default page

Apply -mc / -fs filters, or -ac autocalibration, so the server's catch-all response for unknown hosts is dropped and only genuine vhosts remain.

Sweep a list of hosts in one node

Feed a hosts file so the fuzzer works through every target in turn, expanding vhost discovery from a single IP to a whole probed surface in one run.

Feed discovered vhosts downstream

Emit -json so the found virtual hosts become a structured set an HTTP prober or vulnerability scanner can pick up as its next input.

reference

ffuf-virtual-hosts inputs and flags

67 inputs
NameTypeFlagDescription
rawBOOLEAN-rawDo not encode URI (default: false)
sniSTRING-sniTarget TLS SNI, does not support FUZZ keyword
jsonBOOLEAN-jsonJSON output, printing newline-delimited JSON records (default: false)
modeSTRING-modeMulti-wordlist operation mode. Available modes: clusterbomb, pitchfork, sniper (default: clusterbomb)
rateSTRING-rateRate of requests per second (default: 0)
delaySTRING-pSeconds of `delay` between requests, or a range of random delay. For example "0.1" or "0.1-2.0"
http2BOOLEAN-http2Use HTTP2 protocol (default: false)

Showing key inputs. ffuf-virtual-hosts exposes 67 inputs in total.

Full flag reference (67 inputs)
NameTypeFlagDescription
rawBOOLEAN-rawDo not encode URI (default: false)
sniSTRING-sniTarget TLS SNI, does not support FUZZ keyword
jsonBOOLEAN-jsonJSON output, printing newline-delimited JSON records (default: false)
modeSTRING-modeMulti-wordlist operation mode. Available modes: clusterbomb, pitchfork, sniper (default: clusterbomb)
rateSTRING-rateRate of requests per second (default: 0)
urlsFILE·List of target URLs
delaySTRING-pSeconds of `delay` between requests, or a range of random delay. For example "0.1" or "0.1-2.0"
hostsFILE·List of hosts
http2BOOLEAN-http2Use HTTP2 protocol (default: false)
configFILE-configLoad configuration from a file
headerSTRING-HHeader `"Name: Value"`, separated by colon
searchSTRING-searchSearch for a FFUFHASH payload from ffuf history
silentBOOLEAN-sDo not print additional information (silent mode) (default: false)
maxtimeSTRING-maxtimeMaximum running time in seconds for entire process. (default: 0)
requestFILE-requestFile containing the raw http request
threadsSTRING-tNumber of concurrent threads. (default: 40)
timeoutSTRING-timeoutHTTP request timeout in seconds. (default: 10)
verboseBOOLEAN-vVerbose output, printing full URL and redirect location (if any) with the results. (default: false)
encodersSTRING-encEncoders for keywords, eg. 'FUZZ:urlencode b64encode'
scrapersSTRING-scrapersActive scraper groups (default: all)
input-cmdSTRING-input-cmdCommand producing the input. --input-num is required when using this input method. Overrides -w.
input-numSTRING-input-numNumber of inputs to test. Used in conjunction with --input-cmd. (default: 100)
post-dataSTRING-dPOST data
recursionBOOLEAN-recursionScan recursively. Only FUZZ keyword is supported, and URL (-u) has to end in it. (default: false)
client-keyFILE-ckClient key for authentication. Client certificate needs to be defined as well for this to work
extensionsSTRING-eComma separated list of extensions. Extends FUZZ keyword.
match-timeSTRING-mtMatch how many milliseconds to the first response byte, either greater or less than. EG: >100 or <100
client-certFILE-ccClient cert for authentication. Client key needs to be defined as well for this to work
cookie-dataSTRING-bCookie data
filter-modeSTRING-fmodeFilter set operator. Either of: and, or (default: or)
filter-timeSTRING-ftFilter by number of milliseconds to the first response byte, either greater or less than. EG: >100 or <100
http-methodSTRING-XHTTP method to use (default: GET)
ignore-bodyBOOLEAN-ignore-bodyDo not fetch the response content. (default: false)
input-shellSTRING-input-shellShell to be used for running command
match-linesSTRING-mlMatch amount of lines in response
match-wordsSTRING-mwMatch amount of words in response
maxtime-jobSTRING-maxtime-jobMaximum running time in seconds per job. (default: 0)
scraperfileFILE-scraperfileCustom scraper file path
color-outputBOOLEAN-cColorize output
filter-linesSTRING-flFilter by amount of lines in response. Comma separated list of line counts and ranges
filter-wordsSTRING-fwFilter by amount of words in response. Comma separated list of word counts and ranges
match-regexpSTRING-mrMatch regexp
matcher-modeSTRING-mmodeMatcher set operator. Either of: and, or (default: or)
replay-proxySTRING-replay-proxyReplay matched requests using this proxy.
filter-regexpSTRING-frFilter regexp
output-formatSTRING-ofOutput file format. Available formats: json, ejson, html, md, csv, ecsv (default: json)
request-protoSTRING-request-protoProtocol to use along with raw request (default: https)
http-proxy-urlSTRING-xProxy URL (SOCKS5 or HTTP). For example: http://127.0.0.1:8080 or socks5://127.0.0.1:8080
autocalibrationBOOLEAN-acAutomatically calibrate filtering options (default: false)
recursion-depthSTRING-recursion-depthMaximum recursion depth. (default: 0)
follow-redirectsBOOLEAN-rFollow redirects (default: false)
stop-on-forbiddenBOOLEAN-sfStop when > 95% of responses return 403 Forbidden (default: false)
match-status-codesSTRING-mcMatch HTTP status codes, or "all" for everything. (default: 200,204,301,302,307,401,403
recursion-strategySTRING-recursion-strategyRecursion strategy: "default" for a redirect based, and "greedy" to recurse on all matches (default: default)
stop-on-all-errorsBOOLEAN-saStop on all error cases. Implies -sf and -se. (default: false)
filter-status-codesSTRING-fcFilter HTTP status codes from response. Comma separated list of codes and ranges
match-response-sizeSTRING-msMatch HTTP response size
filter-response-sizeSTRING-fsFilter HTTP response size. Comma separated list of sizes and ranges
host-autocalibrationBOOLEAN-achPer host autocalibration (default: false)
custom-autocalibrationSTRING-accCustom auto-calibration string. Can be used multiple times. Implies -ac
output-skip-empty-fileBOOLEAN-orDon't create the output file if we don't have results (default: false)
autocalibration-keywordSTRING-ackAutocalibration keyword (default: FUZZ)
stop-on-spurious-errorsBOOLEAN-seStop on spurious errors (default: false)
autocalibration-strategySTRING-acsCustom auto-calibration strategies. Can be used multiple times. Implies -ac
dont-fetch-response-bodyBOOLEAN-ignore-bodyDo not fetch the response content. (default: false)
ignore-wordlist-commentsBOOLEAN-icIgnore wordlist comments (default: false)
dirsearch-wordlist-compatibility-modeBOOLEAN-DDirSearch wordlist compatibility mode. Used in conjunction with -e flag. (default: false)

example

Run ffuf-virtual-hosts

ffuf-virtual-hosts · command
# ffuf-virtual-hosts: Host-header fuzz against a shared originffuf -u https://198.51.100.10/ -w vhosts.txt -H 'Host: FUZZ.example.com' -mc 200,301,302 -fc 404 -rate 50
sample output
api.example.com                 [Status: 200, Size: 4821]dev.example.com                 [Status: 302, Size: 178]staging.example.com             [Status: 200, Size: 9102]admin.example.com               [Status: 401, Size: 412]www.example.com                 [Status: 200, Size: 15440]mail.example.com                [Status: 301, Size: 0]

guidance

Choosing ffuf-virtual-hosts

Use ffuf-virtual-hosts when you have a live IP or host and need sites served by Host header, not DNS. For directory and file discovery on one URL use ffuf; to fuzz one wordlist across many URLs use ffuf-multi.

ffuf

General single-target fuzzer with FUZZ anywhere. This node pins FUZZ to the Host header for vhost work.

ffuf-multi

Runs one wordlist across a list of URLs for content discovery. Bulk sibling, not vhost-focused.

wfuzz

Older Python fuzzer that can also fuzz headers. ffuf is the usual Go engine for this step.

faq

ffuf-virtual-hosts questions

It puts FUZZ in the Host header (-H) and swaps in each wordlist entry. The server reveals name-based vhosts even when those names never resolve publicly.

Run ffuf-virtual-hosts yourself

A hosts file and a vhost wordlist feed ffuf-virtual-hosts, which fuzzes the Host header against each target and writes the discovered virtual hosts as a queryable output.

Facts on this page come from the live Trickest tool library.