Windows Server 在默认安装后,会为了兼容性和通用性开启大量服务并保留相对宽松的注册表设置。这种默认配置虽然减少了初期部署的报错概率,却给攻击者留下了巨大的横向移动和提权空间。被动等待补丁日打补丁远远不够,主动缩减攻击面才是关键。核心逻辑很简单:服务器只应该运行支撑其业务所必需的服务,且注册表中那些被恶意软件高频利用的键值必须提前锁死。

精准定位并禁用高危服务

盲目禁用服务会导致系统功能异常,我们需要精准打击那些风险极高且非核心业务依赖的服务。以下是生产环境中建议优先评估并禁用的服务清单,每一项都直接关联到具体的攻击向量。

首先是 Server 服务。这个服务对应的就是文件与打印机共享功能,背后依赖 SMB 协议。如果这台服务器不需要作为文件服务器向其他客户端分发共享文件夹,那么该服务必须禁用。历史上臭名昭著的永恒之蓝漏洞攻击的就是 SMB 协议。禁用方法很简单,通过 PowerShell 执行 Stop-Service LanmanServer -Force 并设置启动类型为 Disabled:

Stop-Service LanmanServer -Force
Set-Service LanmanServer -StartupType Disabled

其次是 Remote Registry 服务。此服务允许远程用户通过连接注册表来修改本机设置。在正常的运维流程中,完全可以通过组策略或远程 PowerShell 进行管理,开启远程注册表纯属给攻击者提供方便。一旦攻击者获取了低权限账号,利用远程注册表连接可以读取 SAM 数据库或修改系统配置。直接禁用此服务,阻断远程篡改注册表的通道。

Net.Tcp Port Sharing Service 也是容易被忽视的雷区。该服务允许 WCF 应用共享 TCP 端口,如果你的业务没有基于 WCF 的分布式架构,这个服务就是多余的。它开放了额外的网络监听点,增加了被扫描和利用的风险。

Print Spooler 服务是近两年来域控提权的重灾区。除非服务器必须承担打印服务器的角色,否则所有服务器都应禁用该服务。Print Spooler 运行在内核高权限下,其 RpcAddPrinterDriver 相关函数曾引发多起严重的远程代码执行漏洞。禁用命令如下:

Stop-Service Spooler -Force
Set-Service Spooler -StartupType Disabled

最后要关注的是 Microsoft FTP Service 和 World Wide Web Publishing Service。如果服务器运行着 IIS,但并未使用 FTP 功能,务必卸载该角色服务。旧版 FTP 服务在传输凭证时存在泄露风险,且 FTP 协议本身缺乏高级别的加密保护。对于 WWW 服务,若服务器不是 Web 服务器,则必须停止,避免 80 或 443 端口暴露在无防护状态下。

服务硬化的进阶配置

仅仅禁用服务还不够,对于必须运行的服务,我们需要修改其底层安全描述符,实施最小权限原则。攻击者常用手法是利用服务权限漏洞,将原本以 LocalSystem 运行的服务二进制文件替换为恶意载荷。我们可以通过 sc 命令或安全模板锁定高风险服务的权限。

例如,针对必须保留的 Remote Desktop Services,建议修改其服务权限,仅授予 Administrators 组完全控制,并显式拒绝非授权账户的修改权限。使用 sc sdshow 命令可以查看服务的安全描述符字符串,通过 sc sdset 进行重设。这能防止低权限用户通过修改服务配置来劫持系统服务。

对于计划任务服务 Schedule,虽然不能禁用,但必须严格控制其任务文件夹的 ACL 权限。攻击者常常利用计划任务来维持持久性,通过注册表或文件权限加固,限制只有 SYSTEM 和 Administrators 能够创建和修改计划任务,能有效阻断大多数后门植入手段。

注册表加固:斩断恶意操作的命脉

注册表是 Windows 的核心数据库,也是恶意软件实现持久化、隐藏和提权的必争之地。注册表加固的核心在于“封堵入口”和“强化认证”。

第一项要处理的是 LM 哈希存储。Windows 默认情况下可能仍然在内存中生成或存储 LM 哈希,这种哈希算法极其脆弱,几乎可以瞬间被破解。必须通过注册表强制系统仅使用 NTLMv2 响应。定位到路径 HKLM\SYSTEM\CurrentControlSet\Control\Lsa,将 NoLMHash 键值创建或修改为 1。这属于 DWORD 类型数据。虽然组策略也能实现,但直接写入注册表可以防止策略未及时刷新带来的空窗期。

New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa" -Name "NoLMHash" -Value 1 -PropertyType DWORD -Force

第二项是禁止在内存中缓存明文凭证。WDigest 协议会在用户登录时将明文密码缓存在内存中,Mimikatz 等工具可以轻松抓取。我们需要在注册表 HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest 下,将 UseLogonCredential 设置为 0。如果该键不存在,直接新建即可。这一操作对防止凭证转储至关重要。

Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest" -Name "UseLogonCredential" -Value 0 -Type DWORD

第三项是关闭默认的隐藏共享。Windows 会自动创建 C$、ADMIN$ 等管理共享,只要攻击者获取本地管理员凭证,就能通过这些共享访问整个磁盘。通过修改注册表 HKLM\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters,新建 DWORD 值 AutoShareWks 并设为 0,重启后这些默认共享将不再自动创建。这能显著减缓攻击者在内网横向移动的速度。

New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" -Name "AutoShareWks" -Value 0 -PropertyType DWORD -Force
强化网络层与认证注册表项

网络层面的注册表加固往往被忽略。攻击者在发起中间人攻击或网络嗅探时,会利用 Windows 对 NetBIOS 和 LLMNR 协议的依赖进行欺骗。当 DNS 解析失败时,Windows 会回退到 NetBIOS 和 LLMNR 广播查询,攻击者可以响应这些广播并诱导服务器将流量发送到恶意主机,从而窃取 NTLMv2 哈希。

我们需要彻底禁用这类多播名称解析。在路径 HKLM\SYSTEM\CurrentControlSet\Services\Dnscache\Parameters 下,创建 DWORD 值 EnableMulticast 并设为 0。同时,针对 NetBIOS over TCP/IP,虽然通常通过网卡属性设置,但为了确保一致性,可以在注册表 HKLM\SYSTEM\CurrentControlSet\Services\NetBT\Parameters\Interfaces\ 下的对应网卡 GUID 子键中,将 NetbiosOptions 值设为 2 以禁用 NetBIOS。

针对 RDP 爆破的防御,注册表也能提供底层保护。默认情况下,RDP 连接没有账户锁定策略,导致攻击者可以无限尝试密码。通过修改 HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp,可以调整安全层和加密级别。将 SecurityLayer 设置为 2 强制使用 SSL,将 MinEncryptionLevel 设置为 3 强制使用 128 位加密。更重要的是,结合账户策略,在 HKLM\SYSTEM\CurrentControlSet\Services\RemoteAccess\Parameters\AccountLockout 下配置 MaxDenials 值,实现账户锁定功能。

UAC 与系统完整性保护

用户账户控制常被运维人员视为麻烦而直接关闭,这是极其危险的做法。UAC 是抵御无文件攻击和恶意软件静默提权的最后一道防线。在注册表中,必须确保 UAC 处于最高保护级别。路径 HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System 下的 EnableLUA 必须为 1。同时,ConsentPromptBehaviorAdmin 应设置为 2,即要求管理员在安全桌面输入凭证,这能防止模拟点击类攻击。PromptOnSecureDesktop 必须设为 1,强制在安全桌面弹出提示,防止恶意软件劫持普通桌面上的弹窗。

Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" -Name "EnableLUA" -Value 1
Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" -Name "ConsentPromptBehaviorAdmin" -Value 2

此外,针对脚本宿主和宏病毒的防御,注册表也能发挥关键作用。Windows Script Host 是勒索软件和下载者常用的执行载体。如果业务不依赖 VBScript 或 JScript,建议通过注册表彻底禁用 WSH。在 HKLM\SOFTWARE\Microsoft\Windows Script Host\Settings 下,创建 DWORD 值 Enabled 并设为 0。这能阻断大量基于脚本的攻击链。

审计与日志记录的注册表调优

加固不仅仅是防御,还要考虑溯源。攻击者入侵后往往会清除日志,我们可以通过注册表强化审计策略,并将日志配置为防篡改模式。在 HKLM\SYSTEM\CurrentControlSet\Control\Lsa 下,设置 SCENoApplyLegacyAuditPolicy 为 1,强制使用高级审计策略而非旧版策略。同时,增加安全日志的大小和覆盖策略,确保日志不会因为空间不足而被频繁覆盖,导致关键攻击痕迹丢失。在 HKLM\SYSTEM\CurrentControlSet\Services\EventLog\Security 下,将 MaxSize 调整为较大的值,如 1GB 以上,并将 Retention 设为 0,表示按需覆盖而非按时间覆盖。

针对命令行审计,这是发现攻击者执行恶意命令的关键。在 HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\Audit 下,创建 ProcessCreationIncludeCmdLine_Enabled 并设为 1,确保在事件 ID 4688 中记录完整的命令行参数。这对于追踪 PowerShell 无文件攻击至关重要。

实施建议与合规检查

上述注册表修改和服务禁用操作,建议通过组策略中的“注册表首选项”或“安全模板”进行批量分发,避免手动操作带来的遗漏。对于生产环境,务必先在测试机验证,特别是 Print Spooler 和 Server 服务的禁用,需确认业务逻辑不依赖 SMB 共享或打印功能。

构建一套基线检查脚本是维持安全状态的有效手段。定期运行 PowerShell 脚本,对比当前服务状态和注册表键值与基线配置的差异,一旦发现偏移立即告警。安全不是一次性工作,随着业务变更和新漏洞的出现,禁用不必要的服务和注册表加固这张网需要持续收紧,才能让攻击者无从下手。