はじめに
Web セキュリティにおいて、偵察(Reconnaissance)は非常に重要な最初のステップです。Gobuster のようなツールは、ディレクトリやファイルの列挙に広く使用されています。しかし、多くの Web サーバーや Web アプリケーションファイアウォール(WAF)は、不審な User-Agent 文字列を持つリクエストをブロックするなど、単純な検出メカニズムを採用しています。デフォルトでは、Gobuster は容易に識別される User-Agent 文字列を使用します。
この実験(Lab)では、Gobuster のスキャンにカスタム User-Agent 文字列を設定する方法を学びます。このテクニックは、単純な検出メカニズムを回避し、偵察活動をよりステルスにすることで、より多くの隠されたディレクトリやファイルを発見するのに役立ちます。
User-Agent 文字列の目的を理解する
このステップでは、User-Agent 文字列とは何か、そしてそれが Web リクエストにおいてなぜ重要なのかを学びます。
User-Agent 文字列は、クライアント(Web ブラウザや Gobuster のようなツール)から Web サーバーに送信されるヘッダーです。通常、クライアントのアプリケーションタイプ、オペレーティングシステム、ソフトウェアベンダー、ソフトウェアバージョンに関する情報が含まれています。Web サーバーは、この情報を使用して、クライアントに最適化されたコンテンツを提供したり、クライアント統計を記録したりします。
Gobuster のようなセキュリティツールの場合、デフォルトの User-Agent 文字列はツールの識別情報を明らかにすることが多く、これが WAF や侵入検知システム(IDS)をトリガーする可能性があります。例えば、Gobuster のデフォルトの User-Agent は gobuster/3.1.0 のようなものになることがあります。
まず、カスタム User-Agent なしで基本的な Gobuster スキャンを実行し、そのデフォルトの動作を確認しましょう。バックグラウンドで設定されたローカル Web サーバーをスキャンします。
まず、プロセスを確認して Web サーバーが実行されていることを確認してください。
ps aux | grep "python3 -m http.server 8080" | grep -v grep
以下のような出力が表示され、サーバーが実行されていることを示しているはずです。
labex 1234 0.0 0.1 12345 6789 ? Sl HH:MM 0:00 python3 -m http.server 8080 --directory /tmp/web_root
次に、ポート 8080 のローカルサーバーに対して、簡単な Gobuster スキャンを実行します。デモンストレーションのために、小さな単語リストを使用します。
gobuster dir -u http://127.0.0.1:8080 -w /usr/share/wordlists/dirb/common.txt -q -x html,txt -t 10
-u http://127.0.0.1:8080: ターゲット URL を指定します。-w /usr/share/wordlists/dirb/common.txt: 使用する単語リストを指定します。-q: クワイエットモード。結果のみを出力します。-x html,txt: 検索する拡張子を指定します。-t 10: 同時実行スレッド数を 10 に設定します。
以下のような出力が表示され、発見されたディレクトリやファイルが表示されます。
/admin (Status: 200)
/secret (Status: 200)
/backup (Status: 200)
このスキャンは機能しますが、Gobuster が使用する User-Agent はデフォルトのものであり、WAF によって簡単にブロックされる可能性があります。
一般的なブラウザの User-Agent 文字列を見つける
このステップでは、Gobuster のスキャンを偽装するために使用できる一般的なブラウザの User-Agent 文字列を見つける方法を学びます。
Gobuster のスキャンを正規の Web ブラウザからのもののように見せるためには、一般的なブラウザが送信する User-Agent 文字列を使用する必要があります。これらの文字列は、以下の方法で見つけることができます。
- ブラウザの開発者ツールでネットワークリクエストを検査する: Web サイトを閲覧する際に、ブラウザの開発者ツール(通常は F12 キー)を開き、「ネットワーク」タブに移動して、任意のリクエストのヘッダーを検査します。
- オンラインで検索する: 多くのウェブサイトが、一般的な User-Agent 文字列のリストをまとめています。
この実験(Lab)では、Windows 上の最新バージョンの Chrome の一般的な User-Agent 文字列を使用しましょう。Chrome の典型的な User-Agent 文字列は、以下のようになります。
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36
この文字列は以下を示しています。
Mozilla/5.0: 多くのブラウザが歴史的な理由で含める一般的なトークンです。(Windows NT 10.0; Win64; x64): オペレーティングシステムの情報(Windows 10、64 ビット)です。AppleWebKit/537.36 (KHTML, like Gecko): レンダリングエンジン情報(WebKit、KHTML 互換性あり)です。Chrome/120.0.0.0: ブラウザ名とバージョンです。Safari/537.36: WebKit ベースのブラウザによく含まれる、もう一つの歴史的なトークンです。
次のステップで直接コピーできます。コマンドラインで使用する際は、User-Agent 文字列にスペースや特殊文字が含まれている場合、特に引用符で囲むことが重要です。
-a フラグを使用してカスタム User-Agent を設定する
このステップでは、Gobuster の-aフラグを使用して、スキャン用のカスタム User-Agent 文字列を設定する方法を学びます。
Gobuster は、この目的のために特別に-aフラグ(または--agent)を提供しています。単に希望する User-Agent 文字列をこのフラグの引数として渡すだけです。
前のステップで特定したカスタム User-Agent 文字列を使用して、Gobuster コマンドを準備しましょう。ターゲットと単語リストは同じものを使用します。
CUSTOM_USER_AGENT="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
echo "Using custom User-Agent: $CUSTOM_USER_AGENT"
次に、Gobuster コマンドを構築します。-aフラグがどのように使用されているかに注意してください。
gobuster dir -u http://127.0.0.1:8080 -w /usr/share/wordlists/dirb/common.txt -a "$CUSTOM_USER_AGENT" -q -x html,txt -t 10
-a "$CUSTOM_USER_AGENT": これは新しい部分で、カスタム User-Agent 文字列を渡しています。文字列にスペースが含まれているため、$CUSTOM_USER_AGENTの周りの引用符は非常に重要です。
実行する前に、この変更がもたらす違いを考えてみてください。-aフラグがない場合、Web サーバーは「gobuster」からのリクエストを見ます。-aフラグを使用すると、「Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36」からのリクエストが表示され、これは正規のブラウザのように見えます。
新しい User-Agent でスキャンを実行する
このステップでは、カスタム User-Agent 文字列を使用して Gobuster スキャンを実行し、結果を観察します。
これで、カスタム User-Agent を使用して Gobuster コマンドを実行します。スキャンの出力自体は以前のものと同様に見えます。User-Agent はサーバーがリクエストをどのように認識するかに影響するだけで、スキャンの結果自体には影響しません(サーバーがデフォルトの User-Agent をブロックしない限り)。
コマンドを実行します。
CUSTOM_USER_AGENT="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
gobuster dir -u http://127.0.0.1:8080 -w /usr/share/wordlists/dirb/common.txt -a "$CUSTOM_USER_AGENT" -q -x html,txt -t 10
同じディレクトリとファイルが検出されるはずです。
/admin (Status: 200)
/secret (Status: 200)
/backup (Status: 200)
出力は同じですが、重要な違いは、これが WAF や IDS を備えた実際のシナリオであった場合、Gobuster のデフォルト User-Agent を使用したスキャンと比較して、このスキャンが疑わしいとフラグ付けされる可能性が低くなることです。これは、検出を回避するための倫理的ハッキングおよびペネトレーションテストにおける基本的なテクニックです。
なぜこれが単純なフィルターの回避に役立つのかを議論する
このステップでは、カスタム User-Agent を設定することが、単純なフィルターや検出メカニズムを回避するための効果的なテクニックである理由について議論します。
多くの Web アプリケーションファイアウォール(WAF)、侵入検知システム(IDS)、さらには基本的なサーバー構成でも、疑わしいトラフィックを識別してブロックするためのルールが採用されています。最も単純で一般的なルールの 1 つは、User-Agent 文字列を確認することです。
カスタム User-Agent を設定することが役立つ理由は次のとおりです。
- User-Agent ベースのブロックのバイパス: WAF に「gobuster」、「nmap」、「sqlmap」などの既知のセキュリティツールの User-Agent を持つリクエストをブロックするルールがある場合、一般的なブラウザの User-Agent を使用すると、この特定のルールによる検出を回避してリクエストを通過させることができます。
- 疑いの軽減: ログを確認するサーバー管理者は、異常な User-Agent(例:
gobuster/3.1.0)からの大量のリクエストに気づく可能性があります。一般的なブラウザを模倣することで、リクエストは正規のユーザーのトラフィックに紛れ込み、手動での調査や自動フラグ付けの可能性が低くなります。 - レート制限の回避(場合による): User-Agent に直接関連するものではありませんが、一部のシステムでは、ブラウザ以外の User-Agent に対してより厳しいレート制限を適用する場合があります。ブラウザとして表示することで、これらのより厳しい制限を回避し、スキャンをより迅速または完全に実行できる可能性があります。
このテクニックは「単純な」フィルターに対して効果的であることに注意することが重要です。より高度な WAF や IDS は、悪意のあるアクティビティを検出するために、リクエストパターン、IP レピュテーション、行動分析などの複数の要因を組み合わせて使用するため、カスタム User-Agent だけでは高度な防御をバイパスするには不十分な場合があります。しかし、これはステルス偵察における基本的かつしばしば必要な最初のステップです。
環境をクリーンアップするために、Python Web サーバーを停止できます。
pkill -f "python3 -m http.server 8080"
このコマンドは、Python Web サーバーを実行しているプロセスを見つけて終了します。
まとめ
この実験では、Web リクエストにおける User-Agent 文字列の重要性と、Gobuster のようなセキュリティツールでどのように使用できるかを学びました。一般的なブラウザの User-Agent 文字列を特定し、最も重要なこととして、Gobuster の-aフラグを使用してスキャン用のカスタム User-Agent を設定しました。この実践的なスキルは、偵察活動をよりステルスかつ効果的にするために不可欠であり、単純な検出メカニズムをバイパスし、正規の Web トラフィックに紛れ込むのに役立ちます。
