Compact
true
担当領域:セキュリティ技術センター リスクハンティング・アナリシスグループ
主にペネトレーションテスト、脆弱性診断などを担当しNECグループのセキュア開発・運用を推進。2020年6月にIPA 産業サイバーセキュリティセンター中核人材育成プログラムを修了。情報処理安全確保支援士(RISS)を保持。

NECサイバーセキュリティ戦略統括部 セキュリティ技術センターの長浜です。
今回は、ディレクトリスキャンツール feroxbuster [1]の紹介をしたいと思います。

昨年、NECブログでもFFUF(Fuzz Faster you Fool)を紹介いたしました[2]。今回は、feroxbusterとFFUFとの違いを比較しながら紹介していきます。私も普段はFFUFを利用していましたが、ある条件ではスキャンできないということがわかり、別のスキャナを調査していました。使いやすいツールなのでぜひともご利用いただければと思います。

FFUFの使用で直面した問題

Hack The BoxのFlusteredというRetiredマシンを解いていた際に問題を感じました。本マシンでは、接続時に認証が必要なプロキシサーバ経由でないとアクセスできないWebページが存在しました。そのWebページに対しディレクトリスキャンを実施しようとした際の出来事です。

FFUFやgobuster [3]で、認証情報をURLに埋め込んだProxyを指定(http[:]//(ID):(PASSWORD)@IPアドレス)すると、ProxyのURLフォーマットエラーが発生して利用できないことがわかりました。回避策としてBurpのUpstream Proxy Serversに認証サーバを設定するなどすることで、FFUFからのスキャンも可能です。しかし、Burp経由のスキャンを実施するとスキャン時間を要するため、別のツールを探していました。

ツールの調査をしていく中で、feroxbusterにたどり着きました。feroxbusterであれば、認証情報付きのサーバに対してもスキャンが可能でした。

改めて確認して、後から気づきましたが、FFUFを実行する際に” Proxy-Authorization: Basic (Base64でエンコードした認証情報)”をHeaderに付与することでスキャン可能であることを確認しました。

FFUFとferoxbusterの違い

FFUFとferoxbusterの違いを確認してみます。大きな違いとしては、FFUFはディレクトリスキャンだけではなく、様々なパラメータに対してファジングが可能です。一方で、feroxbusterはディレクトリスキャンに特化しており、そのスキャン機能がFFUFよりも強力です。以下に簡単な比較表を作成しました。

機能
feroxbuster
FFUF
ディレクトリスキャン
〇
〇
再帰的ディレクトリスキャン
〇
〇
GETパラメータのファジング
×
〇
HTTPメソッドのファジング
×
〇
HOSTヘッダーのファジング
×
〇
POSTデータのファジング
×
〇
Directory-Listing検知機能
〇
×
ページ内リンク収集機能
〇
×
自動フィルター条件追加機能
〇
×
ページ内ワード収集機能
〇
×
Proxy経由のスキャン
〇
〇
Basic認証のURL埋め込み
〇
×
Proxyへの再送
〇
〇
出力ファイル形式(json)
〇
〇
出力ファイル形式(json以外)
×
〇
検査結果のマッチ条件(HTTP Status)
〇
〇
検査結果のマッチ条件(HTTP Status以外)
×
〇
検査結果の除外条件
〇
〇
ワードリストのコメントアウト無効化
〇
〇
拡張子自動追加機能
1
1
〇
1
1
×
1
1
バックアップファイル探索機能
1
1
〇
1
1
×
1
1
実行画面の見やすさ
1
1
〇
1
1
△
1
1

feroxbusterの特徴は、「Directory-Listing検知機能」と「ページ内リンク収集機能」、「自動フィルター条件追加機能」、「ページ内ワード収集機能」、「拡張子自動追加機能」、「バックアップファイル探索機能」の6点があります。また、実行中の画面に関しては、feroxbusterのほうが、進捗状況を把握しやすくなっていました。
それでは、使い方とそれぞれの特徴の紹介を行います。

feroxbusterの使い方

動作環境

|-- index.html
|-- normal (通常検査用)
| |-- index.html
| |-- test.html
| `-- user
|  `-- user.html
|-- dir
| |-- index.html
| |-- test.html
| `-- user (Enable autoindex)
|  `-- supersuperuser.html
|-- link
| |-- index.html
| |-- new_test_page_developer_only.html
| |-- test.html (new_test_page_developer_onlyへのリンクが記載されている)
| `-- user (Enable autoindex)
|  `-- supersuperuser.html
|-- filter (500などのエラーを全てerror.htmlにリダイレクトさせる)
| |-- error.html
| |-- index.html
| |-- test.html
| `-- user
|  `-- user.html
|-- word
| |-- index.html
| |-- supersuperuser.html
| `-- test.html (supersuperuserという文言が含まれている)
|-- autoadd
| |-- index.html
| |-- index.php
| |-- test.html
| `-- test.php
`-- backup
 |-- index.html
 |-- test.html
 |-- test.html.bak
 `-- user
  `-- user.html
1
1

基本的な使い方

まずは、feroxbusterの動作確認を行います。ここでは、再帰オプションなしで実行し、結果の見方などを紹介します。

feroxbusterでは、デフォルトで再帰処理が有効化されています。-n を指定して実行することで再帰オプションなしでferoxbusterを実行できます。

50

全体、およびディレクトリ単位の進捗率の表示などがあり、検査の状況が非常に見やすくなっています。また、検査結果と進捗状態の表示場所が分けられているため、結果のみの確認もしやすくなっています。

結果の確認方法を紹介いたします。まずは、全体的な項目の説明です。上記の結果を対象に説明いたします。結果の表示エリアは、「検査設定情報」と「検出したページ」、「全体の進捗率」、「ディレクトリ単位の進捗率」の4つに分かれています。ここでは、「検出したページ」と「全体の進捗率」、「ディレクトリ単位の進捗率」について説明いたします。

検出したページでは、サーバからのステータスコードや文字数、検出したURLが一覧でまとまっています。リダイレクト先があった際はそのURLも表示されます。

50

全体の進捗率は、黄色い#で進捗率を示し、実行終了予定時間や検出数を表示します。

50

ディレクトリ単位の進捗率は、青い#で進捗率を示します。本項目はディレクトリ数の増加に比例します。対象のサーバにてどれだけの数のディレクトリがあるのかを確認することができます。

50

feroxbusterとFFUFの実行結果画面の比較

feroxbusterとFFUFの比較を行います。今回は同じ条件で比較するため、再帰処理ありで比較をします。

まずは、feroxbusterを再帰オプションありで実行してみます。

50

先ほどの結果とは異なり、normal/user/user.html まで検出できていることが確認できます。ディレクトリ単位の進捗率についても、先ほどは normal に対してのみスキャンしていたのに対し、normal/user までスキャンされていることが確認できます。このように再帰的にスキャンを実行しても、検出したディレクトリ情報を含んだURLリストが出力されます。そのため、検出したページを指摘事項としてまとめやすくなっています。

次にFFUFを実行してみます。

50

FFUFでは、ディレクトリ単位でスキャンを実施していきます。FFUFの結果表示で特徴的なのは、各ディレクトリで検出したファイル名のみを表示するという点になります。そのため、検出したURLリストをまとめる際には、各ファイル名の前にディレクトリ名を確認して追加する必要があります。
また、スキャン対象のディレクトリを検出した際に、上記図の赤枠部分のような通知が出力されます。今回の環境では、1件の追加のみだったため視認性が低下することはありません。しかし、環境によっては件数が多くなることが見込まれます。件数が多くなることで、赤枠のような通知が増加しどこからどこまでがディレクトリのスキャンなのかを確認する時間が長くなってしまいます。

feroxbusterとFFUFの実行結果画面の比較を行いました。feroxbusterの結果の視認性が高いことが確認できたかと思います。

Directory Listing検知機能 [4]

それでは、feroxbusterの機能の紹介に入ります。1つ目はDirectory Listing検知機能です。これは、スキャン対象のWebサイトにてDirectory Listingが有効になっているディレクトリを検出し、通知してくれる機能です。検出した際には、そのディレクトリに対するワードリストのスキャンを実施しないため、スキャン時間の短縮につながります。そのままではDirectory Listingを検出したページに対して再帰的なスキャンが停止してしまうため、次に紹介する「ページ内リンク収集機能」を組み合わせることで再帰的なスキャンを継続できます。

では、実際に利用してみます。本機能はデフォルトで有効になっているため、オプションの入力は不要です。

50

/dir/userフォルダに対してDirectory listingが有効になっていることが確認できます。そして検査の時間が0sとなっているため、スキャンは実施されていないことが確認できます。結果の中(上図の右下)にも記載されていますが、-eオプションを付与することで、「ページ内リンク収集機能」を有効化できます。

ページ内リンク収集機能 [5]

htmlレスポンス内のaタグなどのリンクを収集し、検査対象のURLとして検査を実施します。そのため、Directory listingされたページを取得した際にも再帰的なスキャンが可能となります。

実際に利用してみます。本機能を利用するためには、-eオプションを付与する必要があります。

50

-eオプションを付与することにより、test.htmlに含まれていたaタグのリンク先とDirectory Listingで表示されたリンク先も検出ができていることが確認できます。全体の進捗率を確認すると、検査ワード数が8増加しているため、今回検出したリンクをワードリストに追加してスキャンした証拠となります。

自動フィルター条件追加機能

次は、フィルター条件追加機能について紹介します。
Webサーバにページが存在しない際に、404で応答するのではなく、302でエラーページにリダイレクトさせるサーバに対してスキャンする際、自動的にフィルターを指定したかのようにスキャンを実施してくれます。
これまで、私はFFUFなどでスキャンを実施する際には、以下のように実施していました。feroxbusterでは、自動でフィルターを追加してくれますので、以下のような手順が不要となります。

  1. サーバに対してスキャンを実施します。
  2. Webサイトから同じサイズのページが大量に応答があるのでいったん処理を停止します。
  3. 2で確認したサイズをフィルターに追加して再度実行します。
  4. ディレクトリスキャンの結果を確認します。

実際に利用してみます。本機能もデフォルトで有効になっているため、オプションは不要です。--dont-filterオプションを付与することで無効化できます。

50

wildcard response is static; auto-filtering 145 responses;とあり、同じレスポンスを自動的にフィルターに追加したことを通知しています。

ページ内ワード収集機能 [6]

続いて、「ページ内リンク収集機能」について紹介します。
これは、レスポンス内に含まれる単語を収集して検査のWordlistに追加する機能です。本機能を用いることで、ページ内の単語を列挙せずにスキャンを実施することができます。

本機能を利用する際には、-gオプションを付与します。

50

もともとwordlistに含まれていなかった supersuperuser.html を検出することができました。本単語は test.html に supersuperuser という単語が含まれていたためスキャンすることができました。

拡張子自動追加機能 [6]

index.phpなどの拡張子がついているファイルを検出したら、-x phpが追加されたかのようにスキャンを実施します。本機能を利用するためには、wordlistに index.php や index.html など拡張子がついたものが含まれている必要があります。ここでの動作確認の際にはwordlistを変更して実行します。

比較のため、まずはオプションなしで実行してみます。

50

index.phpと index.html しか検出していないことが確認できます。

続いて拡張子自動追加機能を利用してみます。-Eオプションを付与することで実行できます。

50

test.phpと test.html も検出されていることが確認できます。このように拡張子が初めからわからないシステムに対してのスキャンを実施する際に本オプションを利用できます。

バックアップファイル探索機能 [6]

最後の機能は、「バックアップファイル探索機能」です。これは、公開フォルダにある変更前のファイルを検出する機能です。.bakや .old などよくバックアップとして利用される拡張子を付与してスキャンを実施します。

実際に利用してみます。-Bオプションを付与することで実行できます。

50

バックアップファイルである test.html.bak を検出することができました。

まとめ

参考資料

[1] https://epi052.github.io/feroxbuster-docs/docs/
[2] https://group.nec/jp/ja/solutions/cybersecurity/blog/210604
[3] https://github.com/OJ/gobuster
[4] https://epi052.github.io/feroxbuster-docs/docs/examples/detect-directory-listing/
[5] https://epi052.github.io/feroxbuster-docs/docs/examples/extract-links/
[6] https://epi052.github.io/feroxbuster-docs/docs/examples/dynamic-collections/

付録:feroxbusterのオプションの説明

feroxbusterで使えるオプションを以下にまとめています。各オプションに対してどういった機能かの説明をつけていますのでご利用の際のご参考になれば幸いです。
ここでのオプションは feroxbuster 2.6.4を対象としたものになります。

Option
1
1
Discription
1
2
1
1
説明
1
2
1
1
Target Selection
1
1
1
2
1
1
1
2
1
1
--resume-from
1
1
State file from which to resume a partially complete scan (ex. --resume-from ferox-1606586780.state)
1
2
1
1
中断したスキャン結果(検出したURL)や設定を引き継いでスキャンが可能です。ただし、URLは引き継ぎますが、ワードリストは先頭から再実施します。
1
2
1
1
--stdin
1
1
Read url(s) from STDIN
1
2
1
1
バッシュのリダイレクションを用いて、入力が可能
1
2
1
1
-u, --url <URL>
1
1
The target URL (required, unless [--stdin || --resume-from] used)
1
2
1
1
検査対象となるURLを指定することで検査が可能
1
2
1
1
Composite settings
1
1
1
2
1
1
1
2
1
1
--burp
1
1
Set --proxy to http://127.0.0.1:8080 and set --insecure to true
1
2
1
1
Burp経由で検査させるためのオプションをまとめたコンポーネント
1
2
1
1
--burp-replay
1
1
Set --replay-proxy to http://127.0.0.1:8080 and set --insecure to true
1
2
1
1
検査終了後、検出したURLにBurp経由で再度アクセスを実施するためのコンポーネント
1
2
1
1
--smart
1
1
Set --extract-links, --auto-tune, --collect-words, and --collect-backups to true
1
2
1
1
--extract-links, --auto-tune, --collect-words, and --collect-backupsをまとめて有効化するためのコンポーネント
1
2
1
1
--thorough
1
1
Use the same settings as --smart and set --collect-extensions to true
1
2
1
1
--smartオプションに加え、--collect-extensionsを有効化するためのコンポーネント
1
2
1
1
Proxy settings
1
1
1
2
1
1
1
2
1
1
-p, --proxy <PROXY>
1
1
Proxy to use for requests (ex: http(s)://host:port, socks5(h)://host:port)
1
2
1
1
Proxy経由する際に指定するオプション
認証Proxyも指定可能
1
2
1
1
-P, --replay-proxy <REPLAY_PROXY>
1
1
Send only unfiltered requests through a Replay Proxy, instead of all requests
1
2
1
1
検査終了後、検出したURLに指定のProxy経由で再度アクセスを実施するためのコンポーネント
1
2
1
1
-R, --replay-codes <REPLAY_CODE>…
1
1
Status Codes to send through a Replay Proxy when found (default: --status-codes value)
1
2
1
1
指定したステータスコードのみを再送実施するためのオプション
(動作を確認しましたが、うまく機能していないようです)
1
2
1
1
Request settings
1
1
1
2
1
1
1
2
1
1
-a, --user-agent <USER_AGENT>
1
1
Sets the User-Agent (default: feroxbuster/2.6.4)
1
2
1
1
任意のUser-Agentを設定可能
1
2
1
1
-A, --random-agent
1
1
Use a random User-Agent
1
2
1
1
ランダムなUser-Agentが利用可能
1
2
1
1
-b, --cookies <COOKIE>…
1
1
Specify HTTP cookies to be used in each request (ex: -b stuff=things)
1
2
1
1
Cookie情報を付与
1
2
1
1
-f, --add-slash
1
1
Append / to each request's URL
1
2
1
1
全てのワードリストに対し'/'を付与
1
2
1
1
-H, --headers <HEADER>…
1
1
Specify HTTP headers to be used in each request (ex: -H Header:val -H 'stuff: things')
1
2
1
1
HTTP Header情報を付与
1
2
1
1
-m, --methods <HTTP_METHODS>…
1
1
Which HTTP request method(s) should be sent (default: GET)
1
2
1
1
利用するHTTP Methodを指定
1
2
1
1
-Q, --query <QUERY>…
1
1
Request's URL query parameters (ex: -Q token=stuff -Q secret=key)
1
2
1
1
GETパラメータを設定
1
2
1
1
-x, --extensions <FILE_EXTENSION>…
1
1
File extension(s) to search for (ex: -x php -x pdf js)
1
2
1
1
検査対象に対象にしたい拡張子を指定
1
2
1
1
Request filters
1
1
1
2
1
1
1
2
1
1
--dont-scan <URL>…
1
1
URL(s) or Regex Pattern(s) to exclude from recursion/scans
1
2
1
1
検査対象外にしたいURLを指定
1
2
1
1
Response filters
1
1
1
2
1
1
1
2
1
1
-C, --filter-status <STATUS_CODE>…
1
1
Filter out status codes (deny list) (ex: -C 200 -C 401)
1
2
1
1
指定されたレスポンスコードを非表示
1
2
1
1
--filter-similar-to <UNWANTED_PAGE>…
1
1
Filter out pages that are similar to the given page (ex. --filter-similar-to http://site.xyz/soft404)
1
2
1
1
CSRFやSESSION情報によりレスポンスがわずかに変化するページを対象とする際に指定
95%マッチしたものに関しては、非表示
1
2
1
1
-N, --filter-lines <LINES>…
1
1
Filter out messages of a particular line count (ex: -N 20 -N 31,30)
1
2
1
1
指定された行数のレスポンスを探索しマッチしたものは結果に非表示
1
2
1
1
-s, --status-codes <STATUS_CODE>…
1
1
Status Codes to include (allow list) (default: 200 204 301 302 307 308 401 403 405)
1
2
1
1
指定されたレスポンスコードのみを表示
1
2
1
1
-S, --filter-size <SIZE>…
1
1
Filter out messages of a particular size (ex: -S 5120 -S 4927,1970)
1
2
1
1
指定されたレスポンスのサイズを探索しマッチしたものは結果に非表示
1
2
1
1
-W, --filter-words <WORDS>…
1
1
Filter out messages of a particular word count (ex: -W 312 -W 91,82)
1
2
1
1
指定された文字数のレスポンスを探索しマッチしたものは結果に非表示
1
2
1
1
-X, --filter-regex <REGEX>…
1
1
Filter out messages via regular expression matching on the response's body (ex: -X '^ignore me$')
1
2
1
1
正規表現でレスポンスのボディーを探索しマッチしたものは結果に非表示
1
2
1
1
Client settings
1
1
1
2
目的(Tactic)
1
1
1
2
前々回順位
(2020年度下期)
1
1
-k, --insecure
1
1
Disables TLS certificate validation in the client
1
2
1
1
自己署名証明書を利用しているサーバを対象にする際にTLSの証明書の検証を未実施するためのオプション
1
2
1
1
-r, --redirects
1
1
Allow client to follow redirects
1
2
1
1
301のレスポンスが返ってきた際に、リダイレクトを実施し、リダイレクト先に接続
1
2
1
1
-T, --timeout <SECONDS>
1
1
Number of seconds before a client's request times out (default: 7)
1
2
1
1
クライアントのタイムアウトの時間を指定
1
2
1
1
Scan settings
1
1
1
2
1
1
1
2
1
1
--auto-bail
1
1
Automatically stop scanning when an excessive amount of errors are encountered
1
2
1
1
スキャン実施の際に、サーバからの応答が遅くなった場合、スキャンを停止
(条件に関しては、ツールのDocumentを参考してください)
1
2
1
1
--auto-bail
1
1
Automatically lower scan rate when an excessive amount of errors are encountered
1
2
1
1
スキャン実施の際に、サーバからの応答が遅くなった場合、スキャンの速度を調整
(条件に関しては、ツールのDocumentを参考してください)
1
2
1
1
-d, --depth <RECURSION_DEPTH>
1
1
Maximum recursion depth, a depth of 0 is infinite recursion (default: 4)
1
2
1
1
再帰的な処理の深さを指定
1
2
1
1
-D, --dont-filter
1
1
Don't auto-filter wildcard responses
1
2
1
1
自動フィルター機能の無効化
1
2
1
1
-e, --extract-links
1
1
Extract links from response body (html, javascript, etc...); make new requests based on findings
1
2
1
1
htmlやjavascriptに含まれるlinkを検査対象に追加
1
2
1
1
-L, --scan-limit <SCAN_LIMIT>
1
1
Limit total number of concurrent scans (default: 0, i.e. no limit)
1
2
1
1
同時に検査を進めるURL数の制限
0の場合無制限
1
2
1
1
-n, --no-recursion
1
1
Do not scan recursively
1
2
1
1
再帰的な検査を実施しないためのオプション
1
2
1
1
--parallel <PARALLEL_SCANS>
1
1
Run parallel feroxbuster instances (one child process per url passed via stdin)
1
2
1
1
並列で処理する際に指定
1
2
1
1
--rate-limit <RATE_LIMIT>
1
1
Limit number of requests per second (per directory) (default: 0, i.e. no limit)
1
2
1
1
1秒間に送信するリクエスト数の制限
1
2
1
1
-t, --threads <THREADS>
1
1
Number of concurrent threads (default: 50)
1
2
1
1
スレッド数を指定
1
2
1
1
--time-limit <TIME_SPEC>
1
1
Limit total run time of all scans (ex: --time-limit 10m)
1
2
1
1
全体のスキャン時間を制限
1
2
1
1
-w, --wordlist <FILE>
1
1
Path to the wordlist
1
2
1
1
Configファイルで指定されていたファイル以外のワードリストを用いる際に必要
1
2
1
1
Dynamic collection settings
1
1
1
2
1
1
1
2
1
1
-B, --collect-backups
1
1
Automatically request likely backup extensions for "found" urls
1
2
1
1
バックアップファイルを見つけるため検出したURLの後ろに'.bak'などを付与してスキャン
1
2
1
1
-E, --collect-extensions
1
1
Automatically discover extensions and add them to --extensions (unless they're in --dont-collect)
1
2
1
1
見つけたページ付与されている拡張子を検出し、-xオプションで指定したかのように扱う
1
2
1
1
-g, --collect-words
1
1
Automatically discover important words from within responses and add them to the wordlist
1
2
1
1
レスポンス内に含まれる文字列を検査の文字列として追加
1
2
1
1
-I, --dont-collect <FILE_EXTENSION>…
1
1
File extension(s) to Ignore while collecting extensions (only used with --collect-extensions)
1
2
1
1
-Eオプションを利用する際に、検査の対象外とした拡張子を指定可能
1
2
1
1
Output settings
1
1
1
2
1
1
1
2
1
1
--debug-log <FILE>
1
1
Output file to write log entries (use w/ --json for JSON entries)
1
2
1
1
ログを出力
--jsonを指定することでjson形式で出力
1
2
1
1
--json
1
1
Emit JSON logs to --output and --debug-log instead of normal text
1
2
1
1
本オプションを指定することで、--debug-logや--outputの出力をjson形式に変更
1
2
1
1
--no-state
1
1
Disable state output file (*.state)
1
2
1
1
実行フォルダに.stateファイルの生成を停止
1
2
1
1
-o, --output <FILE>
1
1
Output file to write results to (use w/ --json for JSON entries)
1
2
1
1
アウトプットを出力
--json形式がないと、検出したURLをリストで提示
1
2
1
1
-q, --quiet
1
1
Hide progress bars and banner (good for tmux windows w/ notifications)
1
2
1
1
tmuxを利用しているとプログレスバーの更新がうまくできない場合があり、結果が流れていくのを防止するオプション
1
2
1
1
--silent
1
1
Hide progress bars and banner (good for tmux windows w/ notifications)
1
2
1
1
tmuxを利用しているとプログレスバーの更新がうまくできない場合があり、結果が流れていくのを防止するオプション
1
2
1
1
-v, --verbosity
1
1
Increase verbosity level (use -vv or more for greater effect. [CAUTION] 4 -v's is probably too much)
1
2
1
1
デバッグ情報などの表示レベルを指定
1
2
1
1

執筆者プロフィール

50

長浜 佑介(ながはま ゆうすけ)
セキュリティ技術センター リスクハンティング・アナリシスグループ

主にペネトレーションテスト、脆弱性診断などを担当しNECグループのセキュア開発・運用を推進。
2020年6月にIPA 産業サイバーセキュリティセンター中核人材育成プログラムを修了。
情報処理安全確保支援士(RISS)を保持。