关于 building-vulnerability-scanning-workflow
面向 SOC 团队的漏洞扫描工作流构建技能,涵盖扫描规划、基于资产与威胁情报的风险排序,以及 SIEM 关联和修复跟踪。适用于建立周期性漏洞管理流程,不用于渗透测试或主动利用。
主要功能
- 01规划扫描范围与周期
- 02结合资产和 KEV 排定风险
- 03设置修复 SLA
- 04将扫描结果接入 SIEM
- 05建立修复跟踪仪表板
- 06自动创建高优先级工单
适用场景
- 01建立周期性漏洞扫描计划
- 02识别关键资产上的已知在野漏洞
- 03跟踪补丁修复和 SLA 合规情况
- 04验证补丁后漏洞是否关闭
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill building-vulnerability-scanning-workflow安装后在 Claude Code 中输入/building-vulnerability-scanning-workflow确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
LICENSEreferences/api-reference.mdscripts/agent.py详细介绍
构建漏洞扫描工作流
何时使用
在以下情况下使用本技能:
- SOC 团队需要建立或改进周期性漏洞扫描计划
- 扫描结果需要借助资产上下文和威胁情报,在原始 CVSS 评分之外进行优先级排序
- 漏洞数据必须集成到 SIEM 中,以便与利用尝试进行关联
- 修复跟踪需要借助基于 SLA 的仪表盘和报告实现规范化
请勿使用于渗透测试或主动利用——漏洞扫描用于识别弱点,渗透测试用于验证可利用性。
前置条件
- 漏洞扫描器(Tenable Nessus Professional、Qualys VMDR 或 OpenVAS/Greenbone)
- 带有关键性分类的资产清单(业务关键、标准、开发)
- 从扫描器到所有目标网段的网络访问(基于 Agent 或网络扫描)
- 用于扫描结果摄取和关联的 SIEM 集成
- 用于修复跟踪的补丁管理系统(WSUS、SCCM、Intune)
工作流
步骤 1:定义扫描范围和计划
创建覆盖所有资产类型的扫描策略:
Nessus 扫描配置(API):
import requests
nessus_url = "https://nessus.company.com:8834"
headers = {"X-ApiKeys": f"accessKey={access_key};secretKey={secret_key}"}
# Create scan policy
policy = {
"uuid": "advanced",
"settings": {
"name": "SOC Weekly Infrastructure Scan",
"description": "Weekly credentialed scan of all server and workstation segments",
"scanner_id": 1,
"policy_id": 0,
"text_targets": "10.0.0.0/16, 172.16.0.0/12",
"launch": "WEEKLY",
"starttime": "20240315T020000",
"rrules": "FREQ=WEEKLY;INTERVAL=1;BYDAY=SA",
"enabled": True
},
"credentials": {
"add": {
"Host": {
"Windows": [{
"domain": "company.local",
"username": "nessus_svc",
"password": "SCAN_SERVICE_PASSWORD",
"auth_method": "Password"
}],
"SSH": [{
"username": "nessus_svc",
"private_key": "/path/to/nessus_key",
"auth_method": "public key"
}]
}
}
}
}
response = requests.post(f"{nessus_url}/scans", headers=headers, json=policy,
verify=not os.environ.get("SKIP_TLS_VERIFY", "").lower() == "true") # Set SKIP_TLS_VERIFY=true for self-signed certs in lab environments
scan_id = response.json()["scan"]["id"]
print(f"Scan created: ID {scan_id}")
通过 API 进行 Qualys VMDR 扫描:
import qualysapi
conn = qualysapi.connect(
hostname="qualysapi.qualys.com",
username="api_user",
password="API_PASSWORD"
)
# Launch vulnerability scan
params = {
"action": "launch",
"scan_title": "Weekly_Infrastructure_Scan",
"ip": "10.0.0.0/16",
"option_id": "123456", # Scan profile ID
"iscanner_name": "Internal_Scanner_01",
"priority": "0"
}
response = conn.request("/api/2.0/fo/scan/", params)
print(f"Scan launched: {response}")
步骤 2:处理扫描结果并确定优先级
下载结果并应用基于风险的优先级排序:
import requests
import csv
# Export Nessus results
response = requests.get(
f"{nessus_url}/scans/{scan_id}/export",
headers=headers,
params={"format": "csv"},
verify=not os.environ.get("SKIP_TLS_VERIFY", "").lower() == "true", # Set SKIP_TLS_VERIFY=true for self-signed certs in lab environments
)
# Parse and prioritize
vulns = []
reader = csv.DictReader(response.text.splitlines())
for row in reader:
cvss = float(row.get("CVSS v3.0 Base Score", 0))
asset_criticality = get_asset_criticality(row["Host"]) # From asset inventory
# Risk-based priority calculation
risk_score = cvss * asset_criticality_multiplier(asset_criticality)
# Boost score if actively exploited (check CISA KEV)
if row.get("CVE") in cisa_kev_list:
risk_score *= 1.5
vulns.append({
"host": row["Host"],
"plugin_name": row["Name"],
"severity": row["Risk"],
"cvss": cvss,
"cve": row.get("CVE", "N/A"),
"risk_score": round(risk_score, 1),
"asset_criticality": asset_criticality,
"kev": row.get("CVE") in cisa_kev_list
})
# Sort by risk score
vulns.sort(key=lambda x: x["risk_score"], reverse=True)
CISA KEV(已知被利用漏洞)检查:
import requests
kev_response = requests.get(
"https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json"
)
kev_data = kev_response.json()
cisa_kev_list = {v["cveID"] for v in kev_data["vulnerabilities"]}
# Check if vulnerability is actively exploited
def is_actively_exploited(cve_id):
return cve_id in cisa_kev_list
步骤 3:定义修复 SLA
应用基于 SLA 的修复时间线:
| 优先级 | CVSS 范围 | 资产类型 | SLA | 示例 |
|---|---|---|---|---|
| P1 严重 | 9.0-10.0 + KEV | 所有资产 | 24 小时 | 生产服务器上的 Log4Shell、EternalBlue |
| P2 高 | 7.0-8.9 或 9.0+ 非 KEV | 业务关键 | 7 天 | 无已知利用的 RCE |
| P3 中 | 4.0-6.9 | 业务关键 | 30 天 | 需认证的权限提升 |
| P4 低 | 0.1-3.9 | 标准 | 90 天 | 信息泄露、低影响 DoS |
| P5 信息性 | 0.0 | 开发 | 下一周期 | 最佳实践发现、配置加固 |
步骤 4:与 SIEM 集成以检测利用行为
将漏洞扫描数据与 SIEM 告警关联,以检测主动利用行为:
index=vulnerability sourcetype="nessus:scan"
| eval vuln_key = Host.":".CVE
| join vuln_key type=left [
search index=ids_ips sourcetype="snort" OR sourcetype="suricata"
| eval vuln_key = dest_ip.":".cve_id
| stats count AS exploit_attempts, latest(_time) AS last_exploit_attempt by vuln_key
]
| where isnotnull(exploit_attempts)
| eval risk = "CRITICAL — Vulnerability being actively exploited"
| sort - exploit_attempts
| table Host, CVE, plugin_name, cvss_score, exploit_attempts, last_exploit_attempt, risk
当在关键资产上检测到 KEV 漏洞时发出告警:
index=vulnerability sourcetype="nessus:scan" severity="Critical"
| lookup cisa_kev_lookup.csv cve_id AS CVE OUTPUT kev_status, due_date
| where kev_status="active"
| lookup asset_criticality_lookup.csv ip AS Host OUTPUT criticality
| where criticality IN ("business-critical", "mission-critical")
| table Host, CVE, plugin_name, cvss_score, kev_status, due_date, criticality
步骤 5:构建修复跟踪仪表盘
用于漏洞指标的 Splunk 仪表盘:
-- Open vulnerabilities by severity
index=vulnerability sourcetype="nessus:scan" status="open"
| stats count by severity
| eval order = case(severity="Critical", 1, severity="High", 2, severity="Medium", 3,
severity="Low", 4, 1=1, 5)
| sort order
-- SLA compliance tracking
index=vulnerability sourcetype="nessus:scan" status="open"
| eval sla_days = case(
severity="Critical", 1,
severity="High", 7,
severity="Medium", 30,
severity="Low", 90
)
| eval days_open = round((now() - first_detected) / 86400)
| eval sla_status = if(days_open > sla_days, "OVERDUE", "Within SLA")
| stats count by severity, sla_status
-- Remediation trend over 90 days
index=vulnerability sourcetype="nessus:scan"
| eval is_open = if(status="open", 1, 0)
| eval is_closed = if(status="fixed", 1, 0)
| timechart span=1w sum(is_open) AS opened, sum(is_closed) AS remediated
步骤 6:自动化修复工单
为高优先级发现自动创建工单:
import requests
servicenow_url = "https://company.service-now.com/api/now/table/incident"
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {snow_token}"
}
for vuln in vulns:
if vuln["risk_score"] >= 8.0:
ticket = {
"short_description": f"[VULN] {vuln['cve']} — {vuln['plugin_name']} on {vuln['host']}",
"description": (
f"Vulnerability: {vuln['plugin_name']}\n"
f"CVE: {vuln['cve']}\n"
f"CVSS: {vuln['cvss']}\n"
f"Host: {vuln['host']}\n"
f"Asset Criticality: {vuln['asset_criticality']}\n"
f"CISA KEV: {'YES' if vuln['kev'] else 'NO'}\n"
f"Risk Score: {vuln['risk_score']}\n"
f"Remediation SLA: {'24 hours' if vuln['kev'] else '7 days'}"
),
"urgency": "1" if vuln["kev"] else "2",
"impact": "1" if vuln["asset_criticality"] == "business-critical" else "2",
"assignment_group": "IT Infrastructure",
"category": "Vulnerability"
}
response = requests.post(servicenow_url, headers=headers, json=ticket)
print(f"Ticket created: {response.json()['result']['number']}")
关键概念
| 术语 | 定义 |
|---|---|
| CVSS | 通用漏洞评分系统——漏洞的标准化严重性评级(0-10) |
| CISA KEV | 已知被利用漏洞目录——CISA 维护的已确认存在主动利用行为的漏洞列表 |
| 凭证扫描 | 使用认证访问进行的漏洞扫描,相比仅网络扫描可实现更深入的检测 |
| 资产关键性 | 决定修复优先级的业务影响分类(任务关键、业务关键、标准) |
| 修复 SLA | 服务等级协议,定义按严重性允许修复漏洞的最长时间 |
| EPSS | 漏洞利用预测评分系统——基于 ML 的概率评分,预测被利用的可能性 |
工具与系统
- Tenable Nessus / Tenable.io:企业漏洞扫描器,具有 200,000+ 插件检查和合规审计功能
- Qualys VMDR:基于云的漏洞管理,具有资产发现、优先级排序和补丁集成功能
- OpenVAS (Greenbone):开源漏洞扫描器,带有社区维护的漏洞源
- CISA KEV Catalog:美国政府维护的主动被利用漏洞列表,要求强制修复
- Rapid7 InsightVM:漏洞管理平台,具有实时仪表盘和修复项目跟踪功能
常见场景
- 零日响应:发布新 CVE 时,对受影响软件运行定向扫描,并与 KEV 和漏洞利用数据库交叉比对
- 合规审计准备:生成 PCI DSS 或 HIPAA 漏洞报告,展示扫描覆盖范围和修复状态
- 补丁后验证:重新扫描已修复系统,确认漏洞已关闭并更新跟踪仪表板
- 网络扩展:基础设施新增子网时,按相应策略将其纳入扫描范围
- 第三方风险:在集成前扫描对外资产,验证供应商补丁合规性
输出格式
VULNERABILITY SCAN REPORT — Weekly Summary
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Scan Date: 2024-03-16 02:00 UTC
Scan Scope: 10.0.0.0/16 (1,247 hosts scanned)
Duration: 4h 23m
Coverage: 98.7% (16 hosts unreachable)
Findings:
Severity Count New CISA KEV
Critical 23 5 3
High 187 34 12
Medium 892 78 0
Low 1,456 112 0
Info 3,891 201 0
Top Priority (P1 — 24hr SLA):
CVE-2024-21762 FortiOS RCE 3 hosts KEV: YES
CVE-2024-1709 ConnectWise RCE 1 host KEV: YES
CVE-2024-3400 Palo Alto PAN-OS RCE 2 hosts KEV: YES
SLA Compliance:
Critical: 82% within SLA (4 overdue)
High: 91% within SLA (17 overdue)
Medium: 88% within SLA (107 overdue)
Tickets Created: 39 (ServiceNow)
评论
支持 Markdown