サイト内の現在位置

ディレクトリスキャンツール「feroxbuster」のご紹介

NECセキュリティブログ

2022年5月13日

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

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

FFUFの使用で直面した問題

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

FFUFやgobuster new window[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以外) ×
検査結果の除外条件
ワードリストのコメントアウト無効化
拡張子自動追加機能 ×
バックアップファイル探索機能 ×
実行画面の見やすさ

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

feroxbusterの使い方

動作環境

  • Kali Linux on WSL
  • feroxbuster 2.6.4
  • FFUF 1.5.0 (比較用)
  • 検査対象
    • nginxにて、必要な環境を整備しました。検査対象の環境は以下のようなディレクトリ構成になっています。具体的な構成の紹介は省略いたします。

|-- 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

基本的な使い方

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Directory Listing検知機能 [4]

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

まとめ

  • feroxbusterは、ディレクトリスキャンツールです。多機能で非常に有用なツールであると思います。
  • 同じくディレクトリスキャン機能を持つFFUFとの機能比較を行いました。FFUFのコンセプトが「高速なファジングツール」であるのに対し、feroxbusterはディレクトリスキャナであり、それぞれのツールの設計コンセプトは異なることが分かりました。そのため、feroxbusterはFFUFの置き換えではなく、検査内容に応じて適切に使い分けて利用していくのがよいかと思います。
  • 本ブログの最後にferoxbusterで利用可能なオプションの説明を記載しています。利用する際のご参考となれば幸いです。

参考資料

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

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

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

執筆者プロフィール

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

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

執筆者の他の記事を読む

アクセスランキング