Web path fuzzer

0xn3va 0xn3va Last update: Dec 26, 2023

Fuzdir

Web path fuzzer

Installing

Run the following command to install with pip:

$ pip3 install fuzdir 

Run the following commands to manually install:

$ git clone https://github.com/n3v4/fuzdir.git fuzdir
$ cd fuzdir
$ python3 setup.py install

Usage

You can start the process of fuzzing files and directories with the following command:

$ fuzdir.py -u <url> -W <wordlist>

Help message:

usage: fuzdir [-h] -u URL (-w WORDS | -W PATH) [-e EXTENSIONS] [-E PATH]
              [-m METHOD] [-t THREADS] [--timeout TIMEOUT] [--retry RETRY]
              [--retry-status-list STATUS_LIST] [--ignore-retry-fail]
              [--throttling [SECONDS]] [--proxy URL] [--user-agent USER AGENT]
              [-c COOKIE] [-H HEADER] [--allow-redirect] [-v]
              [--report CONFIG] [-x CONDITIONS]

optional arguments:
  -h, --help            show this help message and exit

necessary arguments:
  -u URL, --url URL     target URL
  -w WORDS, --wordlist WORDS
                        a comma-separated list of words
  -W PATH, --wordlist-path PATH
                        path to word list

extensions settings:
  -e EXTENSIONS, --extensions EXTENSIONS
                        extension list separated by comma
  -E PATH, --extensions-file PATH
                        path to file with extensions

connection settings:
  -m METHOD, --method METHOD
                        HTTP method to use^ by default is GET
  -t THREADS, --threads THREADS
                        the maximum number of threads that can be used to requests, by default 10 threads
  --timeout TIMEOUT     connection timeout, by default 5s.
  --retry RETRY         number of attempts to connect to the server, by default 3 times
  --retry-status-list STATUS_LIST
                        a comma-separated list of HTTP status codes for which should be retry on, by default 504, 502, 503
  --ignore-retry-fail   ignore failed attempts to connect to server and continue fuzzing
  --throttling [SECONDS]
                        delay time in seconds (float) between requests sending, if the throttling value is not specified, it will automatically adjust during fuzzing
  --proxy URL           HTTP or SOCKS5 proxy
                        usage format:
                          [http|socks5]://user:pass@host:port

request settings:
  --user-agent USER AGENT
                        custom user agent, by default setting random user agent
  -c COOKIE, --cookie COOKIE
  -H HEADER, --header HEADER
                        pass custom header(s)
  --allow-redirect      allow follow up to redirection

logging settings:
  -v, --verbose         verbose logging

reports settings:
  --report CONFIG       reports on responses
                        available types:
                          plain         a plain text reporting
                          json          a reporting in JSON
                        usage format:
                          <type>[:components]=<path>
                        available components:
                          json:
                            body        a response body
                            length      a response content length
                            headers     a response headers
                            code        a response status code
                        examples:
                          plain=/tmp/report.txt                 a plain text reporting about the found status code, content length and path
                          json=/tmp/report.json                 a reporting in JSON about the found status code, content length and path
                          json:code,body=/tmp/report.json       a reporting in JSON about the found status code, body and path

filter:
  -x CONDITIONS         conditions for responses matching
                        available conditions:
                          code          filter by status code
                          length        filter by content length
                          grep          filter by regex in response headers or / and body
                        usage format:
                          [ignore:]<condition>[:<area>]=<args>[;]
                        examples:
                          code=200,500                  match responses with 200 or 500 status code
                          ignore:code=404               match responses exclude with 404 status code
                          length=0-1337,7331            match responses with content length between 0 and 1337 or equals 7331
                          grep='regex'                  match responses with 'regex' in headers or body
                          grep:body='regex'             match responses with 'regex' in body
                          code=200;length=0-1337        match responses with 200 status code and content length between 0 and 1337

examples:
  fuzdir -u https://example.com -W wordlist.txt
  fuzdir -u https://example.com -w index,robots -e html,txt
  fuzdir -u https://example.com -W wordlist.txt -e html,js,php -x code=200
  fuzdir -u https://example.com -W wordlist.txt -x code=200;ignore:grep:headers='Auth'

Extensions

Extensions can be specified as .ext or ext, or as a formatted string %.ext. For example, if wordlist contains only index, and the extensions php, .html, %.txt, the following path will be sent to the server:

/index
/index.php
/index.html
/index.txt

Throttling

Throttling allows you to adjust the frequency of sending packets to the server. To do this, you can explicitly pass the number of seconds that must elapse before sending the next packet to the server. For example, if the argument --throttling 2.5 is passed to fuzdir, then 1 packet will be sent to the server every 2.5 seconds.

When throttling value isn't specified, fuzdir adjusts the throttling value during fuzzing, tracking the response time from the server.

By default, throttling completely disabled, similar --throttling 0.

Custom header(s)

You can pass one or more custom headers with -H or --header. For example, if you pass -H Platform:web and -H "Token: reWfBt1fnbgjEhA6wfs+Uw==" the following HTTP-request will be sent to the server:

GET /path HTTP/1.1
Host: www.example.com
...
Platform: web
Token: reWfBt1fnbgjEhA6wfs+Uw==
...

Retry settings

You can specify a list of HTTP status codes with --retry-status-list, for which fuzdir should resend the request to the server, the default value is 502, 503, 504.

The number of attempts can be adjusted using --retry from 0 to 5 inclusive, by default 3 attempts.

By default, if all attempts were fail, fuzzing will be interrupted and the program will exit. To avoid this, you can use --ignore-retry-fail.

Report

You can write a fuzzing results to file with --report key.

Usage format <type>[:components]=<path>

  • type report type,
  • components list of components that should be included in the report,
  • path path to file.

Currently it supports the following components:

  • body a response body,
  • length a response content length,
  • headers a response headers,
  • code a response status code.

Currently it supports the following report types:

Type Default Components Supported Components Examples
plain code, length no --report plain=/tmp/report.txt a plain text reporting about the found status code, content length and path
json code, length body, length, headers, code --report json=/tmp/report.txt a reporting in JSON about the found status code, content length and path
--report json:code,body=/tmp/report.json a reporting in JSON about the found status code, body and path

Conditions

Conditions is a system for filtering HTTP responses during fuzzing.

Usage format [ignore]:<condition>:[<area>]=<args>[;]

  • ignore condition inverting,
  • condition condition name,
  • area search area (only grep supported),
  • args condition arguments.

Currently it supports the following conditions:

Condition Area Args Examples
code no list of status codes (or ranges) separated by comma -x code=200,500-503 match responses with 200, 500, 501, 502, or 503 status code
length no list of lengths (or ranges) separated by comma -x length=0-1337,7331 match responses with content length between 0 and 1337 or equals 7331
grep headers, body regex -x grep=token match responses which contains 'token' in headers or body
-x grep:body=token match responses which contains 'token' in body

You can use multiple conditions, separating them with a semicolon, for example: -x code=200;length=0-1337

Subscribe to our newsletter