ffufの使い方

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.txtでファジングします。キーワードのDIRFILEは任意なので好きな文字列に変更できます(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は非常に柔軟性が高いため、ターゲットを絞って細かく調査したい場合に効果的です。

この記事は役に立ちましたか?

もし参考になりましたら、下記のボタンで教えてください。