ffuf-web-fuzzing について
ffuf-web-fuzzingは、許可を得たペネトレーションテスター向けに、ffufでウェブパス、サブドメイン、APIエンドポイント、パラメーターの挙動を調べる方法を案内するスキルです。認証付きリクエスト、スキャン制御、JSON結果の分析を扱い、許可の確認と本番環境でのレート制限を重視します。
主な機能
- 01ディレクトリとファイルの探索ガイド
- 02サブドメインとAPIエンドポイントのファジング
- 03生リクエストを使った認証付きテスト
- 04ワードリスト、フィルター、レート制限の案内
- 05JSON結果と異常の分析
- 06スキャン前の許可確認
活用シーン
- 01許可済みウェブターゲットのパス探索
- 02Bearer tokenを使ったAPIエンドポイントのファジング
- 03取得済みセッションによる認証リクエストのテスト
- 04保存結果から異常なレスポンスを確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ trailofbits/ skills-curated --skill ffuf-web-fuzzingインストール後、Claude Code で/ffuf-web-fuzzingを入力して読み込まれたか確認します。
同梱ファイルreferences/request-templates.mdreferences/wordlists.md
詳細
FFUF Web ファジング
許可された侵入テストで ffuf(Fuzz Faster U Fool)を効果的に使用するためのガイダンスです。
前提条件
ffuf がインストールされている必要があります:brew install ffuf(macOS)または go install github.com/ffuf/ffuf/v2@latest
使用する場面
- Web ターゲットに対してディレクトリ、ファイル、またはサブドメインの探索を実行する場合
- API エンドポイント、パラメーター、または POST データをファジングする場合
- 生の HTTP リクエストを使って認証済みのファジングを行う場合
- ffuf の JSON 出力を分析し、異常や注目すべき検出結果を見つける場合
- ファジング戦略(ワードリストの選定、フィルタリング、レート制限)を策定する場合
- 認証済みセッションを使って IDOR テストを行う場合
使用しない場面
- ターゲットシステムがスコープ外である、または許可が不明確な場合
- パッシブ偵察のほうが適切な場合(代わりに OSINT ツールを使用してください)
- ターゲットが本番システムで、レート制限が設定されていない場合
- 脆弱性スキャナー一式が必要な場合(Burp Suite、Nuclei などを使用してください)
- 複数ステップのやり取りが必要なロジック上の欠陥をテストする場合
退けるべき正当化
- 「自動キャリブレーションは任意です」 --
-acは必須です。これを使わないと、結果が誤検知に埋もれ、分析が無駄になります。 - 「スレッド数が多いほど結果が速く得られます」 --
-t 200でターゲットに大量のリクエストを送ると、WAF が作動してブロックされ、ステージング環境がクラッシュする可能性もあります。本番ターゲットでは-t 10 -rate 2から始めてください。 - 「あとでフィルタリングすればよいです」 -- スキャンの前にフィルタリングを設定してください。フィルターなしで 22 万件のワードリストを実行し、あとからノイズの中を grep で探すのは順序が逆です。
- 「デフォルトのワードリストで十分です」 -- ワードリストの選定は最も重要な判断です。汎用ワードリストでは、技術固有のパスを見逃します。references/wordlists.md を参照してください。
- 「生のリクエストは手間がかかりすぎます」 -- 認証済みのファジングでは、
--request req.txtのほうが-Hと-bのフラグを組み合わせるより簡単で確実です。一度キャプチャすれば、何度でもファジングできます。
重要なルール
- 使用しない具体的かつ文書化された理由がない限り、必ず
-acを使用してください(自動キャリブレーション) - 後で分析できるように、必ず
-o results.jsonで出力を保存してください -rateと-tのフラグを使って、本番ターゲットへのリクエストレートを制限してください- 認証には
--requestを使用してください -- 生のリクエストファイルは、コマンドラインのヘッダーフラグを連ねるより優れています - まず許可を確認してください -- スキャンを実行する前に、ユーザーがターゲットの書面による許可を得ていることを確認してください。不明な場合は尋ねてください。
基本概念
FUZZ キーワード
# In URL path
ffuf -w wordlist.txt -u https://target.com/FUZZ -ac
# In headers
ffuf -w wordlist.txt -u https://target.com -H "Host: FUZZ.target.com" -ac
# In POST body
ffuf -w wordlist.txt -X POST -d "user=admin&pass=FUZZ" -u https://target.com/login -ac
# Multiple positions with custom keywords
ffuf -w endpoints.txt:EP -w ids.txt:ID -u https://target.com/EP/ID -mode pitchfork -ac
自動キャリブレーション
-ac は、繰り返し発生する誤検知レスポンスを自動的に検出して除外します。ターゲット固有の挙動に適応し、動的コンテンツによるノイズを取り除きます。
ffuf -w wordlist.txt -u https://target.com/FUZZ -ac # Standard
ffuf -w wordlist.txt -u https://target.com/FUZZ -ach # Per-host (multi-host scans)
ffuf -w wordlist.txt -u https://target.com/FUZZ -acc "404" # Custom calibration string
よく使われるパターン
ディレクトリ探索
ffuf -w /opt/SecLists/Discovery/Web-Content/raft-large-directories.txt \
-u https://target.com/FUZZ -e .php,.html,.txt,.bak \
-ac -c -v -o results.json
サブドメイン列挙
ffuf -w /opt/SecLists/Discovery/DNS/subdomains-top1million-5000.txt \
-u https://FUZZ.target.com -ac -c -v -o results.json
API エンドポイントの探索
ffuf -w /opt/SecLists/Discovery/Web-Content/api/api-endpoints.txt \
-u https://api.target.com/v1/FUZZ \
-H "Authorization: Bearer YOUR_TOKEN_HERE" -mc 200,201 -ac -c
生のリクエストを使った認証済みファジング
認証済みのリクエスト全体をキャプチャして req.txt に保存し、FUZZ を挿入します:
POST /api/v1/users/FUZZ HTTP/1.1
Host: target.com
Authorization: Bearer YOUR_TOKEN_HERE
Cookie: session=YOUR_SESSION_ID
Content-Type: application/json
{"action":"view","id":"1"}
ffuf --request req.txt -w wordlist.txt -ac -o results.json
ベアラートークン、セッション Cookie、API キー、GraphQL に対応した構築済みテンプレートについては、references/request-templates.md を参照してください。
認証済みファジング:エージェントのワークフロー
認証済みファジングには、エージェントが独自に取得できない実際の認証情報が必要です。ユーザーから認証済みファジングを依頼された場合:
- 次のいずれかをユーザーに提供してもらいます:
- 認証ヘッダーを含む生の HTTP リクエストファイル(
req.txt) - ブラウザーの DevTools から取得した curl コマンド(
req.txt形式に変換します) - 個別の認証情報(ベアラートークン、セッション Cookie、API キー)
- 認証ヘッダーを含む生の HTTP リクエストファイル(
- curl コマンドを受け取った場合は、生の HTTP リクエスト形式に変換して
req.txtに書き込みます - 個別の認証情報を受け取った場合は、references/request-templates.md のテンプレートを使用し、実際の値に置き換えます
- 認証トークンを決して捏造したり、推測したりしないでください
IDOR テスト
ffuf --request req.txt -w <(seq 1 10000) -ac -mc 200 -o idor_results.json
レート制限
| 環境 | フラグ | 備考 |
|---|---|---|
| 本番環境(ステルス) | -rate 2 -t 10 | WAF の検知を回避 |
| 本番環境(通常) | -rate 10 -t 20 | バランス重視 |
| ステージング/開発環境 | -rate 50 -t 40 | 高速 |
| ローカル/ラボ | 制限なし、-t 100 | 最大速度 |
結果の分析
出力を JSON として保存し(-o results.json)、ファイルを読み込んで次の点に注目します。
- 異常なステータスコード -- ベースラインの 404/403 以外のすべて
- サイズの外れ値 -- 平均より大幅に大きい、または小さいレスポンス
- URL 内の注目すべきキーワード -- admin、api、backup、config、.git、.env
- タイミングの異常 -- レスポンスが遅い場合、SQL インジェクションや重い処理の可能性があります
- 追加調査の対象 -- 興味深い発見があれば、より詳細なファジングを行います
自動キャリブレーションが不十分な場合は、-fs でレスポンスサイズを、-fc でステータスコードを基準にフィルタリングします。一致/フィルターフラグの一覧は ffuf -h を実行して確認してください。
参考資料
- ワードリスト選定ガイド -- シナリオ別の推奨 SecLists
- 認証済みリクエストのテンプレート -- ベアラートークン、Cookie、API キー用の事前構築済み req.txt
- ffuf 公式ドキュメント
- SecLists