Svchost 在實現所謂的共享服務進程中至關重要,其中多個服務可以共享一個進程以減少資源消耗。將多個服務分組到單一進程中可以節省運算資源,NT 設計者特別關心這一點,因為與其他作業系統(例如 Unix 系列)相比,建立 Windows 進程需要更多時間並消耗更多記憶體。 1
簡而言之,這意味著;在 Windows 作業系統上,svchost.exe 管理服務,並且服務實際上會作為執行緒在 svchost.exe 下運行。 Phant0m 以事件日誌服務為目標,找到負責事件日誌服務的流程,偵測並殺死負責事件日誌服務的執行緒。因此,雖然事件日誌服務似乎在系統中運行(因為 Phant0m 沒有終止進程),但它實際上並未運行(因為 Phant0m 終止了線程)並且系統不收集日誌。
Phant0m 使用兩個不同的選項來偵測事件日誌服務的進程 ID。第一種是透過 SCM(服務控制管理員)進行偵測,第二種是透過 WMI(Windows 管理規格)進行偵測。您希望 Phant0m 使用哪種方法來偵測事件日誌服務的進程 ID,請變更 main.cpp 檔案中的以下行。
例如,如果您希望透過 SCM 偵測進程 ID,則應如下編輯它。 (不要同時設定所有值,僅設定您想要的一種技術。)
// PID detection techniques configuration section.
# define PID_FROM_SCM 1 // If you set it to 1, the PID of the Event Log service is obtained from the Service Manager.
# define PID_FROM_WMI 0 // If you set it to 1, the PID of the Event Log service is obtained from the WMI.
例如,如果您希望使用 Technique-1 終止線程,則應如下編輯它。 (不要同時設定所有值,僅設定您想要的一種技術。)
// TID detection and kill techniques configuration section.
# define KILL_WITH_T1 1 // If you set it to 1, Technique-1 will be use. For more information; https://github.com/hlldz/Phant0m
# define KILL_WITH_T2 0 // If you set it to 1, Technique-2 will be use. For more information; https://github.com/hlldz/Phant0m
Phant0m 使用兩種不同的選項來偵測和終止事件日誌服務的執行緒。
當每個服務在執行 Windows Vista 或更高版本的電腦上註冊時,服務控制管理員 (SCM) 會為該服務指派一個唯一的數位標記(按升序)。然後,在服務建立時,該標籤被指派給主服務執行緒的 TEB。然後,該標記將傳播到主服務執行緒所建立的每個執行緒。例如,如果 Foo 服務執行緒建立了一個 RPC 工作執行緒(注意:RPC 工作執行緒稍後不會更多地使用執行緒池機制),則該執行緒將具有 Foo 服務的服務標記。 2
因此,在這種技術中,Phant0m 將使用 NtQueryInformationThread API 檢測事件日誌服務的線程,以取得線程的 TEB 位址並從 TEB 中讀取 SubProcessTag。然後它會終止與事件日誌服務相關的執行緒。此技術的程式碼位於the technique_1.h
檔案中。
在此技術中,Phant0m 檢測與線程關聯的 DLL 的名稱。 Windows 事件日誌服務使用wevtsvc.dll
。完整路徑為%WinDir%System32wevtsvc.dll
。如果該線程正在使用該 DLL,則它是 Windows 事件日誌服務的線程,然後 Phant0m 會終止該線程。此技術的程式碼位於the technique_2.h
檔案中。
您可以將 Phant0m 用作獨立的 EXE 和反射 DLL。在 Microsoft Visual Studio 中開啟項目,進行設定(選擇偵測和終止技術)並編譯。您也可以將反射 DLL 版本與 Cobalt Strike 一起使用,為此,儲存庫中有一個 Aggressor 腳本檔案 (phant0m.cna)。
Cobalt Strike 的 Aggressor 腳本 (phant0m.cna) 的執行類型中使用了 Fork 和注入方法以及bdllspawn
。如果您想將 Phant0m 注入到現有進程中並運行它,您可以查看此專案(https://github.com/rxwx/cs-rdll-ipc-example)並且可以輕鬆完成。您也可以將程式碼轉換為 DLL,然後使用 Donut 轉換為 Shellcode。
注意:此專案僅支援x64架構。