ffufは高速に動作するHTTPファジングツールです。Burp Suite Community EditonはIntruder
に制限があって非常に動作が遅く使い物になりませんが、ffufがあればカバーできます。
目次
ffufのインストール方法
Kali Linuxであればsudo apt -y install ffuf
コマンドでインストールできます。あるいはGitHubから入手する事もできます。
公式サイト:https://github.com/ffuf/ffuf
ffufをビルドする場合はGolangが必要となるので、Golangがインストールされていない場合はコンパイル済みのバイナリが利用できます。
ffufの使い方
ffufはFUZZ
で指定した箇所をワードリストから読み込んだワードに置き換えてHTTPアクセスを行い応答をチェックするツールです。
GETパラメーターを指定する
URLを-u
オプションで指定しGETクエリ箇所のファジングしたい箇所をFUZZ
にして実行します。ワードリストは-w
オプションで指定します。
ffuf -u 'http://example.com?login_username=admin&login_password=FUZZ' -w /path/to/wordlist
POSTパラメーターを指定する
POSTメソッドを使う場合は-d
オプションでデータ部分を指定します。
ffuf -u http://example.com -d "login_username=admin&login_password=FUZZ" -w /path/to/wordlist
リクエストファイルで指定する
複雑なHTTPリクエストを指定したい場合はリクエストファイルが使えます。Burp Suiteを使っている場合は右クリックで「Copy to file」を選択してファイルに書き出し、-request
オプションでファイルを読み込む事ができます。
ffuf -request /path/to/file -w /path/to/wordlist
HTTPファイルは次のようにして保存します。
HTTPヘッダーを指定する
-H
オプションを使うとHTTPヘッダーを指定・追加できます。-H
オプションは複数回指定できるので、2つ以上HTTPヘッダーを追加したい場合は-Hオプションを複数指定します。
ffuf -H "User-Agent: FUZZ" -H "X-Forwarded-For: 127.0.0.1" -u http://example.com
特定の条件を表示しない・特定の条件のみ表示する方法
ffufは結果をすべて表示すると膨大な量になる事があるため、必要な応答に絞る事が大事です。一度ffufを実行してみて、あまりに多くの表示がある場合はフィルタ条件を指定して出力を抑えたり、マッチ条件を指定して特定の条件に一致した場合のみ表示するようにします。
条件の指定に使うのはffufで表示される結果を見ます。各リクエストごとに次のように表示されるはずです。
[Status: 200, Size: 13844, Words: 600, Lines: 273, Duration: 414ms]
上記の結果から次の事が分かります。
- 応答コードは
200
- 応答サイズは
13844
- 応答文字数は
600
- 応答行数は
273
- 応答時間は
414ms
これらの値を見ながらフィルタ条件やマッチ条件を決めていきます。
不要な出力を抑える
特定の条件を指定して表示させないようにフィルタします(初期設定で応答コード404はフィルタされています)。
-fc
応答コードでフィルタする(複数指定可)-fl
応答行数でフィルタする(複数指定可)-fr
フィルタ条件を正規表現で指定する-fs
応答サイズでフィルタする(複数指定可)-ft
応答時間でフィルタする(応答時間が100msを超える場合をフィルタするなら-ft '>100'
)-fw
応答文字数でフィルタする(複数指定可)
応答コード404と403をフィルタして表示させないようにするには次のようにします(カンマ「,」で複数指定できます)。
ffuf -fc 404,403 -u http://example.com/FUZZ -w /path/to/wordlist
特定の条件にあったものを表示する
特定の条件を指定して表示させるようにします。
- -mc 応答コードでマッチします(複数指定可)※
-mc all
ですべての応答コードにマッチさせる - -ml 応答行数でマッチします(複数指定可)
- -mr マッチ条件を正規表現で指定する
- -ms 応答サイズでマッチする(複数指定可)
- -mt 応答時間でマッチする(応答時間が100msを超える場合にマッチさせるなら
-mt '>100'
) - -mw 応答文字数でマッチする(複数指定可)
応答コード200と302にマッチさせるならば次のようにします(カンマ「,」で複数指定できます)。
ffuf -mc 200,302 -u http://example.com/FUZZ -w /path/to/wordlist
-mr
はパストラバーサルを検出したい場合などに便利です。次の例はパストラバーサルで/etc/passwd
を表示できる場合にマッチします。
ffuf -mr "root:" -u 'http://example.com/index.php?file=FUZZ' -w /path/to/wordlist
再帰的にファジングする
ffufはFUZZ
で指定した箇所だけワードリストから読み込んだ単語に置き換えますが、ディレクトリが何層も続く場合は再帰的にファジングする必要があります。-recursion
オプションを使うとディレクトリを発見した際、自動的に発見したディレクトリ配下をファジングします。
ffuf -u http://example.com/FUZZ -w /path/to/wordlist -recursion
複数の場所をファジングする
ffufはワードリストにキーワードを追加することによって複数の場所をファジングできます。指定方法は/path/to/wordlist:KEYWORD
です。
ffuf -u http://example.com/DIR/FILE -w /path/to/wordlist/dir.txt:DIR,/path/to/wordlist/file.txt:FILE
この例ではDIR
の箇所をdir.txt
でファジングし、FILE
の箇所をfile.tx
tでファジングします。キーワードのDIR
やFILE
は任意なので好きな文字列に変更できます(FOO
など)。
なお、ファジングする場所は2つ以上指定できます。デフォルト動作(clusterbomb
)では最初に指定したワードリスト全体を反復処理してから2番目、3番目…と移動します。場所を増やしすぎると膨大な数のリクエストを送信することになるので注意してください。
拡張子を付与する
ワードリストから読み込んだ単語を送信後、単語に拡張子を付与した単語も送信します。拡張子はカンマ「,」で区切って複数指定できます。
ffuf -e .php,.zip,.bak -u http://example.com/FUZZ -w /path/to/wordlist
ワードリストのコメントを無視する
ffufはワードリストから読み込んだ単語をそのまま送信します。コメントアウトした内容も例外ではないため、コメント行を含むワードリストを使う場合は-ic
オプションを使います。
ffuf -ic -u http://example.com/FUZZ -w /path/to/wordlist
リクエスト送信数を抑える
CTFとは違い実際のハッキング(バグバウンティ)では短時間に大量のHTTPリクエストを送信するとWAFによってIPアドレスがブラックリスト入りし、アクセスできなくなる場合があります。AkamaiのようなCDNでもレートリミット設定されている場合があり、通信が遮断される可能性があります。
もしもレート制限に引っかかってアクセスできなくなった場合、わたしはVPNでIPアドレスを変更してから-rate
オプションでffufのレートを調整します。
-rate
オプションは秒間リクエスト数を指定できるので、毎秒10リクエストに抑えたい場合は次のようにします。
ffuf -rate 10 -u http://example.com/FUZZ -w /path/to/wordlist
ffufとdirsearch、どちらを使うべき?
ffufとdirsearchはアプローチ方法がまったく異なります。わたしの経験では、最初のアプローチはdirsearchの方が優れています。
あるサブドメインを見つけて、そこに隠されたディレクトリやファイルを探し出したい場合はdirsearchが効果的です。わたしはサブドメインを見つけたらdirsearchを実行する、という作業を自動化しています。
ffufは非常に柔軟性が高いため、ターゲットを絞って細かく調査したい場合に効果的です。
この記事は役に立ちましたか?
もし参考になりましたら、下記のボタンで教えてください。