はじめに
Nikto は、人気のあるオープンソースのウェブサーバー スキャナーで、ウェブサーバーに対して包括的なテストを実行します。6700 を超える潜在的に危険なファイル/プログラム、1250 を超えるサーバーの古いバージョン、270 を超えるサーバーのバージョン固有の問題などをチェックします。
デフォルトでは、Nikto はウェブサーバーのコンテンツで見つかった IP アドレスに対してリバース DNS ルックアップを実行します。これは関連するホスト名の発見に役立つ場合がありますが、特に大規模なネットワークや応答しないターゲットをスキャンする場合、スキャン速度を大幅に低下させる可能性もあります。
この実験では、-nolookup オプションを使用してこの機能を無効にする方法を学び、スキャン時間を比較してパフォーマンスのメリットを理解します。
-nolookup オプションの目的を理解する
このステップでは、Nikto の -nolookup オプションについて学びます。
Nikto がウェブサーバーをスキャンする際、サーバーの設定ファイル、ログ、またはウェブページ内に IP アドレスを見つけることがあります。デフォルトでは、Nikto はこれらの各 IP に対してリバース DNS ルックアップを試み、関連するホスト名を見つけようとします。このプロセスは時間がかかることがあります。
-nolookup オプションは、Nikto にこのステップを完全にスキップするように指示します。これにより、スキャンが大幅に高速化される可能性がありますが、ターゲットに関連付けられた他のホスト名に関する潜在的に価値のある情報を逃すことになります。
このオプションやその他のオプションは、Nikto のヘルプメニューを表示することで確認できます。早速実行してみましょう。
ターミナルで以下のコマンドを実行してください。
nikto -Help
出力内容をスクロールして、-nolookup オプションを見つけてください。短い説明とともにリストされているはずです。
...
-nolookup 名前のルックアップをスキップする
...
-nolookup が何をするのか理解できたので、実際に動作を確認してみましょう。
IP アドレスを使用してターゲットに対してベースライン スキャンを実行する
このステップでは、ローカル ウェブサーバーに対して標準的な Nikto スキャンを実行します。スキャンにかかる時間を測定するために time コマンドを使用します。これは比較のためのベースラインとして機能します。
実験環境では、127.0.0.1 で実行されているシンプルな Nginx ウェブサーバーが既に起動されています。これをターゲットとして使用します。
スキャンを実行して時間を計測するには、以下のコマンドを実行してください。
time nikto -h 127.0.0.1
スキャンが開始され、以下のような出力が表示されます。完了までに 1 分ほどかかる場合があるため、しばらくお待ちください。
- Nikto v2.5.0
---------------------------------------------------------------------------
+ Target IP: 127.0.0.1
+ Target Hostname: localhost
+ Target Port: 80
+ Start Time: ...
---------------------------------------------------------------------------
+ Server: nginx/1.18.0 (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)
+ Retrieved x-powered-by header: PHP/8.1.2
+ Allowed HTTP Methods: GET, HEAD
+ Public HTTP Methods: GET, HEAD
+ OSVDB-3233: /index.html: Server may leak inodes via ETags, header found with file /var/www/html/index.html inode 262204, size 612, mtime ...
+ 7554 requests: 0 error(s) and 7 item(s) reported on remote host
+ End Time: ... (15 seconds)
---------------------------------------------------------------------------
+ 1 host(s) tested
real 0m15.543s
user 0m14.987s
sys 0m0.312s
最後の 3 行、つまり time コマンドの出力に特に注意してください。real 時間は経過した総経過時間です。次のステップのためにこの値を書き留めておいてください。
-nolookup フラグを使用して同じスキャンを再度実行する
ベースライン実行時間が把握できたので、全く同じスキャンを -nolookup フラグを追加して実行してみましょう。これにより、Nikto はリバース DNS ルックアップを実行しなくなります。
ターミナルで以下のコマンドを実行してください。
time nikto -h 127.0.0.1 -nolookup
スキャンが再度実行されます。Nikto の出力自体は前回のスキャンと非常に似ていますが、time コマンドによって報告される実行時間に違いが見られるはずです。
- Nikto v2.5.0
---------------------------------------------------------------------------
+ Target IP: 127.0.0.1
+ Target Hostname: 127.0.0.1
+ Target Port: 80
+ Start Time: ...
---------------------------------------------------------------------------
+ Server: nginx/1.18.0 (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)
+ Retrieved x-powered-by header: PHP/8.1.2
+ Allowed HTTP Methods: GET, HEAD
+ Public HTTP Methods: GET, HEAD
+ OSVDB-3233: /index.html: Server may leak inodes via ETags, header found with file /var/www/html/index.html inode 262204, size 612, mtime ...
+ 7554 requests: 0 error(s) and 7 item(s) reported on remote host
+ End Time: ... (8 seconds)
---------------------------------------------------------------------------
+ 1 host(s) tested
real 0m8.123s
user 0m7.890s
sys 0m0.201s
出力の Target Hostname が localhost から 127.0.0.1 に変わっていることに注意してください。これは、Nikto が IP をホスト名に解決するためのリバース ルックアップを実行しなかったためです。また、新しい real 時間も記録しておいてください。
両方のスキャンの実行時間を比較する
このステップでは、前の 2 つのステップの結果を分析し、-nolookup フラグのパフォーマンスへの影響を確認します。
両方のコマンドの real 時間を見てみましょう。
スキャン 1 (ベースライン):
real 0m15.543s (あなたの時間は若干異なる場合があります)
スキャン 2 (-nolookup 付き):
real 0m8.123s (あなたの時間は若干異なる場合があります)
ご覧のとおり、-nolookup フラグを使用したスキャンは大幅に速く完了しました。この例では、ほぼ 2 倍の速さでした。DNS ルックアップがタイムアウトする可能性のある、遅いまたは誤って設定されたネットワーク上の複数のホストまたはターゲットをスキャンする場合、パフォーマンスの向上はさらに劇的になる可能性があります。
この単純な比較は、Nikto スキャンで DNS ルックアップを無効にすることによる直接的なパフォーマンス上の利点を示しています。
このパフォーマンス最適化を使用するタイミングを分析する
最終ステップでは、トレードオフについて議論し、-nolookup オプションを使用するのが適切かどうかを判断します。
-nolookup は明確なパフォーマンス向上をもたらしますが、情報を見逃す可能性があるという代償が伴います。リバース DNS ルックアップは、IP アドレスに関連付けられた他のホスト名や仮想ホストを発見するのに役立ち、これは包括的なセキュリティ評価にとって非常に重要になる可能性があります。
では、-nolookup はいつ使用すべきでしょうか?
- 初期スキャンとトリアージ: 大量のホストをスキャンしており、潜在的な脆弱性の概要を迅速に把握したい場合。この段階では、詳細な情報よりも速度が重要です。
- IP アドレスによるスキャン: ターゲットリストが IP アドレスのみで構成されており、関連するドメイン名の発見に関心がない場合、
-nolookupを使用するのは論理的な選択です。 - 信頼性の低いネットワーク: DNS クエリが失敗したりタイムアウトしたりする可能性のある、遅いまたは信頼性の低いネットワーク接続でスキャンする場合、
-nolookupはスキャンが停滞するのを防ぐことができます。 - 速度が重要な場合: ペネトレーションテストコンペティションや迅速なインシデント対応など、時間的制約のある状況では、このオプションから得られる速度は非常に価値があります。
-nolookup を避けるべきなのはいつですか?
- 包括的な評価: 特定のターゲットに対して完全で詳細なセキュリティ監査を実行する場合、可能な限り多くの情報を取得したいと考えます。DNS ルックアップを通じて発見されたホスト名は、追加の攻撃対象領域を明らかにする可能性があります。
- 仮想ホストの発見: ターゲット IP が複数のウェブサイト (仮想ホスト) をホストしていると疑われる場合は、Nikto にルックアップを実行させて特定するのを支援する必要があります。
速度と網羅性の間のこのトレードオフを理解することで、さまざまなシナリオで Nikto をより効果的に使用できます。
まとめ
この実験では、Nikto スキャンの速度を最適化する方法を学びました。まず、リバース DNS ルックアップを無効にする -nolookup フラグの目的を理解しました。
次に、ベースラインスキャンと -nolookup オプションを使用した 2 回目のスキャンを実行しました。time コマンドで実行時間を比較することで、大幅なパフォーマンス向上が観察されました。
最後にトレードオフを分析し、-nolookup は迅速な大規模スキャンや速度が優先される場合に最適であり、包括的な評価のための完全なスキャンでは、可能な限り多くの情報を収集するためにこのフラグを省略すべきであると結論付けました。


