天天看點

Kestrel威脅狩獵實踐篇之一——追捕諸如FIN7 之類的持續威脅

建構 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 狩獵簿。

Kestrel威脅狩獵實踐篇之一——追捕諸如FIN7 之類的持續威脅

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 指令文檔中更詳細):

  1. GET

    指令中傳回的實體類型應始終與 STIX 模式中的根級STIX 網絡可觀察對象 (SCO)類型比對。
  2. 我們需要

    START ... STOP ...

    為我們的第一個模式提供一個時間範圍。否則,STIX-shifter 将預設搜尋最後五分鐘,這可能不是感興趣的時間範圍。

要擷取 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

Kestrel威脅狩獵實踐篇之一——追捕諸如FIN7 之類的持續威脅

下一步很簡單:找到 的子程序

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

其中的一些。

Kestrel威脅狩獵實踐篇之一——追捕諸如FIN7 之類的持續威脅

該單元需要 8 秒才能運作并找到 126 個任務程序作為 .svchost 排程程式的子程序

scheduler

。該

DISP

指令将它們顯示在表格中。

Kestrel威脅狩獵實踐篇之一——追捕諸如FIN7 之類的持續威脅

從上面的截圖(中的部分程序

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
           
Kestrel威脅狩獵實踐篇之一——追捕諸如FIN7 之類的持續威脅

從執行摘要中,我們得到 24 個 amcet 程序,它們産生 45 個子程序并建立 23 個網絡連接配接。

Kestrel威脅狩獵實踐篇之一——追捕諸如FIN7 之類的持續威脅

所有網絡流量共享同一個遠端 IP 位址

9.148.5.93

(根據我們的

DISP nt

指令顯示,帶有屬性

dst_ref.value

dst_port

):

Kestrel威脅狩獵實踐篇之一——追捕諸如FIN7 之類的持續威脅

從我們的威脅情報(在 TI 工具中查找或直接在追查流程中使用 TI 資訊豐富實體(将在以後的部落格中讨論))中,我們沒有看到任何主機受到威脅的迹象。我們可能會檢查該服務

9.148.5.93:443

以确認該服務沒有受到損害或惡意。此時更有趣的是我們發現的子程序:45 個生成的程序隻分為兩類——

conhost

而且 

powershell

——正如我們的

DISP

指令所示:

Kestrel威脅狩獵實踐篇之一——追捕諸如FIN7 之類的持續威脅

這裡的敏感過程是

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

)。

Kestrel威脅狩獵實踐篇之一——追捕諸如FIN7 之類的持續威脅

指令中

amcet_child

顯示的程序隻有兩個檔案

DISP amcet_cc

,它們隻是程序的主要可執行檔案。

Kestrel威脅狩獵實踐篇之一——追捕諸如FIN7 之類的持續威脅

總結和伸展狩獵

在這篇博文中,我們展示了如何開始使用 Kestrel 威脅狩獵語言,從灌輸到第一次尋找:發現 Windows 中的持續威脅。我們首先查找所有計劃的 Windows 任務,然後深入研究一個特定程序以搜尋可疑活動。雖然我們在實踐中沒有發現任何持續存在的威脅,但我們建立了一個 可以重複使用和修訂的狩獵手冊,以供未來的狩獵使用。檢查威脅的持續性通常是發現大型 APT 活動的第一階段之一,可組合的追捕流 功能可以重用這種追捕簿大型追捕。我們隻使用

GET

 和

FIND

此狩獵實踐中的指令,涵蓋了知識編碼的兩個類别之一——模式比對。在我們的下一篇部落格中,我們不僅将介紹模式比對,還将介紹分析,它們的組合在大型狩獵中将非常有用。

繼續閱讀