建構 Huntbook 以發現來自計劃的 Windows 任務的持續威脅
Xiaokui Shu和Ian Molloy · 2021 年 7 月 26 日 · 9 分鐘閱讀
from: https://opencybersecurityalliance.org/posts/kestrel-2021-07-26/
在這篇博文中,是介紹 Kestrel 威脅狩獵語言的系列文章的第一篇,我們将向您展示如何開始您的第一次狩獵。您将學習如何設定環境、連接配接到資料源以及搜尋常見的攻擊技術,即Windows 中的計劃任務。您還将熟悉可用于建構自己的狩獵簿的基本概念。 從該部落格建立的Windows 計劃任務 Huntbook可以從Kestrel 狩獵簿存儲庫下載下傳。
讓我們設定我們的監控堆棧并通過對計劃的 Windows 任務進行推理來執行 Kestrel搜尋持久性 Windows 威脅。
Kestrel安裝
首先,我們将遵循Kestrel 安裝指南并在帶有 Python 3.9 的 Linux 狩獵盒上的 Python 虛拟環境中安裝 Kestrel。
接下來,建立一個幹淨的 Python 虛拟環境并激活它:
$ python -m venv huntingspace
$ . huntingspace/bin/activate
接下來,使用 Jupyter notebook 核心安裝 Kestrel 運作時:
$ pip install -U pip setuptools wheel
$ pip install kestrel-jupyter
$ python -m kestrel_jupyter_kernel.setup
此步驟将安裝所有 Kestrel 運作時元件和依賴項,例如 STIX-shifter以及Jupyter Server,以使用 Kestrel 核心。
設定資料源
大多數組織使用 EDR 來監控他們的 Windows 主機并收集遙測資料,我們可以使用 Kestrel 進行推理。在這個示範中,我們将使用 Sysmon并使用 winlogbeat 将事件流式傳輸到Elasticsearch以進行日志管理。Elasticsearch 中的日志是 記錄,在其之上 Kestrel 提供了一個抽象來進行基于實體的推理, 并支援動态搜尋 流 開發和共享。
Kestrel 通過一組可擴充的接口連接配接到資料源 。我們今天将使用的主要接口是STIX-shifter 接口。STIX-shifter 支援從各種資料源檢索資料,包括存儲在 Elasticsearch 伺服器(由 winlogbeat 使用)上的Elastic Common Schema (ECS) 中的資料。STIX-shifter 有幾十個預設未安裝的連接配接器——使用者需要根據他們可用的資料源選擇要安裝的連接配接器。讓我們為 Sysmon-Elasticsearch(ECS) 資料管道安裝連接配接器:
$ pip install stix-shifter-modules-elastic_ecs
通常,人們會使用存儲在 Elasticsearch 中的日志來監控多個 Windows。通常,人們為來自不同主機的日志配置設定不同的 Elasticsearch 索引以單獨查詢它們。在 Kestrel 中,我們添加并配置了我們在執行狩獵時想要連接配接的資料源。每個配置指定一個或多個受監控的 Windows 主機,由 Elasticsearch 索引辨別。該配置還告訴 Kestrel 如何使用主機名和憑據(例如密碼或 API 密鑰)通路 Elasticsearch 服務。
我們打開一個新終端,用 Kestrel 激活 Python 虛拟環境,并導出三個環境變量來設定一個名為 Kestrel 的資料源
host101
(更多資訊可以在Kestrel 教程中找到:
$ . huntingspace/bin/activate
$ export STIXSHIFTER_HOST101_CONNECTOR=elastic_ecs
$ export STIXSHIFTER_HOST101_CONNECTION='{"host":"elastic.securitylog.company.com", "port":9200, "indices":"host101"}'
$ export STIXSHIFTER_HOST101_CONFIG='{"auth":{"id":"VuaCfGcBCdbkQm-e5aOx", "api_key":"ui2lp2axTNmsyakw9tvNnw"}}'
啟動 Jupyter 并建立一個新的 Huntbook
接下來隻需使用我們的 Kestrel 資料源配置(導出的環境變量)在上述終端中啟動 Jupyter notebook:
$ jupyter notebook
在浏覽器的 Jupyter 頁面上,我們通過在New Notebooks的下拉菜單下選擇Kestrel核心來建立一個空的 Kestrel 狩獵簿。
huntbook是Jupyter筆記本包含狩獵步驟(在 Kestrel),執行結果,和檔案或注釋。
擷取 Windows 排程程式清單
在這次追捕中,我們将開始從 Windows 計劃任務/服務清單中向下鑽取,以追捕諸如FIN7 之類的持續威脅 。
注:FIN7是一個東歐威脅組織,至少自 2015 年年中以來一直活躍,主要針對美國實體,目标是直接竊取金融資訊,例如信用卡和借記卡資料。2021年6月下旬至7月下旬,FIN7組織在魚叉式網絡釣魚活動中,利用武器化Windows 11 Alpha主題Word文檔,針對銷售點 (PoS) 服務提供商投放惡意載荷,包括JavaScript植入程式。
在最近的 Windows(>= Windows 10 版本 1511)中,計劃任務由
svchost.exe
特定參數執行和管理
-k netsvcs -p -s Schedule
。任務是
svchost.exe
在預定時間從程序中作為子程序産生的。Nasreddine Bencherchali在他的 部落格中撰寫的這種了解 提供了将 Windows 計劃任務作為程序實體與父程序一起檢索的想法
svchost.exe
。
在 Kestrel 中,我們使用該
GET
指令從比對給定模式的資料源中檢索資料。在本次搜尋中,我們使用STIX 模式, 因為我們使用的資料源接口是 STIX-shifter,它将 STIX 模式轉換為本地查詢語言,并将結果轉換回 STIX 包以供 Kestrel 處理。
在 Kestrel 中編寫 STIX 模式時需要注意兩個特殊項目(在GET 指令文檔中更詳細):
-
指令中傳回的實體類型應始終與 STIX 模式中的根級STIX 網絡可觀察對象 (SCO)類型比對。GET
- 我們需要
為我們的第一個模式提供一個時間範圍。否則,STIX-shifter 将預設搜尋最後五分鐘,這可能不是感興趣的時間範圍。START ... STOP ...
要擷取 scheduler
svchost.exe
,擷取此類程序實體的直接想法是使用以下 STIX 模式将程序與其特定指令行比對:
[process:command_line = 'C:\Windows\system32\svchost.exe -k netsvcs -p -s Schedule']
我們可以将
GET
指令放在第一個huntbook單元中執行:
# create Kestrel variable scheduler with the list of scheduler processes
scheduler = GET process FROM stixshifter://host101
WHERE [process:command_line = 'C:\Windows\system32\svchost.exe -k netsvcs -p -s Schedule']
START t'2021-04-03T00:00:00Z' STOP t'2021-04-04T00:00:00Z'
或者,我們可以編寫一個更簡單的模式來比對所有
svchost.exe
程序,并通過在 上應用第二個模式來進一步過濾結果
command_line
# first GET going through STIX shifter
svchost = GET process FROM stixshifter://host101
WHERE [process:name = 'svchost.exe']
START t'2021-04-03T00:00:00Z' STOP t'2021-04-04T00:00:00Z'
# second GET running locally against the returned/cached data from the first command
# no need to specify time range for GET from a Kestrel variable, check doc for more info
scheduler = GET process
FROM svchost
WHERE [process:command_line = 'C:\Windows\system32\svchost.exe -k netsvcs -p -s Schedule']
Kestrel 将通過 STIX-shifter 運作第一個模式,并在本地運作第二個模式,以對抗第一個
GET
. 我們将這兩個
GET
指令放在一個代碼塊中,因為它們将始終一起運作。如果我們想對
svchost.exe
程序執行多次搜尋并最小化我們必須對後端執行的查詢,這可能很有用。請注意,在撰寫本文時,由于ECS STIX-shifter 子產品中的錯誤,第一種方法将失敗。
查找計劃任務
執行上面的單元格,我們
svchost.exe
在變量中得到 183 個程序
svchost
。其中隻有兩個是在變量中捕獲的排程程式程序
scheduler
下一步很簡單:找到 的子程序
scheduler
,它們是我們感興趣的計劃任務程序。
對于關系解析,我們使用 Kestrel 指令
FIND
,它将負責記錄到實體的處理并預取相關記錄以進一步深入挖掘。
要使用
FIND
,我們查找要使用的适當關系文法的指令文法。文檔中還有一些示例,例如在 Kestrel 變量中查找程序的子程序,這正是我們在這裡需要的。
tasks = FIND process CREATED BY scheduler
DISP tasks ATTR name, command_line
在上面的代碼塊中,變量
tasks
包含來自 的子程序
scheduler
,我們使用 display 指令
DISP
來顯示 中程序實體的關鍵屬性
tasks
。對于不熟悉流程實體的人,可以使用
INFO tasks
指令列印出所有的屬性,然後列印出
DISP
其中的一些。
該單元需要 8 秒才能運作并找到 126 個任務程序作為 .svchost 排程程式的子程序
scheduler
。該
DISP
指令将它們顯示在表格中。
從上面的截圖(中的部分程序
tasks
),我們看到了一些未知的程序
amcet.exe
,但我們在谷歌和VirusTotal上找不到資訊。
深入研究計劃任務
acmet.exe
由于位置路徑,我們懷疑是一個合法的 IBM 程序,
c:/programdata/ibm/rii/amcet.exe
如上所示。我們可以
amcet
通過
GET
指令為這些程序建立一個新變量并進一步調查。
我們可以使用該
FIND
指令找到與程序相關的可執行檔案,但它提供的資訊可能不會比我們從
command_line
現場獲得的資訊更多。相反,我們可以搜尋子程序以檢視是否有任何可疑的東西,例如PowerShell或其他已知的惡意程序。此外,我們可以找到任何網絡流量并分析通信模式。
讓我們深入研究 amcet 作為我們筆記本中的單個執行塊:
# get only the amcet processes from all scheduled tasks
amcet = GET process FROM tasks WHERE [process:name = 'amcet.exe']
# find and display their child processes
amcet_child = FIND process CREATED BY amcet
DISP amcet_child ATTR name, command_line
# find and display their network traffic
nt = FIND network-traffic CREATED BY amcet
DISP nt ATTR dst_ref.value, dst_port
從執行摘要中,我們得到 24 個 amcet 程序,它們産生 45 個子程序并建立 23 個網絡連接配接。
所有網絡流量共享同一個遠端 IP 位址
9.148.5.93
(根據我們的
DISP nt
指令顯示,帶有屬性
dst_ref.value
和
dst_port
):
從我們的威脅情報(在 TI 工具中查找或直接在追查流程中使用 TI 資訊豐富實體(将在以後的部落格中讨論))中,我們沒有看到任何主機受到威脅的迹象。我們可能會檢查該服務
9.148.5.93:443
以确認該服務沒有受到損害或惡意。此時更有趣的是我們發現的子程序:45 個生成的程序隻分為兩類——
conhost
而且
powershell
——正如我們的
DISP
指令所示:
這裡的敏感過程是
conhost.exe
with參數
0xffffffff -ForceV1
,它可以通路核心空間,被用于許多攻擊,尤其是DLL注入。我們需要檢查所有程序使用的子程序和檔案,
amcet_child
以了解是否有某些内容被篡改或是否存在帶有可疑指令行的程序。
# find child processes of amcet_child
amcet_cc = FIND process CREATED BY amcet_child
DISP amcet_cc ATTR name, command_line
# find files read/written/executed by amcet_child
# Kestrel v1.0.8 only resolves the generic relation LINKED into STIX 2.0 references,
# which is limited to execution relation between processes and executables
amcet_f = FIND file LINKED amcet_child
DISP amcet_f ATTR name, parent_directory_ref.path
執行此單元後,我們看不到任何程序建立的子程序
amcet_child
(中的零實體
amcet_cc
)。
指令中
amcet_child
顯示的程序隻有兩個檔案
DISP amcet_cc
,它們隻是程序的主要可執行檔案。
總結和伸展狩獵
在這篇博文中,我們展示了如何開始使用 Kestrel 威脅狩獵語言,從灌輸到第一次尋找:發現 Windows 中的持續威脅。我們首先查找所有計劃的 Windows 任務,然後深入研究一個特定程序以搜尋可疑活動。雖然我們在實踐中沒有發現任何持續存在的威脅,但我們建立了一個 可以重複使用和修訂的狩獵手冊,以供未來的狩獵使用。檢查威脅的持續性通常是發現大型 APT 活動的第一階段之一,可組合的追捕流 功能可以重用這種追捕簿大型追捕。我們隻使用
GET
和
FIND
此狩獵實踐中的指令,涵蓋了知識編碼的兩個類别之一——模式比對。在我們的下一篇部落格中,我們不僅将介紹模式比對,還将介紹分析,它們的組合在大型狩獵中将非常有用。