Nuclei: 高速かつカスタマイズ可能な脆弱性スキャナーの使い方 徹底解説 🚀

セキュリティツール

はじめに: Nucleiとは? 🤔

Nucleiは、ProjectDiscoveryによって開発されたオープンソースの脆弱性スキャナーです。最大の特徴は、シンプルで人間が読み書きしやすいYAML形式の「テンプレート」に基づいて動作することです。これにより、脆弱性の検出ロジックを柔軟に定義・カスタマイズできます。

Nucleiは非常に高速に動作し、多数のホストを短時間でスキャンすることが可能です。HTTP/HTTPSだけでなく、DNS、TCP、SSL、ファイル、Whois、Websocket、Headless(ブラウザ自動操作)、Code(コード実行)など、多様なプロトコルに対応しています。

世界中のセキュリティ研究者やエンジニアのコミュニティによって、数千ものテンプレートが開発・共有されており、最新の脆弱性(CVE)や設定ミス、情報漏洩などの問題に迅速に対応できます。もちろん、独自のカスタムテンプレートを作成することも可能です。

主な特徴:

  • テンプレートベース: YAML形式でスキャンロジックを定義。
  • 高速スキャン: 並列処理と最適化により高速なスキャンを実現。
  • 高いカスタマイズ性: 既存テンプレートの利用に加え、独自テンプレート作成も容易。
  • 多様なプロトコル対応: HTTP, DNS, TCPなど多くのプロトコルをサポート。
  • 活発なコミュニティ: 常に新しいテンプレートが追加・更新される。
  • 連携機能: 他のツールと組み合わせてワークフローを構築可能。

Nucleiは、脆弱性診断、ペネトレーションテスト、セキュリティ監査、CI/CDパイプラインへの統合など、幅広い用途で活用されています。

⚠️ 注意:

Nucleiは強力なツールですが、その使用には責任が伴います。許可なく他者のシステムをスキャンすることは法律で禁止されています。必ず自身の管理下にあるシステム、または明確な許可を得たシステムに対してのみ使用してください。開発者はツールの誤用やそれによって生じた損害について一切の責任を負いません。

インストール方法 💻

Nucleiをインストールするには、いくつかの方法があります。Go言語 (バージョン1.22以上推奨) がインストールされている環境が前提となることが多いです。

Go言語を使ったインストール (推奨)

最も一般的な方法です。Go言語の環境があれば、以下のコマンドで最新版をインストールできます。


go install -v github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest

インストール後、パスが通っていれば `nuclei` コマンドが利用可能になります。

Homebrew (macOS)

macOSユーザーでHomebrewを導入している場合は、以下のコマンドでインストールできます。


brew install nuclei

Docker

Dockerイメージも提供されています。Dockerがインストールされていれば、以下のコマンドでイメージを取得できます。


docker pull projectdiscovery/nuclei:latest

実行時は `docker run` コマンドを使用します。例えば、ターゲットをスキャンする場合は以下のようになります。


docker run --rm projectdiscovery/nuclei:latest -u https://example.com

ホスト上のファイル(ターゲットリストなど)を使用する場合は、`-v` オプションでマウントする必要があります。

バイナリのダウンロード

GitHubのリリースページから、お使いのOSに対応したコンパイル済みのバイナリファイルをダウンロードすることもできます。

GitHub Releases

インストール後の確認

インストールが成功したか確認するために、バージョン情報を表示してみましょう。


nuclei -version

バージョン情報が表示されれば、インストールは成功です。

テンプレートのダウンロード

Nucleiは初回実行時に、コミュニティによって提供されている公開テンプレートを自動的にダウンロード・更新します(デフォルト設定の場合)。テンプレートは通常、ユーザーのホームディレクトリ以下の `.local/nuclei-templates` (Linux/macOS) や `%USERPROFILE%\.local\nuclei-templates` (Windows) に保存されます。

手動でテンプレートを更新したい場合は、以下のコマンドを実行します。


nuclei -update-templates

基本的な使い方 🎯

Nucleiの基本的な使い方は非常にシンプルです。コマンドラインから `nuclei` コマンドにオプションとターゲットを指定して実行します。

単一ターゲットのスキャン

特定のURLに対してスキャンを実行するには `-u` または `-target` オプションを使用します。


nuclei -u https://example.com

または


nuclei -target https://example.com

ターゲットに `http://` や `https://` を含めるとWeb関連のテンプレートが主に実行されます。プロトコルを指定しない場合(例: `example.com`)、DNSやネットワーク関連のスキャンも試みられます。

複数ターゲットのスキャン (リストファイル)

複数のターゲットをスキャンしたい場合は、ターゲットURL/ドメイン/IPアドレスを1行ずつ記述したテキストファイルを用意し、`-l` オプションで指定します。

targets.txt の例:


https://target1.com
http://target2.org
192.168.1.100
subdomain.target3.net

スキャン実行コマンド:


nuclei -l targets.txt

この方法は、多数のターゲットに対して効率的にスキャンを実行する場合に便利です。

テンプレートの指定

デフォルトでは、Nucleiはインストールされている多くのテンプレートを実行しようとします。特定のテンプレートやテンプレート群のみを実行したい場合は `-t` オプションを使用します。

特定のテンプレートファイルを指定:


nuclei -u https://example.com -t cves/2021/CVE-2021-44228.yaml

特定のディレクトリ配下のテンプレートをすべて実行:


nuclei -u https://example.com -t exposures/files/

複数のテンプレートやディレクトリをカンマ区切りで指定:


nuclei -u https://example.com -t cves/2022/,misconfigurations/apache/

重大度 (Severity) によるフィルタリング

検出結果を重大度でフィルタリングするには `-severity` (または `-s`) オプションを使用します。指定できる重大度は `info`, `low`, `medium`, `high`, `critical` です。カンマ区切りで複数指定できます。

`high` と `critical` の脆弱性のみを検出:


nuclei -u https://example.com -severity high,critical

タグ (Tag) によるフィルタリング

テンプレートにはタグが付与されており、これを利用して関連するテンプレート群を実行できます。`-tags` オプションを使用します。

`cve` タグが付いたテンプレートのみを実行:


nuclei -u https://example.com -tags cve

`network` と `jira` タグが付いたテンプレートを実行:


nuclei -u jira.example.com -tags network,jira

利用可能なタグの一覧は `-tgl` (または `-tags-list`) オプションで確認できます。


nuclei -tgl

出力結果の保存

スキャン結果をファイルに保存するには `-o` オプションを使用します。


nuclei -l targets.txt -o scan_results.txt

JSON Lines形式 (`.jsonl`) で出力するには `-jsonl` オプションを使用します。これは他のツールで結果を処理する際に便利です。


nuclei -l targets.txt -o scan_results.jsonl -jsonl

Markdown形式で出力するには `-me` (または `-markdown-export`) オプションを使用します。指定したディレクトリにテンプレートごとのMarkdownファイルが生成されます。


nuclei -l targets.txt -me markdown_report/

その他の便利なオプション

オプション 説明
-v, -verbose 詳細なログ(リクエスト/レスポンスなど)を表示します。デバッグに役立ちます。 nuclei -u example.com -t my-template.yaml -v
-silent 検出結果のみを表示し、バナーや進行状況などの情報を抑制します。 subfinder -d example.com -silent | httpx -silent | nuclei -silent
-stats スキャン中に統計情報(実行テンプレート数、リクエスト数など)を表示します。 nuclei -l targets.txt -stats
-timeout 個々のリクエストのタイムアウト時間を秒単位で設定します(デフォルト: 10秒)。 nuclei -u example.com -timeout 5
-retries タイムアウトまたはエラーが発生した場合のリトライ回数を設定します(デフォルト: 1)。 nuclei -u example.com -retries 3
-c 同時に実行するテンプレートの数を設定します(デフォルト: 25)。 nuclei -l targets.txt -c 50
-rl, -rate-limit 1秒あたりの最大リクエスト数を設定します(デフォルト: 150)。 nuclei -l targets.txt -rl 100
-H, -header カスタムHTTPヘッダーを追加します。複数指定可能です。 nuclei -u example.com -H "Authorization: Bearer ..." -H "X-Custom-Header: value"
-proxy HTTP/SOCKS5プロキシを指定します。 nuclei -u example.com -proxy http://127.0.0.1:8080
-validate 指定されたテンプレートの構文が正しいか検証します。スキャンは実行しません。 nuclei -t my-template.yaml -validate
-as, -automatic-scan Wappalyzerを使用してターゲットの技術スタックを検出し、関連するタグを持つテンプレートを自動的に選択して実行します。 nuclei -u example.com -as

すべてのオプションを確認するには `-h` (または `-help`) を使用してください。


nuclei -h

テンプレートの仕組み 📜

Nucleiの心臓部とも言えるのが「テンプレート」です。これはYAML形式で記述されたファイルで、Nucleiに対して「何を」「どのように」送信し、「レスポンスの何を」「どのように」チェックするかを指示します。

YAML形式

YAMLは人間が読み書きしやすいデータ構造化言語です。インデント(字下げ)によって階層構造を表現します。キーと値のペアで構成され、非常に直感的です。

テンプレートの主要な構成要素

Nucleiテンプレートは、いくつかの主要なキー(セクション)で構成されます。以下はHTTPリクエストを伴うテンプレートの典型的な構造です。

キー (セクション) 役割
id テンプレートの一意な識別子。通常、ケバブケース(例: `my-template-id`)で記述されます。必須項目です。
info テンプレートに関するメタ情報。以下のサブキーを含みます。
  • name: テンプレートの名前(必須)。
  • author: テンプレートの作成者(必須)。
  • severity: 検出内容の重大度 (`info`, `low`, `medium`, `high`, `critical`)(必須)。
  • description: テンプレートの説明(任意)。
  • reference: 関連情報へのリンク(URLのリスト)(任意)。
  • classification: 脆弱性の分類情報 (CWE ID, CVE ID, CVSSスコアなど)(任意)。
  • tags: テンプレートを分類するためのタグ(カンマ区切りの文字列)(任意)。フィルタリングに使用されます。
requests (HTTPの場合) ターゲットに送信するHTTPリクエストの詳細を定義します。複数のリクエストを定義することも可能です。リクエストメソッド、パス、ヘッダー、ボディなどを指定します。
network (TCP/UDPの場合) TCPやUDP通信の詳細を定義します。接続先ホスト、ポート、送信データなどを指定します。
dns (DNSの場合) DNSクエリの詳細を定義します。クエリ名、タイプ(A, MX, TXTなど)を指定します。
file (ファイル操作の場合) ローカルファイルの存在確認や内容のマッチングを行います。
headless (ヘッドレスブラウザの場合) ヘッドレスブラウザ(Chrome)を操作するアクションを定義します。ページ遷移、要素クリック、スクリプト実行などが可能です。
code (コード実行の場合) Go言語のコードスニペットを実行します。より複雑なロジックを実装できます(注意して使用する必要があります)。
matchers-condition 複数のマッチャー (`matchers`) が存在する場合に、それらの条件をどのように組み合わせるか (`and` または `or`) を指定します。デフォルトは `and` です。
matchers レスポンス(または他のデータソース)から脆弱性や特定の状態を示すパターンを検出するための条件を定義します。複数のマッチャーを指定できます。
  • type: マッチャーの種類 (`status`, `word`, `regex`, `binary`, `size`, `dsl`) を指定します。
  • part: チェック対象の部分 (`body`, `header`, `status_code`, `all`, `interactsh_protocol` など) を指定します。デフォルトは `body` です。
  • status / words / regex / binary / size / dsl: typeに応じた具体的な条件を指定します。
  • negative: `true` に設定すると、条件にマッチ *しない* 場合に成功とみなします(任意)。
  • condition: マッチャー内で複数の条件を組み合わせる場合 (`and` / `or`) を指定します(任意)。
extractors レスポンスから特定の情報を抽出し、結果として表示するためのルールを定義します(任意)。正規表現 (`regex`) や `kval` (キーバリュー) などが利用できます。

簡単なテンプレート例 (HTTP)

特定のファイル (`/admin/config.json`) が存在し、その内容に `”secret_key”` という文字列が含まれているかを確認するテンプレートの例です。


id: exposed-admin-config

info:
  name: Exposed Admin Configuration File
  author: Your Name
  severity: high
  description: Detects an exposed admin configuration file containing sensitive information.
  tags: exposure,config,sensitive

requests:
  - method: GET
    path:
      - "{{BaseURL}}/admin/config.json" # BaseURLはNucleiがターゲットURLから自動的に設定

    matchers-condition: and # 両方のマッチャーがtrueである必要がある
    matchers:
      - type: status # レスポンスのステータスコードをチェック
        status:
          - 200 # ステータスコードが200 OKであること

      - type: word # レスポンスボディに特定の単語が含まれるかチェック
        words:
          - "secret_key"
        part: body # ボディ部分をチェック (デフォルト)

このテンプレートは、まず `/admin/config.json` へGETリクエストを送信します。そして、レスポンスのステータスコードが `200` であり、かつ (`matchers-condition: and`)、レスポンスボディに `”secret_key”` という文字列が含まれている場合に、このテンプレートは「マッチした」(脆弱性または問題を発見した)と判断します。

Nucleiテンプレートは非常に表現力豊かで、変数 (`{{BaseURL}}` など)、ヘルパー関数、条件分岐などを組み合わせて複雑なスキャンロジックを構築できます。

より高度な使い方 ✨

Nucleiは基本的なスキャン以外にも、より効率的で詳細な分析を可能にする高度な機能を提供しています。

ワークフロー (Workflows) ⛓️

ワークフロー機能を使うと、複数のテンプレートを連携させて、条件に応じたスキャンを実行できます。例えば、「特定の技術(例: WordPress)が検出された場合にのみ、その技術に関連する脆弱性テンプレートを実行する」といったシナリオを実現できます。

ワークフローは別のYAMLファイルで定義します。基本的な構造は以下のようになります。


# workflow-example.yaml
id: wordpress-vulnerability-scan-workflow

info:
  name: WordPress Vulnerability Scan Workflow
  author: Your Name

# ワークフロー内で使用するテンプレートへのパスを定義
variables:
  wordpress_detect: technologies/wordpress-detect.yaml
  wordpress_cves: cves/technologies/wordpress/*.yaml # ワイルドカードも使用可能

logic:
  # まず wordpress_detect テンプレートを実行
  - templates:
      - wordpress_detect # 変数名を参照
    # wordpress_detect がマッチした場合にのみ、次のステップを実行
    matchers:
      - id: wordpress_detect # マッチさせたいテンプレートのID (info.id ではない)

  # 上のステップがマッチした場合、wordpress_cves を実行
  - templates:
      - wordpress_cves # 変数名を参照

ワークフローを実行するには `-w` オプションを使用します。


nuclei -u https://wordpress-site.com -w workflow-example.yaml

これにより、不要なスキャンを削減し、より効率的で精度の高い診断が可能になります。

Interactsh連携 (OAST – Out-of-Band Application Security Testing) 📡

Interactshは、ProjectDiscoveryが提供するオープンソースのOASTサーバーです。DNSルックアップ、HTTPリクエスト、SMTP通信などを記録し、外部との意図しない通信を引き起こすタイプの脆弱性(例: SSRF、ブラインドXSS、外部エンティティ参照 (XXE)、OSコマンドインジェクションなど)を検出するのに役立ちます。

NucleiはInteractshとシームレスに連携します。テンプレート内で `{{interactsh-url}}` というプレースホルダーを使用すると、Nucleiは自動的に一意なInteractshサブドメインを生成し、リクエストに挿入します。そして、そのサブドメインへのアクセス(インタラクション)があったかどうかを検出できます。

Interactshを利用するテンプレート例(ブラインドSSRFの検出):


id: blind-ssrf-via-param

info:
  name: Blind SSRF via Request Parameter
  author: Your Name
  severity: high
  tags: ssrf,oast

requests:
  - method: GET
    path:
      - "{{BaseURL}}/load?url={{interactsh-url}}" # パラメータにInteractsh URLを挿入

    matchers:
      - type: word
        part: interactsh_protocol # Interactshへのインタラクションがあったかチェック
        words:
          - "dns" # DNSクエリがあった場合にマッチ (http, smtpなども指定可能)

このテンプレートを実行すると、Nucleiは `{{interactsh-url}}` を `ランダム文字列.oast.fun` のようなURLに置き換えてリクエストを送信します。もしターゲットサーバーがこのURLに対してDNSクエリを発行した場合、Interactshサーバーがそれを検知し、Nucleiの `interactsh_protocol` マッチャーが `dns` というインタラクションを検出して報告します。

デフォルトでは、NucleiはProjectDiscoveryがホストする公開Interactshサーバー (`oast.pro`, `oast.live` など) を使用します。自前のInteractshサーバーを立てて使用することも可能です (`-iserver`, `-itoken` オプション)。

自動スキャン (-as オプション) 🤖

`-as` (または `-automatic-scan`) オプションは、Nucleiに組み込まれた技術検出エンジン(Wappalyzerベース)を使用してターゲットのWebサイトやアプリケーションが使用している技術(CMS、フレームワーク、言語、サーバーソフトウェアなど)を特定し、それらの技術に対応するタグを持つテンプレートを自動的に選択して実行する機能です。


nuclei -u https://example.com -as

これにより、ターゲットに関連性の高いテンプレートのみが実行されるため、スキャン時間を短縮し、ノイズを減らすことができます。特に初期の偵察段階で役立ちます。より詳細なクライアントサイドの技術検出のために `-headless` オプションと組み合わせることも可能です。

ヘッドレスモード (-headless オプション) 🌐

`-headless` オプションを使用すると、NucleiはバックグラウンドでChromeブラウザ(ヘッドレスモード)を起動し、ターゲットのWebページをレンダリングします。これにより、JavaScriptによって動的に生成されるコンテンツや、クライアントサイドのフレームワークに依存するアプリケーションに対しても、より正確なスキャンや技術検出が可能になります。


nuclei -u https://javascript-heavy-app.com -headless -tags javascript,react

また、`headless` プロトコルを使用したテンプレートを作成することで、ログイン操作、フォーム入力、ボタンクリックなど、ブラウザ上での複雑な操作を自動化し、それによって引き起こされる脆弱性を検出することもできます。

カスタムテンプレートの作成と管理 ✍️

Nucleiの真価は、独自のカスタムテンプレートを作成できる点にあります。特定のアプリケーションの独自の設定ミス、ビジネスロジックの脆弱性、あるいは公開されていない脆弱性(ゼロデイ)に対する検出ロジックをテンプレートとして定義できます。

作成したカスタムテンプレートは、デフォルトのテンプレートディレクトリとは別の場所に保存し、`-t` オプションでそのディレクトリを指定して実行するのが一般的です。


nuclei -u https://internal-app.com -t ~/my-nuclei-templates/

テンプレートの作成にあたっては、公式ドキュメントや既存のコミュニティテンプレートが大いに参考になります。

設定ファイル (config.yaml) ⚙️

毎回コマンドラインで多くのオプションを指定する代わりに、設定ファイル (`config.yaml`) にデフォルト設定を記述しておくことができます。デフォルトのパスは `$HOME/.config/nuclei/config.yaml` (Linux/macOS) または `%USERPROFILE%\.config\nuclei\config.yaml` (Windows) です。

設定ファイルの例:


# デフォルトで追加するHTTPヘッダー
header:
  - 'X-BugBounty-Hacker: YourAlias'
  - 'Referer: https://google.com'

# デフォルトで実行するテンプレートディレクトリやタグ
# templates:
#   - ~/my-custom-templates/
# tags: my-custom-tag,important

# デフォルトで除外するタグ
exclude-tags: info,fuzz

# デフォルトのレート制限
rate-limit: 100
concurrency: 30

# デフォルトで使用するプロキシ
# proxy: http://127.0.0.1:8080

# デフォルトのタイムアウト
# timeout: 15

設定ファイルはNuclei起動時に自動的に読み込まれます。`-config` オプションで別の設定ファイルを指定することも可能です。

注意点と倫理的利用 🛡️

Nucleiは非常に強力なツールですが、その利用にはいくつかの注意点と、倫理的な配慮が不可欠です。

法的・倫理的な責任

最も重要な注意点です。 Nucleiを含む脆弱性スキャナーを、許可なく他者のシステムやネットワークに対して使用することは、多くの国や地域で違法行為とみなされます。 必ず以下の点を遵守してください。

  • 自分の管理下にあるシステムに対してのみ使用する。
  • 他者のシステムをスキャンする場合は、事前に明確な書面による許可を得る。
  • バグバウンティプログラムなどに参加する場合は、そのプログラムのルールやスコープ(対象範囲)を厳守する。スコープ外のターゲットへのスキャンは絶対に避ける。
  • スキャンによってサービス停止 (DoS) や意図しない副作用を引き起こさないよう注意する。特に `dos` や `fuzz` タグのついたテンプレートの使用には慎重になる。

ツールの使用によって生じたいかなる結果についても、使用者が全責任を負います。

誤検知 (False Positives) と過検知 (False Negatives)

Nucleiはテンプレートに基づいて動作するため、その精度はテンプレートの品質に依存します。

  • 誤検知 (False Positive): 実際には脆弱性がないのに、脆弱性があると報告されるケース。テンプレートの検出ロジックが甘い場合や、特定の環境でのみ発生するパターンに偶然一致した場合などに起こり得ます。検出結果は必ず手動で検証(再現確認)することが重要です。
  • 過検知 (False Negative): 実際には脆弱性があるのに、検出されないケース。テンプレートが存在しない脆弱性、テンプレートのロジックが不十分な場合、あるいはターゲットの環境が特殊で検出パターンに一致しない場合などに起こり得ます。Nucleiの結果だけで安全だと判断せず、他のツールや手動テストと組み合わせることが推奨されます。

パフォーマンスへの影響

Nucleiは高速ですが、多数のテンプレートを同時に実行したり、レート制限を高く設定しすぎたりすると、ターゲットサーバーやネットワークに大きな負荷をかける可能性があります。

  • スキャン対象システムのパフォーマンスに影響を与えないよう、-c (concurrency) や -rl (rate-limit) オプションを適切に調整してください。
  • 特に本番環境に対してスキャンを行う場合は、事前に負荷テストを行うか、業務時間外に実施するなど、十分な配慮が必要です。

テンプレートの信頼性

コミュニティテンプレートは多くの専門家によってレビューされていますが、中には意図しない動作をするものや、特定の状況下で問題を引き起こす可能性のあるものが含まれているかもしれません。

  • 重要なシステムに対して使用する前には、テンプレートの内容を確認し、その動作を理解しておくことが望ましいです。
  • -validate オプションで構文をチェックしたり、-tl オプションで実行されるテンプレートのリストを確認したりできます。
  • 信頼できないソースからのテンプレートは使用しないようにしましょう。

アップデートの追従

Nuclei本体もテンプレートも活発に開発・更新されています。新しい脆弱性に対応したり、ツールのバグが修正されたりするため、定期的にアップデートを行うことが重要です。


# Nuclei本体のアップデート (Goの場合)
go install -v github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest

# テンプレートのアップデート
nuclei -update-templates

ただし、アップデートによって既存のテンプレートやワークフローの動作が変わる可能性もあるため、変更ログを確認することをお勧めします。

まとめ 🎉

Nucleiは、その速度、柔軟性、そして強力なコミュニティサポートにより、現代のセキュリティ専門家にとって不可欠なツールの一つとなっています。テンプレートベースのアプローチにより、既知の脆弱性からカスタムのチェックまで、幅広いセキュリティスキャンを効率的に自動化できます。

本記事で学んだこと:

  • ✅ Nucleiの概要とその特徴
  • ✅ 様々な環境へのインストール方法
  • ✅ 単一・複数ターゲットのスキャン、テンプレート指定、フィルタリングなどの基本的な使い方
  • ✅ YAMLベースのテンプレート構造と主要な構成要素
  • ✅ ワークフロー、Interactsh連携、自動スキャン、ヘッドレスモードなどの高度な機能
  • ✅ 利用上の注意点と倫理的な考慮事項

Nucleiを使いこなすことで、脆弱性の発見プロセスを大幅にスピードアップし、より安全なシステム構築に貢献できます。しかし、そのパワーを正しく、倫理的に利用することが何よりも重要です。

ぜひ、公式ドキュメントやコミュニティテンプレートをさらに探求し、独自のテンプレート作成にも挑戦してみてください。Happy scanning! 😊

参考情報 📚

コメント

タイトルとURLをコピーしました