HOME > 解決方案

獵殺勒索與惡意軟體從Process開始

2021/11/29

這篇貼文是《使用 Splunk 進行捕獵:基礎知識》系列的第 25 篇。我們一直在 BOTS 和捕獵部落格中討論檔案執行的重要性。值得慶幸的是,Shannon Davis 將深入研究整個捕獵的過程! – Ryan Kovar


無論是安全事件正在發生,或只是想過濾資料以尋找惡意活動的跡象時,您經常會想要追蹤特定處理程序的活動或關係。如果您試圖用暴力的方式進行 (一遍又一遍地複製/貼上父處理程序和子處理程序 ID),那這項工作可能非常耗時且令人氣餒。在激烈的安全攻防中,您甚至可能會錯過一些有機會發現重要資訊的線索。Splunk 在擷取處理程序資料方面非常出色,能讓您進行各種搜尋和關聯性操作,但在視覺化這些資料的父/子關係方面還是需要一點技巧,尤其是跨越多代時。

先決條件
為了尋找這些關係,首先我們必須從擷取正確的資料開始。在部落格中介紹時,我會以 Windows 平台為主,將來有機會再在其他作業系統上重新試作。
我用來在 Windows 通用轉送器上擷取資料的兩個 Splunk 附加元件是:
•    Splunk Add-on for Microsoft Sysmon
•    Splunk Add-on for Microsoft Windows

擷取處理程序事件
安裝了適當的附加元件後,我還需要設定 Windows 端點以擷取與處理程序相關的事件。有兩種資料類型可用於擷取新的處理流程建立事件,分別是:
•    Sysmon Event Code 1 (來自 SwiftOnSecurity 或 Olaf Hartong 的 Sysmon 設定,都是不錯的來源) 
•    Event ID 為 4688 的 Windows 安全事件日誌,並在處理程序建立事件中包含命令列
 
這兩個資料來源都有用,但在本文中我將專注於 Sysmon EventCode=1 的資料,因為它非常適合我將進一步示範的公用程式。
處理程序追蹤
現在我們已經搞定先決條件,開始捕獵吧。在這個例子中,假設我們的環境中有一個已知的惡意試算表,我們想了解是否有人打開過它。如果有,我們想知道發生了什麼事。

首先,我們可以查看在 Sysmon 的任何 EventCode 1 事件中是否有出現試算表檔案名稱 salary.xls。和 《螢幕大角頭》(Anchorman) 中主角金句 ("我喜歡燈") 一樣,我更喜歡 「表格」。我將使用 SPL 命令表來「做表格」,列出這些事件發生的時間、在哪部主機、和其有關的使用者、有關的處理程序 ID,以及觸發處理程序的完整命令列。

這個搜尋會使用主索引,使用 Symon 資料當來源 (不是 sourcetype),並以 EventCode=1 回傳處理程序建立事件。您可以在第一個搜尋方塊中定義 CommandLine 欄位搜尋。為了明顯易懂,我以一個單獨的搜尋命令做示範,您以後可以按圖索驥。然後我新增上述欄位,包含在我的表中。如果您願意,可以隨意新增其他您想要的內容。
index=main source="xmlwineventlog:microsoft-windows-sysmon/operational" EventCode=1
| search CommandLine="*Salaries.xls*"
| table _time host user ProcessId CommandLine
我們的搜尋回傳了一個引用 Salaries.xls 的流程建立事件。我們可以看到使用者是 wallylambic,處理程序 ID 是 6416,命令列顯示看起來是從 Outlook 從打開試算表 Excel.exe,但我們需要進一步確認這一點。此外,我們不知道試算表打開後是否發生了任何事情。

利用前面的搜尋,我們可以再次使用 table 命令來顯示更多欄位,例如父處理程序名稱、父處理程序 ID、父處理程序路徑、處理程序路徑等。這些欄位可以幫助我們進一步檢視並確認流程是否從我們預期的位置執行。
index=main source="xmlwineventlog:microsoft-windows-sysmon/operational" EventCode=1
| search CommandLine="*Salaries.xls*"
| table parent_process_name parent_process_id parent_process_path process_path


藉此我們獲得了一些很有用的追蹤資訊。我們可以看到父處理程序確實是 Outlook.exe,父處理程序 ID 是 11120,以及 Outlook 和 Excel 執行檔的處理程序路徑。在尋找處理程序是否從預期之外的位置 (臨時目錄、啟動資料夾等) 啟動時,處理程序路徑資訊是非常有幫助的資訊。我們可以使用這個處理程序 ID 搜尋整個處理程序樹 (在每次新搜尋中,使用前一次搜尋到的結果處理程序 ID 作為父處理程序 ID),但如前所述,這種作法耗時且容易出錯,是一條讓人心力交瘁的不歸路。

我們能否讓事情簡化,並為打開試算表後發生的所有事情建立一份表格?我們可以!

Donald Murchison 開發了一個很酷的應用程式稱之為 PSTree,它可以讓您的工作更輕鬆。安裝該應用程式以及 Splunk Python SDK 後,您可以輸入父欄位和子欄位,然後依此建立結果處理程序的家族結構表 (我說過我有多麼愛表格嗎?)。

以下大部分搜尋,均取自上面 Splunkbase 連結中 Donald 範例中的詳細資訊。對於新手來說,乍看之下可能令人費解,但事實並非如此。讓我稍微解釋一下。

他使用 rex 命令做的,只是根據現有 ParentImage 和 Image 欄位中的資料建立一些新欄位 (ParentName 和 ProcessName)。如果您不知道如何建立正則表示式,請瀏覽此處做一些基礎訓練。哎呀,我們甚至在我們的捕獵系列《Rex Grok 胡言亂語》中提過這個話題。

取得這些新欄位後,他使用 eval 命令將提取的 ParentName 和 ProcessName 欄位與原有的 ParentProcessId 和 ProcessId 欄位資訊結合起來。再建立另一個名為 detail 的欄位,將 _time 欄位資訊與 CommandLine 欄位資訊結合在一起。完成這些步驟後,可以得到一個非常漂亮的資訊表。

現在,可以在 PSTree 應用程式新增的 pstree 自訂命令中,使用三個新欄位,父項、子項和詳細資訊。space=50 定義只是幫助我們格式化結果表,避免第一列浪費太多空間。

當我們想要對 salary.xls 試算表追蹤處理程序時,必須在 pstree 命令執行完成「之後」,再將它作為搜尋參數之一。這一點非常重要。

最後但同樣重要的是,我們是從樹狀資料建立出一個表格 (我愛表格)。
index=main source="xmlwineventlog:microsoft-windows-sysmon/operational" EventCode=1 user=wallylambic
| rex field=ParentImage "\x5c(?[^\x5c]+)$"
| rex field=Image "\x5c(?[^\x5c]+)$"
| eval parent = ParentName." (".ParentProcessId.")"
| eval child = ProcessName." (".ProcessId.")"
| eval detail=strftime(_time,"%Y-%m-%d %H:%M:%S")." ".CommandLine
| pstree child=child parent=parent detail=detail spaces=50
| search tree=*Salaries.xls*
| table tree


或許您不是很容易閱讀 (視您的螢幕尺寸而定),但是我們的處理程序追蹤結果表最深可達 7 層。從 Outlook.exe (11120) 開始,然後產生 Excel.exe (6416),然後產生 mshta.exe (12404),然後到 powershell.exe (16796),接著它打開另一個 powershell.exe (5912),然後打開 cmd.exe (1832),最後再打開處理程序 (powershell、cacls、bitsadmin 等)。命令列資料也顯示出來了,但我試圖把資料塞滿畫面,所以您可能要瞇著眼睛。

這是將追蹤開始時一小塊放大的結果。

您可以看到手動進行這項操作有多困難,更不用說您不免要打開多個瀏覽器分頁來建立每個新搜尋。這個工具可以將這些資料彙整到一個包含時間戳記和命令列資料的表中,實在太強了!感謝 Donald 創造了這個偉大的應用程式!

希望這個部落格對您的處理程序追蹤有所幫助。 

在此期間,祝您捕獵愉快!