はじめに
Nikto は、人気のあるオープンソースのウェブサーバー スキャナーで、6700 を超える潜在的に危険なファイル/プログラム、1250 を超えるサーバーの古いバージョン、270 を超えるサーバーのバージョン固有の問題など、複数の項目に対してウェブサーバーに対して包括的なテストを実行します。
Nikto がターゲットサーバーにリクエストを送信する際、デフォルトの「User-Agent」文字列を使用して自身を識別します。この文字列はファイアウォールや侵入検知システムによって容易に検出され、スキャンがブロックされる可能性があります。よりステルス性の高いスキャンを実行するには、一般的なウェブブラウザを模倣するように User-Agent を「スプーフィング」または変更できます。
この実験では、Nikto のデフォルトの User-Agent を特定し、次に -useragent オプションを使用して変更し、スキャンを目立たなくする方法を学びます。
テストスキャンからデフォルトの Nikto User-Agent を特定する
このステップでは、ローカルウェブサーバーに対して基本的な Nikto スキャンを実行し、そのデフォルトの User-Agent 文字列を確認します。バックグラウンドでシンプルな Python ウェブサーバーが起動されており、すべての着信リクエストが access.log というファイルに記録されます。
まず、ポート 8000 で実行されているローカルサーバーを対象に、標準的な Nikto スキャンを実行します。ターミナルを開き、以下のコマンドを実行してください。
nikto -h http://localhost:8000
Nikto は一連のテストを実行します。ここではスキャン結果自体には興味がなく、それが作成するログエントリに注目します。
スキャンが完了したら、ログファイルの内容を表示して、サーバーが Nikto のリクエストをどのように記録したかを確認します。cat コマンドを使用してください。
cat ~/project/access.log
Nikto のデフォルトの User-Agent を含むログエントリが表示されるはずです。これは、スキャナーを明確に識別するもので、以下のようなものになります。
127.0.0.1 - "GET / HTTP/1.1" Mozilla/5.0 (X11; Linux x86_64) Nikto/2.5.0 (Evasions:None) (Test:Port Check)
127.0.0.1 - "GET /icons/blank.gif HTTP/1.1" Mozilla/5.0 (X11; Linux x86_64) Nikto/2.5.0 (Evasions:None) (Test:Port Check)
... (other log entries) ...
文字列の Nikto/2.5.0 の部分に注目してください。これが、次のステップで隠したいシグネチャです。
模倣する一般的なブラウザ User-Agent 文字列を選択する
このステップでは、一般的なウェブブラウザの User-Agent 文字列を選択します。目標は、スキャントラフィックを自動化ツールからのものではなく、通常のユーザーからのもののように見せることです。これにより、既知のスキャナー User-Agent に基づいてトラフィックをブロックする単純な検出ルールを回避するのに役立ちます。
オンラインには、現在の User-Agent 文字列を見つけるためのリソースが多数あります。この実験では、Windows マシン上の Firefox ブラウザの典型的な User-Agent を使用します。
使用する文字列は次のとおりです。
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0
このステップは純粋に情報提供のみです。コマンドを実行する必要はありません。次のステップで使用するため、上記の文字列に慣れておいてください。
新しい文字列を設定するために -useragent オプションを使用する
このステップでは、新しい偽装された User-Agent を使用するように Nikto コマンドを構築する方法を学びます。Nikto はこの目的のために特定のコマンドラインオプションを提供しています:-useragent。
このオプションの構文は簡単です。コマンドに -useragent を追加し、その後に使用したい新しい文字列を続けます。User-Agent 文字列にはスペースや特殊文字が含まれるため、文字列全体を二重引用符 (") で囲むことが非常に重要です。
前のステップで選択した Firefox User-Agent を使用してローカルサーバーをスキャンするためのコマンドは、次のように構築します。
nikto -h http://localhost:8000 -useragent "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0"
このステップでは、コマンドがどのように構築されるかを理解するだけで十分です。次のステップで実行します。
スプーフィングされた User-Agent でスキャンを実行する
このステップでは、カスタム User-Agent を使用して Nikto スキャンを実行します。新しいスキャンの結果のみを確認するために、古いログファイルを最初にクリアすることが良い習慣です。
以下のコマンドで access.log ファイルをクリアします。
> ~/project/access.log
このコマンドはファイルを上書きし、空にします。次に、-useragent オプションと Firefox 文字列を使用して Nikto スキャンを実行します。
nikto -h http://localhost:8000 -useragent "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0"
Nikto は以前と同じスキャンを実行しますが、送信するすべてのリクエストは、デフォルトの Nikto のものに代わって Firefox User-Agent 文字列を運びます。スキャンが完了するまで実行させてください。
サーバーログまたはプロキシで新しい User-Agent を検証する
この最終ステップでは、User-Agent のスプーフィングが成功したことを検証します。前回のスキャン中に記録された User-Agent を確認するために、サーバーのログファイルを再度確認します。
cat コマンドを使用して access.log の内容を表示します。
cat ~/project/access.log
今回は、出力が異なるはずです。ログに「Nikto」が表示される代わりに、指定した Firefox User-Agent 文字列が表示されます。
127.0.0.1 - "GET / HTTP/1.1" Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0
127.0.0.1 - "GET /icons/blank.gif HTTP/1.1" Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0
... (other log entries) ...
ご覧のとおり、ログには標準的な Firefox User-Agent が表示されています。「Nikto」という単語は消え、サーバーの基本的なログからスキャナーの識別情報を正常に隠すことができました。
まとめ
この実験では、セキュリティスキャンをよりステルスにするための基本的なテクニックを学びました。Nikto の User-Agent 文字列をスプーフィングして、通常のウェブブラウザを模倣することに成功しました。
以下の方法を学びました。
- ベースラインを確立するためにデフォルトの Nikto スキャンを実行する。
- サーバーログを検査して、デフォルトの Nikto User-Agent を特定する。
-useragentコマンドラインオプションを使用してカスタム文字列を指定する。- スプーフィングされた User-Agent で新しいスキャンを実行する。
- サーバーログを再度確認して変更を検証する。
このスキルは、セキュリティシステムによってすぐにブロックされたり検出されたりすることなく脆弱性評価を実行する必要があるペネトレーションテスターやセキュリティ専門家にとって不可欠です。


