gobuster徹底解説:Webサイトの隠された扉を見つけ出す 🚪

WebサイトやWebアプリケーションのセキュリティ診断、いわゆるペネトレーションテストを行う際、ターゲットに関する情報を可能な限り多く収集することは非常に重要です。特に、開発者が意図せずに公開してしまったディレクトリやファイル、あるいは通常の方法ではアクセスできないサブドメインや仮想ホストなどは、攻撃者にとって貴重な足がかりとなる可能性があります。

このような「隠された」リソースを発見するために広く使われているツールの一つが、gobusterです。この記事では、gobusterの基本的な使い方から、各モードの詳細、実践的な活用法、そして注意点まで、包括的に解説していきます。初心者の方から、すでに利用経験のある方まで、gobusterをより深く理解し、効果的に活用するための一助となれば幸いです。😊


Warning: Undefined array key “is_admin” in /home/c2261046/public_html/omomuki-tech.com/wp-content/themes/sango-theme/library/gutenberg/dist/classes/Toc.php on line 113

Warning: Undefined array key “is_category_top” in /home/c2261046/public_html/omomuki-tech.com/wp-content/themes/sango-theme/library/gutenberg/dist/classes/Toc.php on line 118

Warning: Undefined array key “is_top” in /home/c2261046/public_html/omomuki-tech.com/wp-content/themes/sango-theme/library/gutenberg/dist/classes/Toc.php on line 124

gobusterとは何か? 🤔

gobusterは、Go言語で開発されたオープンソースのコマンドラインツールです。主な目的は、ウェブサイト上のURI(ディレクトリやファイル)、DNSサブドメイン、仮想ホスト名、公開されているAmazon S3バケットやGoogle Cloud Storageバケットなどをブルートフォース(総当たり攻撃)によって発見することです。

ブルートフォースとは、あらかじめ用意された単語リスト(ワードリスト)に含まれる単語を一つずつ試していく手法です。例えば、ディレクトリ探索であれば、/admin, /backup, /config といった一般的なディレクトリ名を次々にリクエストし、サーバーからの応答(ステータスコードなど)を確認することで、存在するディレクトリやファイルを特定します。

gobusterがペネトレーションテスターやセキュリティ研究者に人気がある理由はいくつかあります。

  • 高速性: Go言語の並行処理能力を活かし、複数のリクエストを同時に送信(マルチスレッド)できるため、他の同様のツール(例えばDirBusterなど)と比較して高速に動作します。
  • 多機能性: ディレクトリ/ファイル探索だけでなく、サブドメイン探索、仮想ホスト探索、S3/GCSバケット探索、さらには基本的なファジング機能まで、複数のモードを一つのツールで提供します。
  • コマンドラインインターフェース: GUIを持たず、すべての操作をコマンドラインで行うため、スクリプトへの組み込みや自動化が容易です。
  • 柔軟性: 豊富なオプションにより、スキャン対象、スレッド数、タイムアウト、除外条件などを細かく制御できます。

ただし、gobusterはブルートフォースツールであるため、大量のリクエストをターゲットサーバーに送信します。これはサーバーに負荷をかける可能性があり、また侵入検知システム(IDS)などに検知されやすい(ノイジーなツールである)という側面も持っています。そのため、使用する際には十分な注意と配慮が必要です。

gobusterのインストール 💻

Kali Linuxでの利用

多くのペネトレーションテスト用ディストリビューション、特にKali Linuxでは、gobusterが標準でリポジトリに含まれているか、プリインストールされている場合があります。最新のKali Linuxでは、多くの場合、以下のコマンドで簡単にインストールできます(もしプリインストールされていなければ)。

sudo apt update && sudo apt install gobuster

インストールされているか確認するには、ターミナルで gobuster -h を実行してみてください。ヘルプメッセージが表示されれば利用可能です。

(2023年4月18日のGeeksforGeeksの記事や2020年12月9日のWikipediaの情報では、過去にはデフォルトで含まれていない時期もあったようですが、現在は多くの環境で容易にインストールできます。)

その他の環境でのインストール

他のLinuxディストリビューションやmacOS、Windowsでもgobusterを利用できます。

  • ソースからのビルド: Go言語の開発環境がセットアップされていれば、GitHubリポジトリからソースコードを取得し、ビルドすることができます。(Go 1.16以上が推奨されています)
    go install github.com/OJ/gobuster/v3@latest
  • バイナリのダウンロード: GitHubリポジトリのReleasesページから、お使いのOS/アーキテクチャに対応したコンパイル済みバイナリをダウンロードすることも可能です。

基本的な構文

gobusterの基本的なコマンド構文は以下の通りです。

gobuster <mode> [options]

<mode> には実行したいスキャンの種類(例: dir, dns, vhost など)を指定し、[options] でターゲットURLやワードリストのパス、スレッド数などの詳細設定を行います。各モードとオプションについては、後続のセクションで詳しく解説します。

主要なモードを理解する 🚀

gobusterにはいくつかの動作モードがあり、目的に応じて使い分ける必要があります。ここでは主要なモードの概要を紹介します。

モード名 主な目的 概要
dir ディレクトリ/ファイル探索 ウェブサイト上の隠されたディレクトリやファイルを、ワードリストを使ってブルートフォースで発見します。最も一般的に使用されるモードです。
dns サブドメイン探索 指定されたドメインに対して、ワードリストに含まれる単語をサブドメイン名としてDNS問い合わせを行い、存在するサブドメインを発見します。
vhost 仮想ホスト探索 ターゲットサーバー上でホストされている可能性のある仮想ホスト名(バーチャルホスト)を、ワードリストを使って探索します。DNS探索とは異なり、HTTPリクエストのHostヘッダーを変更して試行します。
fuzz ファジング URLパス、GET/POSTパラメータ、HTTPヘッダーなどにFUZZというキーワードを挿入し、その部分をワードリストの値で置き換えながらリクエストを送信します。より柔軟な探索や脆弱性診断(パラメータ名の推測など)に利用できます。
s3 S3バケット探索 公開されている可能性のあるAmazon S3バケット名を、ワードリストを使って探索します。
gcs GCSバケット探索 公開されている可能性のあるGoogle Cloud Storageバケット名を探索します。
tftp TFTPサーバー探索 TFTPサーバー上のファイルをブルートフォースで探索します。

この記事では、特に利用頻度の高い dir, dns, vhost, fuzz, s3 の各モードについて、詳しく解説していきます。

ディレクトリ/ファイル探索 (dirモード) 🔎

dir モードは、gobusterの中で最も基本的かつ頻繁に使用されるモードです。Webサーバー上に存在する隠されたディレクトリやファイルを探索します。これにより、設定ファイル、バックアップファイル、管理画面へのパスなど、通常はリンクされていない重要な情報が見つかることがあります。

必須オプション

  • -u <URL>: スキャン対象のURLを指定します。例: http://example.comhttps://target.site/path/
  • -w <wordlist>: 使用するワードリストファイルのパスを指定します。ワードリストは探索の成功率を左右する重要な要素です。例: /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt。ワードリストとして - を指定すると、標準入力から読み込むこともできます。

よく使われるオプション

オプション 説明
-x <extensions> 探索対象とするファイルの拡張子をカンマ区切りで指定します。ワードリストの各単語にこれらの拡張子を付与して試行します。 -x php,txt,bak,config
-t <threads> 同時に実行するスレッド数を指定します。デフォルトは10です。値を大きくするとスキャン速度は向上しますが、サーバーへの負荷が増大し、検知されるリスクも高まります。 -t 50
-o <filename> スキャン結果を指定したファイルに出力します。デフォルトでは標準出力に表示されます。 -o gobuster_results.txt
-k / --insecuressl HTTPS接続時のSSL/TLS証明書の検証をスキップします。自己署名証明書などを使用している場合に必要です。 -k
-s <statuscodes> / --status-codes <statuscodes> 発見対象とするHTTPステータスコードをカンマ区切りで指定します。デフォルトは 200,204,301,302,307,401,403,405,500 です。 -s 200,204,301,302,307 (成功とリダイレクトのみ)
-b <statuscodes> / --status-codes-blacklist <statuscodes> 無視する(表示しない)HTTPステータスコードをカンマ区切りで指定します。例えば、大量の404や403を除外したい場合に便利です。 -b 403,404
--exclude-length <lengths> 除外するレスポンスボディの長さをカンマ区切りで指定します。カスタム404ページなどが特定の長さを持つ場合に、それを除外するのに役立ちます。 --exclude-length 1234,5678
-H <header> / --header <header> リクエストにカスタムHTTPヘッダーを追加します。複数指定可能です。 -H "Authorization: Bearer ..." -H "X-Custom-Header: value"
-U <username> / -P <password> HTTP Basic認証が必要な場合にユーザー名とパスワードを指定します。 -U admin -P password123
-c <cookies> / --cookies <cookies> リクエストに含めるCookieを指定します。認証が必要なページのスキャンなどに利用します。 -c "session=abcdef12345; logged_in=true"
--timeout <duration> 個々のリクエストのタイムアウト時間を指定します。デフォルトは10秒です。単位(例: 5s, 500ms)も指定可能です。 --timeout 5s
--delay <duration> 各スレッドがリクエストを送信する間の待機時間を指定します。サーバーへの負荷を軽減したい場合に有効です。単位(例: 1s, 500ms)も指定可能です。 --delay 500ms
-f / --add-slash 発見されたディレクトリ名の末尾にスラッシュ / を追加して表示します。 -f
-v / --verbose 詳細な情報を表示します(エラーなど)。 -v
-q / --quiet バナー表示などを抑制し、結果のみを表示する静音モードです。 -q
--no-progress / -z スキャンの進捗状況を表示しません。 --no-progress
-r / --follow-redirect HTTPリダイレクト(3xxステータスコード)を追跡します。 -r
--wordlist-offset <int> ワードリストの指定した位置からスキャンを再開します。中断したスキャンを続ける際に便利です。 --wordlist-offset 10000

実践的なコマンド例

基本的なスキャン:

gobuster dir -u http://example.com -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt

拡張子を指定し、スレッド数を増やし、結果をファイルに保存:

gobuster dir -u https://secure.site -w /usr/share/seclists/Discovery/Web-Content/common.txt -x php,asp,aspx,jsp,txt -t 50 -o results.txt -k

特定のステータスコード(例: 403 Forbidden)を除外し、詳細表示を有効にする:

gobuster dir -u http://test.local -w /path/to/my/custom_list.txt -b 403 -v

Cookieを指定して認証後のページをスキャン:

gobuster dir -u https://members.example.org/ -w common.txt -c "sessionID=a1b2c3d4e5f6" -k

サーバー負荷を抑えるために遅延を設定:

gobuster dir -u http://sensitive.internal -w big.txt -t 20 --delay 1s

出力結果の読み方

gobusterは、発見したディレクトリやファイルを以下のような形式で表示します(オプションによって多少異なります)。

/images               (Status: 301) [Size: 0] [--> http://example.com/images/]
/admin                (Status: 403) [Size: 128]
/config.php.bak       (Status: 200) [Size: 1024]
/uploads              (Status: 200) [Size: 4096]
/javascript           (Status: 200) [Size: 8192]
  • 最初の列: 発見されたパス(-f オプションがあればディレクトリには / が付く)。
  • (Status: XXX): そのパスへのリクエストに対するHTTPステータスコード。
  • [Size: YYY]: レスポンスボディのサイズ(バイト単位)。
  • [--> URL]: リダイレクト先(ステータスコードが3xxの場合)。

特にステータスコードが 200 OK のものや、予期しないリダイレクト(301, 302)、アクセス制御の問題を示唆する 403 Forbidden401 Unauthorized などに注目します。また、サイズが他のものと極端に異なる場合や、特定のファイル(.bak, .config, .log など)が見つかった場合は、さらなる調査が必要です。

⚠️ 注意: 再帰的スキャンについて
gobusterの dir モードは、デフォルトでは再帰的なスキャンを行いません。つまり、/admin/ というディレクトリが見つかっても、その中の /admin/users/ といったサブディレクトリは自動的には探索しません。もし発見したディレクトリ内部をさらに探索したい場合は、そのディレクトリを新たなターゲットURLとして再度gobusterを実行する必要があります。
例: gobuster dir -u http://example.com/admin/ -w ...
(ただし、いくつかの情報源では `-r` オプションが再帰モードを示すとありますが、公式ドキュメントや多くの使用例では `-r` はリダイレクト追跡用です。再帰的スキャン機能については、`ffuf` や `feroxbuster` といった他のツールがより強力なサポートを提供しています。)

サブドメイン探索 (dnsモード) 🌐

dns モードは、特定のドメインに関連するサブドメインをブルートフォースで発見するために使用されます。例えば example.com というドメインに対して、admin.example.com, dev.example.com, test.example.com のような、存在が公開されていないサブドメインを見つけ出すことができます。これらのサブドメインは、本番環境とは異なる設定がされていたり、開発中の機能が置かれていたりすることがあり、セキュリティ評価の重要なターゲットとなり得ます。

必須オプション

  • -d <domain>: スキャン対象のドメイン名を指定します。例: example.com
  • -w <wordlist>: 使用するワードリストファイルのパスを指定します。サブドメイン名として一般的な単語(例: www, mail, dev, staging, admin, api など)が含まれたリストを使用します。例: /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt

よく使われるオプション

オプション 説明
-i / --show-ips 発見されたサブドメインに対応するIPアドレスを表示します。 -i
-c / --show-cname 発見されたサブドメインのCNAMEレコード(もしあれば)を表示します。 -c
--wildcard ワイルドカードDNSレコードが設定されている場合でもスキャンを強制実行します。(ワイルドカードについては後述) --wildcard
-r <resolver> / --resolver <resolver> DNSクエリに使用するカスタムDNSリゾルバ(サーバー)を指定します。内部ネットワークのDNSサーバーを使いたい場合などに便利です。 -r 8.8.8.8, -r 192.168.1.1
-t <threads> 同時に実行するスレッド数を指定します。デフォルトは10です。 -t 30
-o <filename> スキャン結果を指定したファイルに出力します。 -o subdomains.txt
-v / --verbose 詳細な情報を表示します。 -v
-q / --quiet バナー表示などを抑制する静音モードです。 -q
--timeout <duration> DNSクエリのタイムアウト時間を指定します。デフォルトは1秒です。 --timeout 2s
--delay <duration> 各スレッドがリクエストを送信する間の待機時間を指定します。DNSサーバーへの負荷軽減に役立ちます。 --delay 200ms

実践的なコマンド例

基本的なサブドメインスキャン:

gobuster dns -d example.com -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt

IPアドレスを表示し、スレッド数を増やし、結果をファイルに保存:

gobuster dns -d target-domain.org -w common-subdomains.txt -i -t 50 -o found_subdomains.txt

カスタムDNSサーバーを使用:

gobuster dns -d internal.local -w internal_hosts.txt -r 10.0.0.1

ワイルドカードDNSレコードへの対処

ワイルドカードDNSレコード(例: *.example.com)が設定されているドメインでは、存在しないサブドメイン名を問い合わせても、常に特定のIPアドレス(通常はメインサイトなど)が応答として返ってきてしまいます。これにより、gobusterのようなブルートフォースツールは、ワードリスト内のすべてのサブドメインが存在するかのように誤検知してしまいます。

gobusterは、スキャン開始時にランダムな(通常存在しないであろう)サブドメイン名をいくつか生成して問い合わせ、ワイルドカードが設定されているかどうかを自動で検出しようとします。ワイルドカードが検出された場合、デフォルトではスキャンを停止します。

もしワイルドカードが検出されてもスキャンを続行したい場合は、--wildcard オプションを使用します。ただし、この場合、出力結果には大量の偽陽性(実際には存在しないサブドメイン)が含まれる可能性が高いため、結果の解釈には注意が必要です。発見されたサブドメインが本当に有効かどうかは、手動での確認や他のツールとの組み合わせが必要になることがあります。

💡 ヒント: ワイルドカードが有効な場合でも、特定のサブドメインが異なるIPアドレスを指している場合や、特定のサービス(例: メールサーバーのMXレコードなど)が設定されている場合は、それらが個別に設定されている可能性があり、調査する価値があります。-i-c オプションが役立ちます。

仮想ホスト探索 (vhostモード) 🏢

vhost モードは、単一のIPアドレスで複数のウェブサイト(ドメイン名)をホストする技術である「仮想ホスト(バーチャルホスト)」を探索するために使用されます。Webサーバーは、クライアントからのHTTPリクエストに含まれる Host ヘッダーを見て、どのウェブサイトへのアクセスかを判断し、対応するコンテンツを返します。

dns モードがDNSレコードの存在を確認するのに対し、vhost モードは、ターゲットのWebサーバー(通常はIPアドレスで指定)に対して、様々なホスト名を Host ヘッダーに設定したリクエストを送信し、サーバーの応答の違いから仮想ホストの存在を推測します。これにより、DNSレコードには登録されていない(外部からは直接名前解決できない)内部向けサイトや、設定ミスで意図せずアクセス可能になっているサイトが見つかることがあります。

必須オプション

  • -u <URL>: スキャン対象のWebサーバーのURLを指定します。通常はIPアドレスを指定することが多いです。例: http://192.168.1.100, https://10.0.0.5。ここからベースドメインを推測することもできますが、--domain オプションで明示的に指定する方が確実な場合もあります。
  • -w <wordlist>: 使用するワードリストファイルのパスを指定します。dns モードと同様に、サブドメイン名や一般的なホスト名が含まれたリストを使用します。

よく使われるオプション

オプション 説明
--domain <domain> ベースとなるドメイン名を明示的に指定します。ワードリストの各項目がこのドメインのサブドメインとして扱われます (例: word.domain)。指定しない場合、-u のURLから推測されます。 --domain example.com
--append-domain ワードリストの各項目に、--domain または -u で指定されたベースドメイン名を自動的に付与して Host ヘッダーを生成します。例えば、ワードリストに dev があり、ドメインが example.com なら、Host: dev.example.com として試行します。 --append-domain
-k / --insecuressl HTTPS接続時のSSL/TLS証明書の検証をスキップします。IPアドレスでアクセスする場合や、仮想ホスト名と証明書のコモンネームが一致しない場合に必要です。 -k
-H <header> / --header <header> リクエストにカスタムHTTPヘッダーを追加します。Host ヘッダーはgobusterが設定するため、それ以外のヘッダーを追加する場合に使用します。 -H "X-Forwarded-For: 127.0.0.1"
-t <threads> 同時に実行するスレッド数を指定します。デフォルトは10です。 -t 20
-o <filename> スキャン結果を指定したファイルに出力します。 -o vhosts_found.txt
-s <statuscodes> / --status-codes <statuscodes> 発見対象とするHTTPステータスコードを指定します。通常と異なる応答を返すホストを探します。 -s 200,401,403
--exclude-length <lengths> 除外するレスポンスボディの長さを指定します。デフォルトの応答と異なるサイズの応答を探すのに役立ちます。 --exclude-length 1500
-v / --verbose 詳細な情報を表示します。 -v
-q / --quiet バナー表示などを抑制する静音モードです。 -q

実践的なコマンド例

基本的な仮想ホストスキャン (ベースドメインはURLから推測):

gobuster vhost -u http://192.168.1.50 -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-20000.txt

ベースドメインを明示的に指定し、ドメイン名を自動付与、HTTPSでSSL検証をスキップ:

gobuster vhost -u https://10.1.1.10 -w common-vhosts.txt --domain example.local --append-domain -k -o found_vhosts.log

特定の応答サイズを除外してスキャン:

# まず通常のHostヘッダーなし(またはIPアドレス)でアクセスし、デフォルトの応答サイズを確認
# curl http://192.168.1.50 | wc -c
# 仮にデフォルト応答サイズが1234バイトだった場合
gobuster vhost -u http://192.168.1.50 -w my_vhost_list.txt --exclude-length 1234

出力結果の読み方

vhost モードの出力は、発見された可能性のある仮想ホスト名と、そのリクエストに対するステータスコードやサイズを表示します。

Found: dev.example.local (Status: 200) [Size: 5678]
Found: staging.example.local (Status: 401) [Size: 345]
Found: internal-wiki.example.local (Status: 200) [Size: 12345]

ここで重要なのは、ベースとなるリクエスト(-u で指定したURLへの通常のリクエスト)の応答と比較して、異なるステータスコードやレスポンスサイズを返すホスト名です。それらが有効な仮想ホストである可能性が高いと考えられます。

発見された仮想ホスト名には、必ずしも対応するDNSレコードが存在するとは限りません。もしアクセスしたい場合は、自身のPCの /etc/hosts ファイル(Windowsの場合は C:\Windows\System32\drivers\etc\hosts)に、発見した仮想ホスト名とターゲットサーバーのIPアドレスを追記して名前解決できるように設定する必要があります。

# /etc/hosts ファイルへの追記例
10.1.1.10  dev.example.local staging.example.local internal-wiki.example.local

その後、ブラウザや他のツールからこれらの仮想ホスト名でアクセスできるようになります。

⚠️ 注意: DNSモードとの違い
vhost モードと dns モードは目的が似ていますが、アプローチが異なります。dns はDNSサーバーに問い合わせて名前解決できるかを確認しますが、vhost は直接Webサーバーに異なる Host ヘッダーでリクエストを送り、応答の違いを見ます。両方のモードを実行することで、より広範な探索が可能になります。

ファジング (fuzzモード) ✨

fuzz モードは、gobusterの中でも特に柔軟性の高いモードです。URLの特定の部分、GET/POSTパラメータ、HTTPヘッダーなどに特別なキーワード FUZZ を挿入し、そのキーワード部分をワードリストの値で次々に置き換えながらリクエストを送信します。

これにより、以下のような様々な探索やテストが可能になります。

  • 隠されたAPIエンドポイントやパスの探索
  • GET/POSTパラメータ名の推測
  • パラメータ値のブルートフォース(例: ID、ファイル名など)
  • HTTPヘッダー値のテスト(例: User-Agent, Referer, カスタムヘッダー)
  • ディレクトリトラバーサルなどの脆弱性パターンのテスト

他のモード(dir, dns, vhost)が特定の目的に特化しているのに対し、fuzz モードはより汎用的なブルートフォース/ファジング機能を提供します。

必須オプション

  • -u <URL>: ターゲットURLを指定します。このURL文字列の中に FUZZ キーワードを含める必要があります。
  • -w <wordlist>: FUZZ キーワード部分を置き換えるための値が含まれたワードリストファイルのパスを指定します。

FUZZ キーワードは、URLだけでなく、-H オプションで指定するカスタムヘッダーや、--data オプションで指定するPOSTリクエストのボディ内にも含めることができます。

よく使われるオプション

fuzz モードでは、dir モードで利用可能なオプションの多く(-t, -o, -k, -s, -b, --exclude-length, -H, -U, -P, -c, --timeout, --delay, -v, -q など)が同様に利用できます。

加えて、POSTリクエストを送信するためのオプションがあります。

オプション 説明
-X <method> / --method <method> 使用するHTTPメソッドを指定します。デフォルトはGETです。 -X POST
--data <data> POSTリクエストで送信するリクエストボディを指定します。この中に FUZZ を含めることも可能です。 --data '{"param": "FUZZ"}'

実践的なコマンド例

隠されたパス/エンドポイントの探索 (dirモードと同様の動作):

gobuster fuzz -u http://example.com/FUZZ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt

特定のディレクトリ以下で、特定の拡張子を持つファイルの探索:

gobuster fuzz -u http://example.com/api/v1/FUZZ.json -w api_endpoints.txt -b 404

GETパラメータ名の推測 (特定の応答サイズを持つものを除外):

gobuster fuzz -u "http://example.com/search.php?FUZZ=test" -w potential_params.txt --exclude-length 500

GETパラメータ値のブルートフォース (ID=1から100まで試す):

# まず1から100までの数字を含むワードリスト(ids.txt)を作成
# seq 1 100 > ids.txt
gobuster fuzz -u "http://example.com/user.php?id=FUZZ" -w ids.txt -s 200

POSTパラメータのファジング (JSON形式):

gobuster fuzz -u http://api.example.com/submit -X POST -H "Content-Type: application/json" --data '{"key": "FUZZ"}' -w values.txt -k

カスタムヘッダー値のファジング (例: User-Agent):

gobuster fuzz -u http://example.com/ -H "User-Agent: FUZZ" -w user_agents.txt

結果のフィルタリングの重要性

fuzz モードは非常に強力ですが、設定によっては大量の不要な結果(例えば、常に404を返すリクエストや、常に同じ内容を返すデフォルトページなど)を生成する可能性があります。

そのため、-s / --status-codes, -b / --status-codes-blacklist, --exclude-length といったオプションを効果的に使用して、関心のある応答のみをフィルタリングすることが重要になります。ベースラインとなるリクエスト(FUZZを含まないリクエストや、一般的な値を入れたリクエスト)の応答と比較し、異なる挙動を示すものを特定することが、効率的な探索の鍵となります。

💡 ヒント: fuzz モードは、他の特化ツール(例: wfuzz, ffuf)ほど高度なファジング機能(複数のFUZZキーワードの組み合わせ、エンコーディング、ペイロード処理など)は持っていません。しかし、gobusterの他のモードと組み合わせたり、手軽に基本的なファジングを行いたい場合には非常に便利です。

S3バケット探索 (s3モード) ☁️

s3 モードは、Amazon Web Services (AWS) のオブジェクトストレージサービスである S3 (Simple Storage Service) の中で、公開されている可能性のある「バケット」を探索するために使用されます。S3バケットは、ウェブサイトの静的コンテンツ、ログファイル、バックアップデータ、その他の様々なファイルを保存するために広く利用されています。

設定ミスにより、本来プライベートであるべきS3バケットが意図せず公開状態になっていることがあります。このようなバケットを発見できれば、機密情報へのアクセスや、場合によってはファイルのアップロードなどが可能になる危険性があります。s3 モードは、一般的なバケット命名規則や推測される名前を使って、そのような公開バケットの存在を確認しようと試みます。

必須オプション

  • -w <wordlist>: 使用するワードリストファイルのパスを指定します。このワードリストには、ターゲット組織名、プロジェクト名、一般的な単語など、バケット名として使われそうな文字列を含めます。S3バケット名はグローバルでユニークである必要があります。

S3バケット名は通常、<bucket-name>.s3.amazonaws.com のような形式のURLでアクセスできます。gobusterはこの形式でアクセスを試みます。

よく使われるオプション

s3 モードのオプションは比較的シンプルです。

オプション 説明
-t <threads> 同時に実行するスレッド数を指定します。デフォルトは10です。 -t 25
-o <filename> スキャン結果を指定したファイルに出力します。 -o s3_buckets_found.txt
-v / --verbose 詳細な情報を表示します。 -v
-q / --quiet バナー表示などを抑制する静音モードです。 -q
--max-files <int> リスト表示可能なバケットが見つかった場合に、表示するファイル数の上限を指定します。デフォルトは0で、リスト表示は試みません。5などの値を指定すると、最初の5ファイルが表示されます。 --max-files 5

実践的なコマンド例

基本的なS3バケットスキャン:

gobuster s3 -w s3_bucket_wordlist.txt

スレッド数を増やし、結果をファイルに保存、リスト可能な場合はファイルも表示:

gobuster s3 -w company_specific_buckets.txt -t 30 -o found_buckets.log --max-files 10

出力結果と注意点

s3 モードは、存在し、かつアクセス可能なバケットを発見した場合、そのバケット名を表示します。

Found: company-backup-files.s3.amazonaws.com
Found: public-assets-prod.s3.amazonaws.com (Status: 200) - Found 3 files
 - image1.jpg
 - logo.png
 - styles.css
Found: dev-logs-internal.s3.amazonaws.com

Found: に続いてバケット名が表示されます。--max-files オプションを指定している場合、バケット内のファイルリストが取得できれば、指定した数だけファイル名が表示されます。

🚨 重要: 法的・倫理的注意
S3バケットのスキャンは、ターゲット組織の許可なく行うべきではありません。公開されているバケットを発見した場合でも、その中のファイルへのアクセスやダウンロード、変更、アップロードなどは、明確な許可がない限り違法行為となる可能性があります。AWSの利用規約や関連法規を遵守し、責任ある行動を心がけてください。発見した脆弱性は、適切な手順に従って報告することが推奨されます。

gobusterがバケットを発見したとしても、それは単にその名前のバケットが存在することを示すだけかもしれません。実際にファイルリストを取得できるか、個々のファイルにアクセスできるか、書き込みが可能かなどは、バケットのアクセスポリシーやACL(アクセス制御リスト)の設定に依存します。さらなる調査にはAWS CLIなどのツールが必要になる場合がありますが、繰り返しますが、許可なくアクセスすることは避けてください。

💡 備考: GCSモードについて
gobusterには gcs モードもあり、これはGoogle Cloud Storageの公開バケットを探索するためのものです。使い方は s3 モードとほぼ同様で、ワードリストを指定して実行します。法的・倫理的な注意点もS3と同様に適用されます。
gobuster gcs -w gcs_bucket_wordlist.txt -o found_gcs_buckets.log

ワードリストの選択 📚

gobuster(および他の多くのブルートフォースツール)の成功は、使用するワードリストの質に大きく依存します。適切なワードリストを選択することが、効率的かつ効果的なスキャンの鍵となります。

ワードリストの重要性

ワードリストは、gobusterが試行する単語(ディレクトリ名、ファイル名、サブドメイン名、バケット名など)のリストです。リストに含まれていない名前は発見できません。したがって、ターゲットの特性に合わせて最適化されたリストを使用することが理想的です。

  • 網羅性 vs. 速度: 巨大なワードリストはより多くの可能性をカバーしますが、スキャンに非常に長い時間がかかります。一方、小さなリストは高速ですが、見逃しが多くなる可能性があります。
  • 関連性: ターゲットの言語、使用されている技術スタック(例: PHP, Java, WordPress)、業界、組織名などに関連する単語を含むリストは、発見の可能性を高めます。

代表的なワードリスト

Kali Linuxには、デフォルトで多くの有用なワードリストが含まれています。これらは通常 /usr/share/wordlists/ ディレクトリ以下に格納されています。特に有名なコレクションとして SecLists があります。

SecLists (https://github.com/danielmiessler/SecLists) は、セキュリティテストのための様々な種類のリスト(ユーザー名、パスワード、URL、ファジングペイロードなど)を集めた巨大なコレクションです。Kali Linuxには通常含まれていますが、もしなければ sudo apt install seclists でインストールできます。

SecLists内の代表的なディレクトリ/ファイル探索用リスト:

  • /usr/share/seclists/Discovery/Web-Content/common.txt (比較的小さく、一般的なもの)
  • /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt (DirBusterプロジェクト由来の中規模リスト、よく使われる)
  • /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-big.txt (大規模リスト、時間がかかる)
  • /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt

SecLists内の代表的なサブドメイン/仮想ホスト探索用リスト:

  • /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt (一般的なサブドメイン上位5000)
  • /usr/share/seclists/Discovery/DNS/subdomains-top1million-110000.txt (より大規模なリスト)
  • /usr/share/seclists/Discovery/DNS/namelist.txt (様々な名前を含むリスト)

他にも、dirbdirbuster パッケージに含まれるワードリスト (例: /usr/share/wordlists/dirb/common.txt) もよく利用されます。

ワードリストの選び方

  1. まずは小さいリストから試す: スキャン初期段階では、common.txt のような比較的小さなリストで素早く基本的な探索を行います。
  2. 中規模リストで深掘り: 次に directory-list-2.3-medium.txt のような中規模リストで、より多くの可能性を探ります。これが多くの場合、時間と網羅性のバランスが良い選択肢となります。
  3. ターゲットに合わせて特化:
    • ターゲットが特定のCMS(WordPress, Drupalなど)やフレームワーク(Laravel, Djangoなど)を使用している場合、それらに特化したワードリスト (SecLists内にも存在) を使うと効果的です。
    • ターゲットの言語が英語以外であれば、その言語の一般的な単語を含むリストを探すか、作成します。
    • 発見されたディレクトリやファイル名から、命名規則を推測し、関連する単語を追加したカスタムリストを作成することも有効です。
  4. 大規模リストは最終手段か、時間に余裕がある場合に: big.txt や非常に巨大なリストは、網羅性は高いですが時間がかかります。他の方法で十分な情報が得られなかった場合や、オフラインでの長時間スキャンが可能な場合に検討します。

カスタムワードリストの作成

既存のリストに加えて、ターゲット固有の情報(会社名、製品名、発見されたユーザー名など)を基にカスタムワードリストを作成することも非常に有効です。ツール(例: CeWL)を使ってウェブサイトから単語を抽出したり、手動で関連性の高い単語を追加したりします。

# 例: 既存のリストとカスタムリストを結合
cat /usr/share/seclists/Discovery/Web-Content/common.txt custom_words.txt | sort -u > combined_list.txt
gobuster dir -u http://target.com -w combined_list.txt

適切なワードリストの選択とカスタマイズは、gobusterを最大限に活用するための重要なスキルです。🕵️‍♀️

実践的なヒントと注意点 ⚠️

gobusterは強力なツールですが、その能力を最大限に引き出し、かつ安全に使用するためには、いくつかのヒントと注意点を理解しておく必要があります。

パフォーマンスチューニング

  • スレッド数 (-t): スレッド数を増やすとスキャン速度は向上しますが、ターゲットサーバーや自身のネットワーク帯域に過大な負荷をかける可能性があります。また、短時間に大量のリクエストを送ると、WAF(Web Application Firewall)やIDS/IPS(侵入検知/防御システム)にブロックされたり、DoS攻撃とみなされたりするリスクが高まります。最初はデフォルトの10や、少し増やした20-50程度から始め、状況に応じて調整するのが安全です。
  • 遅延 (--delay): サーバーへの負荷を軽減したり、レートリミット(単位時間あたりのリクエスト数制限)を回避したりするために、リクエスト間に意図的に遅延を入れることができます。--delay 500ms のように指定すると、各スレッドはリクエスト送信後に500ミリ秒待機します。スレッド数と組み合わせることで、1秒あたりの総リクエスト数を制御できます(例: -t 10 --delay 100ms は約100リクエスト/秒)。
  • タイムアウト (--timeout): ネットワークが不安定な場合や、応答の遅いサーバーをスキャンする場合、デフォルトのタイムアウト(dirモード: 10秒, dnsモード: 1秒)では短すぎる可能性があります。必要に応じてタイムアウト値を長く設定します。

誤検知(False Positives)への対処

  • カスタム404ページ (--exclude-length): 多くのウェブサイトでは、「ページが見つかりません」というエラー(404 Not Found)を表示する際に、ステータスコードは404ではなく200 OKを返しつつ、定型のメッセージページを表示することがあります。このようなカスタム404ページは、gobusterにとっては「存在する」ページとして誤検知されます。存在しないランダムなパスにアクセスしてみて、その応答サイズを確認し、--exclude-length でそのサイズを除外することで、誤検知を大幅に減らせます。
  • ワイルドカードDNS (--wildcard): dnsモードのセクションで説明したように、ワイルドカードDNSが設定されていると、存在しないサブドメインもすべて存在するように見えます。gobusterはこれを検出しようとしますが、--wildcard オプションで強制実行する場合は、結果の検証が必要です。
  • ステータスコードフィルタリング (-s, -b): アクセス権がないことを示す 403 Forbidden や、サーバーエラーを示す 500 Internal Server Error などが大量に表示される場合、-b オプションでそれらをブラックリストに登録して非表示にすると、重要な結果が見やすくなります。逆に、特定のステータスコード(例: 200, 301, 302)のみに関心がある場合は -s を使います。

ログの活用 (-o)

特に大規模なスキャンや長時間のスキャンを行う場合は、必ず -o <filename> オプションを使って結果をファイルに保存しましょう。これにより、ターミナルの表示が流れてしまっても後で結果を確認できますし、他のツールでの分析やレポート作成にも役立ちます。

類似ツールとの比較

gobuster以外にも、同様の目的を持つツールは存在します。

  • Dirb / Dirbuster: 古くからあるディレクトリ探索ツール。gobusterに比べて低速な場合が多いですが、GUIを持つDirbusterもあります。
  • ffuf (Fuzz Faster U Fool): Go言語製の高速なファザー。gobusterと同様に高速で、より高度なファジング機能(複数のFUZZポイント、柔軟なフィルタリング、再帰スキャンなど)を持っています。多くのペンテスターに好まれています。
  • feroxbuster: Rust言語製の高速なコンテンツ探索ツール。ffufと同様に高機能で、特に再帰スキャンやレスポンスからのリンク抽出機能が強力です。
  • wfuzz: Python製の高機能なWebファザー。非常に柔軟な設定が可能ですが、Go/Rust製のツールに比べると速度面で劣る場合があります。

どのツールが最適かは状況や好みによりますが、gobusterはそのシンプルさと速度、多機能性のバランスから、依然として広く使われている強力な選択肢です。ffufやferoxbusterは、より高度な機能や再帰スキャンが必要な場合に検討すると良いでしょう。

🚨🚨🚨 最重要: 法的・倫理的な考慮事項 🚨🚨🚨
gobusterは、許可されたターゲットに対してのみ使用しなければなりません。許可なく他者のウェブサイトやシステムに対してスキャンを行うことは、多くの国や地域で違法行為とみなされ、法的な責任を問われる可能性があります。
  • 必ず事前に書面による明確な許可を得てください。 これは、業務としてのペネトレーションテスト契約、バグバウンティプログラムのスコープ内での活動、あるいは自身が管理するシステムに対するテストの場合に限られます。
  • ターゲットシステムの利用規約や、バグバウンティプログラムのルールを遵守してください。スキャンが禁止されていたり、特定の時間帯や強度に制限があったりする場合があります。
  • 過度なスキャンはターゲットサーバーに負荷をかけ、サービス停止(DoS)を引き起こす可能性があります。ツールの設定(スレッド数、遅延)に注意し、影響を最小限に抑えるよう努めてください。

技術的なスキルを持つことと、それを倫理的かつ合法的に使用することは表裏一体です。責任ある行動を常に心がけてください。🙏

まとめ ✨

この記事では、強力なブルートフォースツールであるgobusterについて、その概要からインストール、主要なモード(dir, dns, vhost, fuzz, s3)の使い方、ワードリストの選択、そして実践的なヒントと注意点までを詳しく解説しました。

gobusterは、その高速性と多機能性により、ペネトレーションテストやセキュリティ診断の情報収集フェーズにおいて非常に有用なツールです。隠されたディレクトリやファイル、サブドメイン、仮想ホストなどを効率的に発見することで、潜在的な脆弱性や攻撃経路を見つけ出す手助けとなります。

しかし、その強力さゆえに、使用には細心の注意が必要です。特に、許可なく他者のシステムに対して使用することは絶対に避けてください。常に法的・倫理的な側面を考慮し、責任ある使用を心がけることが重要です。

この記事が、皆さんがgobusterをより深く理解し、安全かつ効果的に活用するための一助となれば幸いです。Happy Hacking (ethically)! 😉

参考情報

以下は、この記事を作成するにあたり参考にした情報の一部です。