使用 Nmap 验证 Windows 主机三类漏洞的修复状态
在企业安全合规检查(等保、漏扫整改、CISA KEV 核验)中,经常需要用 Nmap 对 Windows 主机的 SMB 与 RDP 服务进行核验,确认漏洞是否已真正修复。本文整理三类高频漏洞的扫描命令、判定标准与判定逻辑,便于直接套用提交整改报告。
说明:为避免泄露内部资产信息,文中所有扫描示例均使用占位符
<目标IP>,输出样例为脱敏后的通用格式,不含真实主机指纹。
一、SMB 消息签名漏洞
漏洞背景
SMB 协议默认不强制对通信包进行签名,攻击者可借助 SMB 中继攻击(SMB Relay,配合 LLMNR/NBT-NS 投毒、PrinterBug 等)冒充用户身份横向移动,对应 MS16-075 等利用链。
CISA / Rapid7 等漏洞库给出的缓解措施是:
启用 Windows 策略 "Microsoft network server: Digitally sign communications (always)"
(Samba 上对应:server signing = mandatory)
扫描命令
nmap -sS -sV -Pn -p 445 --script="smb-security-mode" <目标IP>
判定标准
message_signing 字段值 |
对应 Windows 策略 | 是否合规 |
|---|---|---|
required |
Digitally sign communications (always) = Enabled | ✅ 已修复 |
enabled |
仅 "if client agrees" 启用 | ⚠️ 不达标 |
disabled |
两项均未启用 | ❌ 漏洞存在 |
已修复的输出特征
关键字段出现以下行即视为已修复:
| smb-security-mode:
| ...
|_ message_signing: required
判定逻辑:输出 message_signing: required,对应注册表 requiresecuritysignature = 1,强制签名已启用 → 漏洞已修复。
二、RDP 弱加密套件漏洞(TLS 1.0 / 1.1)
漏洞背景
早期 RDP 服务默认启用 TLS 1.0 / 1.1,存在 BEAST、POODLE、CRIME 等降级攻击风险,且与 BlueKeep(CVE-2019-0708)等漏洞组合时危害加剧。现代安全基线要求仅保留 TLS 1.2 及以上,并禁用 RC4、3DES、NULL 等弱算法。
扫描命令
nmap -p 3389 --script ssl-enum-ciphers <目标IP>
判定标准
- ✅ 已修复:仅出现
TLSv1.2(及更高),且密码套件评级不低于 B - ❌ 漏洞存在:出现
SSLv3/TLSv1.0/TLSv1.1,或出现 RC4 / 3DES / NULL / 弱 DH(<1024)
已修复的输出特征
- 协议版本中只出现
TLSv1.2(无 SSLv3 / TLSv1.0 / TLSv1.1) - 所有密码套件评级为 A(使用 ECDHE / DHE 完美前向保密)
- 无 RC4、无 3DES、无 NULL 套件
- 末尾出现
least strength: A
判定逻辑:满足以上条件即说明弱协议与弱算法已全部禁用 → 漏洞已修复。
三、RDP 安全层未启用 NLA 漏洞
漏洞背景
RDP 支持三种安全层:
| 安全层 | 说明 | 安全性 |
|---|---|---|
| Internal RDP security | RDP 自带加密(Standard RDP Security) | ❌ 最弱,存在漏洞且易被中间人攻击 |
| TLS security layer | 仅 TLS 加密通道 | ⚠️ 中等,缺少身份预验证 |
| CredSSP (NLA) | 网络级身份验证,连接前完成认证 | ✅ 最强,可阻断绝大多数 RDP 漏洞利用 |
未启用 NLA 时,BlueKeep(CVE-2019-0708)、BlueKeep-like 漏洞、DoS 等可被未认证触发。安全基线要求强制启用 NLA(CredSSP)。
扫描命令
nmap -p 3389 --script rdp-enum-encryption <目标IP>
判定标准
- ✅ 已修复:
CredSSP security layer (NLA): SUCCESS(推荐同时关闭 Internal RDP 与纯 TLS 层,仅保留 NLA) - ❌ 漏洞存在:
Internal RDP security: SUCCESS或仅TLS security layer: SUCCESS
已修复的输出特征
| rdp-enum-encryption:
| Security layer
| Internal RDP security: FAILED
| TLS security layer: FAILED
|_ CredSSP security layer (NLA): SUCCESS
判定逻辑:
Internal RDP security: FAILED—— 弱安全层已禁用(符合预期)TLS security layer: FAILED—— 纯 TLS 层已禁用(符合预期)CredSSP security layer (NLA): SUCCESS—— NLA 强制启用
说明:Nmap 脚本对
FAILED的含义是"该安全层协商失败/不可用",在此场景下正是我们主动禁用弱安全层的结果,而非缺陷。仅保留 CredSSP 即满足最严基线要求 → 漏洞已修复。
一键批量扫描脚本
可把三条命令整合,便于对多台主机批量核验:
#!/bin/bash
# 用法: ./rdp-smb-check.sh <IP>
TARGET=$1
[ -z "$TARGET" ] && { echo "Usage: $0 <IP>"; exit 1; }
echo "===== [1/3] SMB 消息签名 ====="
nmap -sS -sV -Pn -p 445 --script="smb-security-mode" "$TARGET"
echo -e "\n===== [2/3] RDP TLS 加密套件 ====="
nmap -p 3389 --script ssl-enum-ciphers "$TARGET"
echo -e "\n===== [3/3] RDP 安全层 / NLA ====="
nmap -p 3389 --script rdp-enum-encryption "$TARGET"
⚠️ 安全提示:扫描输出包含主机版本、加密配置等敏感信息,请勿将真实扫描结果直接发布到公网或截图分享,建议仅在内部整改报告中使用。
整改报告摘录(可直接提交)
| 序号 | 漏洞项 | 扫描命令关键字 | 判定证据 | 结论 |
|---|---|---|---|---|
| 1 | SMB 未强制消息签名 | --script smb-security-mode |
message_signing: required |
已修复 |
| 2 | RDP 启用 TLS 1.0/1.1 弱加密 | --script ssl-enum-ciphers |
仅 TLSv1.2,全部 A 级 |
已修复 |
| 3 | RDP 未启用 NLA | --script rdp-enum-encryption |
CredSSP (NLA): SUCCESS,弱层 FAILED |
已修复 |
扩展核验命令(可选)
若需进一步确认操作系统真实版本与 SMBv1 状态,可补充执行(结果仅用于内部核验,勿外传):
# 获取更准确的系统信息
nmap -p 445 --script smb-os-discovery,smb2-security-mode <IP>
# 检查 EternalBlue (MS17-010) 痕迹
nmap -p 445 --script smb-vuln-ms17-010 <IP>
# 确认 SMBv1 是否已禁用(应只出现 SMB 2.x / 3.x)
nmap -p 445 --script smb-protocols <IP>