真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯網站制作重慶分公司

如何使用Winrm.vbs繞過應用白名單執(zhí)行任意未簽名代碼

這篇文章給大家分享的是有關如何使用Winrm.vbs繞過應用白名單執(zhí)行任意未簽名代碼的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

我們提供的服務有:成都網站建設、成都網站制作、微信公眾號開發(fā)、網站優(yōu)化、網站認證、阜城ssl等。為上千余家企事業(yè)單位解決了網站和推廣的問題。提供周到的售前咨詢和貼心的售后服務,是有科學管理、有技術的阜城網站制作公司

嚴正聲明:本文僅限于技術探討,嚴禁用于其他用途。

繞過技術

winrm.vbs(System31中的一個Windows簽名腳本)能夠執(zhí)行攻擊者控制的XSL,它不會受到相關腳本主機的限制,并實現任意無符號代碼執(zhí)行。

當你向winrm.vbs提供“-format:pretty”或“-format:text”時,它會從cscript.exe所在的目錄中相應地導出WsmPty.xsl或WsmTxt.xsl。這也就意味著,如果攻擊者能夠將cscript.exe拷貝到一個他能控制的且存儲了惡意XSL的位置,他們就能夠執(zhí)行任意未簽名的代碼。實際上,這個問題跟Casey Smith的wmic.exe技術完全相同。

PoC

攻擊操作機制如下:

1. 將WsmPty.xsl或WsmTxt.xsl存放到一個由攻擊者控制的地方;

2. 將cscript.exe拷貝到同一個位置;

3. 通過“-format”指定”pretty”或“text”來執(zhí)行winrm.vbs,具體取決于使用的是WsmPty.xsl或WsmTxt.xsl。

下面給出的是一個惡意XLS樣本,我們需要將它放到攻擊者控制的目錄位置,這里選擇的是C:\BypassDir\WsmPty.xsl:




 
  

其實我們還可以在WsmPty.xsl中嵌入惡意的DotNetToJScript  Payload,并執(zhí)行任意未簽名代碼。接下來,可以使用下列batch文件來執(zhí)行Payload:

mkdir%SystemDrive%\BypassDir
copy%windir%\System32\cscript.exe %SystemDrive%\BypassDir
%SystemDrive%\BypassDir\cscript//nologo %windir%\System32\winrm.vbs get wmicimv2/Win32_Process?Handle=4-format:pretty

檢測和繞過策略

在實現這項技術的過程中,必須用到的就是攻擊者可控的WsmPty.xsl或WsmTxt.xsl。

winrm.vbs會對WsmPty.xsl或WsmTxt.xsl進行硬編碼,并顯式地將它們綁定到“pretty”和“text”參數上。就此看來,我們似乎沒有辦法來控制winrm.vbs去執(zhí)行當前目錄中的不同xls文件。從檢測的角度來看,WsmPty.xsl或WsmTxt.xsl文件的哈希會跟System 32中原本的文件哈希不同,因此它們會被當作可疑文件,因為合法xls文件的哈希值很少會發(fā)生變化。

除此之外,合法WsmPty.xsl或WsmTxt.xsl文件應該是目錄簽名的,哈希值發(fā)生變化后將不會再對其進行簽名。也就是說,磁盤中任何沒有簽名的WsmPty.xsl或WsmTxt.xsl文件都應該是可疑文件。需要注意的是,目錄簽名驗證需要運行“cryptsvc”服務。

基于命令行來檢測winrm.vbs是否存在的這種方案相對較弱,因為攻擊者可以將winrm.vbs重命名為他們所選擇的文件。

為了使用xls文件,這里必須在“format”參數中指定“pretty”或“text”。下面給出的是支持的“format”參數(大小寫不敏感):

-format:pretty
-format:"pretty"
/format:pretty
/format:"pretty"
-format:text
-format:"text"
/format:text
/format:"text"

雖然構建基于“format”是否存在的檢測方案能夠捕捉到所有的變化,但這種檢測方案是存在問題的?!癴ormat”參數是否合法使用將取決于組織所采用的方案。不過除了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腳本

毫無疑問,攻擊者還會繼續(xù)使用XSL和WSH來進行攻擊。理想情況下,攻擊者是可以知道Payload到底是從硬盤中執(zhí)行的還是完全在內存中執(zhí)行的。雖然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

logmanstop AMSITrace -ets

接下來,我們還可以通過輸出數據清單來了解更多事件信息:


 
  
   
    
     
    
    
     
    
    
     
    
    
     
      
      
      
      
      
      
      
      
      
      
     
    
   
  
 
 
  
   
    
    
   
  
 

捕捉到.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的執(zhí)行內容:

如何使用Winrm.vbs繞過應用白名單執(zhí)行任意未簽名代碼

感謝各位的閱讀!關于“如何使用Winrm.vbs繞過應用白名單執(zhí)行任意未簽名代碼”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!


本文題目:如何使用Winrm.vbs繞過應用白名單執(zhí)行任意未簽名代碼
網頁URL:http://weahome.cn/article/jeeggi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部