FFuF: Fast web fuzzer written in Go

FFuF: Fast web fuzzer written in Go

January 05, 2022 8 min read 2 views 0 discussions
Table of Contents
    FFuF is one of the latest and by far the fastest fuzzing open-source tools out there. But before we begin, let’s first try to understand what fuzzing really is.

    Fuzzing is the automatic process of giving random input to an application to look for any errors or unexpected behavior. However, finding hidden directories and files on a web server can also be categorized under fuzzing.

    The tool is versatile and can be used for a variety of purposes. Some of its use cases are:
    • General Directory discovery with the option to fuzz at any place in the URL.
    • VHOST discovery without DNS Records
    • Fuzzing using various HTTP methods.

    We’ll talk about the installation and then move on to the usage of the tool.

    Installation

    First, you need to make sure you have Go installed on your Linux distribution, which is a programming language used to write the Gobuster tool. Once all the dependencies are satisfied for Go, you can proceed to download and install go-buster. In order to install Go, you need to input the following command in your terminal window:
    ┌──(mrdev㉿mrdev)-[~] 
    └─$ sudo apt install golang-go
    ┌──(mrdev㉿mrdev)-[~] 
    └─$ sudo apt install ffuf
    ┌──(mrdev㉿mrdev)-[~]
    └─$ffuf -h
    Fuzz Faster U Fool - v1.3.1 Kali Exclusive <3

    HTTP OPTIONS:
      -H                  Header `"Name: Value"`, separated by colon. Multiple -H flags are accepted.
      -X                  HTTP method to use
      -b                  Cookie data `"NAME1=VALUE1; NAME2=VALUE2"` for copy as curl functionality.
      -d                  POST data
      -ignore-body        Do not fetch the response content. (default: false)
      -r                  Follow redirects (default: false)
      -recursion          Scan recursively. Only FUZZ keyword is supported, and URL (-u) has to end in it. (default: false) 
      -recursion-depth    Maximum recursion depth. (default: 0)
      -recursion-strategy Recursion strategy: "default" for a redirect based, and "greedy" to recurse on all matches (default: default)
      -replay-proxy       Replay matched requests using this proxy.
      -timeout            HTTP request timeout in seconds. (default: 10)
      -u                  Target URL
      -x                  Proxy URL (SOCKS5 or HTTP). For example: http://127.0.0.1:8080 or socks5://127.0.0.1:8080

    GENERAL OPTIONS:
      -V                  Show version information. (default: false)
      -ac                 Automatically calibrate filtering options (default: false)
      -acc                Custom auto-calibration string. Can be used multiple times. Implies -ac
      -c                  Colorize output. (default: false)
      -config             Load configuration from a file
      -maxtime            Maximum running time in seconds for entire process. (default: 0)
      -maxtime-job        Maximum running time in seconds per job. (default: 0)
      -noninteractive     Disable the interactive console functionality (default: false)
      -p                  Seconds of `delay` between requests, or a range of random delay. For example "0.1" or "0.1-2.0"
      -rate               Rate of requests per second (default: 0)
      -s                  Do not print additional information (silent mode) (default: false)
      -sa                 Stop on all error cases. Implies -sf and -se. (default: false)
      -se                 Stop on spurious errors (default: false)
      -sf                 Stop when > 95% of responses return 403 Forbidden (default: false)
      -t                  Number of concurrent threads. (default: 40)
      -v                  Verbose output, printing full URL and redirect location (if any) with the results. (default: false)

    MATCHER OPTIONS:
      -mc                 Match HTTP status codes, or "all" for everything. (default: 200,204,301,302,307,401,403,405)
      -ml                 Match amount of lines in response
      -mr                 Match regexp
      -ms                 Match HTTP response size
      -mw                 Match amount of words in response

    FILTER OPTIONS:
      -fc                 Filter HTTP status codes from response. Comma separated list of codes and ranges
      -fl                 Filter by amount of lines in response. Comma separated list of line counts and ranges
      -fr                 Filter regexp
      -fs                 Filter HTTP response size. Comma separated list of sizes and ranges
      -fw                 Filter by amount of words in response. Comma separated list of word counts and ranges

    INPUT OPTIONS:
      -D                  DirSearch wordlist compatibility mode. Used in conjunction with -e flag. (default: false)
      -e                  Comma separated list of extensions. Extends FUZZ keyword.
      -ic                 Ignore wordlist comments (default: false)
      -input-cmd          Command producing the input. --input-num is required when using this input method. Overrides -w. 
      -input-num          Number of inputs to test. Used in conjunction with --input-cmd. (default: 100)
      -input-shell        Shell to be used for running command
      -mode               Multi-wordlist operation mode. Available modes: clusterbomb, pitchfork (default: clusterbomb)
      -request            File containing the raw http request
      -request-proto      Protocol to use along with raw request (default: https)
      -w                  Wordlist file path and (optional) keyword separated by colon. eg. '/path/to/wordlist:KEYWORD'

    OUTPUT OPTIONS:
      -debug-log          Write all of the internal logging to the specified file.
      -o                  Write output to file
      -od                 Directory path to store matched results to.
      -of                 Output file format. Available formats: json, ejson, html, md, csv, ecsv (or, 'all' for all formats) (default: json)
      -or                 Don't create the output file if we don't have results (default: false)

    EXAMPLE USAGE:
      Fuzz file paths from wordlist.txt, match all responses but filter out those with content-size 42.
      Colored, verbose output.
       ffuf -w wordlist.txt -u https://example.org/FUZZ -mc all -fs 42 -c -v

      Fuzz Host-header, match HTTP 200 responses.
       ffuf -w hosts.txt -u https://example.org/ -H "Host: FUZZ" -mc 200
      Fuzz POST JSON data. Match all responses not containing text "error".

      ffuf -w entries.txt -u https://example.org/ -X POST -H "Content-Type: application/json" \
       -d '{"name": "FUZZ", "anotherkey": "anothervalue"}' -fr "error"
      Fuzz multiple locations. Match only responses reflecting the value of "VAL" keyword. Colored.

      ffuf -w params.txt:PARAM -w values.txt:VAL -u https://example.org/?PARAM=VAL -mr "VAL" -c

    More information and examples: https://github.com/ffuf/ffuf
    ┌──(mrdev㉿mrdev)-[~]
    └─$ 

    Once that installation is complete, you can proceed with installing the FuFF. If you have a Go environment ready to go, it is as easy as typing in the following command in your terminal:

    Using FFuF

    In order to start our directory busting, we will need to discover what capabilities FFuF has, and which ones can assist us. By looking at the tool's help page, and by typing in the help command in our terminal, we receive a list of all possible switches for the tool and their description.

    Community Q&A