A Python command-line menu for common ffuf web-enumeration workflows. It helps build the correct ffuf command for directory and file discovery, virtual-host enumeration, and GET parameter fuzzing without requiring every flag to be memorized.
The generated command is shown before ffuf starts, making the project useful both as a practical wrapper and as a way to learn ffuf syntax.
Use scanning tools only on systems you own or have explicit permission to test. Enumeration can create significant traffic and security alerts.
- Directory and endpoint enumeration
- File discovery with selectable extensions
- Virtual-host discovery through the HTTP
Hostheader - GET parameter-name discovery
- GET parameter-value fuzzing
- Automatic ffuf response calibration
- Redirect following and recursive content discovery
- Status-code and response-size matching/filtering
- Configurable threads, rate limit, and timeout
- JSON, HTML, Markdown, CSV, eCSV, and other ffuf report formats
- Input validation and readable errors
- Safe process execution without shell command interpolation
- Python 3.9 or newer
- ffuf installed and available through
PATH - A suitable wordlist for the selected enumeration mode
The Python program uses only the standard library, so there is no pip install step.
Verify both programs:
python --version
ffuf -VClone the repository and enter it:
git clone https://github.com/AryanSecOps/ffuf-menu.git
cd ffuf-menuRun the program:
python FFUF_Enum.pyOn systems where Python is exposed as python3:
python3 FFUF_Enum.pyChoose enumeration type
↓
Enter target URL
↓
Choose a wordlist
↓
Answer the mode-specific prompt
↓
Select optional ffuf settings
↓
Optionally configure a report
↓
Review the displayed command while ffuf runs
FUZZ is ffuf's replacement keyword. Each word from the selected wordlist is inserted wherever FUZZ appears.
Given this wordlist:
admin
login
uploads
The URL:
https://example.test/FUZZ
causes ffuf to request:
https://example.test/admin
https://example.test/login
https://example.test/uploads
The Python program places FUZZ automatically according to the chosen mode.
Discovers paths such as /admin, /api, /login, or /uploads.
Example input:
Select scan type: 1
Target URL: http://127.0.0.1:8000
Wordlist path: C:\Wordlists\common.txt
Resulting command structure:
ffuf -w C:\Wordlists\common.txt -u http://127.0.0.1:8000/FUZZEntering a path such as https://example.test/api scans https://example.test/api/FUZZ.
Adds selected extensions to wordlist entries. The default extensions are:
php,html,txt,js
If the wordlist contains config, ffuf can test /config, /config.php, /config.html, and the other selected extensions.
Example custom extensions:
File extensions [php,html,txt,js]: asp,aspx,config,bak
Choose extensions that make sense for the target technology. A shorter, relevant list is usually faster and easier to interpret.
Discovers websites that share an IP address but respond to different HTTP Host headers.
Example:
Select scan type: 3
Target URL: http://10.10.10.10
Wordlist path: C:\Wordlists\subdomains.txt
Domain [10.10.10.10]: example.test
The important generated argument is:
-H "Host: FUZZ.example.test"
If the wordlist contains admin, ffuf sends a request with Host: admin.example.test.
Use a hostname or subdomain wordlist for this mode rather than a directory wordlist.
Discovers parameter names understood by a page.
For the target:
https://example.test/search
the program builds:
https://example.test/search?FUZZ=test
A parameter-name wordlist containing q, search, debug, and page makes ffuf test each as the parameter name. The fixed value defaults to test.
Keeps a known parameter name fixed while testing different values.
Example:
Select scan type: 5
Target URL: https://example.test/product
Wordlist path: C:\Wordlists\values.txt
Parameter name: id
The program builds:
https://example.test/product?id=FUZZ
This mode requires a value-oriented wordlist appropriate for the parameter being tested.
A wordlist is a plain text file containing one candidate per line:
admin
login
dashboard
uploads
api
Different modes benefit from different content:
| Mode | Example wordlist entries |
|---|---|
| Directory | admin, login, api, uploads |
| File | config, backup, database, index |
| Virtual host | admin, dev, staging, portal |
| Parameter name | id, q, search, debug |
| Parameter value | Values relevant to the known parameter |
The program verifies that the wordlist path exists before starting ffuf. Paths surrounded by double quotes are accepted, which is useful on Windows when folders contain spaces.
Enter one option number or several numbers separated by commas:
Options: 1,6,8,9
Press Enter to use ffuf defaults.
Helps ffuf identify background responses automatically. This is useful when a server returns a successful-looking page for paths that do not exist.
Follows responses such as /admin → /login instead of only reporting the redirect.
Scans inside discovered directories. It is available only for directory and file modes.
ffuf requires a recursive URL to end in FUZZ. The program therefore rejects recursion when the target contains a trailing query string or fragment.
Hides much of ffuf's banner and progress information. Normal output is usually more useful while learning.
Displays only selected HTTP statuses. Accepted examples include:
200
200,301,403
200-299,301,403
all
Hides selected status codes or ranges:
404
400-499
Avoid filtering broad ranges without considering whether useful 401 or 403 responses may be hidden.
Hides responses with known uninteresting sizes. If every nonexistent path returns the same 1,234-byte page, filtering 1234 can expose meaningful differences.
Accepted examples:
1234
0,1234
100-500,1234
Controls concurrent workers. ffuf defaults to 40. More threads are not always better: they increase traffic and can create unreliable results on slow targets.
Sets the maximum requests per second. A value such as 50 makes traffic more predictable.
Sets how long ffuf waits for each response. The program defaults to ten seconds.
After the optional-settings menu, the program can add ffuf's output arguments:
Save results to a report file? (y/N) [n]: y
Output file path [ffuf_results.json]:
Output format [json]: json
Supported formats are:
jsonejsonhtmlmdcsvecsvall
Selecting all asks ffuf to create every supported report format.
For a controlled local lab or other permitted target:
Select scan type: 1
Target URL: http://127.0.0.1:8000
Wordlist path: C:\Wordlists\common.txt
Options: 1,6,8,9
Status codes to hide [404]:
Thread count [40]: 20
Requests per second [100]: 50
Save results to a report file? (y/N) [n]: y
Output file path [ffuf_results.json]:
Output format [json]:
This enables auto-calibration, hides ordinary 404 responses, uses 20 workers, limits the scan to 50 requests per second, and saves JSON results.
A result can look like:
admin [Status: 301, Size: 178, Words: 6, Lines: 8]
adminis the word inserted atFUZZ.Statusis the HTTP response status.Sizeis the response size in bytes.WordsandLinesdescribe the response body.
Interesting results often differ from the background responses in status, size, word count, or line count.
The source is divided into small sections so each part has one responsibility:
ScanTypeandSCAN_TYPESdefine the main menu.OptionandOPTIONSdefine optional flags and validation.format_url()normalizes the target URL.add_fuzz_keyword()placesFUZZin the URL path.add_query_param()adds fuzzing parameters without damaging fragments.build_*_scan()functions construct mode-specific arguments.prompt_optional_arguments()converts settings into ffuf flags.prompt_output_options()configures reports.run_ffuf()displays and launches the command.main()coordinates the complete workflow.
The Python program does not implement an HTTP scanner itself. It builds a list of arguments and passes that list directly to the installed ffuf executable.
Verify:
ffuf -VIf the command works only in a different terminal, close and reopen PowerShell so it receives the updated PATH.
Check the complete path. Surrounding quotes are allowed:
"C:\Users\YourName\Wordlists\common.txt"
Try auto-calibration (1) or filter the repeated response's status/size using options 6 or 7.
Remove query strings and fragments from the directory/file target. Recursive ffuf URLs must end in FUZZ.
Read the ffuf message printed immediately above the exit-code notice. Common causes include an invalid target, unavailable network connection, incompatible flags, or an unwritable report location.
.
├── FFUF_Enum.py # Menu application
├── README.md # Installation, usage, and code explanation
└── .gitignore # Local Python/editor files excluded from Git