【ITニュース解説】Nuclei: 20 Commands for Template-Driven Vulnerability Scanning
2026年10月22日に「Dev.to」が公開したITニュース「Nuclei: 20 Commands for Template-Driven Vulnerability Scanning」について初心者にもわかりやすく解説しています。
ITニュース概要
Nucleiは、テンプレートを使ってWebサイトなどの脆弱性を素早く自動で見つけるツールだ。YAML形式のテンプレートで脆弱性の特徴を定義し、既知の脆弱性や設定ミスなど多くの問題を効率的に検出できる。システム開発のセキュリティ向上に役立つ。
ITニュース解説
Nucleiは、セキュリティの専門家が自動で脆弱性をスキャンする方法を大きく変えた、高速でテンプレートベースの脆弱性スキャナーである。これはProjectDiscoveryによって開発されたツールで、Webサイトやアプリケーションに潜むセキュリティ上の弱点(脆弱性)を効率的に見つけ出す。従来の脆弱性スキャンでは、特定のチェックのために毎回カスタムスクリプトを記述する必要があったが、NucleiはYAML形式の「テンプレート」を使って脆弱性の検出ルールを定義する。これにより、コミュニティが数千もの検出ルールを簡単に貢献できるようになり、CVE(共通脆弱性識別子)として知られる既知の脆弱性、設定ミス、露出している管理パネル、デフォルトの認証情報など、幅広い種類の脆弱性に対応している。公式リポジトリには11,000を超えるテンプレートがあり、1,496件の既知のエクスプロイト(攻撃コード)にも対応しているため、広範なシステムの発見から特定の脆弱性の悪用可能性の検証までを効率的に行うことが可能である。以下に、Nucleiの20の実用的なコマンドとその使用方法について解説する。
まず、基本的なスキャン方法について説明する。単一のターゲットURLをスキャンするには、「nuclei -u https://example.com」と入力する。「-u」フラグは単一のターゲットURLを指定し、Nucleiは初回実行時に最新のテンプレートを自動ダウンロードする。デフォルトではすべてのテンプレートがターゲットに対して実行され、徹底的である反面、時間がかかる場合がある。複数のターゲットをスキャンするには、「nuclei -l targets.txt」というコマンドを使う。「-l」フラグはファイルからターゲットのリストを読み込む。このファイルにはURL、IPアドレス、またはCIDR範囲を一行に一つずつ記述し、複数のホストやURLに対して効率的にスキャンを実行できる。
次に、スキャン結果の出力に関する制御について述べる。「nuclei -u https://example.com -silent」は、サイレントモードを有効にする。「-silent」フラグはバナーや進捗表示を抑制し、検出結果のみを表示する。これはスクリプトでの自動処理や、他のツールへのパイプ連携に標準的に使われるモードである。
検出される脆弱性のフィルタリングも重要である。「nuclei -u https://example.com -s critical,high」のように、「-s」フラグを使って深刻度レベルでテンプレートをフィルタリングできる。深刻度には情報(info)、低(low)、中(medium)、高(high)、クリティカル(critical)、不明(unknown)があり、高い深刻度やクリティカルな結果に焦点を当てることで、重要な発見に集中できる。逆に、「nuclei -u https://example.com -es info」のように、「-es」フラグで特定の深刻度レベルを除外できる。例えば、「info」を除外すれば、悪用可能な脆弱性のみに注目したい場合に役立つ。
スキャン対象をさらに絞り込む方法もある。「nuclei -u https://example.com -t http/cves/ -t ssl」と入力すると、「-t」フラグでテンプレートのパスやディレクトリを指定できる。CVE関連とSSL関連のテンプレートのみを実行することで、広範な発見ではなく、既知の脆弱性や暗号化の設定ミスに焦点を当てたスキャンが可能になる。さらに特定のCVEテンプレートを対象とする場合は、「nuclei -u https://example.com -t cves/2021/CVE-2021-44228.yaml」のように、具体的なYAMLファイルを指定する。これは、ターゲットの技術スタックが分かっていて、特定の脆弱性の存在を確認したい場合に最も速い方法である。
テンプレートをタグでフィルタリングすることもできる。「nuclei -u https://example.com -tags cve,rce」のように、「-tags」フラグで特定のタグを持つテンプレートのみを実行する。タグにはcve、rce(リモートコード実行)、xss(クロスサイトスクリプティング)、sqli(SQLインジェクション)、misconfig(設定ミス)、exposure(情報漏洩)などがあり、これらを組み合わせることで、評価に関連する脆弱性の種類にスキャンを集中させることが可能だ。また、「nuclei -u https://example.com -etags dos」のように、「-etags」フラグで特定のタグを持つテンプレートを除外できる。例えば、「dos」(サービス拒否)のテストを除外することで、本番システムをスキャンする際の安定性への影響を防ぐことができる。
自動技術認識スキャンは、スキャンの効率を劇的に向上させる。「nuclei -u https://example.com -as」のように、「-as」フラグを有効にすると、まずWappalyzerのような検出方法でターゲットの技術スタック(使われている技術)を特定し、その技術に関連するテンプレートのみをロードする。これにより、無関係なテストが排除され、スキャン速度と精度が大幅に向上する。
スキャン対象のシステムへの負荷を考慮することも重要である。「nuclei -u https://example.com -rl 50」のように、「-rl」フラグでグローバルなリクエストレートを1秒あたりの回数で制限できる。デフォルトのリクエストレートは積極的すぎる場合があるため、明示的な値を設定することで、脆弱なターゲットに過負荷をかけたり、レートベースの検出システムを回避したりするのに役立つ。また、「nuclei -u https://example.com -c 20 -bs 20」のように、「-c」フラグでテンプレートの並列実行数、「-bs」フラグでテンプレートあたりのホスト並列処理数を制御できる。これらの値を下げることで、リソース消費を抑え、スキャン動作をより予測可能にできる。
スキャン結果の保存方法も多様である。「nuclei -l targets.txt -jsonl -o results.jsonl」のように、「-jsonl」フラグはJSON Lines形式で出力を生成し、「-o」フラグで出力ファイルを指定する。JSONL形式の出力は、パースツールや他の自動化パイプラインと容易に連携できる。シンプルなテキストファイルに保存したい場合は、「nuclei -u https://example.com -o vulns.txt」のように、「-o」フラグを使用する。ただし、Nucleiはデフォルトで出力ファイルを上書きするため、複数の実行結果を保持したい場合は、一意のファイル名を使用するか、「tee -a」コマンドを使って結果を追記する必要がある。
高度なスキャン機能として、Interactshの無効化がある。「nuclei -u https://example.com -ni」のように、「-ni」フラグは、Nucleiのアウトオブバンドアプリケーションセキュリティテスト(OAST)サービスであるInteractshを無効にする。これは、外部へのInteractshトラフィックが許可されていない場合や、隔離されたネットワークをスキャンする場合、あるいは非OASTの結果のみが必要な場合に使う。
特定のホストをスキャン対象から除外することも可能だ。「nuclei -l targets.txt -exclude-hosts 192.168.1.1,internal.example.com」のように、「-exclude-hosts」フラグで、特定のホスト、CIDR範囲、またはホスト名をスキップできる。これは、一部のターゲットが評価範囲外である場合や、スキャンすべきでない第三者の所有するシステムである場合に不可欠な機能である。
長時間のスキャンを効率的に管理する機能もある。「nuclei -list targets.txt -resume scan-state.cfg」のように、「-resume」フラグはスキャン状態を保存し、中断されたスキャンを再開できるようにする。これは、ネットワークの問題やシステム再起動などによって中断される可能性のある、大規模な範囲に対する長時間実行のスキャンにおいて非常に有用である。この機能を使用すると、テンプレートのクラスタリングは自動的に無効になる。
最新の脆弱性に対応するためには、テンプレートの更新が不可欠である。「nuclei -update-templates」または「-ut」フラグは、nuclei-templatesリポジトリから最新のテンプレートをダウンロードする。新しいCVEは常に公開されており、テンプレートを更新することで、スキャンに最新の検出シグネチャが含まれることを保証できる。これは、重要なセキュリティ評価を行う前に必ず実行すべきである。
カスタムテンプレートを作成する場合、そのテンプレートが正しく記述されているかを確認したいだろう。「nuclei -validate -t /path/to/template.yaml」のように、「-validate」フラグは、スキャンを実行せずにテンプレートの構文と構造をチェックする。テンプレートを貢献する前や、カスタム検出ルールのデバッグ時にこれを使用すると良い。このバリデーターは、YAMLの構文エラー、必要なフィールドの欠落、無効なマッチャー設定などを検出する。
最後に、スキャンの進捗状況を把握するための機能がある。「nuclei -u https://example.com -stats」のように、「-stats」フラグは、送信されたリクエスト数、実行されたテンプレート数、経過時間など、定期的なスキャン統計を表示する。JSON形式で統計が必要な場合は、「-stats-json」を追加する。これは、大規模なスキャンの進行状況を監視し、パフォーマンスのボトルネックを特定するのに役立つ。
これらのNucleiコマンドを使いこなすことで、システムエンジニアを目指す初心者でも、効率的かつ体系的に脆弱性スキャンを行い、システムのセキュリティを評価する第一歩を踏み出すことができるだろう。