はじめに
Nikto は、人気のあるオープンソースのウェブサーバー スキャナーで、6700 を超える潜在的に危険なファイル/プログラム、1250 を超えるサーバーの古いバージョン、270 を超えるサーバーのバージョン固有の問題など、複数の項目に対してウェブサーバーに対して包括的なテストを実行します。
Nikto は標準的な HTTP ウェブサイトを簡単にスキャンできますが、SSL/TLS (HTTPS) を使用するサイトをスキャンするには特定のオプションが必要です。この実験では、SSL/TLS が有効なウェブサイトをスキャンするために Nikto を使用する方法を学びます。テスト目的で、ローカルでホストされたセキュアなウェブサーバーを使用します。SSL スキャンの開始方法、特定のポートへの指示方法、およびスキャン結果における SSL 関連情報の解釈方法を学びます。
HTTPS を使用したターゲットウェブサイトの特定
このステップでは、ターゲットとなるセキュアなウェブサーバーが実行されており、アクセス可能であることを確認します。この実験のセットアップスクリプトは、SSL/TLS を使用するシンプルな Python ウェブサーバーを既に起動しています。これは localhost のポート 4433 でリッスンしています。
サーバーが実行されていることを確認するために、curl コマンドを使用できます。当社のサーバーは自己署名証明書(認証局によって信頼されていない)を使用しているため、信頼されていない証明書であっても処理を続行するように curl に指示するために、-k または --insecure フラグを使用する必要があります。
ターミナルで以下のコマンドを実行してください。
curl -k https://localhost:4433
サーバーのメインページの HTML コンテンツが表示されるはずです。これにより、サーバーがアクティブであり、HTTPS 経由でコンテンツを提供していることが確認できます。
<html><body><h1>Welcome to the Secure Test Server!</h1></body></html>
ターゲットが稼働していることを確認したので、次にスキャンに進むことができます。
-ssl フラグを使用して SSL モードを有効にする
このステップでは、HTTPS サイトのスキャンに -ssl フラグが不可欠である理由を学びます。デフォルトでは、Nikto はポート 80 の標準 HTTP 経由でターゲットをスキャンしようとします。SSL を使用することを指定せずに SSL/TLS 接続を期待するポートを指定した場合、初期通信ハンドシェイクが正しくないため、スキャンは失敗します。
この動作を観察するために、-ssl フラグを 付けずに ポート 4433 のセキュアサーバーに対して Nikto を実行してみましょう。
nikto -h localhost -p 4433
ウェブサーバーが見つからないことを示す出力が表示されるか、エラーメッセージが表示される場合があります。これは、Nikto が HTTPS をリッスンしているポートに対して HTTP で通信しようとしているためです。
- Nikto v2.5.0
---------------------------------------------------------------------------
+ Target IP: 127.0.0.1
+ Target Hostname: localhost
+ Target Port: 4433
---------------------------------------------------------------------------
+ Start Time: ...
---------------------------------------------------------------------------
+ ERROR: No web server found on localhost:4433
---------------------------------------------------------------------------
+ 0 host(s) tested
これは、-ssl フラグの必要性を示しています。このフラグは、Nikto にウェブ要求を SSL/TLS レイヤーでラップするように明示的に指示し、セキュアサーバーとの通信を可能にします。次のステップでは、このフラグを使用して適切なスキャンを実行します。
HTTPS ターゲットに対するスキャンの実行
このステップでは、-ssl フラグを使用して、セキュアなウェブサーバーに対して適切な脆弱性スキャンを実行します。-h (ホスト)、-p (ポート)、および -ssl フラグを組み合わせることで、Nikto に正しいホストとポートに接続し、SSL/TLS 接続を使用するように指示できます。
スキャンを開始するには、ターミナルで以下のコマンドを実行してください。
nikto -h localhost -p 4433 -ssl
Nikto はスキャンを開始します。当社のサーバーは自己署名証明書を使用しているため、Nikto は証明書の発行元が信頼されていないという警告を表示する可能性が高いですが、この場合は予期されることです。その後、スキャンが続行されます。
出力は次のようになります。
- Nikto v2.5.0
---------------------------------------------------------------------------
+ Target IP: 127.0.0.1
+ Target Hostname: localhost
+ Target Port: 4433
+ SSL Info: Self-signed certificate.
+ Start Time: ...
---------------------------------------------------------------------------
+ Server: SimpleHTTP/0.6 Python/3.10.12
+ 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
...
+ 1 host(s) tested
これで、SSL 対応ウェブサイトを Nikto で正常にスキャンできました。
出力における SSL 固有のチェックの確認
このステップでは、前のスキャンの出力を分析して、SSL/TLS 接続に固有の情報を特定します。-ssl フラグが使用されると、Nikto は一般的なウェブの脆弱性をスキャンするだけでなく、サーバーの SSL/TLS 証明書と構成に関する詳細も提供します。
前のステップのコマンドの出力をスクロールバックすると、SSL 証明書に関連する情報が見つかります。この情報を分離するために、スキャンを再実行し、grep を使用して出力をフィルタリングできます。証明書の「Subject」行を検索してみましょう。
nikto -h localhost -p 4433 -ssl | grep "Subject"
このコマンドはスキャンを再度実行しますが、「Subject」という単語を含む行のみを表示します。
+ Subject: C=US, ST=California, L=MountainView, O=LabEx, OU=IT, CN=localhost
この行は、国 (C)、州 (ST)、および共通名 (CN) など、サーバーの SSL 証明書に埋め込まれた詳細を示しています。この情報は、セキュリティ評価中にサーバーの ID を検証するのに役立ちます。Nikto は、暗号スイート情報やその他の SSL 関連の脆弱性もチェックし、セキュアサーバーの構成のより完全な全体像を提供します。
非標準ポートでの SSL モードの強制
このステップでは、通常は暗号化されていないトラフィックを処理するポートであっても、任意のポートで Nikto に SSL を使用するように「強制」する方法を探ります。これは、8080 のような異常なポートで HTTPS を実行している可能性のある、設定ミスのあるサービスを特定するのに役立ちます。
まず、既存のサーバーを停止し、ポート 8080 で新しいサーバーを開始する必要があります。
## Stop the previous server
pkill -f "python3 /home/labex/project/https_server/server.py"
## Create a new server configuration for port 8080
cat << EOF > /home/labex/project/https_server/server_8080.py
import http.server
import ssl
import os
os.chdir(os.path.dirname(os.path.abspath(__file__)))
server_address = ('0.0.0.0', 8080)
httpd = http.server.HTTPServer(server_address, http.server.SimpleHTTPRequestHandler)
httpd.socket = ssl.wrap_socket(httpd.socket,
server_side=True,
certfile='cert.pem',
keyfile='key.pem',
ssl_version=ssl.PROTOCOL_TLS)
httpd.serve_forever()
EOF
## Start the new server in the background and wait a moment
python3 /home/labex/project/https_server/server_8080.py &> /dev/null &
sleep 3
これで、セキュアサーバーがポート 8080 で実行されます。-ssl フラグがない場合、Nikto はこれを標準の HTTP ポートと見なします。-ssl を含めることで、TLS ハンドシェイクを開始するように強制します。
ポート 8080 に対してスキャンを実行します。
nikto -h localhost -p 8080 -ssl
出力は前のスキャンと同様になり、Nikto が非標準ポートに SSL/TLS を使用して正常に接続し、テストを実行したことを確認します。
- Nikto v2.5.0
---------------------------------------------------------------------------
+ Target IP: 127.0.0.1
+ Target Hostname: localhost
+ Target Port: 8080
+ SSL Info: Self-signed certificate.
...
これにより、任意のポートで SSL/TLS サービスをスキャンするために Nikto を使用できることが確認されます。
まとめ
この実験では、Nikto を使用して SSL/TLS が有効なウェブサイトをスキャンする基本的なプロセスを学びました。まず、ターゲットの HTTPS サーバーを特定および検証することから始めました。次に、HTTPS ポートに単に Nikto を向けるだけでは失敗する理由を実際に確認し、SSL/TLS 通信を有効にするには -ssl フラグが必要であることを学びました。
セキュアサーバーに対してスキャンを正常に実行し、証明書の詳細のような SSL 固有の情報を出力で分析し、最終的に非標準ポートで SSL モードを強制する方法を学びました。このスキルは、セキュリティのために HTTPS に依存する最新のウェブアプリケーションに対して徹底的なセキュリティ評価を実施する上で不可欠です。


