mcpField
B
building-vulnerability-scanning-workflow

building-vulnerability-scanning-workflow

github.com/mukul975安全35.2k260 次安装8 周前更新
代码仓库

关于 building-vulnerability-scanning-workflow

面向 SOC 团队的漏洞扫描工作流构建技能,涵盖扫描规划、基于资产与威胁情报的风险排序,以及 SIEM 关联和修复跟踪。适用于建立周期性漏洞管理流程,不用于渗透测试或主动利用。

主要功能

  1. 01规划扫描范围与周期
  2. 02结合资产和 KEV 排定风险
  3. 03设置修复 SLA
  4. 04将扫描结果接入 SIEM
  5. 05建立修复跟踪仪表板
  6. 06自动创建高优先级工单

适用场景

  1. 01建立周期性漏洞扫描计划
  2. 02识别关键资产上的已知在野漏洞
  3. 03跟踪补丁修复和 SLA 合规情况
  4. 04验证补丁后漏洞是否关闭

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/mukul975/anthropic-cybersecurity-skills --skill building-vulnerability-scanning-workflow

安装后在 Claude Code 中输入/building-vulnerability-scanning-workflow确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

LICENSE
references/
api-reference.md
scripts/
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