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=