Nucleiを使いこなす:Web・インフラ脆弱性スキャンの自動化「キラー」ツール

Security tutorial - IT technology blog
Security tutorial - IT technology blog

「泥棒を捕らえて縄をなう」ことにならないために

午前3時、サーバー過負荷のアラートでスマホが鳴り止みませんでした。ログを確認すると、ある不審なIPが1分間に5,000回以上のリクエストを送り、SSHのブルートフォース攻撃を仕掛けていたのです。ファイアウォールはありましたが、更新パッチを適用していないバックグラウンドサービスを見逃していたという自分の不注意でした。眠気に耐えながらキーボードを叩き、データ紛失の恐怖と戦いながら必死に修正箇所を探す経験は、まさにトラウマものです。この苦い教訓から学んだのは、「ハッカーがドアをノックする前に、自分で脆弱性を見つける必要がある」ということです。

ペネトレーションテスト(Pentest)やDevSecOpsの世界では、Nucleiはもはやお馴染みのツールです。ポートスキャンに特化したNmapや、動作の重いNessusとは異なり、Nucleiはより柔軟なアプローチを採用しています。それは、YAML形式で記述された「テンプレート」に基づいて脆弱性をスキャンするという方法です。最大の強みはそのスピードです。新しい脆弱性(CVE)が公開されると、コミュニティからわずか数時間でスキャンテンプレートがリリースされることも珍しくありません。現在、Nucleiのテンプレート数は8,000を超え、ロジックエラーから設定ミスまで幅広くカバーしています。

このツールを使えば、XSS、SQLインジェクション、設定ファイルの漏洩チェックといった退屈な作業を、数千ものドメインに対して同時に自動化できます。一日中手動でテストする代わりに、わずか数分ですべてが完了します。

Nucleiをあっという間にインストールする

NucleiはGo言語で書かれているため非常に軽量です。Linux、Windows、macOSのいずれでもスムーズに動作します。Go環境が整っていれば、コマンド一つでインストールが完了します。

Go経由でのインストール

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

インストール後、以下のコマンドを入力して準備ができているか確認してください:

nuclei -version

「脳(テンプレート)」の更新

初めて使用する際は、Nucleiの「知能」をダウンロードする必要があります。これは世界中のトップセキュリティ専門家によって作成された数千ものスキャンテンプレートの集合体です:

nuclei -update-templates

ヒント:私はよく月額5ドル程度の格安VPS(Ubuntu)でNucleiを動かし、個人のPCに負荷をかけずに24時間365日の定期スキャンを行っています。

よく使う実戦コマンド

Nucleiの使用法は非常に簡単ですが、大量の通知に埋もれないためには、賢いフィルタリング方法を知っておく必要があります。

1. 特定のウェブサイトを素早くチェックする

これが最もシンプルな開始方法です:

nuclei -u https://example.com

Nucleiは自動的に分析を行い、最適なテンプレートを選択して実行します。特定の脆弱性をより詳しく調査したい場合は、-tagsフラグを使用します。

2. 優先度に基づいたスキャン

時間が限られている場合、私は極めて危険な脆弱性(Critical)や設定ミス(Misconfig)のみに焦点を当てます:

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

この方法により、不要な警告を排除し、システム停止に直結するような脆弱性の対処に集中できます。

3. 一括スキャン(Bulk Scan)

数百ものウェブサイトを管理している場合、一つずつスキャンする必要はありません。すべての対象をtargets.txtファイルに保存して、以下を実行します:

nuclei -list targets.txt -c 50

-c 50フラグは、50スレッドの同時実行を可能にします。サーバーのスペックに応じてこの数値を上げることで、作業をより早く完了させることができます。

4. 独自の「監視の目」を作成する

サーバー上でマルウェア特有の兆候を探す必要がある場合もあります。新しいYAMLテンプレートの作成は非常に簡単です。例えば、以下は.envファイルが外部に露出していないかを確認する方法です:

id: expose-env-file
info:
  name: .envファイルの露出をスキャン
  severity: high
requests:
  - method: GET
    path:
      - "{{BaseURL}}/.env"
    matchers:
      - type: word
        words:
          - "DB_PASSWORD"
          - "APP_KEY"

コードを書くのに2分もかからず、独自の脆弱性スキャンツールが手に入ります。

結果の管理とモニタリング

スキャンが終わった後、どこで結果を確認するのが便利でしょうか?真っ黒なコンソール画面をずっと眺めている必要はありません。

分析用レポートの出力

私はよく JSONファイルとして出力し、後でPythonスクリプトでフィルタリングしたり、ダッシュボードに反映させたりしています:

nuclei -u https://example.com -json-export results.json

素早く確認するだけであれば、-o results.txtフラグを使用して従来のテキストファイルとして保存します。

セキュリティを自動化プロセス(CI/CD)に組み込む

インフラエンジニアであれば、NucleiをGitHub ActionsやJenkinsに統合すべきです。新しいコードがプッシュされるたびに、Nucleiが自動的に基本的なスキャンを実行します。重大な脆弱性が発見された場合、チームのSlackに直接通知を送ることも可能です。

notifyツールと組み合わせることで、非常に強力な即応体制を構築できます:

nuclei -u https://example.com | notify -provider slack

Nucleiを使用する際の実戦的なアドバイス

  • 倫理が最優先: 自分が権限を持っている、または許可を得たシステムのみをスキャンしてください。好奇心ゆえにブラックハッカーになってはいけません。
  • ツールは100%正確ではない: 時にはNucleiが誤検知(False Positive)をすることもあります。エラーが報告されたら、慌てて上司に報告する前に、必ず手動で再確認してください。
  • 常に「脳」を最新の状態に: 新しい脆弱性は毎日次々と現れます。毎朝、作業を始める前に -update-templates を実行する習慣をつけましょう。

Nucleiをマスターすることは、システムの安全性を高めるだけでなく、ハッカーの思考プロセスを理解することにも繋まります。皆さんの実装が成功し、サーバーが常に脆弱性のないクリーンな状態に保たれることを願っています!

Share: