Webサイト脆弱性スキャン入門:NucleiとKatanaで始めるセキュリティチェック

ebサイトのセキュリティが気になるけど、専門的な知識がなくて何から始めればいいか分からない...そんなIT技術者の方に向けて、オープンソースのツールを使った脆弱性スキャンの方法をご紹介します。 今回は「Nuclei」と「Katana」という2つのツールを組み合わせて、効率的にWebサイトの脆弱性をチェックする方法を解説していきます。

By Toshiyuki Yoshida

1. NucleiとKatanaとは?

NucleiはProjectDiscoveryが開発したオープンソースの脆弱性スキャナーです。最大の特徴は以下の通りです。

  • テンプレートベース:YAML形式のテンプレートで脆弱性パターンを定義
  • コミュニティ駆動:世界中のセキュリティ研究者が3000以上のテンプレートを提供
  • 高速処理:並列処理による効率的なスキャン
  • 低い誤検出率:実際の脆弱性を模擬したテストで精度が高い
  • 多様な対応:CVE、設定ミス、情報漏洩など幅広い脆弱性に対応

KatanaもProjectDiscoveryが開発したWebクローラーです:

  • 高速クロール:Go言語で開発された軽量で高速なクローラー
  • JavaScript対応:SPA(Single Page Application)も適切にクロール
  • 設定柔軟:クロール深度や対象範囲を細かく制御可能
  • Nuclei連携:同じ開発元のため、Nucleiとの相性が抜群

両者ともProjectDiscoveryが開発したツールですが、この組み合わせが良い理由は次 の通りです。

  • Katanaでサイト全体のURLを収集
  • NucleiでそれらのURLに対して脆弱性をチェック
  • 両ツールとも同じ開発元なので連携がスムーズ
  • オープンソースなので無料で利用可能

2. インストール方法

前提条件は次の通りです。

  • macOS
  • Homebrew(未インストールの場合は公式サイトからインストール)
  • Go言語環境(brew install goでインストール可能)

インストール手順は以下の通りです。 初回実行時にNucleiが自動的にテンプレートをダウンロードします。

# Homebrewを使用(推奨)
brew install nuclei

# インストール確認
nuclei -version

# Go言語でインストール
go install github.com/projectdiscovery/katana/cmd/katana@latest

# インストール確認
katana -version

# テンプレートの手動更新(定期的に実行推奨)
nuclei -update-templates

3. 実行方法と結果の確認

最もシンプルな使い方から始めましょう。単一のURLを検査する方法です。

# 基本的なスキャン
nuclei -u https://example.com -o results.txt

# 重要度の高い脆弱性のみチェック
nuclei -u https://example.com -s critical,high,medium -o important_vulns.txt

サイト全体をチェックしたい場合は、次のような手順となります。

# 1. Katanaでサイト全体をクロール
katana -u https://example.com -d 2 -o urls.txt

# 2. 不要なファイルを除外
grep -v -E '\.(jpg|jpeg|png|gif|css|js|ico)$' urls.txt > filtered_urls.txt

# 3. Nucleiで脆弱性スキャン
nuclei -l filtered_urls.txt -s critical,high,medium -o vulnerability_report.txt

脆弱性が発見されなければ何も出力されません。 脆弱性が発見された場合は発見された内容が出力されていますので、以下のように 確認できます。

# 発見された脆弱性の数
wc -l vulnerability_report.txt

# 脆弱性の内容確認
cat vulnerability_report.txt

# 重要度別の集計
cat vulnerability_report.txt | grep -oE '\[(critical|high|medium|low)\]' | sort | uniq -c

4. どのような検証がなされているか確認する方法

仕事などで脆弱性検証を行う場合、「で、一体何が検証されたん?」と聞かれること もあると思います。3,000以上のテンプレートを使用しているので、簡単にどんなテ ンプレートが使用されているか把握する方法です。

# 全テンプレート数
nuclei -tl | wc -l

# カテゴリ別のテンプレート数
echo "CVE脆弱性: $(nuclei -tl -tags cve | wc -l)"
echo "情報漏洩: $(nuclei -tl -tags exposure | wc -l)"
echo "設定ミス: $(nuclei -tl -tags misconfig | wc -l)"
echo "XSS: $(nuclei -tl -tags xss | wc -l)"
echo "LFI: $(nuclei -tl -tags lfi | wc -l)"
echo "管理画面: $(nuclei -tl -tags panel | wc -l)" 
echo "技術スタック: $(nuclei -tl -tags tech | wc -l)" 
echo "情報収集: $(nuclei -tl -tags osint | wc -l)" 

# 重要度で判別
nuclei -tl -s critical | wc -l     # 1321件
nuclei -tl -s high | wc -l         # 2377件  
nuclei -tl -s medium | wc -l       # 2322件
nuclei -tl -s low | wc -l          # 316件
nuclei -tl -s info | wc -l         # 4086件

脆弱性が発見された場合は、以下のように詳細ログを確認しましょう。

# 詳細ログ付きで実行
nuclei -u https://example.com -v -o results.txt

# 特定カテゴリのテンプレート一覧
nuclei -tl -tags cve | head -10

CVE(Common Vulnerabilities and Exposures)について

CVEは世界共通のセキュリティ脆弱性カタログです。

  • 命名規則:CVE-YYYY-NNNNN(年-通し番号)
  • :CVE-2021-44228(Log4jの重大な脆弱性)
  • Nucleiは3000以上のCVEに対応したテンプレートを保有

5. 実践的な使い分け

実践的な使い方をまとめてみしょう。

# クイックチェック(30秒以内)
nuclei -u https://example.com -t exposures/ -s critical,high

# バランス型チェック(1-2分)
nuclei -u https://example.com -t cves/,exposures/ -s medium,high,critical

# 徹底スキャン(5-10分) - 新サイトの評価など
katana -u https://example.com -d 2 | nuclei -s critical,high,medium

テンプレート選択は以下のような指針で運用するとよいと思います。

  • 初回チェックcves/,exposures/(CVEと情報漏洩)
  • 定期チェック-s critical,high(重要度の高いもののみ)
  • 詳細調査:全テンプレート使用

6. パフォーマンス最適化

脆弱性の検証自体は結構重たい処理なってしまうので、パフォーマンスが問題となる 場合は、以下のような並行度やレート制限の調整を行いましょう。

# 並列度とレート制限の調整
nuclei -u https://example.com -c 50 -rl 100 -timeout 5

# バッチ処理での最適化
nuclei -l urls.txt -c 25 -rl 50 -bulk-size 25
  • -c 50:同時実行テンプレート数を50に設定
  • -rl 100:1秒間に100リクエストまで
  • -timeout 5:タイムアウトを5秒に短縮

7. セキュリティ向上のための継続的運用

継続的に運用するために、次のようなスクリプトを組んで cronなどで自動運用する 方法もよいと思います。

#!/bin/bash
# daily_security_check.sh

TARGET="https://your-website.com"
DATE=$(date +%Y%m%d)
OUTPUT_DIR="security_scans/$DATE"

# 金曜日(5)かチェック
if [ $(date +%u) -eq 5 ]; then
    echo "金曜日なので、テンプレートを更新します..."
    nuclei -update-templates
fi

mkdir -p "$OUTPUT_DIR"

# 高優先度の脆弱性をチェック
nuclei -u "$TARGET" -s critical,high -o "$OUTPUT_DIR/critical_scan.txt"

# 結果をメール送信(お好みで)
if [ -s "$OUTPUT_DIR/critical_scan.txt" ]; then
    mail -s "セキュリティアラート: $TARGET" admin@company.com < "$OUTPUT_DIR/critical_scan.txt"
fi

8. 他ツールとの連携例

Webサイトが静的サイトジェネレーターなどで組まれている場合は、 サイト生成のCI/CDパイプラインに脆弱性検証を組み込むという手もあります。

以下は、GitHub Actionsの例です。

# GitHub Actions例
name: Security Scan
on:
  schedule:
    - cron: '0 9 * * 1'  # 毎週月曜日9時

jobs:
  security-scan:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      
      - name: Install Nuclei
        run: |
          go install github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest
          
      - name: Run Security Scan
        run: |
          nuclei -u ${{ secrets.TARGET_URL }} -s critical,high -o scan_results.txt
          
      - name: Upload Results
        uses: actions/upload-artifact@v2
        with:
          name: security-scan-results
          path: scan_results.txt

また、レポート生成の自動化、定期的な処理などの最後にレポート出力を組み込んで も良いと思います。

# 簡単なサマリーレポート生成
generate_security_report() {
    TARGET=$1
    OUTPUT="security_report_$(date +%Y%m%d).txt"
    
    echo "=== セキュリティスキャンレポート ===" > "$OUTPUT"
    echo "対象サイト: $TARGET" >> "$OUTPUT"
    echo "スキャン日時: $(date)" >> "$OUTPUT"
    echo "" >> "$OUTPUT"
    
    # スキャン実行
    nuclei -u "$TARGET" -s critical,high,medium -o temp_results.txt
    
    echo "発見された脆弱性数: $(wc -l < temp_results.txt)" >> "$OUTPUT"
    echo "" >> "$OUTPUT"
    echo "詳細結果:" >> "$OUTPUT"
    cat temp_results.txt >> "$OUTPUT"
    
    rm temp_results.txt
    echo "レポートを生成しました: $OUTPUT"
}

# 使用例
generate_security_report "https://example.com"

⚠️ 重要:責任ある使用のための注意事項

脆弱性の検証はサーバーに非常に負荷をかけるため、 不正アクセス禁止法、電子計算機損壊等業務妨害罪、偽計業務妨害罪 などに抵触し違法行為になる可能性があります。

必ず以下を遵守しましょう。

  1. 所有権の確認

    • 自分が所有するサイトのみスキャンしてください
    • 他者のサイトには必ず事前許可を取得してください
  2. 適切な負荷制御

    • 本番サイトへの負荷を考慮してレート制限を設定
    • 業務時間外でのスキャン実施を推奨
  3. 結果の適切な管理

    • スキャン結果には機密情報が含まれる可能性があります
    • 結果ファイルの保存場所とアクセス権限に注意

なぜ偽計業務妨害罪となる可能性があるか

偽計業務妨害罪(刑法233条)の要件は、以下の3つです。

  • 偽計:虚偽の情報や人を欺く行為
  • 業務妨害:他人の業務を妨害すること
  • 故意:妨害する意図があること

脆弱性検査はサーバーに非常に負荷を掛ける処理であることは知られているので、 業務妨害と故意であることは分かりやすいと思います。

「偽計」については、脆弱性スキャンはブラウザの正常なアクセスを装って リクエストヘッダを偽装しつつ「負荷」という観点では攻撃的とも言えるペイロード を送信するため「偽計」と見なされる可能性があります。

まとめ

NucleiとKatanaを使った脆弱性スキャンは、以下のような方に特におすすめです:

  • 自社サイトのセキュリティ状況を定期的にチェックしたい
  • オープンソースツールでコストを抑えたい
  • コマンドラインツールに慣れている
  • セキュリティの基本的な知識を実践で学びたい

最初は単一URLの簡単なチェックから始めて、慣れてきたらサイト全体のスキャンや自動化に挑戦してみてください。重要なのは継続的にセキュリティをチェックする習慣を作ることです。

脆弱性が見つからない結果も良い結果です。むしろサイトが適切にメンテナンスされている証拠として安心できる材料になります。

セキュリティは一度設定すれば終わりではなく、継続的な取り組みが重要です。このツールを活用して、より安全なWebサイト運営を目指しましょう!


参考リンク

注意:この記事の内容は啓蒙目的であり、適切な許可なく他者のシステムをスキャンすることは違法行為となる可能性があります。必ず責任を持って使用してください。