Elastic威脅分析與規則編寫
聲明
由于傳播、利用此文所提供的信息而造成的任何直接或者間接的后果及損失,均由使用者本人負責,雷神眾測及文章作者不為此承擔任何責任。
雷神眾測擁有對此文章的修改和解釋權。如欲轉載或傳播此文章,必須保證此文章的完整性,包括版權聲明等全部內容。未經雷神眾測允許,不得任意修改或者增減此文章內容,不得以任何方式將其用于商業目的。
星火實驗室 專注于實戰攻防與研究,研究涉及實戰攻防、威脅情報、攻擊模擬與威脅分析等,團隊成員均來自行業具備多年實戰攻防經驗的紅隊、藍隊和紫隊專家。本著以攻促防的核心理念,通過落地ATT&CK攻防全景知識庫、紅隊武器庫和漏洞庫,全面構建實戰化、常態化、體系化的企業安全建設與運營。
NO.1 前言
在實際測試中,發現Elastic自帶的告警規則具有局限性且容易繞過。針對一些場景,比如通過注冊表創建計劃任務、諸如atexec類通過遠程調用命名管道創建計劃任務、powershell/iexplore遠程落地文件等行為,會出現檢測不到的情況。所以需要結合攻擊手法以及攻擊過程中產生的特征編寫適合的規則。
NO.2 ECS
Elastic使用ECS規范定義了EDR在 Elasticsearch 中存儲事件數據時要使用的一組通用字段,遵從ECS規范的數據在kibana中可以使用簡潔的語法篩選出匹配的數據。
ECS定義了許多字段集,用于對Agent產生的數據源進行分類。例如:process集、agent集、file集、event集、network集等。顧名思義,process對應的是產生數據源的進程相關數據,agent集是收集該數據源的agent相關數據,而file集則是該數據源或者說是產生數據源進程對文件系統操作的數據。event集和network集則是操作日志和網絡活動產生的數據。在字段集下,還定義了字段名去區分每個字段代表的信息。字段集和字段之間用 . 號連接。例如:process.name字段對應的是進程名。
直觀展示如下:

常用的字段:
process.name 進程名process.pe.original_file_name 進程最終調用的PE鏡像文件process.parent.name 父進程process.args 進程參數dns.question.name dns解析域名registry.key 注冊表鍵file.path 包含文件名的文件絕對路徑file.directory 文件路徑
ECS詳見:Elastic Common Schema
https://www.elastic.co/guide/en/ecs/current/index.html
NO.3 kibana查詢語法KQL
KQL是一種使用自由文本搜索或基于字段的搜索過濾 Elasticsearch 數據的簡單語法。KQL 僅用于過濾數據,并沒有對數據進行排序或聚合的作用。KQL是簡化了的EQL。
語法:
1、簡單搜索
process.name:"net.exe" 關鍵字匹配file.name:aaa bbb 空格會自動分詞,語句會搜索出文件名是aaa或bbb的結果,要匹配包含空格的字段需要用雙引號包起來
2、條件運算符
> >= < <=age >= 10
3、邏輯運算符
and or not和編程語言易一樣
4、優先級
()
5、字段運算簡化
age:(10 or 20) 等價于 age=10 or age=20
6、通配符
* 匹配多個任意字符通配符支持字段名通配和值通配file.pat*:ddddd.txtfile.path:*ddd*.txt
在kibana中,還可以使用Lucene語法查詢
https://www.cnblogs.com/xing901022/p/4974977.html

NO.4 創建自定義告警規則
進入kibana
Security-告警-管理規則-創建新規則

kibana提供了五種規則類型,可以靈活使用。以KQL為例,創建一條檢測schtasks.exe創建計劃任務的簡單規則。

創建查詢規則

設置規則告警嚴重性以及分線分數、標簽

高級設置里可以設置規則引用的來源,映射ATT&CK以及處理告警的調查指南

設置規則運行間隔時間
繼續創建完規則之后可以在定制規則欄里查看新建的規則

效果展示



NO.5 規則對比
以自帶規則和自定義規則對比說明自定義規則的必要性,以創建計劃任務為例,elastic給出檢測計劃任務的相關規則有9條,可在rules/windows頁面下搜索scheduled查看。
5.1 自帶規則的局限性
以比較詳細的persistence_local_scheduled_task_creation
https://github.com/elastic/detection-rules/blob/main/rules/windows/persistence_local_scheduled_task_creation.toml
分析,其規則如下EQL語言
https://www.elastic.co/guide/en/elasticsearch/reference/current/eql-syntax.html# eql-basic-syntax
sequence with maxspan=1m [process where event.type != "end" and ((process.name : ("cmd.exe", "wscript.exe", "rundll32.exe", "regsvr32.exe", "wmic.exe", "mshta.exe", "powershell.exe", "pwsh.exe", "powershell_ise.exe", "WmiPrvSe.exe", "wsmprovhost.exe", "winrshost.exe") or process.pe.original_file_name : ("cmd.exe", "wscript.exe", "rundll32.exe", "regsvr32.exe", "wmic.exe", "mshta.exe", "powershell.exe", "pwsh.dll", "powershell_ise.exe", "WmiPrvSe.exe", "wsmprovhost.exe", "winrshost.exe")) or process.code_signature.trusted == false)] by process.entity_id [process where event.type == "start" and (process.name : "schtasks.exe" or process.pe.original_file_name == "schtasks.exe") and process.args : ("/create", "-create") and process.args : ("/RU", "/SC", "/TN", "/TR", "/F", "/XML") and /* exclude SYSTEM SIDs - look for task creations by non-SYSTEM user */ not user.id : ("S-1-5-18", "S-1-5-19", "S-1-5-20")] by process.parent.entity_id
該規則的大意是按時間序列查找在1分鐘內,擁有相同程序ID的cmd.exe、rundll32.exe之類的程序以及無簽名文件,以不是system用戶、本地服務用戶、網絡服務用戶權限且擁有相同父進程調用schtasks.exe創建計劃任務的動作。規則假想了攻擊者在1分鐘內執行完畢創建計劃任務的命令,且攻擊這只有調用schtasks.exe創建計劃任務的一種方式。然而,在實際的攻擊行為中,攻擊者用于創建計劃任務的手法還有直接調用API、atexe.exe等橫向工具遠程通過atsvc命名管道調用SchRpcRegisterTask創建計劃任務、寫注冊表等。或者攻擊者啟動了cmd.exe卻忘記了schtasks的用法需要去查詢,等查詢到再執行命令,已經過了一分鐘。在上述兩種情況下,規則無法檢測出創建計劃任務也就無法告警。
5.2 自建規則
上文說到攻擊者用于創建計劃任務的手法有調用API、通過atsvc命名管道調用SchRpcRegisterTask、寫注冊表、schtasks.exe等。這些方法除了寫注冊表直接注冊任務之外,均會在C:\Windows\System32\Tasks路徑下落地以計劃任務名命名的文件。所以檢測計劃任務的更詳細和全面的規則可以這么寫(KQL)
(registry.key :*CurrentVersion\\Schedule\\TaskCache\\Tree* and process.name:(regedit.exe or cmd.exe or powershell.exe )) or (file.path:C\:\\Windows\\System32\\Tasks\\* and event.type:"creation") and not user.id:(S-1-5-18* or S-1-5-19* or S-1-5-20*)
拆開來看
registry.key :*CurrentVersion\\Schedule\\TaskCache\\Tree* and process.name:(regedit.exe or cmd.exe or powershell.exe ) //監測寫注冊表創建計劃任務 process.name可替換為process.pe.original_file_name file.path:C\:\\Windows\\System32\\Tasks\\* and event.type:"creation"http://監測非寫注冊表創建的加護任務。可以監測到atexec等遠程執行命令程序在本機創建的計劃任務,創建此類計劃任務的進程為svchost.exe且一般沒有參數。 and not user.id:(S-1-5-18* or S-1-5-19* or S-1-5-20*) 監測非system、 LOCAL SERVICE 、NET SERVICE創建的計劃任務。
5.3 對比
在兩條規則都開啟的前提下


查看告警,可以看到自帶的規則無論是命令行執行schtasks(cmd和schtask命令間隔超過1分鐘)還是atexec創建的計劃任務都沒有告警。

箭頭標注的第一條告警為atexec創建計劃任務的告警,第二條為schtask的告警。
查看告警詳情:
atexec的的告警詳情

cmd調用schtasks的告警詳情

注:這里需要在進程樹里找到并點擊schtask.exe查看進程參數等
NO.6 總結
本文介紹了Elastic Seim如何創建自定義告警規則,以及創建的規則和原有規則效果的對比,可以看到原有規則的不足之處。對某些攻擊場景的監測,須要深入了解攻擊者潛在的攻擊手法,提煉攻擊特征,才能寫出更全面更精準的監測規則。未知攻,焉知防。