| Tested on | Kali GNU/Linux Rolling 2026.2 (kali-rolling) |
|---|---|
| Package | ffuf 2.1.0-1+b11gobuster 3.8.2-1feroxbuster 2.13.1-0kali3wfuzz 3.1.0-6dirb 2.22+dfsg-7dirsearch (GitHub clone) |
| Applies to | Kali Linux |
| Lab environment | Kali + Metasploitable 2 on VirtualBox host-only — pentest lab setup |
| Privilege | Normal user for fuzz scans; sudo for apt install |
| Scope | Compare URL and web request fuzzers, install FFUF, Gobuster, Feroxbuster, Wfuzz, Dirb, and Dirsearch on Kali, run directory fuzzing against Metasploitable Apache, explain wordlists, filters, Burp Intruder follow-up, and troubleshooting. Does not cover protocol fuzzing, binary format fuzzing, or credential brute force. |
| Related guides | Learn hacking with Metasploitable 2 Banner grabbing tools Ethical hacking tutorial |
A URL fuzzer automates high-volume HTTP guesses to surface paths, files, and parameters the application never advertises on the home page. After find hidden endpoints with Gobuster and archive tools, deeper fuzzing widens the wordlist, adds extensions, and tunes filters for authorized web assessments.
This guide installs the main Kali fuzzing CLIs and runs them against Metasploitable 2 HTTP on a host-only lab network. Every command output below was captured on that layout, not against random internet hosts.
What is web application fuzzing in ethical hacking?
Web application fuzzing here means sending many crafted HTTP requests and comparing responses to find hidden attack surface. The goal is discovery, not exploitation — you are collecting leads for manual validation in a browser or Burp Suite.
Common hits include:
- hidden directories (
/admin/,/backup/) - backup or config files (
.bak,.zip,config.php) - debug pages (
phpinfo.php) - API-style paths (
/api/v1/) - interesting parameters (
?file=,?redirect=) - virtual hosts on shared infrastructure
A fuzz match is not a vulnerability by itself. Confirm each path before you report it.
Compare web fuzzing tools on Kali
Use this table to pick a tool before you launch a large wordlist against a production scope.
| Tool | Best for | Strength on Kali |
|---|---|---|
| FFUF | Fast path, parameter, and vhost fuzzing | Flexible matchers (-mc, -fs, -fw) and JSON export |
| Feroxbuster | Recursive forced browsing | Auto-recursion and wildcard filtering |
| Gobuster | Simple directory, DNS, and vhost modes | Fast Go binary in apt |
| Dirsearch | Python workflow with reports | Built-in extensions and export formats |
| Wfuzz | Headers, forms, and parameters | Multiple FUZZ placeholders in one request |
| Burp Intruder | Authenticated captured requests | Proxy context with cookies and CSRF tokens |
| Dirb | Legacy directory scans | Still on lab images; fewer filters than FFUF |
Online URL fuzzers help with tiny smoke tests when you lack a lab, but they rarely match CLI control over wordlists, cookies, threads, and saved output during real engagements.
URL fuzzer vs directory brute forcing
| Term | Meaning | Example |
|---|---|---|
| URL fuzzer | Tests paths, files, parameters, or hosts | /admin, ?FUZZ=test, Host: dev.example.com |
| Directory brute force | Wordlist guesses against the web root | gobuster dir on / |
| Web fuzzer | Broader HTTP request mutation | Headers, POST bodies, cookies |
| Application fuzzing | General software testing term | Also covers APIs, protocols, file formats |
This article stays on HTTP URL and request fuzzing for web apps — not binary protocol fuzzers or APK fuzzing.
Kali lab setup
Point every tool at the same authorized web target. On the standard pentest lab setup, Metasploitable listens on HTTP on the attacker-only subnet:
TARGET=192.168.56.114
WEB_URL=http://192.168.56.114
LAB=/tmp/web-fuzz-lab
mkdir -p "$LAB"Build a short wordlist for repeatable demos (expand to SecLists on real assessments):
printf 'phpMyAdmin\ntwiki\ndav\ntest\nphpinfo\n' > "$LAB/words-small.txt"Confirm Apache responds before you fuzz:
curl -s -o /dev/null -w '%{http_code}\n' "$WEB_URL/"200A 200 on the root means the web service is up. If curl times out, fix VM networking before you blame the fuzzer.
Install fuzzing tools on Kali
Kali rolling ships the main CLI fuzzers in apt. Refresh indexes and install them together:
sudo apt update
sudo apt install -y ffuf gobuster feroxbuster wfuzz dirbCheck versions against the package index:
apt-cache policy ffuf gobuster feroxbuster wfuzzffuf:
Installed: 2.1.0-1+b11
...
gobuster:
Installed: 3.8.2-1
...
feroxbuster:
Installed: 2.13.1-0kali3
...
wfuzz:
Installed: 3.1.0-6ffuf -Vffuf version: 2.1.0-devferoxbuster --versionferoxbuster 2.13.1Dirsearch is not an apt package on this image. Clone it into the lab directory and install Kali’s Python dependencies:
git clone --depth 1 https://github.com/maurosoria/dirsearch.git "$LAB/dirsearch"
sudo apt install -y python3-defusedcsv python3-requests-ntlm python3-httpx python3-requests-toolbeltChoose wordlists and filters
Wordlist choice drives runtime, noise, and findings more than the fuzzer brand.
- Small lists — smoke tests (
words-small.txt, top paths fromdirb/common.txt) - Medium lists — normal authorized scans when time allows
- Technology lists — PHP, Java, WordPress, or API routes from SecLists
- Extensions — pair
-e php,bak,zipor tool-specific extension flags - Parameter lists — for
?FUZZ=discovery after path mapping - Custom lists — routes from JavaScript mining in find hidden endpoints
Filter noise early:
| Problem | Signal | Fix |
|---|---|---|
| Soft 404 | Every path returns 200 | Filter size or words (-fs, -fw) |
| Wildcard vhost | Every host answers | Baseline request and dedupe |
| Redirect storm | Many 301/302 | Follow manually; note real destination |
| WAF or rate limit | 403/429 spikes | Lower -t, add delays, confirm scope |
Status codes to read together with size:
| Code | Often means |
|---|---|
| 200 | Content returned — verify it is not a generic error page |
| 301/302 | Redirect — path may exist at the Location target |
| 401 | Authentication required — path likely exists |
| 403 | Forbidden — path may exist but blocked |
| 404 | Usually noise unless the target uses custom 404 sizes |
| 500 | Server error — handler may be reachable but broken |
Fuzz paths with FFUF
FFUF is the default speed tool for directory, extension, parameter, and vhost fuzzing on modern assessments. Run a short path scan against the lab wordlist:
ffuf -w "$LAB/words-small.txt" -u "$WEB_URL/FUZZ" -mc 200,301,302,403 -t 10 -timeout 8:: URL : http://192.168.56.114/FUZZ
:: Matcher : Response status: 200,301,302,403
phpMyAdmin [Status: 301, Size: 326, Words: 21, Lines: 10, Duration: 3ms]
twiki [Status: 301, Size: 321, Words: 21, Lines: 10, Duration: 3ms]
dav [Status: 301, Size: 319, Words: 21, Lines: 10, Duration: 5ms]
test [Status: 301, Size: 320, Words: 21, Lines: 10, Duration: 6ms]
phpinfo [Status: 200, Size: 48014, Words: 3637, Lines: 254, Duration: 7ms]301 rows show directories that redirect with a trailing slash. The large 200 on phpinfo is a classic debug leak on Metasploitable — validate in a browser before you treat it as reportable on a customer app.
Save JSON for later triage with -o "$LAB/ffuf.json" -of json. Use -recursion only when scope allows nested discovery — request volume multiplies quickly.
Fuzz with Feroxbuster
Feroxbuster targets recursive content discovery with automatic wildcard filtering. On the same small wordlist it still walks into child paths:
feroxbuster -u "$WEB_URL/" -w "$LAB/words-small.txt" -t 10 -q --no-state -T 8404 GET 9l 33w -c Auto-filtering found 404-like response and created new filter; toggle off with --dont-filter
403 GET 10l 31w -c Auto-filtering found 404-like response and created new filter; toggle off with --dont-filter
301 GET 9l 29w 321c http://192.168.56.114/twiki => http://192.168.56.114/twiki/
301 GET 9l 29w 319c http://192.168.56.114/dav => http://192.168.56.114/dav/
301 GET 9l 29w 320c http://192.168.56.114/test => http://192.168.56.114/test/
301 GET 9l 29w 326c http://192.168.56.114/phpMyAdmin => http://192.168.56.114/phpMyAdmin/
200 GET 0l 0w 0c http://192.168.56.114/test/testoutput/ESAPI_logging_file_testThe auto-filter lines show Feroxbuster learning baseline 404 and 403 shapes before it prints real hits. Expect extra nested URLs beyond the five input words — that recursion is why testers pair Feroxbuster with tight scope rules.
Fuzz directories with Gobuster
Gobuster’s dir mode is a straightforward entry point when you want clear status lines without FFUF’s matcher syntax:
gobuster dir -u "$WEB_URL/" -w /usr/share/wordlists/dirb/common.txt -t 20 --timeout 8s -q.hta (Status: 403) [Size: 291]
.htaccess (Status: 403) [Size: 296]
dav (Status: 301) [Size: 319] [--> http://192.168.56.114/dav/]
phpMyAdmin (Status: 301) [Size: 326] [--> http://192.168.56.114/phpMyAdmin/]
phpinfo (Status: 200) [Size: 48014]
phpinfo.php (Status: 200) [Size: 48026]
test (Status: 301) [Size: 320] [--> http://192.168.56.114/test/]
twiki (Status: 301) [Size: 321] [--> http://192.168.56.114/twiki/]403 on dotfiles such as .htaccess still signals the server recognized the path. Add -x php,html,bak for extension brute force and use gobuster vhost when you need hostname guessing on one IP.
Fuzz paths with Dirsearch
Dirsearch wraps recursion, extensions, and reporting in a Python CLI. Against the small lab list:
python3 "$LAB/dirsearch/dirsearch.py" -u "$WEB_URL/" -w "$LAB/words-small.txt" -t 10 --timeout=8Extensions: php, asp, aspx, jsp, html, htm | HTTP method: GET | Threads: 10
Wordlist size: 5
Target: http://192.168.56.114/
[10:34:11] 301 - 326B - /phpMyAdmin -> http://192.168.56.114/phpMyAdmin/
[10:34:11] 301 - 321B - /twiki -> http://192.168.56.114/twiki/
[10:34:11] 301 - 319B - /dav -> http://192.168.56.114/dav/
[10:34:11] 301 - 320B - /test -> http://192.168.56.114/test/
[10:34:11] 200 - 48KB - /phpinfo
Task CompletedDirsearch is slower than FFUF on huge lists but friendly for labs because defaults cover extensions and timestamps in one command. Export with -o report.txt when you need shareable notes.
Fuzz requests with Wfuzz
Wfuzz inserts payloads into paths, parameters, headers, and forms using the FUZZ keyword. Hide 404 noise on the lab paths:
wfuzz -w "$LAB/words-small.txt" --hc 404 -t 10 "$WEB_URL/FUZZ"********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer *
********************************************************
Target: http://192.168.56.114/FUZZ
Total requests: 5
000000001: 301 9 L 29 W 326 Ch "phpMyAdmin"
000000002: 301 9 L 29 W 319 Ch "dav"
000000003: 301 9 L 29 W 321 Ch "twiki"
000000004: 301 9 L 29 W 320 Ch "test"
000000005: 200 254 L 3637 W 48014 Ch "phpinfo"Kali’s packaged Wfuzz may warn that PycURL is not linked against OpenSSL. Path fuzzing on HTTP labs still works; test HTTPS targets carefully or fix the Python curl backend if TLS scans fail.
Parameter fuzzing uses the same placeholder in the query string: '$WEB_URL/?FUZZ=test'. Filter with --hc, --sc, --hl, and --hw instead of trusting raw output volume.
Fuzz captured requests with Burp Intruder
Burp Intruder fits when you already captured a real request behind login — session cookies, CSRF tokens, JSON bodies, or multipart uploads. CLI directory tools cannot replay that context as easily.
Typical workflow:
- Browse the target through Burp Suite Proxy.
- Send an interesting request to Intruder.
- Mark payload positions in the URL, headers, cookies, or body.
- Load a wordlist or numeric range.
- Sort results by response length or status code.
Use Intruder for focused parameter attacks on one authenticated endpoint. Use FFUF or Feroxbuster for breadth across large path wordlists. Keep Intruder slow on production systems — it is interactive by design.
Fuzz directories with Dirb
Dirb remains on Kali images as a legacy option. Silent mode against the small list:
dirb "$WEB_URL/" "$LAB/words-small.txt" -S -r-----------------
DIRB v2.22
By The Dark Raver
-----------------
START_TIME: Sun Aug 2 10:33:33 2026
URL_BASE: http://192.168.56.114/
WORDLIST_FILES: /tmp/web-fuzz-lab/words-small.txt
GENERATED WORDS: 5
+ http://192.168.56.114/phpMyAdmin (CODE:301|SIZE:326)
+ http://192.168.56.114/twiki (CODE:301|SIZE:321)
+ http://192.168.56.114/dav (CODE:301|SIZE:319)
+ http://192.168.56.114/test (CODE:301|SIZE:320)
+ http://192.168.56.114/phpinfo (CODE:200|SIZE:48014)Dirb lacks modern JSON export and fine filters. Prefer FFUF or Gobuster for new work; keep Dirb when a course script or older lab image expects it.
Pick a fuzzer for your task
| Use case | Start here |
|---|---|
| Fast directory and file discovery | FFUF or Feroxbuster |
| Simple first lab scan | Gobuster or Dirsearch |
| Recursive forced browsing | Feroxbuster |
| Parameter or header fuzzing | FFUF or Wfuzz |
| Virtual host discovery | FFUF or Gobuster vhost |
| Authenticated POST or JSON | Burp Intruder |
| Quick online sanity check | Hosted URL fuzzer (small scope only) |
Many testers run FFUF or Feroxbuster for breadth, then move interesting hits into Burp for manual follow-up.
Troubleshoot web fuzzing on Kali
| Symptom | Likely cause | Fix |
|---|---|---|
| All paths return 200 | Soft 404 or wildcard vhost | Filter size/words; compare baseline response |
| Empty FFUF output | Matcher too strict | Widen -mc or remove -fs filters |
| Every path 404 | Wrong base URL or service down | curl -I "$WEB_URL/"; confirm port 80 |
| Timeouts and errors | Threads too high or fragile target | Lower -t, increase --timeout |
| Wfuzz SSL failures | PycURL/OpenSSL mismatch on Kali | Test HTTP lab first; fix python3-pycurl for HTTPS |
| Dirsearch import errors | Missing Python modules | apt install python3-defusedcsv python3-httpx … |
| Feroxbuster floods nested URLs | Auto-recursion on wide scope | Shorter wordlist; disable recursion flags |
| Gobuster version command fails | Subcommand renamed | Use apt-cache policy gobuster or dpkg -l gobuster |
Different node in sudo |
Secure PATH without user tools | Do not sudo-wrap fuzzers; run as your user |
| 403 on every guess | WAF or IP block | Slow down; confirm authorization |
| Hits differ between tools | Filters and recursion differ | Normalize on status, size, and final URL |
| Juice Shop build fails | Node major mismatch | Match Node version per app docs or use Docker package |
References
Summary
URL fuzzers discover hidden web paths, files, parameters, and virtual hosts by sending many HTTP requests and studying the responses. On Kali rolling, apt install ffuf gobuster feroxbuster wfuzz dirb covers most CLI workflows; Dirsearch and Burp Intruder fill Python reporting and authenticated proxy fuzzing respectively.
Against Metasploitable 2, FFUF, Gobuster, Wfuzz, Feroxbuster, and Dirsearch all surfaced the same core hits — phpMyAdmin, twiki, dav, test, and phpinfo — with different filtering and recursion behavior. Good results depend on wordlist size, matchers, and manual validation more than the logo on the binary.
Start with a small authorized wordlist, read status codes together with response size, and confirm findings in a browser or Burp before you report. When path mapping alone is enough, find hidden endpoints may suffice; return here when you need extensions, recursion, parameters, or vhost fuzzing at scale.

