ENUM^:Enumeration

feroxbuster

feroxbuster recursive content discovery — recursion by default, link extraction, response auto-filtering, and rich matchers/filters.

beginnerupdated 2026-09-15feroxbuster

feroxbuster

feroxbuster — Fast, simple, recursive content-discovery tool written in Rust (v2.11.x). Author: Ben “epi” Risher (@epi052). Key differentiators over gobuster/dirb: recursion is on by default, it extracts links from response bodies (HTML/JS/robots.txt) and scans them, auto-filters obvious wildcard/404 responses, and offers an interactive scan-management menu while running.

Installation

# Kali / Debian / Ubuntu (repo package)
sudo apt install feroxbuster

# Cargo (Rust toolchain, always latest)
cargo install feroxbuster

# Homebrew (macOS / Linuxbrew)
brew install feroxbuster

# Static binary install script (no root needed, drops ./feroxbuster)
curl -sL https://raw.githubusercontent.com/epi052/feroxbuster/main/install-nix.sh | bash

# Prebuilt release binary (Linux x86_64)
curl -sL https://github.com/epi052/feroxbuster/releases/latest/download/x86_64-linux-feroxbuster.tar.gz \
  | tar -xz && sudo mv feroxbuster /usr/local/bin/

# Docker
docker run --init -it ghcr.io/epi052/feroxbuster:latest \
  -u http://target.com -w /wordlists/common.txt
feroxbuster -h        # concise help
feroxbuster --help    # full help with every flag and default
feroxbuster -V        # version

Quick Start

# The one command you'll run 90% of the time — recursion is automatic
feroxbuster -u http://10.10.10.100 -w /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt

# With extensions and a saved log
feroxbuster -u http://10.10.10.100 \
  -w /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt \
  -x php,html,txt -o ferox.txt

Core Flags

FlagShortDescription
--url <url>-uTarget URL. Repeatable — pass -u multiple times to scan several targets
--wordlist <path>-wWordlist path (default: /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt)
--threads <int>-tTotal number of concurrent threads (default: 50)
--depth <int>-dMaximum recursion depth; 0 means recurse infinitely (default: 4)
--extensions <exts>-xExtensions to append, comma-separated (php,html,txt). Use -x tar.gz etc. for multi-part
--methods <methods>-mHTTP methods to try, comma-separated (default: GET)
--data <data>Request body to send (e.g. for POST); accepts @file to read from a file
--stdinRead the target URL(s) from STDIN instead of -u
--output <file>-oWrite results to a file (plain text, or JSON with --json)
--jsonEmit newline-delimited JSON (great for piping / jq)
--silentMachine-readable output only — URLs, no banner or progress (ideal for piping)
--quiet-qSuppress the progress bars and banner but keep status lines
--verbosity-vIncrease log verbosity (-v, -vv, -vvvv)
--no-recursion-nDisable recursion entirely (behave like gobuster dir)
--add-slash-fAppend / to each word (find directories that only answer with a trailing slash)
--resume-from <state>Resume a previous scan from its ferox-<ts>.state file

HTTP / Request Flags

FlagShortDescription
--headers <header>-HCustom header, repeatable (-H 'Authorization: Bearer …' -H 'X-Api: 1')
--cookies <cookie>-bCookie(s) to send, repeatable (-b 'PHPSESSID=abc')
--query <param>-QQuery-string parameter, repeatable (-Q 'debug=1')
--user-agent <string>-aSet the User-Agent (default: feroxbuster/<version>)
--random-agent-APick a random User-Agent per scan from a built-in list
--redirects-rFollow 3xx redirects (off by default — 301/302 are reported, not followed)
--insecure-kDisable TLS certificate validation
--proxy <url>-pProxy all traffic (http://127.0.0.1:8080, socks5://127.0.0.1:1080)
--replay-proxy <url>-PSend only matched responses to a second proxy (e.g. Burp) to cut noise
--replay-codes <codes>-RStatus codes that get sent to the replay proxy (default: your match codes)
--burpShortcut for --proxy http://127.0.0.1:8080 --insecure
--burp-replayShortcut for --replay-proxy http://127.0.0.1:8080 --insecure
--server-certs <pem>Trust a custom CA / self-signed server cert (repeatable)
--client-cert <pem>Client certificate for mTLS
--client-key <pem>Client private key for mTLS
--timeout <secs>-TPer-request timeout in seconds (default: 7)

Status Codes, Matchers & Filters

feroxbuster’s real power is filtering. By default it reports status codes 200-299, 301, 302, 307, 308, 401, 403, 405 and auto-filters wildcard responses. Tune with:

FlagShortDescription
--status-codes <codes>-sWhitelist: only report these status codes (space/comma separated)
--filter-status <codes>-CBlacklist: hide these status codes (e.g. -C 404,403)
--filter-size <bytes>-SHide responses of exactly these byte sizes (repeatable)
--filter-words <count>-WHide responses with this many words
--filter-lines <count>-NHide responses with this many lines
--filter-regex <regex>-XHide responses whose body matches this regex
--filter-similar-to <url>Hide responses fuzzy-similar (ssdeep) to a known page — kills soft-404s
--dont-filterTurn OFF wildcard/auto filtering (report literally everything)

Workflow — kill false positives fast: Run once, spot a repeating bogus size/word/line count in the output, then re-run adding -S <size> / -W <words> / -N <lines>. For soft-404 pages that vary in size, --filter-similar-to http://target/definitely-404-page is the sharpest tool.

Recursion Control

FlagDescription
-n, --no-recursionDisable recursion completely
-d, --depth <int>Cap recursion depth (0 = unlimited; default 4)
--force-recursionRecurse into every discovered URL even without a trailing slash / not obviously a directory
-L, --scan-limit <int>Max number of directory scans running concurrently (throttles a recursion explosion)
-I, --dont-scan <regex>Skip URLs matching this regex, repeatable (e.g. -I 'logout' -I '\.js$')
# Deep but controlled: unlimited depth, but only 3 directories scanned at once
feroxbuster -u http://target -w wordlist.txt -d 0 -L 3

# Recurse everywhere, but never into logout or static asset paths
feroxbuster -u http://target -w wordlist.txt --force-recursion -I 'logout' -I '\.(js|css|png|jpg)$'

feroxbuster parses response bodies and pulls out more targets automatically:

FlagShortDescription
--extract-links-eParse HTML/JS/robots.txt for links and scan them (on by default in recent builds; flag forces it)
--dont-extract-linksTurn link extraction off
--scan-dir-listingsAlso brute-force inside auto-indexed (Index of /) directory listings
--collect-extensionsLearn extensions seen in responses and add them to the scan on the fly
--collect-backupsOn each found page, also request backup variants (.bak, ~, .old, …)
--collect-wordsHarvest words from responses and add them to the wordlist mid-scan
# "Just find everything" mode — collect extensions, backups, and words as it goes
feroxbuster -u http://target -w /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt \
  --collect-extensions --collect-backups --collect-words

Performance & Stealth

FlagShortDescription
--threads <int>-tConcurrent threads (default 50)
--rate-limit <int>Cap requests per second per directory scan
--scan-limit <int>-LConcurrent directory scans
--time-limit <spec>Stop after a duration (10m, 1h, 30s)
--auto-tuneAutomatically slow down when the server starts erroring, then speed back up
--auto-bailAbort a scan that trips too many errors/timeouts/403s (guards against WAF bans)
--smartPreset: --auto-tune --collect-words --collect-backups --extract-links
--thoroughPreset: everything --smart does plus --collect-extensions --scan-dir-listings
# Gentle scan against a rate-limited / WAF'd target
feroxbuster -u http://target -w wordlist.txt --rate-limit 20 --auto-tune --auto-bail

# Aggressive but self-throttling one-liner
feroxbuster -u http://target -w wordlist.txt --thorough --auto-tune

Interactive Scan Menu

While a scan is running, press Enter to open the interactive menu. From there you can:

  • List all active recursive scans with their IDs.
  • Cancel a runaway scan (e.g. a huge auto-indexed directory) without killing the whole run: type the scan number(s) and confirm.
  • Cancelled scans are pruned so the rest of the run continues.

This is the main reason to prefer feroxbuster on messy targets — you prune noisy recursion live instead of restarting.

Practical Examples

# Basic recursive scan with extensions
feroxbuster -u http://10.10.10.100 \
  -w /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt \
  -x php,html,txt

# Authenticated scan (session cookie + bearer token)
feroxbuster -u http://10.10.10.100 \
  -w /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt \
  -b 'PHPSESSID=abc123def456' -H 'Authorization: Bearer eyJhbGciOi...'

# Over HTTPS with a bad cert, following redirects
feroxbuster -u https://10.10.10.100 -w wordlist.txt -k -r

# Proxy everything through Burp
feroxbuster -u http://10.10.10.100 -w wordlist.txt --burp

# Scan fast, but replay only interesting hits to Burp
feroxbuster -u http://10.10.10.100 -w wordlist.txt -t 100 \
  --replay-proxy http://127.0.0.1:8080 --replay-codes 200,301,302

# Filter out a soft-404 baseline (page is 200 but always ~1274 bytes / 96 words)
feroxbuster -u http://10.10.10.100 -w wordlist.txt -S 1274 -W 96

# Only show 200s and 301s
feroxbuster -u http://10.10.10.100 -w wordlist.txt -s 200,301

# Hide 403/404 noise
feroxbuster -u http://10.10.10.100 -w wordlist.txt -C 403,404

# POST-based content discovery
feroxbuster -u http://10.10.10.100 -w wordlist.txt -m POST --data 'action=FUZZ'

# Multiple targets in one run
feroxbuster -u http://10.10.10.100 -u http://10.10.10.101 -w wordlist.txt

# Pipe a list of live hosts from httpx into a parallel scan
cat live_hosts.txt | feroxbuster --stdin -w wordlist.txt --silent

# Save both a human log and machine-readable JSON
feroxbuster -u http://10.10.10.100 -w wordlist.txt -o ferox.txt
feroxbuster -u http://10.10.10.100 -w wordlist.txt --json -o ferox.json

FUZZ Keyword

feroxbuster substitutes the FUZZ keyword anywhere in the URL, headers, cookies, query, or body — combine with multiple wordlists for positional fuzzing:

# Fuzz a path segment
feroxbuster -u http://10.10.10.100/FUZZ/admin -w wordlist.txt

# Fuzz a query-parameter value
feroxbuster -u 'http://10.10.10.100/item?id=FUZZ' -w /usr/share/seclists/Fuzzing/4-digits-0000-9999.txt

# Fuzz a header value
feroxbuster -u http://10.10.10.100 -H 'X-Forwarded-For: FUZZ' -w ips.txt

Resume & State Files

Every scan writes a ferox-<timestamp>.state file on interruption (Ctrl-C) so nothing is lost:

# Ctrl-C mid-scan writes ferox-1694781234.state, then:
feroxbuster --resume-from ferox-1694781234.state

Config File (ferox-config.toml)

Persistent defaults live in ferox-config.toml, searched in the current directory, then ~/.config/feroxbuster/, then /etc/feroxbuster/. Generate a documented template:

# The repo ships a fully-commented template
curl -sL https://raw.githubusercontent.com/epi052/feroxbuster/main/ferox-config.toml.example \
  -o ~/.config/feroxbuster/ferox-config.toml
# ~/.config/feroxbuster/ferox-config.toml
wordlist = "/usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt"
threads  = 50
depth    = 3
extensions = ["php", "html", "txt", "bak"]
auto_tune  = true
# status codes to hide by default
filter_status = [404]
PurposePath
feroxbuster default/usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt
Directories (large)/usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt
Files/usr/share/seclists/Discovery/Web-Content/raft-medium-files.txt
Common (small/fast)/usr/share/seclists/Discovery/Web-Content/common.txt
API endpoints/usr/share/seclists/Discovery/Web-Content/api/api-endpoints.txt
Backup/config files/usr/share/seclists/Discovery/Web-Content/raft-medium-files.txt (add --collect-backups)
Kali built-in common/usr/share/wordlists/dirb/common.txt
Kali built-in big/usr/share/wordlists/dirb/big.txt

Extension Stacking by Tech Stack

Match -x to the detected technology (or let --collect-extensions learn them):

# PHP:       -x php,phps,php5,phtml,inc,bak
# ASP/.NET:  -x asp,aspx,ashx,asmx,config
# Java:      -x jsp,jspx,do,action
# Node/JS:   -x js,json,ts,map
# Python:    -x py,pyc,wsgi
# Backups:   -x bak,old,orig,save,swp,txt,zip,tar.gz   (or just --collect-backups)

Quick Reference — Common Workflows

HTB / CTF Initial Enumeration

# One recursive pass with extensions, collect as you go, gentle auto-tuning
feroxbuster -u http://target.htb \
  -w /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt \
  -x php,html,txt -C 404 --collect-extensions --auto-tune -o ferox_initial.txt

Web App Pentest via Burp

# Fast scan, but only matched hits land in Burp's proxy history for triage
feroxbuster -u https://target.com \
  -w /usr/share/seclists/Discovery/Web-Content/raft-large-directories.txt \
  -x php,bak,old,conf -k -t 80 \
  --replay-proxy http://127.0.0.1:8080 --replay-codes 200,301,302,401 \
  -o ferox_pentest.txt

Bug Bounty — many hosts, be polite

subfinder -d target.com -silent | httpx -silent \
  | feroxbuster --stdin -w wordlist.txt --rate-limit 15 --auto-tune --auto-bail --silent -o ferox_bb.txt

Troubleshooting

ProblemSolution
Everything returns the same status/size (wildcard)Auto-filtered by default; if not, add -S/-W/-N or --filter-similar-to <404-url>
Recursion exploding on a huge directoryPress Enter, open the menu, cancel that scan; or pre-empt with -L and -I <regex>
Flooded with 403s / getting bannedAdd --auto-bail, lower --rate-limit, try --random-agent
Scan too slowRaise -t and drop --rate-limit; verify --auto-tune isn’t throttling on errors
TLS / self-signed cert errorsAdd -k (or --server-certs ca.pem to trust a specific CA)
Missing redirected contentAdd -r to follow 3xx
Soft-404 pages (200 with “not found” text)--filter-similar-to a known bad URL, or -X 'not found' regex filter
Lost a long scan to Ctrl-C--resume-from ferox-<ts>.state
Too much noise in BurpUse --replay-proxy + --replay-codes instead of --proxy

feroxbuster vs the Alternatives

ToolLanguageKey Advantage
feroxbusterRustRecursion by default, link extraction, live scan-cancel menu, auto-tune/auto-bail
ffufGoMultiple FUZZ positions, richest matcher/filter syntax, clusterbomb/pitchfork modes
gobusterGoSimple, fast, dedicated dns/vhost/s3 modes
dirsearchPythonBuilt-in recursion, smart extension substitution

See Also

  • ffuf — when you need multi-position fuzzing and advanced matchers.
  • gobuster — when you specifically want DNS/vhost/S3 modes.

Based on feroxbuster v2.11.x — https://github.com/epi052/feroxbuster

On this page

☧ CPTS · ordered posts

Locked

Unlock with your Main_Key through local GPG.

Start the local GPG helper

In your cheatsheet checkout, run:

npm run unlock:helper

Open the link it prints, or paste its pairing code below. Keep the terminal open until GPG finishes.

Import an index you already decrypted

Download the encrypted index, then decrypt with GPG:

gpg --output report-index.json --decrypt report-index.gpg

Your private key stays in GPG. The decrypted index is saved in this browser so you can reopen it after navigation, refreshes and restarts. Lock this browser or clear this site's browser data to remove the saved index. Nothing is uploaded.