はじめに
Nikto は、人気のあるオープンソースのウェブサーバー スキャナーであり、6700 を超える潜在的に危険なファイル/プログラム、1250 を超えるサーバーの古いバージョン、および 270 を超えるサーバーのバージョン固有の問題を含む、複数の項目に対してウェブサーバーに対して包括的なテストを実行します。
一般的なウェブサーバーの構成はバーチャルホスティングです。これは、1 つの IP アドレスを持つ単一のサーバーが複数のウェブサイト(例:site1.example.com および site2.example.com)をホストするものです。サーバーの IP アドレスを直接スキャンすると、Nikto のようなスキャナーは、サーバーに構成されている デフォルト のウェブサイトのみをテストし、他のサイトを見逃してしまう可能性があります。
この実験(Lab)では、Nikto の -vhost オプションを使用して、サーバー上のバーチャルホストのいずれかを具体的にターゲットにする方法を学びます。これにより、スキャンが正確かつ集中的に行われるようになります。
1 つの IP アドレスで複数のウェブサイトをホストしているサーバーを特定する
このステップでは、私たちの環境にあるウェブサーバーが、同じ IP アドレス(127.0.0.1)で 2 つの異なるウェブサイトをホストしていることを確認します。これは、curl コマンドを使用して、異なる Host ヘッダーを持つ HTTP リクエストを送信することで行うことができます。Host ヘッダーは、クライアントがアクセスしたいウェブサイトをウェブサーバーに伝えます。
まず、site1.labex.io にリクエストを送信してみましょう。--header "Host: site1.labex.io" オプションは、curl に指定されたホストヘッダーを送信するように指示します。
curl --header "Host: site1.labex.io" http://127.0.0.1
最初のサイトの HTML コンテンツが表示されるはずです。
<html><body><h1>Welcome to Site 1</h1></body></html>
次に、Host ヘッダーを変更して、site2.labex.io にリクエストを送信してみましょう。
curl --header "Host: site2.labex.io" http://127.0.0.1
今回は、2 番目のサイトのコンテンツが表示されます。
<html><body><h1>This is Site 2</h1><p>This site has a test.txt file.</p></body></html>
これにより、127.0.0.1 のサーバーがホスト名に基づいて異なるコンテンツを提供していることが確認できます。これがバーチャルホスティングの定義です。
特定ターゲットのバーチャルホストのホスト名を見つける
このステップでは、ローカルサーバーに設定されているホスト名を確認します。実際のシナリオでは、DNS 列挙や SSL 証明書の分析などの偵察技術を使用してバーチャルホストを見つけます。この実験(Lab)では、ホスト名は /etc/hosts ファイルにあらかじめ設定されています。このファイルは、オペレーティングシステムがホスト名を IP アドレスにマッピングするために使用されます。
cat コマンドを使用して /etc/hosts ファイルの内容を確認し、マッピングを見てみましょう。
cat /etc/hosts
出力には、標準の localhost マッピングに加えて、バーチャルホストのために追加した 2 つのカスタムエントリが表示されます。
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
127.0.0.1 site1.labex.io
127.0.0.1 site2.labex.io
この出力から、site1.labex.io と site2.labex.io が、ターゲットスキャンに使用できるホスト名であることを確認できます。次のステップでは、site2.labex.io をターゲットにします。
-vhost オプションを使用してターゲットのホスト名を指定する
このステップでは、特定のバーチャルホストをスキャンするために使用される Nikto のオプションについて学びます。デフォルトでは、nikto -h 127.0.0.1 は最初に設定されたバーチャルホスト(site1.labex.io)をスキャンします。Nikto に別のバーチャルホストをスキャンするように指示するには、-vhost (または -host+)オプションを使用する必要があります。
このオプションは、Nikto にすべての HTTP リクエストの Host ヘッダーで提供されたホスト名を使用するように指示し、ウェブサーバーがリクエストを正しいウェブサイトにルーティングすることを保証します。
構文は次のとおりです:nikto -h <IP_ADDRESS> -vhost <HOSTNAME>
フルスキャンを実行せずに簡単なテストを行ってみましょう。-Display V オプションを使用して詳細な出力を表示し、スキャンの有効な設定を確認できます。ここでは site2.labex.io をターゲットにします。
nikto -h 127.0.0.1 -vhost site2.labex.io -Display V
出力にはスキャン設定の詳細が表示されます。Host ヘッダーの値を確認して、正しく設定されていることを確認してください。
...
---------------------------------------------------------------------------
- Nikto 2.x
---------------------------------------------------------------------------
...
- Scan Options:
...
Host -> 127.0.0.1
...
VHost -> site2.labex.io
...
- Headers:
...
Host: site2.labex.io
...
---------------------------------------------------------------------------
+ テスト対象ホスト数: 1
出力には、Nikto がリクエストで Host: site2.labex.io を使用することが明確に示されており、これはまさに私たちが望むものです。
vhost フラグを使用してサーバーIP に対してスキャンを実行する
-vhost オプションの仕組みを理解したところで、ターゲットのバーチャルホスト site2.labex.io に対してフルスキャンを実行する時間です。
ターミナルで以下のコマンドを実行してください。Nikto が様々なテストを実行するため、スキャンが完了するまで数分かかります。
nikto -h 127.0.0.1 -vhost site2.labex.io
スキャンが開始されると、以下のような出力が表示されます。Target Host が site2.labex.io と表示されていることに注意してください。これにより、正しいバーチャルホストをスキャンしていることが確認できます。
- Nikto v2.5.0
---------------------------------------------------------------------------
+ Target IP: 127.0.0.1
+ Target Hostname: site2.labex.io
+ Target Port: 80
+ Start Time: ...
---------------------------------------------------------------------------
+ Server: Apache/2.4.52 (Ubuntu)
+ The anti-clickjacking X-Frame-Options header is not present.
+ The X-XSS-Protection header is not defined. This header can hint to the user agent to protect against some forms of XSS
+ The X-Content-Type-Options header is not set. This could allow the user agent to render the content of the site in a different fashion to the MIME type
+ No CGI directories found (use '-C all' to force check all possible dirs)
+ /test.txt: A text file was found.
+ 7 requests: 0 error(s) and 5 item(s) reported on remote host
+ End Time: ...
+ 1 host(s) tested
+ /test.txt: A text file was found. という行に注目してください。このファイルは site2.labex.io にのみ存在するため、スキャンが正しくターゲットされていることをさらに確認できます。
ターゲットとした vhost に固有の結果を確認する
最終ステップとして、結果の違いを示すために、今回は -vhost フラグを 付けずに スキャンを実行します。これにより、バーチャルホスティング環境で特定のサイトを正確にスキャンするには -vhost オプションが不可欠であることが証明されます。
サーバーの IP アドレスに対して標準的な Nikto スキャンを実行します。
nikto -h 127.0.0.1
この新しいスキャンからの出力を観察してください。
- Nikto v2.5.0
---------------------------------------------------------------------------
+ Target IP: 127.0.0.1
+ Target Hostname: localhost
+ Target Port: 80
+ Start Time: ...
---------------------------------------------------------------------------
+ Server: Apache/2.4.52 (Ubuntu)
...
(その他の検出結果)
...
+ End Time: ...
+ テスト対象ホスト数: 1
この出力を前のステップのスキャンと比較してください。2 つの重要な違いに気づくでしょう。
Target Hostnameがサーバーのデフォルトであるlocalhost(または127.0.0.1)になりました。- 検出結果
+ /test.txt: A text file was found.がありません。これは、test.txtがデフォルトサイト(site1.labex.io)に存在せず、このスキャンはsite2.labex.ioをターゲットにしていないためです。
この比較により、-vhost なしでは site2.labex.io に固有の脆弱性や情報を見逃していたことが明確に示されます。
まとめ
この実験では、Web サーバーの脆弱性スキャンにおける重要な技術を学びました。バーチャルホストとは何か、そしてセキュリティ評価中に特別な対応が必要な理由を理解しました。
以下の実践を行いました。
curlとカスタムHostヘッダーを使用して、同じ IP アドレス上の異なるウェブサイトを手動で検査しました。- Nikto の
-vhostオプションの目的を特定しました。 nikto -h <IP> -vhost <HOSTNAME>を使用して、特定のバーチャルホストに対してターゲットスキャンを実行しました。- ターゲットスキャンとデフォルトスキャンの結果を比較し、この技術の重要性を理解しました。
このスキルは、サーバー上のすべての Web アプリケーションが、デフォルトのものだけでなく、徹底的にテストされていることを保証するために、あらゆるペネトレーションテスターまたはセキュリティアナリストにとって不可欠です。


