CVE-2025-20352 Cisco SNMP 漏洞暴露检测工具

CVE-2025-20352 SNMP 暴露检测工具

<p align="left">
<img src="https://raw.githubusercontent.com/scadastrangelove/CVE-2025-20352/main/cokk_cve20352.png" alt="CVE-2025-20352 logo" width="420">
</p>

CVE-2025-20352 SNMP 暴露检测工具 是一个轻量级、安全的黑盒检测方案,专为网络管理员和安全运维人员设计,用于快速识别网络中可能受 CVE-2025-20352 漏洞影响的 Cisco IOS/IOS XE 设备。

该工具通过 SNMP 社区扫描获取设备的 sysDescr.0 信息,并自动解析版本号,与已知的修复版本进行比对,从而标记出需要进一步验证的设备。整个过程不执行任何漏洞利用操作,仅进行信息收集与评估。

功能特性

  • SNMP 社区扫描:使用 onesixtyone 对指定子网进行快速 SNMP 探测,支持自定义社区列表
  • 智能设备识别:自动识别 Cisco IOS 和 IOS XE 设备,区分非 Cisco 设备
  • 版本信息提取:从 sysDescr.0 横幅中精准提取系统版本号
  • 漏洞状态标记:基于内置的修复版本白名单,自动标记设备状态:
    • :check_mark_button: Fixed — 确认为已修复版本
    • :warning: Potentially Vulnerable — 可能受影响的版本,需在 Cisco Software Checker 中进一步验证
    • :information: Not Cisco / Not IOS — 非 Cisco 或非 IOS 设备
  • CSV 输出:生成结构化 CSV 报告,便于后续分析与审计
  • 纯黑盒检测:不进行任何漏洞利用或破坏性操作,安全合规

安装指南

系统要求

  • 操作系统:Linux (Ubuntu/Debian 推荐) 或 macOS
  • 依赖工具:onesixtyone、python3、snmp
  • Python 版本:Python 3.6 及以上

安装步骤

1. 克隆仓库

git clone https://github.com/scadastrangelove/CVE-2025-20352 cve-2025-20352-scan
cd cve-2025-20352-scan

2. 安装依赖 (Ubuntu/Debian)

sudo add-apt-repository -y universe
sudo apt update
sudo apt install -y onesixtyone snmp python3

3. 安装依赖 (macOS)

brew install onesixtyone snmp python3

4. 创建 SNMP 社区列表

创建包含常用默认社区名称的文本文件:

printf "public\nprivate\n" > communities.txt

可根据需要添加更多社区名称,每行一个。

使用说明

基础用法

1. 执行 SNMP 扫描

使用 onesixtyone 对目标子网进行扫描(请替换为实际 IP 地址):

onesixtyone -c communities.txt 192.168.1.0/24 10.0.0.0/24 | tee snmp_raw.txt

参数说明:

  • -c communities.txt — 指定社区列表文件
  • 192.168.1.0/24 — 目标子网(支持 CIDR 格式)
  • | tee snmp_raw.txt — 同时输出到终端并保存原始结果

2. 解析扫描结果

python3 ios_cve20352_parser.py < snmp_raw.txt > parsed.csv

3. 查看格式化报告

column -s, -t < parsed.csv | less -S

输出说明

生成的 parsed.csv 文件包含以下字段:

字段 说明
ip 设备 IP 地址
community 有效的 SNMP 社区名称
vendor 厂商类型:Cisco 或 Non-Cisco
os_family 操作系统系列:IOS、IOS XE 或空
version 从 banner 中提取的版本号
status 漏洞状态标记(详见下方说明)
raw 原始 sysDescr.0 横幅内容

状态标记说明

状态 含义
Fixed (IOS XE 17.15.4a) 确认为已修复版本
Potentially Vulnerable — IOS XE 17.x.x; verify in Cisco Software Checker 可能受影响的版本,需在 Cisco Software Checker 中确认
Cisco IOS/IOS XE (version unknown) — Potentially Vulnerable Cisco 设备但无法提取版本号,建议人工核查
Not Cisco / Not IOS 非 Cisco 设备或非 IOS 系统

使用示例

完整扫描流程示例

# 1. 准备社区列表
echo -e "public\nprivate\ncisco\n" > communities.txt

# 2. 扫描 /24 子网
onesixtyone -c communities.txt 192.168.10.0/24 | tee scan_results.txt

# 3. 解析结果
python3 ios_cve20352_parser.py < scan_results.txt > vulnerability_report.csv

# 4. 筛选潜在风险设备
grep "Potentially Vulnerable" vulnerability_report.csv

输出示例

ip,community,vendor,os_family,version,status,raw
192.168.1.100,public,Cisco,IOS XE,17.15.4a,Fixed (IOS XE 17.15.4a),"Cisco IOS XE Software, Version 17.15.4a ..."
192.168.1.101,private,Cisco,IOS,15.5(3)S2,Potentially Vulnerable — IOS 15.5(3)S2; verify in Cisco Software Checker,"Cisco IOS Software, ASR1000 ... Version 15.5(3)S2 ..."
192.168.1.102,public,Non-Cisco,,,,HP ProCurve Switch ..."

核心代码

1. 主解析器 — ios_cve20352_parser.py

该脚本是整个工具的核心,负责解析 onesixtyone 的原始输出,识别 Cisco 设备并标记漏洞状态。

#!/usr/bin/env python3
import re, sys, csv, fileinput

# 已知修复版本白名单
# 格式: {"操作系统": {"版本号": True}}
# 可通过 Cisco Software Checker 确认后手动添加
FIXED_WHITELIST = {
    "IOS": {
        # 在此添加确认的 IOS 15.x 修复版本
        # 例如: "15.9(3)M12": True
    },
    "IOS XE": {
        "17.15.4a": True,
        # 可在此添加更多已确认的修复版本
        # "17.15.4b": True,
        # "17.9.6": True,
    }
}

# 预编译正则表达式,提升匹配效率
RE_VERSION = re.compile(r'\bVersion\s+([^\s,]+)', re.IGNORECASE)
RE_CISCO_IOS = re.compile(r'Cisco\s+IOS\s+Software', re.IGNORECASE)
RE_CISCO_IOS_XE = re.compile(r'Cisco\s+IOS\s+XE\s+Software', re.IGNORECASE)


def classify(line: str):
    """
    解析单行扫描结果,提取设备信息并判断漏洞状态
    
    输入格式: "IP [community] <sysDescr.0 banner>"
    返回: 包含 ip, community, vendor, os_family, version, status, raw 的字典
    """
    line = line.strip()
    if not line:
        return None

    # 尝试解析标准格式: IP [community] description
    m = re.match(r'(?P<ip>\d+\.\d+\.\d+\.\d+)\s+\[(?P<com>[^]]+)\]\s+(?P<desc>.+)$', line)
    if not m:
        # 格式不匹配时返回未解析状态
        return {
            "ip": "", "community": "", "vendor": "Unknown",
            "os_family": "", "version": "", "raw": line,
            "status": "Unparsed"
        }
    
    ip = m.group('ip')
    community = m.group('com')
    desc = m.group('desc')

    # 初始化设备信息
    vendor = "Non-Cisco"
    os_family = ""
    version = ""

    # 识别 Cisco 设备类型
    if RE_CISCO_IOS_XE.search(desc):
        vendor = "Cisco"
        os_family = "IOS XE"
    elif RE_CISCO_IOS.search(desc):
        vendor = "Cisco"
        os_family = "IOS"

    # 提取版本号
    vm = RE_VERSION.search(desc)
    if vm:
        version = vm.group(1)

    # 判断漏洞状态
    if vendor != "Cisco":
        status = "Not Cisco / Not IOS"
    elif not version:
        status = "Cisco IOS/IOS XE (version unknown) — Potentially Vulnerable; verify in Cisco Software Checker"
    else:
        # 检查版本是否在修复白名单中
        fixed = FIXED_WHITELIST.get(os_family, {}).get(version, False)
        if fixed:
            status = f"Fixed ({os_family} {version})"
        else:
            status = f"Potentially Vulnerable — {os_family} {version}; verify in Cisco Software Checker"

    return {
        "ip": ip,
        "community": community,
        "vendor": vendor,
        "os_family": os_family,
        "version": version,
        "raw": desc,
        "status": status
    }


def main():
    """主函数:读取标准输入,解析并输出 CSV 格式结果"""
    rows = []
    for line in fileinput.input():
        rec = classify(line)
        if rec:
            rows.append(rec)

    # 输出 CSV 报告
    writer = csv.DictWriter(
        sys.stdout,
        fieldnames=["ip", "community", "vendor", "os_family", "version", "status", "raw"]
    )
    writer.writeheader()
    for r in rows:
        writer.writerow(r)


if __name__ == "__main__":
    main()

2. 扫描命令集成示例

以下是在实际环境中集成扫描与解析的 Shell 脚本示例:

#!/bin/bash
# 快速扫描脚本 — scan_and_parse.sh

SUBNETS="192.168.1.0/24 10.0.0.0/24"
COMMUNITY_FILE="communities.txt"
RAW_OUTPUT="snmp_raw_$(date +%Y%m%d_%H%M%S).txt"
CSV_OUTPUT="vuln_report_$(date +%Y%m%d_%H%M%S).csv"

echo "[*] Starting SNMP scan on: $SUBNETS"
onesixtyone -c "$COMMUNITY_FILE" $SUBNETS | tee "$RAW_OUTPUT"

echo "[*] Parsing results..."
python3 ios_cve20352_parser.py < "$RAW_OUTPUT" > "$CSV_OUTPUT"

echo "[*] Summary of potentially vulnerable devices:"
grep -c "Potentially Vulnerable" "$CSV_OUTPUT" || echo "0"

echo "[*] Reports saved to:"
echo "    Raw:   $RAW_OUTPUT"
echo "    CSV:   $CSV_OUTPUT"

3. 白名单更新机制

当 Cisco 官方发布新的修复版本后,可通过更新 FIXED_WHITELIST 字典来标记更多安全版本:

# 更新示例 — 添加新的已确认修复版本
FIXED_WHITELIST = {
    "IOS": {
        "15.9(3)M12": True,   # 确认修复
        "15.8(3)M10": True,   # 确认修复
    },
    "IOS XE": {
        "17.15.4a": True,
        "17.15.4b": True,     # 新增修复版本
        "17.9.6": True,       # 新增修复版本
        "17.12.5": True,      # 新增修复版本
    }
}

6HFtX5dABrKlqXeO5PUv/wKBeZz89oneeyT2ANqhHWE=

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容