はじめに
Nikto は、人気のあるオープンソースのウェブサーバー スキャナーで、6,700 を超える潜在的に危険なファイル/プログラム、1,250 を超えるサーバーの古いバージョン、270 を超えるサーバーのバージョン固有の問題など、複数の項目に対してウェブサーバーに対して包括的なテストを実行します。
この文脈におけるプロキシとは、ツール (Nikto) とターゲットサーバーの間に配置される仲介サーバーのことです。Burp Suite、OWASP ZAP、または mitmproxy のようなツールが一般的に使用されます。Nikto のトラフィックをプロキシ経由でルーティングすることは、セキュリティ専門家にとって強力なテクニックです。これにより、スキャナーが送信しているリクエストと受信しているレスポンスを正確に確認できます。これは、スキャンのデバッグ、スキャナーの動作の理解、さらにはセキュリティ対策を回避するためにトラフィックをリアルタイムで変更するのに非常に役立ちます。
この実験では、ローカルプロキシのセットアップ方法、Nikto をそれに設定する方法、スキャンを実行する方法、そして傍受したトラフィックを分析する方法を学びます。プロキシとして mitmproxy を使用し、ターゲットとしてシンプルなローカル Python ウェブサーバーを使用します。
Burp Suite や OWASP ZAP のようなローカルプロキシの設定
このステップでは、スキャンターゲットとして機能するシンプルなウェブサーバーを起動し、次にトラフィックを傍受するための軽量なコマンドラインプロキシである mitmproxy を起動します。すべての操作はターミナルで行います。
まず、基本的な Python ウェブサーバーを起動しましょう。このサーバーは、現在のディレクトリ ~/project からシンプルな index.html ファイルをホストします。同じターミナルを引き続き使用できるように、ポート 8000 でバックグラウンドで実行します。
以下のコマンドを実行してください。
python3 -m http.server 8000 &
コマンドの末尾にある & は、プロセスをバックグラウンドで実行します。プロセス ID を示す出力が表示されるはずです。
次に、プロキシを起動しましょう。ここでは mitmproxy のウェブベースインターフェースである mitmweb を使用します。これにより、キャプチャされたトラフィックをユーザーフレンドリーな方法で表示できます。デフォルトではポート 8080 でプロキシトラフィックをリッスンし、ポート 8081 でウェブインターフェースを提供します。
バックグラウンドで mitmweb を起動するには、次のコマンドを実行します。
mitmweb --web-host 0.0.0.0 &
mitmweb が起動する際にいくつかの出力が表示されます。これで、ポート 8000 で実行中のターゲットサーバーと、ポート 8080 で実行中のプロキシが準備できました。プロキシのトラフィックは、ラボ環境でブラウザを開き、http://127.0.0.1:8081 にアクセスすることで表示できます。現時点では、何も表示されません。
Nikto をプロキシで使用するように設定する (-useproxy)
このステップでは、先ほど起動した mitmproxy インスタンスを通じて Nikto がトラフィックを送信するように指示する方法を学びます。Nikto にはこの目的のための専用コマンドラインオプション -useproxy があります。
このオプションの構文は -useproxy http://<proxy_host>:<proxy_port> です。私たちの mitmproxy はローカルマシン (127.0.0.1) のポート 8080 で実行されているため、正しい URL は http://127.0.0.1:8080 となります。
完全なスキャンを実行する前に、Nikto がプロキシ経由でターゲットサーバーに接続できることを確認するために、簡単なテストを実行しましょう。ここでは -Plugins '@@NONE' オプションを使用します。これは、Nikto に接続してサーバーバナーを表示するように指示し、脆弱性テストは実行しないようにします。これは、プロキシ設定を検証するための迅速かつ効果的な方法です。
ターミナルで以下のコマンドを実行してください。
nikto -h 127.0.0.1 -p 8000 -useproxy http://127.0.0.1:8080 -Plugins '@@NONE'
以下のような出力が表示され、Nikto のバナーとターゲットサーバーに関する情報が表示されるはずです。
- Nikto v2.x.x
---------------------------------------------------------------------------
+ Target IP: 127.0.0.1
+ Target Hostname: 127.0.0.1
+ Target Port: 8000
+ Start Time: ...
---------------------------------------------------------------------------
+ Server: SimpleHTTP/0.6 Python/3.10.6
+ END TIME: ...
---------------------------------------------------------------------------
+ 1 host(s) tested
これで、ブラウザで http://127.0.0.1:8081 の mitmweb インターフェースを確認すると、Nikto からキャプチャされた最初のリクエストが表示されます。これは、プロキシ設定が正しく機能していることを確認します。
設定したプロキシ経由でスキャンを実行する
このステップでは、プロキシ設定が検証されたので、Nikto で実際のスキャンを実行します。これにより大量のトラフィックが生成され、そのすべてが mitmproxy を経由してルーティングされ、ログに記録されます。
この実験ではスキャン時間を妥当なものにするために、-Tuning 1 オプションを使用します。Nikto のチューニングオプションは、実行されるテストの種類を制御します。-Tuning 1 は「Interesting File / Seen in Log」チェックに焦点を当てており、これは良い出発点となります。
スキャンを開始するには、以下のコマンドを実行してください。
nikto -h 127.0.0.1 -p 8000 -useproxy http://127.0.0.1:8080 -Tuning 1
Nikto はターゲットサーバーのスキャンを開始します。進捗状況と発見された内容はターミナルに直接表示されます。出力は、発見内容に応じて以下のようなものになる可能性があります。
- Nikto v2.x.x
---------------------------------------------------------------------------
+ Target IP: 127.0.0.1
+ Target Hostname: 127.0.0.1
+ Target Port: 8000
+ Start Time: ...
---------------------------------------------------------------------------
+ Server: SimpleHTTP/0.6 Python/3.10.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
...
+ /: The server returns the following message when a request for a non-existent page is made: b'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"\n "http://www.w3.org/TR/html4/strict.dtd">\n<html>\n <head>\n <meta http-equiv="Content-Type" content="text/html;charset=utf-8">\n <title>Error response</title>\n </head>\n <body>\n <h1>Error response</h1>\n <p>Error code: 404.</p>\n <p>Message: File not found.</p>\n <p>Error code explanation: 404 - Nothing matches the given URI.</p>\n </body>\n</html>'
...
+ END TIME: ...
---------------------------------------------------------------------------
+ 1 host(s) tested
スキャンが実行されている間、mitmweb のブラウザタブに切り替えて、リクエストがリアルタイムで表示されるのを確認できます。
プロキシの HTTP 履歴で Nikto のトラフィックを観察する
このステップでは、mitmproxy によってキャプチャされたトラフィックの分析に焦点を当てます。ここでプロキシを使用する真の価値が明らかになります。このステップでは新しいコマンドは必要ありません。ブラウザで mitmweb インターフェースを使用します。
http://127.0.0.1:8081 で実行されている mitmweb のブラウザタブに移動してください。長いウェブリクエストのリストが表示されるはずです。このリストの各エントリは、Nikto がターゲットサーバーに対して実行した特定のテストです。
左側のリストでいずれかのリクエストをクリックしてください。右側のパネルが更新され、その特定のリクエストとその対応するレスポンスの詳細が表示されます。
インターフェースを探索してください。
- Request Tab: ここでは、Nikto によって送信された正確な HTTP リクエストを確認できます。以下の点に注意してください。
- リクエストライン(例:
GET /some/test/file.html HTTP/1.1)。 - ターゲットサーバーを指す
Hostヘッダー。 - クライアントを
Niktoとして識別するUser-Agentヘッダー。
- リクエストライン(例:
- Response Tab: このタブには、サーバーからの完全な応答が表示されます。HTTP ステータスコード(例:
200 OKまたは404 Not Found)、レスポンスヘッダー、およびレスポンスボディを確認できます。
いくつかのリクエストをクリックして、数分間探索してください。Nikto が一般的な管理ディレクトリ(/admin/ など)にアクセスしようとしたり、バックアップファイル(/index.html.bak など)を確認したり、その他の標準的なチェックを実行したりする様子が見られます。このトラフィックを観察することで、脆弱性スキャナーがどのように動作するかについての深い理解を得ることができます。
プロキシがスキャン結果にどのように影響するかを分析する
このステップでは、プロキシの使用がスキャンにどのように影響する可能性があるかを分析します。これを行うには、比較のためのベースラインが必要です。同じ Nikto スキャンを再度実行しますが、今回はプロキシを 使用せずに 実行します。
ステップ 3 と同じスキャンコマンドを実行しますが、-useproxy オプションは省略します。
nikto -h 127.0.0.1 -p 8000 -Tuning 1
ターミナルで出力を観察してください。次に、このスキャンの結果とステップ 3 のプロキシ経由のスキャンの結果を比較してください。私たちの単純な実験環境では、ファイアウォールやその他のセキュリティシステムが配置されていないため、結果は同一であるはずです。
では、プロキシの目的は何でしょうか?
- 可視性(デバッグ): 前のステップで見たように、主な利点は可視性です。スキャンが失敗したり予期しない結果を生成したりした場合、何がうまくいっていないかを理解するために、まずプロキシを確認することになります。生の要求と応答を確認できることは、トラブルシューティングに不可欠です。
- パフォーマンス: プロキシはネットワークトラフィックに追加の「ホップ」を追加するため、わずかな遅延が発生する可能性があります。非常に大規模なスキャンの場合、これにより合計スキャン時間がわずかに増加する可能性があります。
- 変更(高度): 高度なプロキシは、トラフィックを変更するように設定できます。たとえば、
User-Agentを「Nikto」から一般的なブラウザ文字列に変更するルールを設定できます。これは、Nikto ユーザーエージェントに基づいてリクエストをブロックする単純な Web アプリケーションファイアウォール(WAF)を回避するために使用できます。この実験では変更を行いませんが、この機能の理解は重要です。
要約すると、この実験では、プロキシの主な効果は、スキャンプロセスへの「中間者」ビューを提供することであり、これはセキュリティテストの基本的なスキルです。
まとめ
この実験では、Nikto を使用した Web 脆弱性スキャンを実行中に、プロキシを活用する方法を習得しました。
まず、ターゲットとして単純な Python Web サーバーと、インターセプトプロキシとしての mitmproxy を含む、必要な環境をセットアップしました。次に、Nikto の -useproxy コマンドラインオプションを使用して、すべてのスキャン トラフィックをプロキシ経由でルーティングする方法を学びました。
スキャンを実行し、mitmweb インターフェースでトラフィックを観察することで、Nikto が送信するリクエストの種類と受信する応答を直接把握することができました。最後に、プロキシなしで比較スキャンを実行することで、プロキシがスキャンにどのように影響するかを分析し、このコンテキストにおける主な役割は、分析とデバッグのための重要な可視性を提供することであると結論付けました。これは、セキュリティ専門家がテストツールをより良く理解し、制御するために使用する基本的なテクニックです。


