模拟 CVE-2025-54918(Windows NTLM 漏洞)的利用与缓解。包含检测脚本、Ansible 修补和 CI/CD 加固。演示在混合云环境中从低权限访问到 SYSTEM 权限的提权过程。
模拟利用和缓解 CVE-2025-54918(Windows NTLM 漏洞)。包含检测脚本、Ansible 修补和 CI/CD 加固。演示从低权限访问到混合云环境中 SYSTEM 权限的提权过程。
作者:Mark Mallia
在当今的混合云环境中,用户交互与系统沦陷之间的界限比以往任何时候都更模糊。本文探讨了一个真实的攻击链,始于一个看似无害的图形缺陷 CVE-2025-55226(Windows 图形内核中的一个竞态条件),并通过 CVE-2025-54918(一个关键的 NTLM 认证绕过)升级到完全的 SYSTEM 级别控制。
这些漏洞共同展示了攻击者如何从远程代码执行仅通过几步就升级到权限提升。但更重要的是,它们展示了高级 DevOps 工程师如何通过自动化、CI/CD 集成和基础设施即代码来检测、缓解和监控此类威胁。
发布: 2025 年 9 月 16 日(补丁星期二)
微软最新的安全公告指出了 win32k.sys(用于 Windows 桌面和服务器版本的核心图形内核)中的一个严重缺陷。该弱点是一个竞态条件,允许攻击者在运行该漏洞驱动的任何系统上触发远程代码执行(RCE)。由于该驱动程序位于 GDI(图形设备接口)的核心,它可被滥用以在内核模式下执行任意代码——这种权限级别可危及整个机器。
为何重要:
- 它针对的是为每个图形用户界面提供动力的核心子系统,从普通办公电脑到高性能服务器。
- 星期二发布的补丁提供了即时修复,但仅当管理员知道如何及时检测、部署和监控时才有效。
以下代码段从注册表中提取当前版本的 win32k.sys,将其与修补版本进行比较,将不匹配项记录到 CSV 文件中,该文件可导入 Excel 或 Tableau。
# DetectWin32k.ps1 – 检测易受攻击的 win32k.sys
$target = 'Microsoft-Windows-GraphicsKernel'
$patchVersion = '6.0.22.7' # 预期的修补版本
$regPath = "HKLM:\SYSTEM\CurrentControlSet\Services\$target"
$currentVer = Get-ItemProperty $regPath | Select-Object -ExpandProperty ImagePath
$kernelFile = Join-Path $env:SystemRoot \System32\win32k.sys
$fileVersion = (Get-ChildItem $kernelFile).VersionInfo.FileVersion
if ($fileVersion -ne $patchVersion) {
Write-Output "vulnerable: $currentVer (actual=$fileVersion, expected=$patchVersion)" | Out-File -Encoding ascii .\report.csv
}
功能说明:
以下 YAML 文件指示 Ansible 在所有目标主机上应用 win32k.sys 更新并重启 GDI 服务。
---
- name: 部署 Windows 图形内核补丁
hosts: windows_servers
gather_facts: yes
tasks:
- name: 复制新的 win32k.sys
copy:
src: /tmp/patches/win32k.sys
dest: C:\Windows\System32\
mode: '0644'
force: yes
- name: 重启 GDI 服务
win_service:
name: w32k
state: restarted
功能说明:
windows_servers)中的每台 Windows 服务器。创建一个简单的面板,用于可视化 GDI 对象表随时间的使用情况。
# grafana-dashboard.yml
apiVersion: 1
dashboard:
title: “GDI 使用情况”
panels:
- name: “正在使用的对象”
type: graph
targets:
- query: "SELECT timestamp, gdi_objects FROM win32k_stats WHERE $__timeFilter()"
功能说明:
win32k_stats)拉取指标,并显示在 Grafana 面板上。您可以设置当使用量超出阈值时触发警报——这是驱动程序回归的早期指标。向您的 Jenkins 或 GitHub Actions 流水线添加一个测试步骤,通过轻量级工具(例如 wdfuzz)对 win32k.sys 进行模糊测试来验证补丁。
# .github/workflows/cve55226.yml
name: CVE‑2025‑55226 CI
on:
push:
branches:
- main
jobs:
test_and_deploy:
runs-on: windows-latest
steps:
- uses: actions/checkout@v3
- name: 运行模糊测试
run: |
wdfuzz.exe -t win32k.sys -c config.yaml
if ($LASTEXITCODE -eq 0) { Write-Host "模糊测试通过" }
- name: 部署补丁
uses: ansible/[email protected]
with:
playbook: DetectWin32k.ps1
功能说明:
main 分支时,检出代码库。一切始于图形引擎中的一个单点缺陷。攻击者找到了一种利用 Windows 内核中竞态条件的方法(如上所述),绕过防御并远程执行代码。这就是 CVE-2025-55226。但真正的危险出现在攻击者将其与 CVE-2025-54918(NTLM 认证中的一个弱点)配对时。突然之间,他们不只是进入系统——而是掌控了系统。
起初只是一个图形缺陷,最终演变为全面的权限提升,赋予他们 SYSTEM 级别的访问权限。这个事件链并非只是理论。它提醒我们,在当今的混合环境中,漏洞很少孤立存在。
发布时间: 2025 年 9 月 9 日(补丁星期二)
CVSS v3.1 评分: 8.8(高危)
向量: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
CWE: CWE‑287 – 身份验证不当
受影响组件: Windows NTLM(新技术 LAN 管理器)
该缺陷是 NTLM 验证认证数据时的逻辑错误。攻击者只要能通过网络到达主机,即使只有最小权限,也能欺骗系统授予 SYSTEM 级别权限。这意味着在入侵工作站或域控制器后,攻击者可以安装应用程序、窃取机密文件并创建新的管理员账户——基本上完全控制目标。
该漏洞是 2025 年日益增长的模式之一:已有另外两个 NTLM 漏洞被报告(CVE‑2025‑53778, CVE‑2025‑21311)。微软针对此问题的补丁修复了一个不正确的比较例程,该例程错误地接受了某些哈希值。
# 查找具有易受攻击 NTLM 设置的主机
$target = "dc01.company.local"
Invoke-Command -ComputerName $target -ScriptBlock {
Get-WmiObject -Class Win32_OperatingSystem |
Select-Object CSName, Version, BuildNumber
} | Out-File -FilePath C:\temp\nlm_detection.txt
# 检查 NTLM 策略值
Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\Netlogon" |
Select-Object "LmCompatibilityLevel"
# 导出为 CSV 以便快速审查
$report = @()
foreach ($item in Get-WmiObject -Class Win32_Service | Where { $_.Name -eq "netlogon"}) {
$report += [pscustomobject]@{
Service = $item.Name
LmCompat = (Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Services\Netlogon").LmCompatibilityLevel
}
}
$report | Export-Csv -Path C:\temp\nlm_report.csv -NoTypeInformation
该脚本提取当前操作系统版本,验证 Netlogon 键是否设置为微软建议的值(3),并将结果写入易于使用的 CSV。
---
- name: 为 Windows 服务器修补 NTLM
hosts: windows_dc01, windows_dc02, windows_dc03
gather_facts: true
tasks:
- name: 启用 Netlogon 兼容性级别
win_regedit:
path: HKLM:\SYSTEM\CurrentControlSet\Services\Netlogon
key: LmCompatibilityLevel
value: 3
datatype: dword
- name: 安装微软补丁 KB5000000
win_updates:
category_name: Security
search_keyword: KB5000000
reboot_after: true
部署 playbook 到所有域控制器。该任务确保正确设置策略并安装最新的安全更新,从而使相同的逻辑缺陷不再可被利用。
使用 Responder 和 Impacket,您可以模拟真实的 NTLM 中继攻击:
secretsdump.py 捕获认证数据。# 在攻击机上启动 Responder
responder -i eth0 -f
# 从受害者处转储凭据
python3 impacket/secretsdump.py <victim-ip> <domain-admin-username>
# 将哈希重放到目标
python3 impacket/ntlmrelay.py <victim-ip> <target-ip>
在受控环境中运行脚本,并验证您获得了 SYSTEM 级别访问权限。
向流水线添加一个 NTLM 加固任务:
- name: 验证 Netlogon 兼容性级别
win_regedit:
path: HKLM:\SYSTEM\CurrentControlSet\Services\Netlogon
key: LmCompatibilityLevel
value: 3
datatype: dword
state: present
# 当应用新补丁时触发
- name: 如有必要则重启并重新启动服务
win_reboot:
reboot_timeout_sec: 120
该任务在流水线因新补丁构建而触发时自动运行。
创建一个告警,当主机使用匹配易受攻击哈希模式的 NTLM 认证登录时触发:
input {
beats {
type => "winlogbeat"
}
}
filter {
if [event_id] == "4624" and [logon_type] =~ /NTLM/ {
mutate {
add_field => { "[ntlm_match]" => "true" }
}
}
}
output {
elasticsearch {
hosts => ["es.company.local"]
index => "ntlm_audit"
}
}
告警进入 Sentinel 进行可视化,使审计人员能够看到修复已应用并正在监控。
安全性不仅仅是修补漏洞——更在于理解它们如何关联、如何演变,以及它们如何以并非立即显而易见的方式被武器化。通过串联 CVE-2025-55226 和 CVE-2025-54918,我展示了图形驱动程序中的一个单一缺陷如何为完全系统沦陷打开大门。但更重要的是,我演示了 DevOps 工程师如何不仅能通过技术修复来响应,还能通过预见性、自动化和韧性来应对。