
本项目是一个专为授权安全测试和应急响应设计的轻量级命令行工具,用于远程检测 Citrix NetScaler ADC 与 Gateway 设备是否存在 CVE-2025-6543 内存溢出漏洞。它通过 SNMP v2c 或 SSH 获取目标设备的完整版本号,并与官方发布的已修复版本列表进行比对,从而快速、精准地识别脆弱资产。
sysDescr.0 OID 获取设备 banner,非侵入式且高效。show version 命令获取版本信息。VULNERABLE ⚠️ 或 Parcheado ✅ 状态。snmpget (通常包含在 net-snmp-utils 包中)。sshpass (用于非交互式密码验证)。citrix-cve-2025-6543-check.py 保存到您的本地目录。net-snmp-utils 和 sshpass 包。工具的核心逻辑是通过 -h 参数获取帮助,通过指定目标主机和认证信息进行检测。
# 使用默认 SNMP community 'public' 检测单个主机
python3 citrix-cve-2025-6543-check.py 192.168.1.100
# 使用指定的 SNMP community 检测多个主机
python3 citrix-cve-2025-6543-check.py 192.168.1.100 192.168.1.101 -c mycommunity
# 使用 SSH 方式检测(当 SNMP 不可用时)
python3 citrix-cve-2025-6543-check.py 192.168.1.100 --ssh-user nsroot --ssh-pass 'mypassword' --no-snmp
# 同时启用 SNMP 和 SSH 作为后备(工具会自动尝试)
python3 citrix-cve-2025-6543-check.py 192.168.1.100 -c public --ssh-user nsroot --ssh-pass 'mypassword'参数 | 类型 | 必选 | 默认值 | 描述 |
|---|---|---|---|---|
| 位置参数 | 是 | 无 | 一个或多个目标主机的 IP 地址或 FQDN。 |
| 可选 | 否 |
| SNMP v2c 的 community 字符串。 |
| 标志 | 否 |
| 禁用 SNMP 检测模式。 |
| 可选 | 否 | 无 | SSH 用户名,用于执行 |
| 可选 | 否 | 无 | SSH 密码,与 |
# Builds mínimas NO vulnerables
SAFE = {
"14.1": (47, 46),
"13.1": (59, 19),
"13.1F": (37, 236), # FIPS
"13.1N": (37, 236), # NDcPP
}
BANNER_RX = re.compile(r"(?:NS|NetScaler).*?([0-9]+\.[0-9]+)-([0-9]+)\.([0-9]+)")
def parse_build(text: str):
"""
从设备 banner、CLI 或 SNMP 响应中提取版本分支和构建号。
返回格式: (rama, (major, minor))
"""
m = BANNER_RX.search(text)
if not m:
return None
rama, maj, mino = m.group(1), int(m.group(2)), int(m.group(3))
return rama, (maj, mino)
def vulnerable(rama, build):
"""
根据官方 SAFE 表判断给定的构建版本是否易受攻击。
返回 True 表示存在漏洞,False 表示已修复。
"""
key = rama if rama != "13.1" else "13.1" # 处理 FIPS/NDcPP 特例
if "FIPS" in rama: key = "13.1F"
if "NDCPP" in rama.upper(): key = "13.1N"
safe = SAFE.get(key)
if safe is None:
return True # 12.1 / 13.0: 总是存在漏洞
return build < safedef snmp_banner(host, community, timeout=3):
"""
通过 snmpget 命令获取 sysDescr.0 的信息。
需要系统安装 net-snmp 工具集。
"""
try:
out = subprocess.check_output(
["snmpget", "-v2c", "-c", community, "-Oqv", host, "1.3.6.1.2.1.1.1.0"],
timeout=timeout, text=True, stderr=subprocess.DEVNULL)
return out.strip()
except Exception:
return ""def check_host(host, args):
origin = ""
banner = snmp_banner(host, args.community) if args.snmp else ""
if banner:
origin = "SNMP"
elif args.ssh_user and args.ssh_pass:
banner = cli_banner(host, args.ssh_user, args.ssh_pass)
origin = "SSH/CLI"
if not banner:
print(f"[?] {host}: 无法获取版本信息 (需要 SNMP 或 SSH)")
return
parsed = parse_build(banner)
if not parsed:
print(f"[?] {host}: 无法识别的版本签名: {banner[:60]}...")
return
rama, build = parsed
vuln = vulnerable(rama, build)
state = "VULNERABLE ⚠️" if vuln else "PATCHED ✅"
print(f"[{state}] {host} -> {rama}-{build[0]}.{build[1]} via {origin}")
```FINISHED6HFtX5dABrKlqXeO5PUv/1lwBAWgvriIn2K0vpIrTD7s5pQtwvnRnppdNvw1oXR/
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。