Go で書かれた高速 Web ファザー。
リリース ページからビルド済みバイナリをダウンロードし、解凍して実行します。
または
homebrew を使用した macOS を使用している場合、ffuf は次のコマンドでインストールできます: brew install ffuf
または
最近の go コンパイラーがインストールされている場合: go install github.com/ffuf/ffuf/v2@latest
(更新にも同じコマンドが機能します)
または
git clone https://github.com/ffuf/ffuf ; cd ffuf ; go get ; go build
Ffuf は Go 1.16 以降に依存します。
以下の使用例は、 ffuf
使用して実行できる最も単純なタスクのみを示しています。
多くの例を使用して多くの機能を説明するより詳細なドキュメントは、ffuf wiki (https://github.com/ffuf/ffuf/wiki) で入手できます。
実際の使用例やヒントを含む、より広範なドキュメントについては、Michael Skelton (@codingo) による素晴らしいガイド「FFUF について知っておくべきことすべて」を必ずチェックしてください。
また、Docker コンテナ https://github.com/adamtlangley/ffufme を使用してローカルで、または http://ffuf.me で作成されたライブ ホスト バージョンに対して、さまざまなレッスンやユースケースを使用して、ライブ ホストに対して ffuf スキャンを練習することもできます。アダム・ラングレー @adamtlangley 著。
URL の末尾に FUZZ キーワードを使用する ( -u
):
ffuf -w /path/to/wordlist -u https://target/FUZZ
デフォルトの仮想ホスト応答サイズが 4242 バイトであると仮定すると、ホスト ヘッダーをファジングしながら、そのサイズのすべての応答 ( -fs 4242
) をフィルターで除外できます。
ffuf -w /path/to/vhost/wordlist -u https://target -H "Host: FUZZ" -fs 4242
GET パラメータ名のファジングはディレクトリ検出と非常に似ており、URL の一部としてFUZZ
キーワードを定義することで機能します。また、無効な GET パラメータ名に対する応答サイズは 4242 バイトであると想定されています。
ffuf -w /path/to/paramnames.txt -u https://target/script.php?FUZZ=test_value -fs 4242
パラメータ名がわかっている場合は、同じ方法で値をファジー化できます。この例では、間違ったパラメータ値が HTTP 応答コード 401 を返すと想定しています。
ffuf -w /path/to/values.txt -u https://target/script.php?valid_name=FUZZ -fc 401
これもFUZZ
キーワードを使用する非常に簡単な操作です。この例では、POST リクエストの一部のみをファジングしています。再び 401 の応答をフィルタリングして除外します。
ffuf -w /path/to/postdata.txt -X POST -d "username=admin&password=FUZZ" -u https://target/login.php -fc 401
ffuf を無期限に実行したくない場合は、 -maxtime
使用できます。これにより、一定時間 (秒単位) が経過するとプロセス全体が停止します。
ffuf -w /path/to/wordlist -u https://target/FUZZ -maxtime 60
再帰を使用する場合、 -maxtime-job
使用してジョブごとの最大時間を制御できます。これにより、指定された時間 (秒単位) が経過すると現在のジョブが停止され、次のジョブが続行されます。再帰機能がサブディレクトリを検出すると、新しいジョブが作成されます。
ffuf -w /path/to/wordlist -u https://target/FUZZ -maxtime-job 60 -recursion -recursion-depth 2
両方のフラグを組み合わせて、ジョブごとの最大実行時間と全体の実行時間を制限することもできます。再帰を使用しない場合、両方のフラグは同じように動作します。
この例では、POST 経由で送信される JSON データをファジングします。ラダムサはミューテーターとして使用されます。
--input-cmd
使用すると、ffuf は一致した位置をその位置として表示します。これと同じ位置の値は、呼び出し先で環境変数$FFUF_NUM
として使用できます。この位置の値をミューテーターのシードとして使用します。ファイル example1.txt および example2.txt には、有効な JSON ペイロードが含まれています。すべての応答を照合しますが、応答コード400 - Bad request
を除外します。
ffuf --input-cmd 'radamsa --seed $FFUF_NUM example1.txt example2.txt' -H "Content-Type: application/json" -X POST -u https://ffuf.io.fi/FUZZ -mc all -fc 400
もちろん、ペイロードごとにミューテーターを呼び出すのはあまり効率的ではないため、Radamsa を例として使用して、ペイロードを事前に生成することもできます。
# Generate 1000 example payloads
radamsa -n 1000 -o %n.txt example1.txt example2.txt
# This results into files 1.txt ... 1000.txt
# Now we can just read the payload data in a loop from file for ffuf
ffuf --input-cmd 'cat $FFUF_NUM.txt' -H "Content-Type: application/json" -X POST -u https://ffuf.io.fi/ -mc all -fc 400
ffuf を実行すると、まずデフォルトの構成ファイルが存在するかどうかがチェックされます。 ffufrc
ファイルのデフォルトのパスは$XDG_CONFIG_HOME/ffuf/ffufrc
です。このファイルで 1 つまたは複数のオプションを構成でき、それらは後続のすべての ffuf ジョブに適用されます。 ffufrc ファイルの例はここにあります。
構成ファイルの場所に関する詳細な説明は、wiki にあります: https://github.com/ffuf/ffuf/wiki/Configuration
コマンドラインで指定された構成オプションは、デフォルトのffufrc
ファイルからロードされたオプションをオーバーライドします。注: これは、複数回指定できる CLI フラグには適用されません。そのような例の 1 つは、 -H
(ヘッダー) フラグです。この場合、コマンドラインで指定された-H
値が、代わりに構成ファイルの値に追加されます。
さらに、さまざまなユースケースに多数の構成ファイルを使用したい場合は、構成ファイルへのファイルパスをパラメータとして受け取る-config
コマンドラインフラグを使用して構成ファイルのパスを定義することでこれを行うことができます。
ffuf のテスト ケースを定義するには、URL ( -u
)、ヘッダー ( -H
)、または POST データ ( -d
) の任意の場所でキーワードFUZZ
を使用します。
Fuzz Faster U Fool - v2.1.0
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.
-cc Client cert for authentication. Client key needs to be defined as well for this to work
-ck Client key for authentication. Client certificate needs to be defined as well for this to work
-d POST data
-http2 Use HTTP2 protocol (default: false)
-ignore-body Do not fetch the response content. (default: false)
-r Follow redirects (default: false)
-raw Do not encode URI (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.
-sni Target TLS SNI, does not support FUZZ keyword
-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
-ach Per host autocalibration (default: false)
-ack Autocalibration keyword (default: FUZZ)
-acs Custom auto-calibration strategies. Can be used multiple times. Implies -ac
-c Colorize output. (default: false)
-config Load configuration from a file
-json JSON output, printing newline-delimited JSON records (default: false)
-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)
-scraperfile Custom scraper file path
-scrapers Active scraper groups (default: all)
-se Stop on spurious errors (default: false)
-search Search for a FFUFHASH payload from ffuf history
-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-299,301,302,307,401,403,405,500)
-ml Match amount of lines in response
-mmode Matcher set operator. Either of: and, or (default: or)
-mr Match regexp
-ms Match HTTP response size
-mt Match how many milliseconds to the first response byte, either greater or less than. EG: >100 or <100
-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
-fmode Filter set operator. Either of: and, or (default: or)
-fr Filter regexp
-fs Filter HTTP response size. Comma separated list of sizes and ranges
-ft Filter by number of milliseconds to the first response byte, either greater or less than. EG: >100 or <100
-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.
-enc Encoders for keywords, eg. 'FUZZ:urlencode b64encode'
-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, sniper (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
ffuf の実行中にENTER
を押すと、プロセスが一時停止され、ユーザーはシェルのような対話モードに切り替わります。
entering interactive mode
type "help" for a list of commands, or ENTER to resume.
> help
available commands:
afc [value] - append to status code filter
fc [value] - (re)configure status code filter
afl [value] - append to line count filter
fl [value] - (re)configure line count filter
afw [value] - append to word count filter
fw [value] - (re)configure word count filter
afs [value] - append to size filter
fs [value] - (re)configure size filter
aft [value] - append to time filter
ft [value] - (re)configure time filter
rate [value] - adjust rate of requests per second (active: 0)
queueshow - show job queue
queuedel [number] - delete a job in the queue
queueskip - advance to the next queued job
restart - restart and resume the current ffuf job
resume - resume current ffuf job (or: ENTER)
show - show results for the current job
savejson [filename] - save current matches to a file
help - you are looking at it
>
このモードでは、フィルタの再構成、キュー管理、および現在の状態のディスクへの保存が可能です。
フィルターを (再) 構成すると、フィルターは死後に適用され、新しく追加されたフィルターによって除外されたメモリ内のすべての誤検出一致が削除されます。
一致の新しい状態は、 ffuf
によって検出されたかのようにすべての一致を出力するコマンドshow
で出力できます。
「ネガティブな」一致はメモリに保存されないため、フィルタを緩和しても、残念ながら失われた一致を取り戻すことはできません。この種のシナリオでは、ユーザーはコマンドrestart
使用できます。これにより、状態がリセットされ、現在のジョブが最初から開始されます。
ffuf は MIT ライセンスに基づいてリリースされています。 「ライセンス」を参照してください。