
ffuf v2.2.1
Goで書かれた高速なWebファザー

ffuf - より速くファズれ、愚か者よ
Go で書かれた高速な Web ファザーです。
インストール
-
ダウンロード リリースページ からプリビルドバイナリを入手し、解凍して実行してください!
または
-
Windows で Scoop を使用している場合、ffuf は次のコマンドでインストールできます:
scoop install ffufまたは
-
Windows で Winget を使用している場合、ffuf は次のコマンドでインストールできます:
winget install ffuf.ffufまたは
-
macOS で homebrew を使用している場合、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.20 以上に依存しています。
- チェックアウトからの Go ビルドでは、タグではなく
git-<日付>-<コミット>と表示されます。ローカルビルドは、たとえタグ上にいても公式リリースではありません。Go の組み込みビルド情報にはコミットは含まれますがタグ名は含まれないため、ビルド元の正確なコミットを表示しています。公式のバージョン付きバイナリはリリースページにあります。
使用例
以下の使用例は、ffuf で実行できる最も単純なタスクを示しています。
より多くの例を含む詳細なドキュメントは、ffuf wiki にあります: https://github.com/ffuf/ffuf/wiki
実際の使用例やヒントを含むより詳細なドキュメントについては、Michael Skelton (@codingo) による素晴らしいガイド「FFUF について知っておくべきすべてのこと」もご覧ください。
また、Docker コンテナ https://github.com/adamtlangley/ffufme をローカルで使用するか、Adam Langley @adamtlangley が作成したホスト版 http://ffuf.me に対して、実際のホスト上で ffuf スキャンを練習することもできます。
典型的なディレクトリ発見
URL の末尾に FUZZ キーワードを使用します (-u):
ffuf -w /path/to/wordlist -u https://target/FUZZ
バーチャルホスト発見(DNS レコードなし)
デフォルトのバーチャルホストのレスポンスサイズが 4242 バイトであると仮定し、そのサイズのレスポンスをフィルタリング (-fs 4242) しながら Host ヘッダーをファジングします:
ffuf -w /path/to/vhost/wordlist -u https://target -H "Host: FUZZ" -fs 4242
GET パラメータファジング
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
POST データファジング
これも非常に簡単で、再び 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 データをファジングします。ミューテーターとして Radamsa を使用します。
--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 を例にします:
# 1000 個のサンプルペイロードを生成
radamsa -n 1000 -o %n.txt example1.txt example2.txt
# これにより 1.txt ... 1000.txt のファイルが作成されます
# あとは 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 オプション:
-H ヘッダー `"名前: 値"`。コロンで区切ります。複数の -H フラグを受け付けます。
-X 使用する HTTP メソッド
-b curl コピー機能のための Cookie データ `"NAME1=VALUE1; NAME2=VALUE2"`。
-cc 認証用のクライアント証明書。これを使用するにはクライアントキーも定義する必要があります。
-ck 認証用のクライアントキー。これを使用するにはクライアント証明書も定義する必要があります。
-d POST データ
-http2 HTTP2 プロトコルを使用する (デフォルト: false)
-ignore-body レスポンスの内容を取得しない (デフォルト: false)
-r リダイレクトを追跡する (デフォルト: false)
-raw URI をエンコードしない (デフォルト: false)
-recursion 再帰的にスキャンする。FUZZ キーワードのみサポートされ、URL (-u) はそれで終わる必要があります。 (デフォルト: false)
-recursion-depth 最大再帰深度 (デフォルト: 0)
-recursion-strategy 再帰戦略: "default" はリダイレクトベース、"greedy" はすべてのマッチに対して再帰 (デフォルト: default)
-replay-proxy マッチしたリクエストをこのプロキシで再生する
-sni ターゲット TLS SNI。FUZZ キーワードはサポートしません。
-timeout HTTP リクエストのタイムアウト (秒) (デフォルト: 10)
-u ターゲット URL
-x プロキシ URL (SOCKS5 または HTTP)。例: http://127.0.0.1:8080 または socks5://127.0.0.1:8080

