標籤:

在不熟悉C/C++情況下,hook windows事件

介紹

MSDN中對它的介紹為:

WMI(Windows 管理規範)是基於Windows操作系統的管理數據和操作的基礎架構。可以編寫WMI腳本或應用程序來自動執行遠程計算機上的管理任務,但是WMI會將管理數據提供給操作系統和產品的其他部分。

通過上述定義,我們了解到他所具有的威力,你不僅可以以管理員許可權進行計劃任務執行,而且最重要的是,還是通過遠程執行!但是這僅是它功能的冰山一角,而且很多像CozyDuke,和DeepPanda這樣的黑客組織已經注意到了這一」武器」。實際上,在過去幾年裡,黑客們已經開始在他們的滲透測試過程中使用windows本機工具來達成他們的目的。

這種無上傳攻擊提供了很多便利之處,首先,攻擊者不需要將各種各樣的工具上傳到目標操作系統上面,從而降低了被殺毒軟體以及用戶檢測到的可能性。其次,這種攻擊方法減少了攻擊溯源被發現的可能性。

WMI可以由Powershell,WMI控制台,或者使用MOF腳本實現。

在Powershell中使用WMI,你需要打開Powershell控制台,然後執行Get-wmiobject命令(或者gwmi),如下:

$ get-wmiobject win32_logicaldisk name, freespace, systemname, size -filter drivetype=3nn__GENUS : 2n__CLASS : Win32_LogicalDiskn__SUPERCLASS :n__DYNASTY :n__RELPATH :n__PROPERTY_COUNT : 4n__DERIVATION : {}n__SERVER :n__NAMESPACE :n__PATH :nFreeSpace : 34652438528nName : C:nSize : 106901270528nSystemName : AI-PINCHEWEEEY-VMnPSComputerName :n

上方代碼中你可以看到,我們通過Win32_LogicalDisk類獲取到了多個系統驅動器的屬性。這些類中每一個都具有一些屬性和你可以執行的函數,你可以通過閱讀MSDN給出的這些類的文檔進行了解。Win32_LogicalDisk類的說明文檔:Win32_LogicalDisk class。WMI所有類的說明文檔:WMI Classes (Windows)

攻擊者可以對C盤進行複製,並且得到C盤的ID,以便滲透測試結束之後刪除副本,清理痕迹。在解密SAM文件獲取windows憑證攻擊過程中,就用到了這一攻擊方法,在這一方法中,Win32_ShadowCopy類中的Create()函數被調用:

$ Get-WMIObject Win32_ShadowCopy -List).Create("C:", "ClientAccessible").ShadowIDn

順便說一下,如果你想要有關於影子副本的moar cookies,你可以閱讀這一篇文章:webcache.googleusercontent.com

你還有很多方法去執行WMI,比如可以通過windows命令行執行,如下,你可以發現,變數基本上是相同的:

$ wmic logicaldisk where drivetype=3 get name, freespace, systemname, sizenFreeSpace Name Size SystemNamen33230168064 C: 106901270528 AI-PINCHEWEEEY-VMn

做一些有趣的事情

現在我們已經說了很多WMI中你可以使用的類以及函數。那麼攻擊者如何使用WMI達到他們的目的呢?

比如開啟一個進程?

$ wmic process call create "notepad.exe"nExecuting (Win32_Process)->Create()nMethod execution successful.nOut Parameters:ninstance of __PARAMETERSn{n ProcessId = 2416;n ReturnValue = 0;n};n

再比如殺掉一個進程?

$ wmic process where name="notepad.exe" deletenDeleting instance AI-PINCHEWEEEY-VMROOTCIMV2:Win32_Process.Handle="2416"nInstance deletion successful.n

事情變得不簡單了吧?

還有更多可以實現的,你可以參考OS類的指南,比如:

Win32_Process (「edit」, query processes)nWin32_Service (「edit」, query services)nWin32_Directory (「edit」, query directories)nWin32_Shares (「edit」, query network shares)nWin32_LocalTime (query time)n

你沒有忘記最有趣的事情吧,你可以遠程執行命令!

$ wmic /node: "192.168.1.10" /username:domainuser /password:pwd process call create notepad.exenExecuting (Win32_Process)->Create()nMethod execution successful.nOut Parameters:ninstance of __PARAMETERSn{n ProcessId = 5176;n ReturnValue = 0;n};n

這是攻擊者在內網中進行橫向滲透的最佳方法,因為攻擊者不用將PSexec這類的工具上傳到受害機器上面。

如何hook windows事件呢?

我們還沒有討論到MOF腳本,用我自己的話講,MOF腳本需要使用mofcomp.exe進行」編譯」,然後就可以訪問到一些WMI功能。

使用MOF腳本,你可以決定操作系統執行命令的對象,以及執行命令的時間。以下對象就是用於定義這兩個變數:

__EventConsumer: 指定執行程序n__EventFilter: 設置執行時間n__FilterToConsumerBinding: 將執行程序和執行時間進行綁定n

這樣做最有趣的一件事就是可以執行vbs腳本,所以這樣的話你就可以做你想做的任何事情,比如:

instance of ActiveScriptEventConsumer as $Consn{n Name = "ASEC";n ScriptingEngine = "VBScript";n ScriptText =n "Set objShell = CreateObject("WScript.Shell") n" n "objShell.Exec("c:windowssystem32cmd.exe /c echo MOF Script Output>c:mof_output.txt")n";n};n

上述EventConsumer將執行windows命令並且通過vb腳本將一些內容寫入文件,這樣就很方便去檢查命令執行成功與否。

接下來就是Event Filter,什麼時間執行:

instance of __EventFilter as $Filtn{n Name = "EF";n EventNamespace = "rootcimv2";n QueryLanguage = "WQL";n Query = "SELECT * FROM __InstanceCreationEvent " n "WITHIN 2 WHERE TargetInstance ISA Win32_Process "n "AND TargetInstance.Name = notepad.exe";n};n

對於EventFilter,一種叫做WQL(WMI查詢語言)的語言在這裡被使用。這一語言可以用來hook不通的系統事件。在上方代碼中,我們正在定義了」什麼時候觸發」,即什麼時候創建實例。你可以閱讀一篇文檔詳細了解:__InstanceCreationEvent class。在這裡,我們創建名為」notepad.exe」的Wind32_Process類的實例。

這是一個非常簡單的方法來實現類似於hook CreateProcess調用的東西。攻擊者可以查看特定的進程,然後執行某些操作,例如殺死進程。

現在讓我們定義將執行程序和執行時間進行綁定的操作:

instance of __FilterToConsumerBindingn{n Filter = $Filt;n Consumer = $Cons;n};n

最後,MOF腳本如下:

#pragma namespace (".rootsubscription")nninstance of ActiveScriptEventConsumer as $Consn{n Name = "ASEC";n ScriptingEngine = "VBScript";n ScriptText =n "Set objShell = CreateObject("WScript.Shell") n" n "objShell.Exec("c:windowssystem32cmd.exe /c echo MOF Script Output>c:mof_output.txt")n";n};nninstance of __EventFilter as $Filtn{n Name = "EF";n EventNamespace = "rootcimv2";n QueryLanguage = "WQL";n Query = "SELECT * FROM __InstanceCreationEvent " n "WITHIN 2 WHERE TargetInstance ISA Win32_Process "n "AND TargetInstance.Name = notepad.exe";n};nninstance of __FilterToConsumerBindingn{n Filter = $Filt;n Consumer = $Cons;n};n

我們只需要通過以管理員身份執行mofcomp.exe對這一腳本進行編譯:

$ mofcomp.exe .mof_script.mofnMicrosoft (R) MOF Compiler Version 10.0.10586.0nCopyright (c) Microsoft Corp. 1997-2006. All rights reserved.nParsing MOF file: .mof_script.mofnMOF file has been successfully parsednStoring data in the repository...nWARNING: File .mof_script.mof does not contain #PRAGMA AUTORECOVER.nIf the WMI repository is rebuilt in the future, the contents of this MOF file will not be included in the new WMI repository.nTo include this MOF file when the WMI Repository is automatically reconstructed, place the #PRAGMA AUTORECOVER statement on the first line of the MOF file.nDone!n

此時如果你打開記事本,你就會看到在C盤下面出現了mof_output.txt.

進行更複雜的攻擊

我敢確信,當你小時候看電視或者看電影過程中,一定聽過所謂的」時間炸彈」或者」邏輯炸彈」~那麼,讓我們實現這樣的一個」炸彈」吧~

由上文可知,我們可以改變代碼的執行時間,我們只需要對 Event Filter中的代碼做一些小小的修改:

instance of __EventFilter as $Filtn{n Name = "EF";n EventNamespace = "rootcimv2";n QueryLanguage = "WQL";n Query = "SELECT * FROM __InstanceModificationEvent WITHIN 20 WHERE "n "TargetInstance ISA Win32_LocalTime AND "n "TargetInstance.Hour = 10 AND "n "TargetInstance.Minute = 34";n};n

從上述代碼中可以看到,Event Consumer會在上午10:34觸發。我們通過hook系統時間以及監控其變化來對它進行實現。代碼中within是指定事件相差間隔為20秒。

我們已經展示了如何使用WMI和MOF腳本來實現攻擊者使用自定義工具執行的許多操作。你可以在某些時間執行某些操作(有助於確定何時從受感染的系統中獲取信息),在程序或服務啟動或停止時執行,當文件從文件系統中寫入或刪除時執行,或者windows事件被記錄時執行,等等。

是不是非常酷!

如何檢查我是否被入侵呢?

現在你知道WMI的強大了吧,那麼下一個問題就是如何防護這種攻擊呢?首先,和平時入侵檢測一樣,了解當前系統正在運行什麼,你需要知道在系統中註冊了哪些事件,以便你可以監控其創建以及刪除。你可以使用如下powershell命令列出所有的Event

Consumers,,Event Filters 以及Filter To Consumer Bindings。

gwmi -Namespace "root/subscription" -Class __EventFilterngwmi -Namespace "root/subscription" -Class __EventConsumerngwmi -Namespace "root/subscription" -Class __FilterToConsumerBindingn

如果想刪除事件,你可以使用如下命令:

gwmi -Namespace "root/subscription" -Class __EventConsumer | where name -eq "<NAME>" | Remove-WmiObjectngwmi -Namespace "root/subscription" -Class __EventFilter | where name -eq "<NAME>" | Remove-WmiObjectn

現在你可以寫腳本來監控系統事件,以及刪除掉不應該存在的異常事件.

你還可以使用windows平台上的時間追蹤器來跟蹤wmi活動.

結論

總之現在得到的結論是黑客可以使用wmi進行偵查,橫向滲透,以及與之相關的一切,由於windows中自帶這種服務,導致了使用這一攻擊方法進行滲透的案例越來越多。

和往常一樣,每一個功能強大的好工具如果用來做壞事,同樣會非常強大。wmi攻擊已經在一些惡意軟體中被使用,比如:Wiper,Flame中利用MOF文件使用rundll32執行惡意dll,Kjw0rm中使用TV5Monde

Compromise 獲取系統信息,PowerWorm中使用WMI進行持久性控制,Operation Mangal等等。

所以,希望你之後在威脅建模時,將wmi加入到其中。

參考:

__EventFilter class

__EventConsumer class

__FilterToConsumerBinding class

Creating a Logical Consumer

Creating an Event Filter

Binding an Event Filter with a Logical Consumer

ActiveScriptEventConsumer class

Running a Script Based on an Event

WMI Tasks for Scripts and Applications

PowerWorm Analysis and Weaponized PowerWorm

Advanced Persistent Threats | Kashif Ali

sentinelone.com/blog/un

cert-ro.eu/files/doc/61

Inside the 「wiper」 malware that brought Sony Pictures to its knees [Update]

la.trendmicro.com/media

cansecwest.com/slides/2

blackhat.com/docs/us-14

www2.fireeye.com/rs/fir

blackhat.com/docs/us-15

poppopret.blogspot.com/

本文翻譯自:Hooking Windows events without knowing anything about C/C++,如若轉載,請註明來源於嘶吼: 在不熟悉C/C++情況下,hook windows事件 更多內容請關注「嘶吼專業版」——Pro4hou

推薦閱讀:

用戶模式下基於異常和內核控制的線程級鉤子技術分析

TAG:信息安全 | Hook |