Webサイト脆弱性スキャン入門:NucleiとKatanaで始めるセキュリティチェック
ebサイトのセキュリティが気になるけど、専門的な知識がなくて何から始めればいいか分からない...そんなIT技術者の方に向けて、オープンソースのツールを使った脆弱性スキャンの方法をご紹介します。今回は「Nuclei」と「Katana」という2つのツールを組み合わせて、効率的にWebサイトの脆弱性をチェックする方法を解説していきます。 NucleiはProjectDiscoveryが開発したオープンソースの脆弱性スキャナーです。最大の特徴は以下の通りです。 KatanaもProjectDiscoveryが開発したWebクローラーです。 両者ともProjectDiscoveryが開発したツールですが、この組み合わせが良い理由は次 の通りです。 前提条件は次の通りです。 インストール手順は以下の通りです。 初回実行時にNucleiが自動的にテンプレートをダウンロードします。 最もシンプルな使い方から始めましょう。単一のURLを検査する方法です。 サイト全体をチェックしたい場合は、次のような手順となります。 脆弱性が発見されなければ何も出力されません。 脆弱性が発見された場合は発見された内容が出力されていますので、以下のように 確認できます。 仕事などで脆弱性検証する場合、「で、一体何が検証されたん?」と聞かれること もあると思います。3,000以上のテンプレートを使用しているので、簡単にどんなテ ンプレートが使用されているか把握する方法です。 脆弱性が発見された場合は、以下のように詳細ログを確認しましょう。 CVEは世界共通のセキュリティ脆弱性カタログです。 実践的な使い方をまとめてみしょう。 テンプレート選択は以下のような指針で運用するとよいと思います。 脆弱性の検証自体は結構重たい処理なってしまうので、パフォーマンスが問題となる 場合は、以下のような並行度やレート制限を調整しましょう。 継続的に運用するために、次のようなスクリプトを組んでcronなどで自動運用する 方法もよいと思います。 Webサイトが静的サイトジェネレーターなどで組まれている場合は、 サイト生成のCI/CDパイプラインに脆弱性検証を組み込むという手もあります。 以下は、GitHub Actionsの例です。 また、レポート生成の自動化、定期的な処理などの最後にレポート出力を組み込んで も良いと思います。 脆弱性の検証はサーバーに非常に負荷をかけるため、 不正アクセス禁止法、電子計算機損壊等業務妨害罪、偽計業務妨害罪 などに抵触し違法行為になる可能性があります。 必ず以下を遵守しましょう。 所有権の確認 適切な負荷制御 結果の適切な管理 偽計業務妨害罪(刑法233条)の要件は、以下の3つです。 脆弱性検査はサーバーに非常に負荷を掛ける処理であることは知られているので、 業務妨害と故意であることは分かりやすいと思います。 「偽計」については、脆弱性スキャンはブラウザの正常なアクセスを装って リクエストヘッダを偽装しつつ「負荷」という観点では攻撃的とも言えるペイロード を送信するため「偽計」と見なされる可能性があります。 NucleiとKatanaを使った脆弱性スキャンは、以下のような方に特におすすめです。 最初は単一URLの簡単なチェックから始めて、慣れてきたらサイト全体のスキャンや自動化に挑戦してみてください。重要なのは継続的にセキュリティをチェックする習慣を作ることです。 脆弱性が見つからない結果も良い結果です。むしろサイトが適切にメンテナンスされている証拠として安心できる材料になります。 セキュリティは一度設定すれば終わりではなく、継続的な取り組みが重要です。このツールを活用して、より安全なWebサイト運営を目指しましょう。 参考リンク 注意:この記事の内容は啓蒙目的であり、適切な許可なく他者のシステムをスキャンすることは違法行為となる可能性があります。必ず責任を持って使用してください。Table of Contents
1. NucleiとKatanaとは?
2. インストール方法
brew install goでインストール可能)# Homebrewを使用(推奨)
brew install nuclei
# インストール確認
nuclei -version
# Go言語でインストール
go install github.com/projectdiscovery/katana/cmd/katana@latest
# インストール確認
katana -version
# テンプレートの手動更新(定期的に実行推奨)
nuclei -update-templates3. 実行方法と結果の確認
# 基本的なスキャン
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 -c4. どのような検証がなされているか確認する方法
# 全テンプレート数
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 -10CVE(Common Vulnerabilities and Exposures)について
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,mediumcves/,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 257. セキュリティ向上のための継続的運用
# 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"
fi8. 他ツールとの連携例
# 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"⚠️ 重要:責任ある使用のための注意事項
なぜ偽計業務妨害罪となる可能性があるか
まとめ