Webサーバーのセキュリティを強化するための第一歩
Niktoとは?🤔
Nikto(ニクト)は、オープンソース(GPL)で開発されているWebサーバー脆弱性スキャナーです。WebサーバーやWebアプリケーションに潜む既知の脆弱性や設定不備を検出することを目的としています。 具体的には、以下のような項目をチェックします。
- 危険な可能性のあるファイルやプログラムの存在
- 古いバージョンのサーバーソフトウェア
- サーバーソフトウェアのバージョン固有の問題
- サーバー設定の問題(例:インデックスファイルの複数存在、HTTPサーバーオプション)
- インストールされているWebサーバーやソフトウェアの特定
Niktoは、Chris Sullo氏によって開発され、現在も活発に開発が続けられており、脆弱性データベースやプラグインは頻繁に更新されています。これにより、最新の脅威に対応したスキャンが可能です。世界中のセキュリティ専門家やペネトレーションテスター、システム管理者に広く利用されています。
⚠️ 注意点
Niktoは高速なスキャンを目指しているため、ログファイルや侵入検知システム(IDS/IPS)にはっきりとスキャン活動が記録されます。ステルス性は低いため、「隠密な」スキャンには向いていません。しかし、IDS回避技術(LibWhiskerの機能を利用)もサポートされているため、IDSのテストなどに利用することも可能です。
検出されるすべての項目が必ずしもセキュリティ上の問題であるとは限りません。「情報のみ (info only)」として分類される項目もあり、これらは直接的な脆弱性ではないものの、管理者が把握していないサーバー上の情報を示唆する場合があります。
Niktoの特徴 ✨
- オープンソース: 無料で利用でき、ライセンス費用はかかりません。ソースコードが公開されており、カスタマイズも可能です。
- 包括的なスキャン: 7000以上の危険なファイル/プログラム、1250以上のサーバーの旧バージョン、270以上のサーバーのバージョン固有の問題をチェックします。
- 設定ミスの検出: 複数のインデックスファイルの存在や、不適切なHTTPサーバーオプションなど、設定上の問題を発見します。
- ソフトウェアの特定: HTTPヘッダー、favicon、特定のファイルから、インストールされているWebサーバーやソフトウェアを特定しようと試みます。
- 頻繁な更新: 脆弱性データベースとプラグインは頻繁に更新され、
-update
オプションで簡単に最新の状態に保てます。 - SSL/TLSサポート: HTTPSサイトのスキャンやSSL/TLS設定のチェックに対応しています(OpenSSLが必要)。
- プロキシサポート: HTTPプロキシ経由でのスキャンが可能です。
- 認証サポート: Basic認証やNTLM認証が必要なサイトのスキャンに対応しています。
- 柔軟な出力形式: スキャン結果をテキスト(TXT)、CSV、HTML、XML、JSON、NBE (Nessus)、SQLなど、様々な形式で保存できます。
- スキャン調整機能 (Tuning): 特定の種類のテストのみを実行したり、除外したりすることができます。
- プラグインシステム: 機能はプラグインによって提供されており、特定のプラグインのみを実行したり、カスタムプラグインを追加したりできます。
- クロスプラットフォーム: Perlで書かれているため、Perl実行環境があればLinux、macOS、Windowsなど様々なOSで動作します。
Niktoのインストール 💻
NiktoはPerlで書かれているため、実行にはPerlインタープリターが必要です。多くのLinuxディストリビューションやmacOSにはデフォルトでPerlがインストールされています。
Linux (Debian/Ubuntu系)
パッケージマネージャー (apt) を使って簡単にインストールできます。
sudo apt update
sudo apt install nikto
Linux (その他のディストリビューション) / macOS / Windows
GitHubリポジトリから直接ソースコードを取得して利用するのが最も確実で、常に最新版を利用できます。
- Gitのインストール (未導入の場合):
- Linux (apt):
sudo apt install git
- Linux (yum/dnf):
sudo yum install git
/sudo dnf install git
- macOS (Homebrew):
brew install git
- Windows: Git for Windows をダウンロードしてインストールします。
- Linux (apt):
- Perlのインストール (Windowsの場合): ActivePerl などをインストールします。
- Niktoリポジトリのクローン: ターミナルまたはコマンドプロンプトを開き、以下のコマンドを実行します。
git clone https://github.com/sullo/nikto.git
- Niktoの実行: クローンしたディレクトリ内の
program
ディレクトリに移動し、nikto.pl
を実行します。
(Linux/macOSではcd nikto/program perl nikto.pl -Version
./nikto.pl -Version
でも実行できる場合があります。実行権限がない場合はchmod +x nikto.pl
で権限を付与してください。)
-Version
オプションでバージョン情報が表示されれば、インストール(またはソースコードからの実行準備)は成功です。
Dockerでの利用
Dockerがインストールされていれば、コンテナを使ってNiktoを実行することも可能です。
# リポジトリをクローン
git clone https://github.com/sullo/nikto.git
cd nikto
# Dockerイメージをビルド
docker build -t sullo/nikto .
# ヘルプ表示
docker run --rm sullo/nikto
# 基本的なスキャン実行 (例)
docker run --rm sullo/nikto -h http://example.com
# 結果をホストのカレントディレクトリに保存 (例: JSON形式)
docker run --rm -v $(pwd):/tmp sullo/nikto -h http://example.com -o /tmp/out.json -Format json
Niktoデータベースとプラグインの更新
Niktoの脆弱性データベースとプラグインは定期的に更新することが非常に重要です。以下のコマンドで最新の状態に保つことができます。
perl nikto.pl -update
# または
# ./nikto.pl -update
スキャンを実行する前には、このコマンドで更新を確認することをお勧めします。
Niktoの基本的な使い方 🚀
基本的なスキャン
最も基本的な使い方は、-h
(または -host
) オプションでスキャン対象のホストを指定するだけです。ホストはIPアドレスまたはドメイン名で指定できます。
perl nikto.pl -h http://example.com
# または IPアドレスで
# perl nikto.pl -h 192.168.1.1
デフォルトでは、HTTP (ポート80) でスキャンが実行されます。
SSL/HTTPSサイトのスキャン
HTTPSを使用しているサイトをスキャンするには、-ssl
オプションを追加します。
perl nikto.pl -h https://secure.example.com -ssl
-ssl
オプションを付けると、デフォルトでポート443がスキャンされます。また、SSL証明書に関する情報や、HTTPS特有の設定ミスなどもチェックされます。
特定のポートのスキャン
Webサーバーが標準ポート (80, 443) 以外で動作している場合は、-p
(または -port
) オプションでポート番号を指定します。
# HTTPでポート8080をスキャン
perl nikto.pl -h http://example.com -p 8080
# HTTPSでポート8443をスキャン
perl nikto.pl -h https://example.com -p 8443 -ssl
複数のポートをスキャンしたい場合は、カンマ区切りで指定します。
perl nikto.pl -h http://example.com -p 80,8080,8888
スキャン結果の保存
スキャン結果をファイルに保存するには、-o
(または -output
) オプションで出力ファイル名を指定します。ファイル形式は -Format
オプションで指定できます (指定しない場合はファイル名の拡張子から推測されます)。
# テキスト形式で保存
perl nikto.pl -h http://example.com -o scan_result.txt -Format txt
# HTML形式で保存
perl nikto.pl -h http://example.com -o scan_result.html -Format htm
# CSV形式で保存
perl nikto.pl -h http://example.com -o scan_result.csv -Format csv
# XML形式で保存
perl nikto.pl -h http://example.com -o scan_result.xml -Format xml
# JSON形式で保存
perl nikto.pl -h http://example.com -o scan_result.json -Format json
利用可能なフォーマット: csv
, htm
, json
, msf+
, nbe
, sql
, txt
, xml
。
スキャン結果の読み方
Niktoの出力には多くの情報が含まれます。基本的な見方は以下の通りです。
+ Target IP:
スキャン対象のIPアドレス+ Target Hostname:
スキャン対象のホスト名+ Target Port:
スキャン対象のポート番号+ Start Time:
スキャン開始時刻+ Server:
検出されたWebサーバーソフトウェアとそのバージョン (例: Apache/2.4.52)+ ...
: 検出された項目。各行の先頭に+
が付きます。OSVDB-xxxxx:
Open Source Vulnerability Database (現在は閉鎖) のID。脆弱性の種類を示唆します。古い情報ですが、参考になる場合があります。- メッセージの内容: 検出された具体的な問題点や情報が記述されます。
- 例:
The anti-clickjacking X-Frame-Options header is not present.
(クリックジャッキング対策のヘッダーがない) - 例:
Apache/2.4.52 appears to be outdated (current is at least Apache/2.4.59).
(Apacheのバージョンが古い) - 例:
Directory indexing found.
(ディレクトリ一覧が表示される) - 例:
robots.txt contains entries which should be manually viewed.
(robots.txtに確認すべきエントリがある)
- 例:
+ End Time:
スキャン終了時刻+ x requests: y error(s) and z item(s) reported on remote host
: スキャン統計(リクエスト数、エラー数、報告された項目数)
各項目について、その意味やリスクを評価し、対策が必要かどうかを判断する必要があります。単純に項目が報告されたからといって、必ずしも重大な脆弱性があるとは限りません。
💡 ヒント: 検出された項目 (特にOSVDB IDや特定のファイル名、ヘッダー情報など) をWebで検索すると、関連する脆弱性情報 (CVEなど) や対策方法が見つかることがあります。
Niktoの主要なオプション詳説 🛠️
Niktoには多くのオプションがあり、スキャンをより詳細に制御できます。ここでは特に重要なオプションをいくつか紹介します。
オプション | 説明 | 例 |
---|---|---|
-h, -host <host> |
スキャン対象のホスト (IPまたはドメイン名) を指定します。必須オプションです。 | -h example.com |
-p, -port <port> |
スキャン対象のポートを指定します。デフォルトは80 (-ssl なし) または 443 (-ssl あり)。複数指定はカンマ区切り。 |
-p 8080 , -p 80,443,8000 |
-ssl |
SSL/TLSモードでスキャンを実行します (HTTPS)。 | -ssl |
-o, -output <file> |
スキャン結果を指定したファイルに出力します。 | -o result.html |
-Format <format> |
出力ファイルの形式を指定します (txt , csv , htm , xml , json など)。 |
-Format htm |
-Tuning <type> |
実行するテストの種類を制御します。番号で指定し、複数指定も可能です。特定のテストのみを実行したい場合に便利です。 | -Tuning 123 (1, 2, 3のテストを実行) |
-Plugins <plugin> |
実行するプラグインを指定します。デフォルトは ALL 。カンマ区切りで複数指定、- で除外も可能。 |
-Plugins apacheusers,dictionary , -Plugins ALL,-skipfish |
-list-plugins |
利用可能な全てのプラグインを一覧表示します。スキャンは実行しません。 | -list-plugins |
-update |
NiktoのプラグインとデータベースをCIRT.netから更新します。 | -update |
-timeout <sec> |
リクエストのタイムアウト時間を秒単位で指定します。デフォルトは10秒。 | -timeout 5 |
-Pause <sec> |
各テストリクエストの間に指定した秒数だけ一時停止します。IDS/IPSによる検知を遅らせる効果が期待できますが、スキャン時間は長くなります。 | -Pause 3 |
-id <id:pass[:realm]> |
Basic認証などのホスト認証情報を指定します。 | -id admin:password123 |
-useproxy |
設定ファイル (nikto.conf) で定義されたプロキシサーバーを使用します。 | -useproxy |
-evasion <type> |
IDS回避技術を指定します。番号で指定し、複数指定も可能です。効果は環境によります。 | -evasion 124 (1, 2, 4の技術を使用) |
-maxtime <sec> |
スキャンの最大実行時間を秒単位で指定します。時間になるとスキャンを中断します。 | -maxtime 3600 (1時間) |
-no404 |
Niktoが404 (Not Found) ページを推測しようとする試みを無効にします。スキャンを高速化する場合があります。 | -no404 |
-nocache |
Webサーバーのキャッシュを無視するように試みます。キャッシュされた古い情報ではなく、最新の状態をスキャンしたい場合に有効です。 | -nocache |
-Display <option> |
出力内容を制御します。番号や文字で指定し、複数指定も可能です。 | -Display 1234D (リダイレクト、Cookie、200応答、認証要求、デバッグ情報を表示) |
-Version |
Nikto本体、プラグイン、データベースのバージョン情報を表示します。 | -Version |
-Help |
詳細なヘルプ情報を表示します。 | -Help |
-Tuning オプションの詳細
-Tuning
オプションは、実行するテストの種類を絞り込むために使用します。番号で指定し、複数組み合わせることも可能です。x
を付けると逆(指定したもの以外すべて)になります。
番号 | カテゴリ | 説明 |
---|---|---|
0 | File Upload | ファイルアップロード関連の脆弱性 |
1 | Interesting File / Seen in logs | 興味深いファイルやログに見られるファイル |
2 | Misconfiguration / Default File | 設定ミスやデフォルトで存在するファイル |
3 | Information Disclosure | 情報漏洩につながる可能性のあるもの |
4 | Injection (XSS/Script/HTML) | インジェクション系の脆弱性 (XSSなど) |
5 | Remote File Retrieval – Inside Web Root | Webルート内のリモートファイル取得 |
6 | Denial of Service | サービス拒否 (DoS) 攻撃につながる可能性のあるもの |
7 | Remote File Retrieval – Server Wide | サーバー全体のリモートファイル取得 |
8 | Command Execution / Remote Shell | コマンド実行やリモートシェル |
9 | SQL Injection | SQLインジェクション |
a | Authentication Bypass | 認証回避 |
b | Software Identification | ソフトウェアの特定 |
c | Remote Source Inclusion | リモートソースインクルージョン |
x | Reverse Tuning Options | 指定したタイプ以外のすべてのテストを実行 |
例: 設定ミス(2)と情報漏洩(3)に関するテストのみ実行する場合
perl nikto.pl -h http://example.com -Tuning 23
例: インジェクション(4, 9)とコマンド実行(8)を除外してスキャンする場合
perl nikto.pl -h http://example.com -Tuning x489
-evasion オプションの詳細
-evasion
オプションは、IDS (侵入検知システム) の検知を回避するための技術を指定します。効果はIDSの種類や設定に依存するため、必ず回避できるわけではありません。
番号 | 技術 | 説明 |
---|---|---|
1 | Random URI Encoding (non-UTF8) | ランダムなURIエンコーディング (非UTF8) |
2 | Directory self-reference (/./) | ディレクトリ自己参照 (/./) |
3 | Premature URL ending | URLの早期終了 |
4 | Prepend long random string | 長いランダム文字列を先頭に追加 |
5 | Fake parameter | 偽のパラメータを追加 |
6 | TAB as request spacer | リクエストスペーサーとしてタブ文字を使用 |
7 | Change the case of the URL | URLの大文字/小文字を変更 |
8 | Use Windows directory separator (\) | Windows形式のディレクトリ区切り文字 (\) を使用 |
A | Use carriage return (0x0d) as request spacer | リクエストスペーサーとしてキャリッジリターンを使用 |
B | Use binary value 0x0b as request spacer | リクエストスペーサーとしてバイナリ値 0x0b を使用 |
例: 複数の回避技術を試す場合
perl nikto.pl -h http://example.com -evasion 1248
倫理的な考慮事項と法的側面 🛡️
Niktoは強力な脆弱性スキャンツールですが、その使用には重要な倫理的および法的な側面が伴います。
🚫 絶対に許可なくスキャンしないこと
自分自身が管理権限を持つサーバー、または、書面などで明確な許可を得たサーバー以外に対してNikto(および他のいかなるスキャンツールも)を使用してはいけません。
許可なく他者のシステムをスキャンする行為は、多くの国や地域において不正アクセス行為として法的に禁止されており、犯罪となります。これは、たとえ悪意がなく、学習目的や興味本位であったとしても同様です。
不正アクセス禁止法などの法律に違反した場合、刑事罰(懲役や罰金)の対象となる可能性があります。また、民事上の損害賠償を請求される可能性もあります。さらに、社会的な信用を失うことにもつながります。
責任ある使用のために
- 明確な許可: スキャンを実行する前に、対象システムの所有者から書面による明確な許可を得てください。口頭での許可ではなく、証拠が残る形での許可が望ましいです。許可の範囲 (スキャン対象、期間、時間帯、使用するツール、スキャンの強度など) を明確に合意しておくことが重要です。
- 影響の考慮: Niktoのスキャンは、対象サーバーに負荷をかける可能性があります。特に古いシステムやリソースの限られたシステムに対して高頻度・高負荷なスキャンを行うと、サービス停止などの意図しない影響を引き起こす可能性があります。許可を得る際に、スキャンによる潜在的な影響についても説明し、理解を得ておくことが重要です。
- 目的の明確化: スキャンを行う目的を明確にし、許可された範囲を超えないようにしてください。
- 倫理的ガイドラインの遵守: 倫理的なハッキング (Ethical Hacking) の原則に従い、発見した脆弱性は責任を持って報告し、悪用しないでください。
- ログの確認: Niktoのスキャンはログに記録されます。スキャン対象の管理者に、どのようなログが記録される可能性があるかを事前に伝えておくと、後の誤解を防ぐことができます。
Niktoは、Webサーバーのセキュリティを向上させるための非常に有用なツールですが、その力を正しく、倫理的に、そして合法的に使用することが不可欠です。常に責任ある行動を心がけましょう。
まとめ 🎉
Niktoは、Webサーバーの脆弱性や設定ミスを迅速に発見するための強力なオープンソースツールです。基本的な使い方から様々なオプションを駆使することで、より詳細で目的に合わせたスキャンを実行できます。
重要なポイント:
- インストールはパッケージマネージャーやGitHubから簡単に行えます。
- 基本的なスキャンは
-h
オプションで対象を指定するだけです。 - HTTPSサイトは
-ssl
、特定ポートは-p
オプションを使います。 - 結果は
-o
と-Format
で様々な形式で保存できます。 -Tuning
や-Plugins
でスキャン内容を細かく制御できます。- 最も重要なのは、必ず許可を得た対象に対してのみ使用することです。 無許可のスキャンは違法行為となります。
- 脆弱性データベースとプラグインは
-update
で定期的に更新しましょう。
Niktoのスキャン結果は、あくまでも潜在的な問題点を示唆するものです。報告された各項目について詳細を調査し、実際のリスクを評価した上で、適切な対策を講じることが重要です。Niktoを正しく活用し、Webサーバーのセキュリティ強化に役立てましょう!
参考情報
- Nikto 公式GitHubリポジトリ: https://github.com/sullo/nikto
- CIRT.net (Nikto配布元の一つ): https://cirt.net/Nikto2
コメント