SMB签名漏洞深度解析:从原理到实战修复指南

发布时间:2026/7/28 10:50:15
SMB签名漏洞深度解析:从原理到实战修复指南 1. 项目概述从一条Nessus告警说起如果你负责过企业内网的安全运维或渗透测试大概率在Nessus的扫描报告里见过这个熟悉的“中等风险”告警SMB Signing not required对应的插件ID是57608。第一次看到时你可能会疑惑这既不是远程代码执行也不是权限提升怎么就成漏洞了这个“签名”到底是什么不开启又会怎样我最初也有同样的疑问直到在一次真实的内网横向移动演练中攻击者利用这个“不起眼”的配置弱点像逛自家后院一样悄无声息地窃取了大量敏感文件我才真正意识到它的严重性。这绝不是一个可以忽略的低危项而是通往核心数据的一道敞开的侧门。简单来说SMBServer Message Block协议是Windows网络中文件和打印机共享的基石。而SMB签名SMB Signing是一项安全特性它确保在网络上传输的SMB数据包确实来自它所声称的客户端并且在传输过程中没有被篡改。当这项特性被设置为“非必需”Not required时就意味着服务器虽然支持签名但不会强制要求客户端使用。攻击者就可以利用中间人攻击如ARP欺骗、LLMNR/NBT-NS投毒等手段劫持或伪造SMB会话进行数据窃取甚至远程命令执行。Nessus插件57608正是在检测网络中是否存在这类配置不安全的SMB服务器通常是域控制器或文件服务器。本文将从一个实战运维和渗透测试双重视角彻底拆解SMB签名漏洞的原理、危害、检测方法并提供从单机到域环境的完整修复指南。无论你是安全工程师、系统管理员还是对内网安全感兴趣的爱好者都能从中获得可直接落地的操作步骤和避坑经验。2. SMB签名漏洞深度解析不只是“一个开关”2.1 SMB协议与签名机制的工作原理要理解漏洞得先明白SMB协议是如何工作的。你可以把SMB会话想象成两个人客户端和服务器通过一条不安全的公共电话线通话。他们需要交换文件通话内容。在没有签名的情况下对话可能是这样的客户端“我是Alice请把‘财务报告.docx’发给我。”服务器“好的给你。”这里存在两个致命问题1. 你怎么证明打电话的真是Alice2. 传输过程中的“财务报告”内容有没有被窃听者掉包SMB签名就是为了解决这两个问题而生的“数字指纹”机制。它的核心原理基于会话密钥Session Key。在SMB会话建立的身份验证阶段比如使用NTLM或Kerberos客户端和服务器会协商出一个只有双方知道的共享密钥。此后对于每个SMB数据包发送方都会用这个会话密钥通过HMAC哈希消息认证码通常是HMAC-SHA256算法计算出一个唯一的“签名”Signature并将这个签名附加在数据包中。接收方在拿到数据包后会用相同的密钥重新计算一次签名并与数据包中的签名进行比对。如果一致则证明1.数据完整性数据在传输过程中未被篡改2.消息真实性数据确实来自拥有会话密钥的合法对方因为密钥是在安全身份验证后产生的。在Windows系统中SMB签名有三个可能的状态启用并必需Enabled and required服务器只接受带有效签名的SMB数据包。这是最安全的状态。启用但不必需Enabled but not required服务器支持并可以处理签名但如果客户端不支持或不使用签名它也会接受未签名的连接。这就是Nessus报告漏洞的状态。禁用Disabled服务器根本不支持签名。这是最不安全的状态但有趣的是Nessus的57608插件主要针对的是第二种状态因为“不要求”在混合环境中最常见也最容易被利用。2.2 漏洞利用场景与真实危害“不就是可能被篡改数据吗”——如果这么想就低估了它的危害。在实际攻击链中SMB签名缺失是内网横向移动的“黄金跳板”之一。结合其他攻击手法它能产生毁灭性的效果。场景一中间人攻击与凭据窃取攻击者通过ARP欺骗或利用有缺陷的协议如LLMNR、NBT-NS将自己伪装成网关或目标服务器。当域内用户尝试访问一个不存在的共享路径如误输入\\filesrv\share时其计算机会通过LLMNR广播询问“filesrv在哪”。攻击者响应这个广播声称自己就是“filesrv”。用户的SMB客户端随后会向攻击者发起连接并进行身份验证发送NTLM Hash。由于攻击者伪装的“服务器”不要求SMB签名它可以完全接收并转发这些认证流量从而轻松截获用户的NTLM Hash。这个Hash可以被用于“传递哈希”攻击直接登录其他同样不要求签名的服务器。场景二SMB Relay中继攻击这是比单纯窃取更高级的攻击。攻击者同样通过中间人位置截获一个客户端的SMB认证请求NTLM Challenge/Response。但这次攻击者不破解这个Hash而是将它“原封不动地”中继Relay到网络中的另一台服务器Target上并试图访问Target的资源。如果Target服务器也不要求SMB签名它就会接受这个被中继的认证认为攻击者就是最初的合法客户端。攻击者从而获得在Target服务器上的访问权限可能是执行命令、写入文件甚至直接获取Shell。整个过程中攻击者无需知道用户的明文密码或破解Hash利用的就是签名缺失导致的身份验证机制缺陷。实操心得在一次红队评估中我们发现在一个大型办公网段超过80%的服务器和所有工作站都未强制要求SMB签名。利用Responder工具进行LLMNR投毒在15分钟内就捕获了数十个域用户的NTLMv2 Hash。更危险的是其中一台用于软件分发的服务器不要求签名存在弱口令我们成功将捕获的一个高权限用户Hash中继到这台服务器获得了系统权限并部署了后门。这一切的起点就是那条“SMB Signing not required”的告警。场景三数据篡改与注入在文件传输过程中攻击者可以修改SMB数据包的内容。例如将用户下载的软件安装包替换为捆绑了恶意软件的版本或者在上传的文档中注入恶意代码。由于没有签名验证客户端和服务器都无法察觉数据已被篡改。2.3 Nessus插件#57608的检测逻辑了解漏洞原理后再看Nessus的检测就一目了然了。插件57608的执行流程非常直接连接探测Nessus尝试通过445端口与目标建立SMB连接。协议协商在SMB协议协商阶段Negotiate Protocol Request/Response客户端会告知服务器自己支持的能力列表。Nessus会模拟一个声明自己支持SMB签名的客户端。响应分析服务器在协商响应中会返回其自身的能力标志位。其中一个关键标志位是Security Signatures Required。如果服务器返回的标志表明它支持签名Security Signatures Enabled为True但不要求签名Security Signatures Required为False那么插件就会触发告警判定为“SMB Signing not required”。信息收集插件通常还会收集目标机器的NetBIOS名称、操作系统版本等信息辅助判断其重要性如是否为域控制器。这个检测是非侵入性的它只是进行了一次正常的协议协商不会对目标系统造成任何破坏或更改。3. 漏洞检测与影响范围评估3.1 手动检测与验证方法除了依赖Nessus掌握手动检测方法能让你在应急响应或快速排查时更得心应手。这里推荐几个实用工具。使用nmap脚本检测nmap的smb-security-mode脚本是快速扫描网段的利器。nmap -p 445 --script smb-security-mode 目标IP或网段执行后重点关注输出中的两行| smb-security-mode: | account_used: guest | authentication_level: user | challenge_response: supported |_ message_signing: disabled but supported如果message_signing显示为disabled but supported或enabled but not required则说明存在漏洞。如果显示required则是安全的。使用PowerShell适用于本地或已有权限的远程主机在Windows主机上你可以使用PowerShell快速检查本地或远程服务器的SMB签名要求状态。# 检查本地机器的SMB服务器签名配置 Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters -Name RequireSecuritySignature -ErrorAction SilentlyContinue # 检查本地机器的SMB客户端签名配置这影响它作为客户端时是否使用签名 Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\LanManServer\Parameters -Name EnableSecuritySignature -ErrorAction SilentlyContinue # 更全面的方法是使用Get-SmbServerConfiguration cmdlet (Windows Server 2012 / Win8) Get-SmbServerConfiguration | Select-Object EnableSecuritySignature, RequireSecuritySignature对于远程检测如果没有现成工具可以尝试通过WMI查询需要相应权限Get-WmiObject -Class Win32_ComputerSystem -ComputerName 远程主机名 | Select-Object Name # 注意直接查询签名注册表项需要远程注册表访问权限通常较难。使用Impacket套件中的smbclient.py对于渗透测试人员Impacket工具包提供了更底层的交互方式。python3 /usr/share/doc/python3-impacket/examples/smbclient.py 域名/用户:密码目标IP连接后在SMB shell中服务器的能力会在初始协商时显示但不如nmap脚本直观。更专业的做法是使用ntlmrelayx.py等工具直接进行中继测试但这属于攻击模拟范畴需在授权环境下进行。3.2 确定影响范围与风险定级拿到扫描报告后不能一概而论需要评估风险。资产重要性排序域控制器Domain Controllers最高风险。攻击者一旦通过中继攻击获得域控权限意味着整个域沦陷。必须立即修复。文件服务器、数据库服务器、应用服务器高风险。存储和处理关键业务数据。优先修复。成员服务器中风险。可能作为横向移动的跳板。计划内修复。普通办公电脑工作站风险相对较低但数量庞大。如果攻击者已进入内网工作站同样是中继攻击的良好目标。可以通过组策略统一修复。网络位置考量核心业务网段风险高需优先处理。隔离的测试/开发网段可根据安全策略放宽但仍建议修复。DMZ区通常不应开放SMB445端口到互联网如果存在风险极高。业务影响评估开启强制签名可能会影响与一些老旧设备或特定嵌入式系统的兼容性。在修复前需要识别网络中是否存在这类设备。一个实用的方法是在修复策略中先设置为“启用但不要求”观察一段时间看是否有业务报错日志中是否有签名失败记录然后再推进到“强制要求”。注意事项不要只盯着服务器。在一个现代攻击链中攻击者往往先攻陷一台工作站然后以此为起点利用工作站作为客户端向其他服务器发起的、未签名的SMB会话进行中继攻击。因此客户端的签名配置同样重要。服务器要求签名但客户端不启用签名会话依然无法建立。必须两端配合。4. 修复指南从单机到域环境的完整方案修复的核心目标是将SMB签名策略从“不要求”改为“要求”。这需要在SMB服务器和SMB客户端两端进行配置。4.1 单机手动修复Windows Server 2012 R2 / Windows 8 及以上对于少量服务器或无法加入域的设备可以采用手动修改注册表或PowerShell命令的方式。方法一通过PowerShell推荐这是最清晰、最不容易出错的方式。# 以管理员身份运行PowerShell # 1. 配置SMB服务器端本机作为文件共享服务器时 # 查看当前配置 Get-SmbServerConfiguration # 启用服务器签名并要求它 Set-SmbServerConfiguration -RequireSecuritySignature $true -Force # -Force 参数避免交互式确认 # 同时也建议启用服务器端的签名支持通常默认已启用 Set-SmbServerConfiguration -EnableSecuritySignature $true -Force # 2. 配置SMB客户端本机作为访问其他共享的客户端时 # 查看当前配置 Get-SmbClientConfiguration # 启用客户端签名并要求它 Set-SmbClientConfiguration -RequireSecuritySignature $true -Force # 启用客户端的签名支持 Set-SmbClientConfiguration -EnableSecuritySignature $true -Force执行后可能需要重启服务器服务或重新启动计算机才能使更改完全生效。可以重启Server服务Restart-Service LanmanServer -Force方法二通过注册表编辑器适用于所有Windows版本注册表是底层配置但操作需谨慎。打开regedit。导航到服务器端配置HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters新建或修改DWORD (32位)值RequireSecuritySignature设置值为1。确保EnableSecuritySignature值为1通常默认是。导航到客户端配置HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters新建或修改DWORD (32位)值RequireSecuritySignature设置值为1。确保EnableSecuritySignature值为1。重启计算机。实操心得在手动修改注册表时我曾遇到过因拼写错误如RequireSecuritySignatures多了个‘s’导致配置不生效的情况。强烈建议使用PowerShell的Set-Smb*Configuration命令它更直观且不易出错。修改后务必使用Get-Smb*Configuration命令验证并用nmap或Test-NetConnection从另一台机器扫描445端口验证策略是否已生效。4.2 使用组策略进行域级统一修复最佳实践对于域环境使用组策略对象GPO是高效、统一的管理方式。可以针对不同的OU组织单位设置不同的策略。创建并链接GPO打开组策略管理控制台GPMC。在需要应用的OU例如“服务器OU”或“工作站OU”上右键选择“在这个域中创建GPO并在此处链接”。为GPO命名如“强制启用SMB签名 - 服务器”。配置SMB服务器签名策略针对服务器OU右键新建的GPO选择“编辑”。导航到计算机配置-策略-Windows 设置-安全设置-本地策略-安全选项。在右侧找到策略Microsoft 网络服务器: 对通信进行数字签名(如果客户端允许)解释此策略对应EnableSecuritySignature。设置为“已启用”表示服务器支持签名。Microsoft 网络服务器: 对通信进行数字签名(始终)解释此策略对应RequireSecuritySignature。设置为“已启用”表示服务器要求所有传入的SMB会话都必须签名。这是修复漏洞的关键设置。配置SMB客户端签名策略针对所有计算机OU或单独为工作站创建在同一GPO或为工作站新建的GPO中编辑。导航到相同路径安全选项。找到策略Microsoft 网络客户端: 对通信进行数字签名(如果服务器同意)解释对应客户端的EnableSecuritySignature。设置为“已启用”。Microsoft 网络客户端: 对通信进行数字签名(始终)解释对应客户端的RequireSecuritySignature。设置为“已启用”。这意味着客户端将只与要求签名的服务器通信并对自己发起的会话进行签名。策略应用与验证将包含服务器的GPO链接到服务器OU将包含客户端的GPO链接到工作站OU。在域控制器上运行gpupdate /force或在目标客户端/服务器上运行强制刷新组策略。等待策略生效通常下一个组策略刷新周期约90分钟或重启计算机。使用gpresult /h report.html生成策略结果报告确认策略已成功应用。再次使用nmap或Nessus进行扫描验证告警应已消除。4.3 修复后的兼容性测试与回滚方案兼容性测试强制启用签名后最大的风险是与旧设备或不支持签名的设备如某些网络存储设备NAS、老式打印机服务器、特定工业控制设备的连接中断。监控事件日志重点查看Windows日志-系统和Microsoft-Windows-SMBServer/Operational中的警告或错误事件。寻找事件ID为3019、3020等与SMB签名失败相关的事件。分段实施不要在全网同时强制启用。可以先在一个非关键的、具有代表性的测试OU中实施观察1-2周。使用“审核”模式对于无法确定影响的场景可以先将组策略中的“始终”签名设置为“已禁用”但启用“审核”模式如果系统支持。这样可以在事件日志中记录哪些连接尝试了未签名的会话而不实际阻止它们。回滚方案如果出现严重兼容性问题需要快速回滚。组策略回滚在GPMC中直接将该GPO链接设置为“已禁用”然后在受影响计算机上运行gpupdate /force。或者修改GPO中的策略设置回“未配置”或“已禁用”。手动回滚对于个别关键服务器如果等不及组策略刷新可以按照4.1节的方法使用PowerShell将-RequireSecuritySignature设置为$false并重启Server服务。制定例外策略对于极少数确实无法支持签名的关键业务设备可以考虑将其隔离到独立的VLAN中并在网络边界防火墙/ACL上严格限制其SMB访问范围作为风险缓释措施而不是简单地全局关闭签名。5. 进阶加固与持续性监控修复漏洞只是第一步建立持续的监控和防御体系才能长治久安。5.1 网络层加固措施禁用过时且不安全的协议SMBv1这是永恒之蓝EternalBlue利用的协议版本本身存在严重漏洞且性能差。应在所有系统上彻底禁用。可以通过组策略计算机配置-策略-管理模板-网络-Lanman工作站-启用不安全的来宾登录或PowerShell (Disable-WindowsOptionalFeature -Online -FeatureName SMB1Protocol) 禁用。LLMNR和NetBIOS-NS这些是用于本地名称解析的协议正是它们的不安全性被Responder等工具利用来进行投毒攻击。在纯域环境有DNS中可以考虑在网络层面或主机层面禁用它们。组策略路径计算机配置-策略-管理模板-网络-DNS客户端-关闭多播名称解析禁用LLMNR。禁用NetBIOS over TCP/IP在网络适配器属性中TCP/IPv4高级设置 - WINS标签 - 选择“禁用NetBIOS over TCP/IP”。网络分段与微隔离将不同安全等级的设备划分到不同的VLAN中并在核心交换机或防火墙上配置访问控制列表ACL严格限制SMB445端口的访问流量。例如只允许管理网段访问服务器区的SMB端口工作站之间禁止互相访问445端口。这能极大限制攻击者在攻陷一台主机后的横向移动能力。5.2 安全监控与日志审计配置集中日志收集如SIEM系统并监控以下关键事件以便及时发现异常SMB活动。事件ID 3019 (SMB签名错误)记录在Microsoft-Windows-SMBServer/Operational日志中。当服务器配置为要求签名但收到未签名的请求时会生成此事件。偶尔出现可能是兼容性问题大量出现则可能预示攻击探测。事件ID 4625 (登录失败)在安全日志中。关注登录类型为“3”网络登录的大量失败尤其是来自非常用IP或用户名的失败可能伴随中继攻击。事件ID 4648 (使用显式凭据登录)在安全日志中。如果攻击者通过中继攻击成功可能会产生此类日志显示一个账户从某台计算机攻击者机器登录到另一台计算机目标机器。网络流量监控使用IDS/IPS或网络流量分析工具检测异常的SMB连接模式例如同一源IP在短时间内向大量不同目标发起SMB连接尝试。5.3 构建主动防御体系启用Windows Defender Credential Guard对于Windows 10/11和Server 2016启用Credential Guard可以基于虚拟化安全VBS隔离和保护NTLM哈希、Kerberos票证等秘密使得即使攻击者窃取了内存也难以提取出可用于传递哈希攻击的凭据。实施LAPS本地管理员密码解决方案确保每台计算机的本地管理员账户密码是随机、唯一且定期更改的。这能有效阻止攻击者利用中继攻击获取一台机器的本地管理员权限后使用相同密码横向移动。强制使用Kerberos认证在域环境中Kerberos认证比NTLM更安全且天然抗中继攻击因为票据是针对特定服务主体的。通过组策略限制使用NTLM计算机配置-策略-Windows 设置-安全设置-本地策略-安全选项-网络安全: 限制 NTLM: ...但需谨慎评估对旧应用的兼容性影响。定期漏洞扫描与渗透测试将SMB签名检查作为常规漏洞扫描的必选项。定期授权进行内部渗透测试模拟攻击者视角验证包括SMB中继在内的横向移动手段是否依然有效。修复“SMB Signing not required”漏洞远不止是在扫描报告上打一个勾。它要求我们从协议原理理解风险在业务兼容性中寻找平衡并通过技术配置、网络架构和监控响应构建一个立体的防御层。从一条Nessus告警开始深入下去你会发现这其实是夯实内网安全基础的一块关键基石。每次策略变更后别忘了亲自用工具扫一下亲眼看到那个红色的“Medium”变成“None”或“Info”才是对安全工作最好的回报。