はじめに
Nikto は、人気のあるオープンソースのウェブサーバースキャナーであり、6700 を超える潜在的に危険なファイル/プログラム、1250 を超えるサーバーの古いバージョン、270 を超えるサーバーのバージョン固有の問題など、複数の項目に対してウェブサーバーに対して包括的なテストを実行します。
ウェブサーバーをスキャンする場合、特に低速または信頼性の低いネットワーク上、あるいは高負荷のサーバーに対してスキャンを行う場合、リクエストの完了に時間がかかることがあります。デフォルトでは、Nikto は応答を 10 秒間待ちます。サーバーがこれよりも遅い場合、Nikto はタイムアウトエラーを報告し、スキャンを正常に完了できない可能性があります。
この実験 (Lab) では、Nikto の -timeout オプションを使用してリクエストのタイムアウト期間を制御する方法を学びます。これにより、Nikto の動作を調整して、低速または応答性の低いウェブサーバーを正常にスキャンできるようになります。
低速または応答性の低いウェブサーバーの特定
このステップでは、ウェブサーバーが低速かどうかを特定する方法を学びます。スキャンツールでタイムアウトを調整する前に、まずサーバーの通常の応答時間を測定することが重要です。これを行う簡単な方法は curl コマンドを使用することです。
バックグラウンドで意図的に低速なウェブサーバーを起動しました。このサーバーは応答を送信する前に 5 秒間待機します。curl を使用して、このサーバーからの応答を取得するのにかかる時間を測定しましょう。-w フラグは出力のフォーマットを可能にし、%{time_total} はトランザクションの合計時間を保持する変数です。
ポート 8000 で実行されているローカルサーバーの応答時間を測定するために、ターミナルで次のコマンドを実行してください。
curl -o /dev/null -s -w 'Total time: %{time_total}\n' http://localhost:8000
以下のような出力が表示されます。サーバーに追加した人工的な遅延により、時間は 5 秒をわずかに超えるはずです。
Total time: 5.00...
これにより、サーバーが低速であり、応答に数秒以上かかることが確認できます。この情報は、Nikto で適切なタイムアウトを設定するために不可欠です。
短いタイムアウトを秒単位で設定するために -timeout オプションを使用する
このステップでは、Nikto の -timeout オプションについて学びます。このオプションを使用すると、Nikto が諦めてタイムアウトとマークする前に、単一のリクエストが完了するのを待つ秒数を指定できます。デフォルト値は 10 秒です。
設定ミスされたタイムアウトで Nikto がどのように動作するかを理解するために、低速なサーバーに対して意図的に短すぎる値を設定します。サーバーの応答に約 5 秒かかることがわかっているので、タイムアウトを 2 秒に設定します。これにより、スキャンはタイムアウトエラーで失敗します。これは次のステップで観察します。
まず、Nikto のヘルプメニューを使用して -timeout オプションの存在と説明を確認しましょう。nikto -Help の出力を grep にパイプして、特定 のオプションを見つけることができます。
nikto -Help | grep timeout
出力には -timeout オプションとその説明が表示されます。
-timeout <secs> Timeout for requests (default 10 seconds)
これにより、オプションの使用方法が確認できます。次のステップで、実際のスキャンに適用します。
スキャンを実行し、潜在的なタイムアウトエラーを観察する
このステップでは、決定した短いタイムアウト値で Nikto スキャンを実行します。これにより、ターゲットサーバーに対してタイムアウトが不十分な場合に何が起こるかが実証されます。
2 秒のタイムアウトでローカルサーバーをスキャンするには、次のコマンドを実行します。-h フラグはホストを指定し、-p はポートを指定します。
nikto -h localhost -p 8000 -timeout 2
スキャンが実行されると、コンソールに複数のエラーメッセージが表示されます。Nikto はリクエストを作成しようとしますが、サーバーの応答に 5 秒かかるため、2 秒のタイムアウトは毎回超過します。
出力は、これに似たエラーでいっぱいになります。
- Nikto v2.5.0
---------------------------------------------------------------------------
+ Target IP: 127.0.0.1
+ Target Hostname: localhost
+ Target Port: 8000
+ Start Time: ...
---------------------------------------------------------------------------
+ Server: No banner retrieved
+ 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
+ ERROR: Connection timed out
+ ERROR: Connection timed out
... (many more errors) ...
繰り返される ERROR: Connection timed out メッセージは、タイムアウト値が低すぎることを明確に示す兆候です。スキャンの結果は信頼性が低く、多くのテストがスキップされている可能性が高いです。
タイムアウト値を増やして、より信頼性の高いスキャンを実行する
このステップでは、前のステップの問題を修正するために、適切なタイムアウト値を設定します。信頼性の高いスキャンを確保するには、タイムアウトはサーバーの最も長い予想応答時間よりも長くする必要があります。
ステップ 1 の curl テストから、サーバーの応答に約 5 秒かかることがわかっています。安全のために、小さなバッファを追加する必要があります。タイムアウトを 7 秒に設定しましょう。これにより、サーバーはリクエストを処理して応答を送信するのに十分な時間が与えられます。
今回は 7 秒のタイムアウトで Nikto スキャンを再度実行します。
nikto -h localhost -p 8000 -timeout 7
今回は、異なる結果が表示されるはずです。「Connection timed out」エラーなしでスキャンが続行されます。Nikto はサーバーと正しく通信し、テストを実行できるようになります。
出力は、通常の成功したスキャンにより近いものになります。
- Nikto v2.5.0
---------------------------------------------------------------------------
+ Target IP: 127.0.0.1
+ Target Hostname: localhost
+ Target Port: 8000
+ Start Time: ...
---------------------------------------------------------------------------
+ Server: Python/3.10.6 http.server/0.6
+ 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)
+ "robots.txt" not found.
...
タイムアウトエラーがなくなり、サーバーバナーが表示されていることに注意してください。これは、スキャンが現在信頼性高く実行されていることを示しています。
ターゲットネットワークに最適なタイムアウト値を見つける
このステップでは、最適なタイムアウト値を見つけるための戦略について説明します。制御された環境で既知の遅延を使用しましたが、実際のシナリオでは、正確な応答時間はわかりません。
最適なタイムアウトを見つけることはバランスが重要です。
- 短すぎる場合: タイムアウトエラーが発生し、信頼性の低いスキャンになります(ステップ 3 で見たように)。
- 長すぎる場合: サーバーが実際には高速である場合、スキャンが不必要に遅くなる可能性があります。たとえば、通常 1 秒で応答するサーバーに 30 秒のタイムアウトを設定すると、実際に失敗した各リクエストに対して 30 秒待つことになり、全体のスキャン速度が低下します。
良い戦略は次のとおりです。
pingまたはcurlを使用してベースライン測定を実行し、一般的なレイテンシを理解します。- ベースライン測定よりも数秒長いタイムアウトから開始します。
- それでもタイムアウトエラーが表示される場合は、スキャンがスムーズに実行されるまで値を段階的に増やします。
私たちのサーバーでは、7 秒のタイムアウトがうまく機能しました。最後に、わずかに余裕を持たせた 10 秒のタイムアウト(Nikto のデフォルト)でスキャンを実行し、スキャンの合計実行時間を制限する -maxtime オプションも導入しましょう。これは、非常に大きなウェブサイトでスキャンが何時間も実行されないようにするために役立ちます。
nikto -h localhost -p 8000 -timeout 10 -maxtime 60s
このコマンドは、Nikto に対して各リクエストで最大 10 秒待機し、スキャン全体が 60 秒を超える場合は中止するように指示します。この組み合わせにより、個々のリクエストのタイミングとスキャンの合計時間の両方を制御できます。
まとめ
この実験では、信頼性の高いウェブ脆弱性スキャンを実行するために不可欠なスキルである、Nikto でのリクエストタイムアウトを効果的に管理する方法を学びました。
まず、curl コマンドを使用して応答時間を測定し、遅いウェブサーバーを特定しました。次に、Nikto の -timeout オプションを調べ、最初に低すぎる値を設定したところ、接続エラーが発生しました。その後、タイムアウトを適切な値に増やし、スキャンを正常に完了させました。
最後に、スキャンの信頼性と効率性のバランスを取って最適なタイムアウト値を見つける戦略を学び、スキャンの合計実行時間を制御するための関連オプション -maxtime についても紹介しました。これらの設定を適切に構成することで、Nikto スキャンが網羅的かつタイムリーであることを保証できます。


