YAMLで記述されたテンプレートに基づく脆弱性スキャナ
- Nuclei -
Nucleiの強みは、豊富なテンプレートを活かした柔軟なスキャンにあります。
本記事では、Nucleiとは何かという基本から、インストール、スキャン実行、テンプレートの使用方法を体系的に解説します。検証環境での実演も交え、実際の挙動をイメージしやすい構成になっています。
Nucleiとは
Nucleiは、ProjectDiscovery社が開発・公開しているオープンソースの脆弱性スキャナです。HTTPを中心に、DNS、TCP、SSLなど複数のプロトコルに対応しており、既知の脆弱性(CVE)や設定ミスをテンプレートベースで検出できる点が大きな特徴です。
主な特徴
- YAML形式で記述されたテンプレートを使用して脆弱性を検出する。
- Webアプリケーション、インフラ、API、クラウド、モバイルアプリ、ネットワークデバイス、CMSなど幅広いプラットフォームに対応。
- Go言語で開発されており、多数のターゲットに対して並列で高速なスキャンが可能。
- TCP、DNS、HTTP、SSL、WHOIS、JavaScriptなど多彩なプロトコルに対応。
- コミュニティによってテンプレートが日々更新されている。
- CLIベースでCI/CDや自動化に統合しやすい。
- MITライセンスのもとで公開されているオープンソースソフトウェア。
注意事項
Nucleiは強力なツールですが、誤用によるリスクもあるため、以下の点に注意して使用する必要があります。
スキャン対象の許可を得ること
本記事で紹介するNucleiは、強力なセキュリティ診断ツールです。許可なく第三者のネットワークやシステムをスキャンする行為は、不正アクセス禁止法などに抵触する可能性があります。明確な権限がある範囲内でご使用ください。
「検出結果 = 脆弱性」とは限らない
Nucleiは既知の脆弱性を高速に検出しますが、誤検出が発生する可能性もあります。スキャン結果は、他のツール(OWASP ZAP、OpenVASなど)と組み合わせて二次検証することが望ましいです。
Nucleiのインストール
このセクションでは、特に利用頻度の高いKali Linux、およびUbuntuを対象に、それぞれインストール手順を解説します。
- Kali Linux 2025.4
- Ubuntu 24.04 LTS
Kali Linuxにインストール
Kali Linuxの公式リポジトリには、nucleiパッケージが収録されています。APTを利用することで、依存関係を含めたインストールを容易に行うことが可能です。
パッケージリストの更新
$ sudo apt updateAPTパッケージリストを更新し、最新の状態に同期します。これにより、APTが参照するリポジトリ情報が更新され、Nucleiを含む最新のパッケージ情報を取得できます。
パッケージ情報の確認
$ apt show nuclei
Package: nuclei
Version: 3.7.0-0kali1
Priority: optional
Section: golang
Maintainer: Kali Developers <devel@kali.org>
Installed-Size: 124 MB
Homepage: https://github.com/projectdiscovery/nuclei
Download-Size: 27.5 MB
APT-Sources: http://http.kali.org/kali kali-rolling/main amd64 Packages
Description: Fast and customizable vulnerability scanner based on simple YAML based DSL
This package contains a fast tool for configurable targeted scanning based on
templates offering massive extensibility and ease of use.
.
Nuclei is used to send requests across targets based on a template
leading to zero false positives and providing fast scanning on large
number of hosts. Nuclei offers scanning for a variety of protocols
including TCP, DNS, HTTP, File, etc. With powerful and flexible
templating, all kinds of security checks can be modelled with Nuclei.続いて、Nucleiパッケージの詳細情報を確認します。このコマンドにより、Nucleiのバージョン情報(Version)や機能概要(Description)などを確認できます。
最新バージョンのNucleiは、リリース後おおむね1週間程度でKali Linuxの公式リポジトリに取り込まれます。
| バージョン | Nucleiリリース日 | Kali Linuxの公式リポジトリに反映 |
|---|---|---|
| 3.7.0 | 2026年1月28日 | 2026年2月2日 |
| 3.6.2 | 2026年1月1日 | 2026年1月9日 |
| 3.6.1 | 2025年12月16日 | 2025年12月19日 |
インストール状況の確認
$ apt list --installed | grep nucleiインストール済みか確認します。
Nucleiをインストール
$ sudo apt install nuclei準備が整ったら、Kali Linux公式リポジトリからNucleiをインストールします。
Ubuntuにインストール
Ubuntuの公式リポジトリにNucleiは含まれていません。そこで、以下ではGo言語を利用してNucleiをインストールする方法を取り上げます。UbuntuにGoをインストールしていない場合、「UbuntuにGoをインストールする」をご覧ください。
Go環境の確認
Goのバージョンが1.24.2以上であることを確認
$ go version
go version go1.25.6 linux/amd64Goプロジェクトのワークスペースのbinが$PATHに含まれていることを確認
$ echo $(go env GOPATH)
/home/user/go # Goプロジェクトのワークスペース
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/go/bin:/home/user/go/binNucleiのインストール
$ go install -v github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest-vオプションにより、インストール中の詳細ログを表示します。@latestを指定して、最新安定版を取得します。
バイナリは通常$HOME/go/bin/nucleiに配置されます。
インストール後の動作確認
Nucleiのインストールが完了したら、実行ファイルが正しく配置され、期待したバージョンが利用可能かを必ず確認してください。
実行パスの確認
$ which nuclei
# 実行結果
/usr/bin/nuclei # Kali Linux(APTインストール)の場合
/home/user/go/bin/nuclei # Ubuntu(Goインストール)の場合nucleiコマンドがどのパスに配置されているかを確認します。
バージョン確認
$ nuclei -version
# 実行結果
# Kali Linux(APTインストール)の場合
[INF] Nuclei Engine Version: v3.7.0
[INF] Nuclei Config Directory: /home/kali/.config/nuclei
[INF] Nuclei Cache Directory: /home/kali/.cache/nuclei
[INF] PDCP Directory: /home/kali/.pdcp
# Ubuntu(Goインストール)の場合
[INF] Nuclei Engine Version: v3.7.0
[INF] Nuclei Config Directory: /home/user/.config/nuclei
[INF] Nuclei Cache Directory: /home/user/.cache/nuclei
[INF] PDCP Directory: /home/user/.pdcp
インストールされたNucleiのバージョンを確認します。
Nucleiの使用方法
このセクションでは、Nucleiの基本的な使い方について解説します。
基本的なスキャン
ターゲットの指定方法
Nucleiは、単一ホストから複数ホスト、CIDR指定までターゲットを柔軟に指定できます。
$ nuclei -u 192.168.1.100 # 単一ホスト
$ nuclei -u 192.168.1.0/24 # CIDR
$ nuclei -l hosts.txt # 複数ホスト-u、-target:単一ホストを指定。IPアドレス、URL、CIDRでの指定が可能。-l、-list:複数ターゲットを記載したファイルを指定。
脆弱性のみ出力
$ nuclei -u 192.168.1.100 -silent-silentオプションを指定すると、検出された脆弱性のみが出力されます。
ファイル出力
# テキスト形式
$ nuclei -u 192.168.1.100 -o results.txt # -outputでも可
# JSON形式
$ nuclei -u 192.168.1.100 -je results.json # -json-exportでも可
# JSONL(JSON Lines)形式
$ nuclei -u 192.168.1.100 -jle results.jsonl # -jsonl-exportでも可-o:指定したファイルに出力-je:JSON形式でファイル出力-jle:JSONL(JSON Lines)形式でファイル出力
-meオプションを使用すると、検出された脆弱性ごとに作成された個別ファイルが指定したディレクトリに出力されます。
# Markdown形式(1脆弱性 = 1ファイル)
$ nuclei -u 192.168.1.100 -me output_dir # -markdown-exportでも可- 検出された脆弱性ごとに個別ファイルを作成。
- 各ファイルには脆弱性の詳細情報がMarkdown形式で出力される。
Nuclei本体のアップデート
$ nuclei -up # -updateでも可-upオプションは、Nuclei本体(エンジン)のアップデートを行います。
ヘルプ
$ nuclei -hNucleiテンプレートの使用方法
Nucleiのテンプレートは、スキャン対象に対する診断ロジックを定義したYAMLファイルです。テンプレートはGitHub上で公式に提供されており、コミュニティによって継続的かつ活発に更新されています。
テンプレートのバージョン確認
$ nuclei -tv # -templates-versionでも可
# 実行結果(Kali Linux)
[INF] Public nuclei-templates version: v10.3.8 (/home/kali/.local/nuclei-templates)
# 実行結果(Ubuntu)
[INF] Public nuclei-templates version: v10.3.8 (/home/user/nuclei-templates)
-tvオプションを指定することで、テンプレートのバージョン、および格納場所を確認できます。
テンプレートのアップデート
$ nuclei -ut # -update-templatesでも可-utオプションは、Nucleiテンプレートのアップデートを行います。(デフォルト設定では、スキャンを開始するとテンプレートが自動的に更新されます。)
テンプレート一覧の表示
$ nuclei -tl-tlオプションを指定した場合、スキャン処理を行わず、テンプレートを一覧表示します。
Nucleiには、12,000を超えるテンプレートが存在します。
$ nuclei -tl | grep yaml$ | wc -l
12075テンプレートはタグ、重大度、プロトコルタイプなどによって分類されており、オプションを指定することで効率的にフィルタリングできます。
タグ
$ nuclei -tl -tags cve # タグを複数指定する場合は、カンマ区切り・-tags:タグを指定
テンプレートに付与されたタグでフィルタリングします。上記の例では、CVEに関連したテンプレートのみを一覧表示します。
2026年2月現在、テンプレートにはvuln、discovery、discoveryなど7,000種類以上のタグが存在します。
頻出タグ(Top10)
| タグ | テンプレート数 |
|---|---|
| vuln | 6,560 |
| cve | 3,842 |
| discovery | 3,574 |
| vkev | 1,601 |
| wordpress | 1,461 |
| panel | 1,390 |
| exposure | 1,348 |
| xss | 1,332 |
| wp-plugin | 1,281 |
| osint | 1,130 |
重大度
$ nuclei -tl -severity critical,high # -sでも可・-severity:重大度を指定
テンプレートに定義されている重大度でフィルタリングします。上記のコマンドでは、criticalおよびhighレベルの脆弱性に限定したテンプレートが表示されます。
- critical
- high
- medium
- low
- info
プロトコルタイプ
$ nuclei -tl -type network,dns # -ptでも可・-tpye:プロトコルタイプを指定
他にもhttp、ssl、cloud、headlessなどのタイプが用意されており、特定領域に特化したスキャンが可能です。
スキャン実行例
テンプレートの指定
# 単一テンプレート
$ nuclei -u 192.168.1.100 -t network/cves/2021/CVE-2021-30047.yaml
# 複数テンプレート(カンマ区切り)
$ nuclei -u 192.168.10.101 -t network/cves/2021/CVE-2021-30047.yaml,javascript/misconfiguration/pgsql/pgsql-empty-password.yaml
# ディレクトリ単位
$ nuclei -u 192.168.1.100 -t network/cves-tまたは-templatesオプションにて、スキャン対象のテンプレートを指定します。テンプレートを格納しているディレクトリを指定すると、その配下のすべてのテンプレートが対象となります。
タグ・重大度・プロトコルタイプの指定
$ nuclei -u 192.168.1.100 -tags cve # タグ(-tags)
$ nuclei -u 192.168.1.100 -severity critical # 重大度(-severity)
$ nuclei -u 192.168.1.100 -type dns # プロトコルタイプ(-type)タグ、重大度、プロトコルタイプを限定して、スキャンを実行します。
複数のフィルタを指定すると、AND条件で評価されます。
$ nuclei -u 192.168.1.100 -tags cve -severity criticalこの例では、「タグがcve、かつ重大度がcriticalのテンプレート」のみが実行されます。
【実演解説】検証環境でNucleiを実行する
脆弱性診断の学習用途として広く利用されているMetasploitable2を対象に、Kali LinuxにインストールしたNucleiを用いて実演形式で解説します。
検証環境のシステム構成
- Nuclei実行マシン(Kali Linux 2025.4)
- Nucleiバージョン:3.7.0
- テンプレートバージョン:10.3.8
- スキャン対象マシン(Metasploitable2)
- IPアドレス:192.168.10.101
- ネットワーク設定:ホストオンリーアダプター
Kali Linux、Metasploitable2いずれも、Windowsマシン上に構築した仮想環境にて稼働しています。
スキャン実行
以下のコマンドを使用して、重大度がcriticalおよびhighに該当するテンプレートのみを対象としたスキャンを実施します。
$ nuclei -u 192.168.10.101 -severity critical,high-u:スキャン対象をIPアドレスで指定-severity:重大度でテンプレートをフィルタリング
スキャン実行中に検出された脆弱性は、標準出力にリアルタイム表示されます。
スキャン結果を確認
以下は、実際のスキャン結果です。
$ nuclei -u 192.168.10.101 -severity critical,high
__ _
____ __ _______/ /__ (_)
/ __ \/ / / / ___/ / _ \/ /
/ / / / /_/ / /__/ / __/ /
/_/ /_/\__,_/\___/_/\___/_/ v3.7.0
projectdiscovery.io
[INF] Current nuclei version: v3.7.0 (latest)
[INF] Current nuclei-templates version: v10.3.8 (latest)
[INF] New templates added in latest release: 457
[INF] Templates loaded for current scan: 3765
[INF] Executing 3764 signed templates from projectdiscovery/nuclei-templates
[WRN] Loading 1 unsigned templates for scan. Use with caution.
[INF] Targets loaded for current scan: 1
[INF] Running httpx on input host
[INF] Found 1 URL from httpx
[INF] Templates clustered: 261 (Reduced 224 Requests)
[CVE-2012-1823] [http] [high] http://192.168.10.101/index.php?-d+allow_url_include%3don+-d+auto_prepend_file%3dphp%3a//input
[INF] Using Interactsh Server: oast.live
[pgsql-default-db] [javascript] [high] 192.168.10.101:5432 [database="postgres",password="",usernames="postgres"]
[pgsql-default-db] [javascript] [high] 192.168.10.101:5432 [database="postgres",password="postgres",usernames="postgres"]
[pgsql-list-users] [javascript] [high] 192.168.10.101:5432 ["postgres"] [database="postgres",password="postgres",usernames="postgres"]
[pgsql-file-read] [javascript] [high] 192.168.10.101:5432 ["pg_multixact","PG_VERSION","server.key","pg_twophase","postmaster.opts","pg_xlog","postmaster.pid","global","pg_clog","pg_subtrans","root.crt","base","pg_tblspc","server.crt"] [database="postgres",password="postgres",usernames="postgres"]
[pgsql-default-db] [javascript] [high] 192.168.10.101:5432 [database="template1",password="postgres",usernames="postgres"]
[pgsql-list-database] [javascript] [high] 192.168.10.101:5432 ["postgres","template1","template0"] [database="postgres",password="postgres",usernames="postgres"]
[pgsql-list-password-hashes] [javascript] [high] 192.168.10.101:5432 ["postgres : md53175bce1d3201d16594cebf9d7eb3f9d"] [database="postgres",password="postgres",usernames="postgres"]
[postgres-default-logins] [javascript] [high] 192.168.10.101:5432 [passwords="postgres",usernames="postgres"]
[vnc-default-login] [javascript] [high] 192.168.10.101:5900 [passwords="password"]
[vnc-default-login] [javascript] [high] 192.168.10.101:5900 [passwords="password123"]
[CVE-2004-2687] [tcp] [high] 192.168.10.101:3632
[pgsql-empty-password] [javascript] [critical] 192.168.10.101:5432
[pgsql-version-detect] [javascript] [high] 192.168.10.101:5432 ["PostgreSQL 8.3.1 on i486-pc-linux-gnu, compiled by GCC cc (GCC) 4.2.3 (Ubuntu 4.2.3-2ubuntu4)"] [database="postgres",password="postgres",usernames="postgres"]
[CVE-2020-1938] [tcp] [critical] 192.168.10.101:8009
[CVE-2021-30047:version] [tcp] [high] 192.168.10.101:21 ["2.3.4"]
[pgsql-default-db] [javascript] [high] 192.168.10.101:5432 [database="template1",password="",usernames="postgres"]
[CVE-2011-2523] [tcp] [critical] 192.168.10.101:6200
[INF] Scan completed in 1m. 18 matches found.この例では、以下のような既知の脆弱性が検出されています。(criticalのみ抜粋)
- PostgreSQLのパスワードが未設定
- CVE-2020-1938:Apache Tomcat AJPコネクタの脆弱性(Ghostcat)
- CVE-2011-2523:vsftpd 2.3.4のバックドア
- OWASP ZAPやOpenVASなどの診断ツールを用いて、スキャン結果を精査する。
- 検出されたCVE識別番号を元にNVD(National Vulnerability Database)などで脆弱性情報を確認する。
- Nucleiはスキャン後にエクスポート可能な形式を複数備えており、CI/CD連携や自動化による継続的なセキュリティ検証を実施する。
