はじめに
Web アプリケーションのペネトレーションテストやセキュリティ監査では、ユーザーが認証された後にのみアクセス可能なウェブサイトの領域に遭遇することがよくあります。Gobuster のような標準的なディレクトリスキャンツールは、セッションを維持しないため、これらの隠されたパスを見逃す可能性があります。この実験(Lab)では、Gobuster の Cookie 機能を使用して認証されたディレクトリスキャンを実行するプロセスを説明します。Web アプリケーションからセッション Cookie を取得し、その Cookie を Gobuster で使用して、認証されたセクション内のディレクトリやファイルを発見する方法を学びます。これにより、アプリケーションのアタックサーフェス(attack surface)のより包括的なビューが得られます。
Web アプリケーションにログインし、セッション Cookie を取得する
このステップでは、Web アプリケーションへのログインをシミュレートし、認証成功時に設定されるセッション Cookie をキャプチャします。この Cookie は、Gobuster が認証済み領域にアクセスするために不可欠です。ここではcurlを使用してログインを実行し、Cookie を抽出します。
まず、認証なしでダッシュボードにアクセスしようとして、リダイレクトされることを確認しましょう。
curl -v http://localhost:8080/dashboard
302 Foundが表示され、/にリダイレクトされるはずです。次に、ログインしましょう。この Web アプリケーションには、http://localhost:8080/にユーザー名user、パスワードpasswordを持つシンプルなログインフォームがあります。これらの認証情報を使用して/loginに POST リクエストを送信します。
curl -v -X POST -d "username=user&password=password" http://localhost:8080/login
出力の中からSet-Cookieヘッダーを探してください。Set-Cookie: session=authenticated_session_id_12345; Path=/のような形式になっているはずです。authenticated_session_id_12345という値がセッション Cookie です。この値をメモしておいてください。
次に、取得した Cookie を使用してダッシュボードにアクセスしてみましょう。YOUR_COOKIE_VALUEを実際に見つけた Cookie の値に置き換えてください。
curl -v --cookie "session=authenticated_session_id_12345" http://localhost:8080/dashboard
これで、ダッシュボードページのコンテンツが表示されるはずです。これは、認証されたアクセスが成功したことを示しています。
認証済み領域に対する gobuster dir コマンドの構築
このステップでは、基本的なgobuster dirコマンドを準備します。Web アプリケーションの認証済み領域をターゲットにします。認証済みスキャンのベース URL はhttp://localhost:8080/authenticated/になります。ディレクトリの総当たり攻撃(brute-forcing)には、一般的な単語リストを使用します。
まず、Gobuster がインストールされていることを確認しましょう。
gobuster version
バージョン情報が表示されるはずです。表示されない場合は、セットアップセクションを参照してください。
次に、基本的なgobuster dirコマンドを構築します。URL には-uフラグを、単語リストには-wを使用します。この実験(Lab)では、デモンストレーション目的で組み込みの小さな単語リストを使用するか、システムで利用可能な場合はcommon.txtのような一般的なものを指定できます。common.txtが見つからない場合は、テスト用に小さなカスタム単語リストを作成できます。
この実験のために小さな単語リストを作成しましょう。
echo -e "secret_dir\nadmin\nconfig\nbackup\nusers" > ~/project/wordlist.txt
次に、Cookie を含めない基本的なコマンドは次のようになります。
gobuster dir -u http://localhost:8080/authenticated/ -w ~/project/wordlist.txt
このコマンドを今実行しても、認証が必要なためsecret_dirは見つからない可能性が高いです。次のステップで、このコマンドに Cookie を追加します。
セッション Cookie を提供するために-c フラグを使用する
このステップでは、ステップ 1 で取得したセッション Cookie を-cフラグを使用して Gobuster コマンドに統合します。このフラグにより、Gobuster は指定された Cookie をリクエストに含めることができ、認証済み領域にアクセスできるようになります。
ステップ 1 で取得した Cookie の値、つまりsession=authenticated_session_id_12345を思い出してください。
-cフラグは、Cookie をkey=valueの形式で受け取ります。したがって、Cookie 文字列は"session=authenticated_session_id_12345"となります。
次に、これをステップ 2 のコマンドと組み合わせます。
gobuster dir -u http://localhost:8080/authenticated/ -w ~/project/wordlist.txt -c "session=authenticated_session_id_12345"
このコマンドは、Gobuster に対して、指定された単語リストを使用してhttp://localhost:8080/authenticated/でディレクトリスキャンを実行し、さらに重要なことに、すべてのリクエストにsession=authenticated_session_id_12345Cookie を含めるように指示します。これにより、Gobuster は認証の壁を回避し、保護された領域内のリソースを発見できるようになります。
実行する前に、Cookie の値が正しいことを再確認してください。
スキャンの実行
これで完全な Gobuster コマンドが構築されました。次は、それを実行して結果を観察する番です。このスキャンは、Web アプリケーションの認証済みセクション内のディレクトリとファイルを見つけようとします。
前のステップで準備したコマンドを実行してください。
gobuster dir -u http://localhost:8080/authenticated/ -w ~/project/wordlist.txt -c "session=authenticated_session_id_12345"
Gobuster はスキャンを開始し、その進捗を表示します。出力に注意深く目を向けてください。Status: 200 (OK)、Status: 301 (Moved Permanently)、またはStatus: 302 (Found) で示されるディレクトリまたはファイルのエントリが表示されるはずです。これは、リソースが正常にアクセスされたか、リダイレクトされたことを意味します。
出力例:
===============================================================
Gobuster vX.X.X
===============================================================
[+] Url: http://localhost:8080/authenticated/
[+] Wordlist: /home/labex/project/wordlist.txt
[+] Threads: 10
[+] Timeout: 10s
[+] User Agent: gobuster/X.X.X
[+] Cookies: session=authenticated_session_id_12345
===============================================================
2024/01/01 12:00:00 Starting gobuster in directory enumeration mode
===============================================================
/secret_dir (Status: 200) [Size: 100]
===============================================================
2024/01/01 12:00:05 Finished
===============================================================
/secret_dirがStatus: 200で見つかっていることに注目してください。これは、Gobuster が認証 Cookie を送信していたため、このディレクトリに正常にアクセスできたことを示しています。Cookie がない場合、このディレクトリは見つからないか、リダイレクトまたは未承認のステータスを返す可能性が高いです。
認証時のみアクセス可能なページを見つけるために結果を分析する
この最終ステップでは、Gobuster スキャンの出力を分析して、認証済み領域内で正常に検出されたリソースを特定します。重要なのは、通常はセッション Cookie なしではアクセスできないStatus: 200 (OK) またはその他の成功コードを返したエントリを探すことです。
前のステップの出力から、次のようなものが見られたはずです。
/secret_dir (Status: 200) [Size: 100]
この行は、Gobuster がhttp://localhost:8080/authenticated/ URL 内で/secret_dirパスを正常に見つけ、HTTP 200 OK ステータスを返したことを示しています。これは、このディレクトリが認証時にアクセス可能であることの強力な兆候です。
確認するために、Cookie なしでcurlを使用してこのパスに直接アクセスしてみてください。
curl http://localhost:8080/authenticated/secret_dir
ログインページにリダイレクトされるか、未承認のメッセージが表示されるはずです。
次に、Cookie を使用してアクセスしてみてください。
curl --cookie "session=authenticated_session_id_12345" http://localhost:8080/authenticated/secret_dir/hidden_file.html
hidden_file.htmlの内容が表示され、このパスが確かに正しい認証 Cookie でのみアクセス可能であることを確認できます。
このプロセスは、Gobuster で Cookie を使用することで、認証済みユーザーにのみ表示される Web アプリケーションの隠された部分を明らかにできることを示しており、セキュリティ評価の範囲を大幅に拡大します。
まとめ
この実験では、Gobuster を使用して認証済みディレクトリのスキャンを実行する方法を学びました。まず、シミュレートされた Web アプリケーションにログインし、セッション Cookie を抽出しました。次に、-cフラグを使用してこの Cookie を含める Gobuster コマンドを構築しました。このコマンドを実行することで、認証済みユーザーのみがアクセスできる隠しディレクトリ(/secret_dir)を発見することができました。このテクニックは、すべてのアクセス可能なパス、認証の背後にあるものさえも、適切に特定および保護する必要がある Web アプリケーションを徹底的に監査する必要があるセキュリティ専門家や開発者にとって非常に価値があります。
