results-storage について
ペネトレーションテスト担当者向けの、SQLiteを使った保存・レポート生成スキルです。ホスト、ポートスキャン、脆弱性の情報をセッション間で保持し、サブシステム別の整理や絞り込み、Markdown・JSON出力に対応します。
主な機能
- 01テスト結果をSQLiteに永続化
- 02サブシステムとホスト別に整理
- 03脆弱性、スキャン、Web所見を保存
- 04深刻度、種類、ホストで絞り込み
- 05MarkdownとJSONのレポートを生成
活用シーン
- 01複数のテストセッションで所見を保持
- 02サブシステム別に資産と脆弱性を整理
- 03ホストや深刻度を指定して所見を検索
- 04ペネトレーションテストのレポートを作成
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ crazymarky/ pentest-skills --skill results-storageインストール後、Claude Code で/results-storageを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
assets/report_templates/json_schema.jsonmarkdown_template.mdreferences/api_reference.mddatabase_schema.mdintegration_examples.mdscripts/__init__.pydb_manager.pyquery_builder.pyreport_generator.pystorage_api.py詳細
ペネトレーションテスト結果の保存とレポート作成
概要
results-storage スキルは、すべてのペネトレーションテスト活動に対応する SQLite ベースの永続ストレージシステムを提供します。セッションをまたいだデータの永続化、構造化された脆弱性の追跡、プロフェッショナルなレポートの生成が可能になります。
主な機能
- 永続ストレージ:
./data/results.dbに SQLite データベースを作成します - 柔軟な構成:サブシステム(任意)> ホストの階層構造
- 複数形式のレポート:Markdown および JSON 形式のレポートを生成します
- クエリ機能:深刻度、種類、ホスト、サブシステムでフィルタリングできます
- 後方互換性:既存のスキルと変更なしで併用できます
データの構成
Subsystem (optional)
└── Host
├── Port Scan Results
├── Vulnerabilities (SQLi, XSS, LFI, etc.)
└── Web Findings (detailed web vulnerability info)
サブシステムがない場合:データはフラットなホスト階層で構成されます(subsystem_id は NULL)。
クイックスタート
データベースの初期化
データベースは初回使用時に自動的に作成されます。
from .claude.skills.results-storage.scripts.storage_api import StorageAPI
api = StoreAPI()
# Database created at ./data/results.db
脆弱性の保存
# Flat hierarchy (no subsystem)
api.store_sqli_vulnerability(
host_ip="192.168.1.100",
url="https://example.com/login?id=1",
parameter="id",
payload="1' OR '1'='1",
severity="Critical",
title="SQL Injection in Login Page"
)
# With subsystem
api.store_xss_vulnerability(
host_ip="192.168.1.100",
url="https://example.com/search",
xss_type="reflected",
payload="<script>alert(1)</script>",
subsystem="Web Application",
severity="High",
title="XSS in Search Functionality"
)
レポートの生成
from .claude.skills.results-storage.scripts.report_generator import ReportGenerator
gen = ReportGenerator()
# Markdown report
gen.generate_markdown_report(output_path="pentest_report.md")
# JSON report
gen.generate_json_report(output_path="pentest_report.json")
# Subsystem-specific report
gen.generate_markdown_report(
output_path="webapp_report.md",
subsystem="Web Application"
)
データベーススキーマ
テーブル
subsystems(任意)
- id、name、description、subnet_range、created_at
hosts
- id、subsystem_id(NULL 許容)、ip_address、hostname、mac_address、os_fingerprint、status、first_seen、last_seen
vulnerabilities
- id、host_id、vulnerability_type、severity、title、description、affected_component、proof_of_concept、cvss_score、cwe_id、cve_id、status、discovered_at、discovered_by_skill
port_scan_results
- id、host_id、port、protocol、state、service、version、product、extra_info、scan_tool、scan_date
web_findings(Web 脆弱性の詳細情報)
- id、vulnerability_id、url、parameter、http_method、payload、response_evidence、context、request_headers
scan_metadata
- id、host_id、skill_used、scan_command、scan_date、raw_output_path、notes
インデックス
一般的なクエリ向けに最適化されています。
idx_vulnerabilities_severity(vulnerabilities(severity))idx_vulnerabilities_type(vulnerabilities(vulnerability_type))idx_vulnerabilities_host(vulnerabilities(host_id))idx_port_scans_host(port_scan_results(host_id))idx_web_findings_vuln(web_findings(vulnerability_id))
API リファレンス
StorageAPI クラス
初期化
api = StorageAPI(db_path="./data/results.db")
サブシステムの管理
# Create subsystem
subsystem_id = api.create_subsystem(
name="Web Application",
description="Customer A web infrastructure",
subnet_range="192.168.1.0/24"
)
# Get or create (returns existing if already exists)
subsystem_id = api.get_or_create_subsystem("Web Application")
# List all subsystems
subsystems = api.list_subsystems()
脆弱性の保存
# Generic vulnerability storage
vuln_id = api.store_vulnerability(
host_ip="192.168.1.100",
vuln_type="sqli",
severity="Critical",
title="SQL Injection in Login",
subsystem="Web Application", # Optional
description="Full description...",
affected_component="/login",
proof_of_concept="id=1' OR '1'='1",
cvss_score=9.8,
cwe_id="CWE-89"
)
# SQL Injection (convenience method)
vuln_id = api.store_sqli_vulnerability(
host_ip="192.168.1.100",
url="https://example.com/login?id=1",
parameter="id",
payload="1' OR '1'='1",
db_type="MySQL",
subsystem="Web Application", # Optional
**details
)
# XSS (convenience method)
vuln_id = api.store_xss_vulnerability(
host_ip="192.168.1.100",
url="https://example.com/search?q=test",
xss_type="reflected", # reflected/stored/dom
payload="<script>alert(1)</script>",
context="html_body", # html_body/html_attribute/javascript/dom/url
subsystem="Web Application", # Optional
**details
)
# LFI (convenience method)
vuln_id = api.store_lfi_vulnerability(
host_ip="192.168.1.100",
url="https://example.com/download?file=../../etc/passwd",
payload="../../etc/passwd",
file_read="root:x:0:0:root:/root:/bin/bash\n...",
subsystem="Web Application", # Optional
**details
)
ポートスキャン結果の保存
api.store_port_scan(
host_ip="192.168.1.100",
ports=[
{
"port": 80,
"protocol": "tcp",
"state": "open",
"service": "http",
"version": "Apache httpd 2.4.41",
"product": "Apache"
},
{
"port": 443,
"protocol": "tcp",
"state": "open",
"service": "https"
}
],
scan_tool="nmap",
subsystem="External Network" # Optional
)
クエリメソッド
# Get vulnerabilities with filters
vulns = api.get_vulnerabilities(
subsystem="Web Application", # Optional
severity="Critical", # Optional
vuln_type="sqli", # Optional
host_ip="192.168.1.100" # Optional
)
# Returns: List[Dict]
# Get host summary
summary = api.get_host_summary("192.168.1.100")
# Returns: Dict with open_ports, vulnerabilities, os_info, etc.
# Get statistics
stats = api.get_subsystem_statistics(subsystem="Web Application")
# Returns: Dict with total_vulnerabilities, severity_breakdown, etc.
ReportGenerator クラス
gen = ReportGenerator(db_path="./data/results.db")
# Markdown report
markdown_path = gen.generate_markdown_report(
output_path="report.md", # Optional: auto-generates if None
subsystem="Web Application" # Optional: includes all if None
)
# JSON report
json_path = gen.generate_json_report(
output_path="report.json",
subsystem="Web Application"
)
# Executive summary only
summary = gen.generate_executive_summary(subsystem="Web Application")
# Risk score calculation
risk_info = gen.calculate_risk_score(vulnerabilities)
# Returns: {"score": 8.5, "level": "High"}
既存のスキルとの連携
既存のすべてのスキルには、任意で使用できるストレージスクリプトがあります。これらのスクリプトは次の処理を行います。
- ツールの出力を解析します(nmap XML、sqlmap JSON など)。
- StorageAPI を呼び出して検出結果を保存します。
- 任意のグループ化に対応する --subsystem フラグをサポートします。
例:ポートスキャン結果の保存
# Flat hierarchy
nmap -sV -p- 192.168.1.0/24 -oX scan.xml
python .claude/skills/recon-port-scan/scripts/port_scan_storage.py \
--xml-file scan.xml
# With subsystem
python .claude/skills/recon-port-scan/scripts/port_scan_storage.py \
--xml-file scan.xml \
--subsystem "External Network"
例:SQLi の保存
sqlmap -u "https://example.com/login?id=1" --batch --answers=continuing
python .claude/skills/exploit-sqli/scripts/sqli_storage.py \
--host-ip 192.168.1.100 \
--url "https://example.com/login?id=1" \
--parameter id \
--subsystem "Web Application" \
--severity Critical
使用シナリオ
シナリオ 1:複数セッションにわたるペネトレーションテスト
状況:数日間にわたってペネトレーションテストを実施しており、セッションをまたいで状態を維持する必要があります。
# Day 1: Initial reconnaissance
nmap -sV -p- 192.168.1.0/24 -oX day1_scan.xml
python .claude/skills/recon-port-scan/scripts/port_scan_storage.py \
--xml-file day1_scan.xml \
--subsystem "Customer A"
# Day 2: Web application testing
sqlmap -u "https://customer-a.com/login?id=1" --batch
python .claude/skills/exploit-sqli/scripts/sqli_storage.py \
--host-ip 192.168.1.100 \
--url "https://customer-a.com/login?id=1" \
--parameter id \
--subsystem "Customer A"
# Day 3: Generate report
python -c "
from .claude.skills.results-storage.scripts.report_generator import ReportGenerator
gen = ReportGenerator()
gen.generate_markdown_report('customer_a_report.md', 'Customer A')
"
シナリオ 2:複数サブシステムでの構成
状況:個別のサブシステム(DMZ、内部ネットワーク、クラウド)を含む大規模なネットワークをテストしています。
# DMZ scanning
nmap -sV -p- 10.0.0.0/24 -oX dmz_scan.xml
python .claude/skills/recon-port-scan/scripts/port_scan_storage.py \
--xml-file dmz_scan.xml \
--subsystem "DMZ"
# Internal network
nmap -sV -p- 192.168.1.0/24 -oX internal_scan.xml
python .claude/skills/recon-port-scan/scripts/port_scan_storage.py \
--xml-file internal_scan.xml \
--subsystem "Internal"
# Cloud infrastructure
nmap -sV -p- 10.1.0.0/24 -oX cloud_scan.xml
python .claude/skills/recon-port-scan/scripts/port_scan_storage.py \
--xml-file cloud_scan.xml \
--subsystem "Cloud"
# Generate subsystem-specific reports
python -c "
from .claude.skills.results-storage.scripts.report_generator import ReportGenerator
gen = ReportGenerator()
gen.generate_markdown_report('dmz_report.md', 'DMZ')
gen.generate_markdown_report('internal_report.md', 'Internal')
gen.generate_markdown_report('cloud_report.md', 'Cloud')
"
# Or generate comprehensive report
python -c "
gen = ReportGenerator()
gen.generate_markdown_report('full_report.md')
"
シナリオ 3:脆弱性のクエリ
状況:すべてのホストにある Critical の脆弱性をすべて見つける必要があります。
from .claude.skills.results-storage.scripts.storage_api import StorageAPI
api = StorageAPI()
critical_vulns = api.get_vulnerabilities(severity="Critical")
for vuln in critical_vulns:
print(f"[{vuln['id']}] {vuln['title']}")
print(f" Host: {vuln['host_ip']}")
print(f" Type: {vuln['vulnerability_type']}")
print(f" CVSS: {vuln['cvss_score']}")
print(f" Discovered: {vuln['discovered_at']}")
print()
シナリオ 4:フラットな階層の使用
状況:複雑な構成を必要としない、シンプルなテストです。
# No subsystem specified - uses flat hierarchy
nmap -sV -p- 192.168.1.0/24 -oX scan.xml
python .claude/skills/recon-port-scan/scripts/port_scan_storage.py \
--xml-file scan.xml
# Query flat hierarchy
python -c "
from .claude.skills.results-storage.scripts.storage_api import StorageAPI
api = StorageAPI()
api.store_xss_vulnerability(
host_ip='192.168.1.100',
url='https://example.com/search',
xss_type='reflected',
payload='<script>alert(1)</script>',
# No subsystem = flat hierarchy
severity='High',
title='XSS in Search'
)
"
シナリオ 5:ホストベースの調査
状況:特定のホストの検出結果を詳しく調査します。
from .claude.skills.results-storage.scripts.storage_api import StorageAPI
api = StorageAPI()
# Get comprehensive host summary
host_summary = api.get_host_summary("192.168.1.100")
print(f"IP: {host_summary['ip_address']}")
print(f"Hostname: {host_summary.get('hostname', 'Unknown')}")
print(f"OS: {host_summary.get('os_fingerprint', 'Unknown')}")
print(f"Open Ports: {len(host_summary['ports'])}")
print(f"Vulnerabilities: {len(host_summary['vulnerabilities'])}")
print("\n--- Vulnerabilities ---")
for vuln in host_summary['vulnerabilities']:
print(f"[{vuln['severity']}] {vuln['title']}")
print("\n--- Open Ports ---")
for port in host_summary['ports']:
print(f"Port {port['port']}/{port['protocol']}: {port.get('service', 'unknown')} ({port['state']})")
シナリオ 6:カスタムクエリ
状況:特定の脆弱性パターンをクエリする必要があります。
from .claude.skills.results-storage.scripts.storage_api import StorageAPI
api = StorageAPI()
# All web vulnerabilities in a subsystem
web_vulns = api.get_vulnerabilities(
subsystem="Web Application",
vuln_type=["xss", "sqli", "lfi", "ssrf", "xxe"]
)
# High-severity SQLi across all subsystems
sqli_high = api.get_vulnerabilities(
vuln_type="sqli",
severity=["High", "Critical"]
)
# Vulnerabilities for a specific host
host_vulns = api.get_vulnerabilities(host_ip="192.168.1.100")
レポートのカスタマイズ
Markdown レポートのセクション
生成されるレポートには、次の項目が含まれます。
- エグゼクティブサマリー - 概要とリスクスコア
- 方法論 - テストの手法と使用したツール
- 詳細な検出結果 - 深刻度ごとに分類された脆弱性
- ホスト一覧 - 検出されたすべてのホスト
- 推奨事項 - 優先順位を付けた修正手順
- 付録 - コマンド、ツールの出力、コンプライアンス
JSON レポートスキーマ
{
"metadata": {
"report_date": "2025-02-14",
"test_period": {
"start": "2025-02-10",
"end": "2025-02-14"
},
"testers": ["pentester"]
},
"executive_summary": {
"risk_score": 8.5,
"total_vulnerabilities": 47,
"severity_breakdown": {...}
},
"subsystems": [...],
"hosts": [...],
"vulnerabilities": [...],
"recommendations": [...]
}
データ管理
データベースの場所
./data/results.db
バックアップ
# Simple backup
cp ./data/results.db ./data/results_backup_$(date +%Y%m%d).db
# Encrypted backup (recommended for production)
gpg --cipher-algo AES256 --compress-algo 1 --symmetric ./data/results.db
エクスポート/インポート
# SQLite to SQL
sqlite3 ./data/results.db .dump > results_backup.sql
# SQL to SQLite
sqlite3 ./data/results.db < results_backup.sql
データベースのリセット
# CAUTION: Deletes all data
rm ./data/results.db
# Database will be recreated on next use
パフォーマンスに関する考慮事項
- 容量:10,000 件以上の脆弱性でテスト済み
- クエリ時間:フィルターを適用したクエリで 1 秒未満
- レポート生成:1,000 件以上の脆弱性を含む完全なレポートで 10 秒未満
- インデックス:一般的なクエリパターンに対して自動的に作成されます
セキュリティに関する考慮事項
データ保護
- データベースの権限:Results.db は権限 600(所有者のみ読み書き可能)で作成されます
- 機密データ:データベースには PoC コードが含まれます。実稼働環境では暗号化を検討してください
- 監査証跡:すべての検出結果には、タイムスタンプと検出方法が含まれます
ベストプラクティス
- 定期的なバックアップ:各テストセッション後にバックアップを作成します
- アクセス制御:ファイルシステムの権限が制限されていることを確認します
- 暗号化:バックアップを共有場所に保存する前に暗号化します
- 保持:保持ポリシーに従い、不要になったデータを削除します
トラブルシューティング
データベースがロックされている場合
# Check for processes using the database
lsof ./data/results.db
# Kill blocking processes if needed
kill -9 <PID>
インポートエラー
# Ensure Python path is correct
export PYTHONPATH="${PYTHONPATH}:$(pwd)"
python -c "from .claude.skills.results-storage.scripts.storage_api import StorageAPI"
レポート生成エラー
# Install Jinja2 if missing
pip install jinja2
# Verify database exists
ls -lh ./data/results.db
コンプライアンス
このストレージおよびレポートシステムは、以下の標準への準拠をサポートします。
- OWASP Testing Guide v4.2
- PTES(Penetration Testing Execution Standard)
- OSSTMM(Open Source Security Testing Methodology)
一貫性を保つため、すべてのタイムスタンプは UTC で記録されます。
関連スキル
- recon-port-scan - ストレージ連携によるポートスキャン
- recon-subdomain - ストレージ連携によるサブドメイン列挙
- exploit-sqli - ストレージ連携による SQL インジェクションテスト
- exploit-xss - ストレージ連携による XSS テスト
- exploit-lfi - ストレージ連携による LFI テスト
高度な使用方法
プログラムからのアクセス
import sqlite3
conn = sqlite3.connect('./data/results.db')
cursor = conn.cursor()
# Custom SQL queries
cursor.execute("""
SELECT h.ip_address, COUNT(v.id) as vuln_count
FROM hosts h
LEFT JOIN vulnerabilities v ON h.id = v.host_id
GROUP BY h.ip_address
ORDER BY vuln_count DESC
""")
for row in cursor.fetchall():
print(f"{row[0]}: {row[1]} vulnerabilities")
conn.close()
バッチ処理
from .claude.skills.results-storage.scripts.storage_api import StorageAPI
api = StorageAPI()
# Store multiple vulnerabilities
vulnerabilities = [
{"host_ip": "192.168.1.100", "vuln_type": "xss", "severity": "High", ...},
{"host_ip": "192.168.1.101", "vuln_type": "sqli", "severity": "Critical", ...},
]
for vuln_data in vulnerabilities:
api.store_vulnerability(**vuln_data)
このスキルは、pentest-skills のすべての機能にわたる、永続的で整理されたペネトレーションテストデータ管理の基盤を提供します。