跳轉到

整理適用於 Windows 事件記錄的 Sigma 規則

本頁說明 Yamato Security 如何透過將 logsource 欄位去抽象化,並篩除無法使用或難以使用的規則,將上游 Sigma 適用於 Windows 事件記錄的規則整理成更易於使用的形式。這是透過 sigma-to-hayabusa-converter 工具完成的,該工具主要用於建立託管在 hayabusa-rules 的精選 Sigma 規則集。該規則集由 HayabusaVelociraptor 使用。

來源

本文件與轉換工具一起維護,位於 Yamato-Security/sigma-to-hayabusa-converter。我們希望這些資訊對於其他想要使用 Sigma 規則來偵測 Windows 事件記錄中攻擊的專案也有幫助。另請參閱 建立規則檔案欄位修飾子

TL;DR

  • logsource 欄位去抽象化,並為內建規則以及原始的 Sysmon 基礎規則建立新的 .yml 規則檔案,可讓 Sigma 規則更容易完整支援內建事件,也讓分析人員更容易閱讀規則。
  • 在為 Windows 事件記錄撰寫 Sigma 規則時,了解原始 Sysmon 基礎記錄與相容的內建記錄之間的差異非常重要,最理想的情況是撰寫能同時相容兩者的規則。
  • 許多組織無法或不願意在所有 Windows 端點上安裝並維護 Sysmon 代理程式,因為他們沒有專門的資源來處理,或是想要避免 Sysmon 造成任何速度變慢或當機的風險。因此,盡可能啟用越多內建事件記錄,並使用能夠在這些內建記錄中偵測攻擊的工具,就顯得相當重要。

上游 Sigma 規則在 Windows 事件記錄上的挑戰

根據我們的經驗,為 Windows 事件記錄建立原生 Sigma 規則剖析器的主要挑戰,一直是支援 logsource 欄位。目前這是 Hayabusa 少數尚未原生支援的功能之一,因為它仍然非常複雜且正在開發中。目前我們透過將上游規則轉換為更易於使用的格式來解決此問題,詳細說明如下。

關於 logsource 欄位

在適用於 Windows 事件記錄的 Sigma 規則中,product 欄位設定為 windows,接著是 service 欄位或 category 欄位。

service 欄位範例:

logsource:
    product: windows
    service: application

category 欄位範例:

logsource:
    product: windows
    category: process_creation

Service 欄位

service 欄位相對容易處理,它會告訴使用該 Sigma 規則的任何後端,根據 Windows XML 事件記錄中的 Channel 欄位搜尋單一通道或多個通道。

單一通道範例

service: application 等同於在 Sigma 規則中加入 Channel: Application 的選擇條件。

多重通道範例

service: applocker 目前產生最多需要搜尋的通道,因為 AppLocker 會將資訊儲存在四個不同的記錄中。為了正確地僅搜尋 AppLocker 記錄,需要在 Sigma 規則邏輯中加入以下條件:

Channel:
    - Microsoft-Windows-AppLocker/MSI and Script
    - Microsoft-Windows-AppLocker/EXE and DLL
    - Microsoft-Windows-AppLocker/Packaged app-Deployment
    - Microsoft-Windows-AppLocker/Packaged app-Execution

目前的 service 對應清單

服務 通道
application Application
application-experience Microsoft-Windows-Application-Experience/Program-Telemetry, Microsoft-Windows-Application-Experience/Program-Compatibility-Assistant
applocker Microsoft-Windows-AppLocker/MSI and Script, Microsoft-Windows-AppLocker/EXE and DLL, Microsoft-Windows-AppLocker/Packaged app-Deployment, Microsoft-Windows-AppLocker/Packaged app-Execution
appmodel-runtime Microsoft-Windows-AppModel-Runtime/Admin
appxpackaging-om Microsoft-Windows-AppxPackaging/Operational
bits-client Microsoft-Windows-Bits-Client/Operational
capi2 Microsoft-Windows-CAPI2/Operational
certificateservicesclient-lifecycle-system Microsoft-Windows-CertificateServicesClient-Lifecycle-System/Operational
codeintegrity-operational Microsoft-Windows-CodeIntegrity/Operational
diagnosis-scripted Microsoft-Windows-Diagnosis-Scripted/Operational
dhcp Microsoft-Windows-DHCP-Server/Operational
dns-client Microsoft-Windows-DNS Client Events/Operational
dns-server DNS Server
dns-server-analytic Microsoft-Windows-DNS-Server/Analytical
driver-framework Microsoft-Windows-DriverFrameworks-UserMode/Operational
firewall-as Microsoft-Windows-Windows Firewall With Advanced Security/Firewall
hyper-v-worker Microsoft-Windows-Hyper-V-Worker
kernel-event-tracing Microsoft-Windows-Kernel-EventTracing
kernel-shimengine Microsoft-Windows-Kernel-ShimEngine/Operational, Microsoft-Windows-Kernel-ShimEngine/Diagnostic
ldap_debug Microsoft-Windows-LDAP-Client/Debug
lsa-server Microsoft-Windows-LSA/Operational
microsoft-servicebus-client Microsoft-ServiceBus-Client
msexchange-management MSExchange Management
ntfs Microsoft-Windows-Ntfs/Operational
ntlm Microsoft-Windows-NTLM/Operational
openssh OpenSSH/Operational
powershell Microsoft-Windows-PowerShell/Operational, PowerShellCore/Operational
powershell-classic Windows PowerShell
printservice-admin Microsoft-Windows-PrintService/Admin
printservice-operational Microsoft-Windows-PrintService/Operational
security Security
security-mitigations Microsoft-Windows-Security-Mitigations*
shell-core Microsoft-Windows-Shell-Core/Operational
smbclient-connectivity Microsoft-Windows-SmbClient/Connectivity
smbclient-security Microsoft-Windows-SmbClient/Security
system System
sysmon Microsoft-Windows-Sysmon/Operational
taskscheduler Microsoft-Windows-TaskScheduler/Operational
terminalservices-localsessionmanager Microsoft-Windows-TerminalServices-LocalSessionManager/Operational
vhdmp Microsoft-Windows-VHDMP/Operational
wmi Microsoft-Windows-WMI-Activity/Operational
windefend Microsoft-Windows-Windows Defender/Operational

Service 對應來源

我們建立了將服務對應到通道名稱的 YAML 對應檔案,並定期維護、託管在轉換器儲存庫中。它們是根據 SigmaHQ/sigma tests/thor.yml 中的服務對應資訊而來:雖然這似乎不是供人使用的官方通用設定檔,但它似乎是最新的。

Category 欄位

大多數 category 欄位只是在搜尋特定 Channel 之外,額外加入一個條件來檢查 EventID 欄位中的特定事件 ID。這些類別名稱大多以 Sysmon 事件為基礎,並針對內建的 PowerShell 記錄與 Windows Defender 增加了一些額外的類別。

Category 欄位範例

process_creation:
    EventID: 1
    Channel: Microsoft-Windows-Sysmon/Operational

目前的 category 對應清單

有些類別會對應到多個 service/EventID(以粗體顯示)。

類別 服務 事件 ID
antivirus windefend 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1017, 1018, 1019, 1115, 1116
clipboard_change sysmon 24
create_remote_thread sysmon 8
create_stream_hash sysmon 15
dns_query sysmon 22
driver_load sysmon 6
file_block_executable sysmon 27
file_block_shredding sysmon 28
file_change sysmon 2
file_creation sysmon 11
file_delete sysmon 23, 26
file_delete_detected sysmon 26
file_executable_detected sysmon 29
image_load sysmon 7
network_connection sysmon 3
network_connection security 5156
pipe_created sysmon 17, 18
process_access sysmon 10
process_creation sysmon 1
process_creation security 4688
process_tampering sysmon 25
process_termination sysmon 5
ps_classic_provider_start powershell-classic 600
ps_classic_start powershell-classic 400
ps_module powershell 4103
ps_script powershell 4104
raw_access_thread sysmon 9
registry_add sysmon 12
registry_add security 4657
registry_delete sysmon 12
registry_event sysmon 12, 13, 14
registry_event security 4657
registry_rename sysmon 14
registry_set sysmon 13
registry_set security 4657
sysmon_error sysmon 255
sysmon_status sysmon 4, 16
wmi_event sysmon 19, 20, 21

Category 欄位的挑戰

如上所示,同一個 category 可以使用多個服務與事件 ID(以粗體標示)。這表示,如果規則所使用的欄位也存在於內建事件記錄中,就有可能將某些為 sysmon 設計的 Sigma 規則用於類似的內建 Windows security 事件記錄。在這種情況下,可能需要轉換欄位名稱——有時也包括值——以符合內建 security 事件記錄的欄位名稱與值。雖然對某些類別來說這可能只是重新命名一些欄位名稱那麼簡單,但對其他類別而言,可能還需要對欄位值進行各種轉換。我們如何進行這項轉換,以及 sysmon 記錄與 security 記錄之間的相容性,將在下方詳細說明。

Category 對應來源

類別的 YAML 對應檔案同樣託管在轉換器儲存庫中,也是根據 SigmaHQ/sigma tests/thor.yml 中的資訊而來。

抽象化記錄來源的優點與挑戰

在後端抽象化記錄來源,並為不同的 ChannelEventID 與欄位建立對應,既有優點也有挑戰。

優點

  1. 在將 Sigma 規則轉換為其他後端查詢時,將 ChannelEventID 欄位名稱轉換為適當的後端欄位名稱可能會更容易。
  2. 可以將兩條規則整合為一條。例如,處理程序建立事件可以記錄在 Sysmon 1 以及 Security 4688 中。與其撰寫兩條查看不同通道、事件 ID 與欄位但邏輯相同的規則,不如將欄位標準化為 Sysmon 所使用的形式,然後讓後端轉換器加入 ChannelEventID 欄位,並在必要時轉換其他欄位資訊。這讓規則的維護更容易,因為需要維護的規則數量減少了。
  3. 雖然非常罕見,但如果某個記錄來源開始將其資料記錄在不同的 ChannelEventID 中,只需要更新對應邏輯,而不必更新所有 Sigma 規則,讓維護更容易。

挑戰

  1. 如果原始基於 Sysmon 的 Sigma 規則使用了某個內建記錄中不存在的欄位來過濾誤報,會發生什麼事?你應該還是建立該規則,以偵測能力為優先;還是忽略它,以減少誤報為優先?理想情況下,需要建立兩條具有不同 severitystatus 與誤報資訊的規則,讓使用者能更好地處理。
  2. 這會讓篩選規則變得更困難,因為如果檔案尚未建立,你就無法僅根據 .yml 檔案中的 ChannelEventID 欄位,或規則的檔案路徑來篩選——因為它是針對內建記錄的衍生規則,而非原始的 Sysmon 規則。此外,由於規則 ID 相同,你也無法根據規則 ID 進行篩選。
  3. 當警示來自由 Sysmon 記錄衍生而來、針對內建記錄的規則時,這會讓確認警示變得更困難。欄位名稱與值無法對應,因此分析人員需要理解這個略為複雜的轉換過程。
  4. 這會讓後端邏輯的建立更複雜。

對於第一個問題,除了在有值得投入心力的重要使用情境時建立並維護新規則之外,我們無能為力;但為了解決第 2 到第 4 個問題,我們決定將 logsource 欄位去抽象化,並為任何能夠產生多條規則的規則建立兩套規則。能夠在內建記錄中偵測攻擊的規則會輸出到 builtin 目錄,而針對 Sysmon 的規則則輸出到 sysmon 目錄。

轉換範例

以下是一個簡單的範例,以便更好地理解轉換過程。

轉換前 — 原始的 Sigma 規則:

logsource:
    category: process_creation
    product: windows
detection:
    selection:
        - Image|endswith: '.exe'
    condition: selection

轉換後 — 適用於 Sysmon 記錄的 Hayabusa 相容規則:

logsource:
    category: process_creation
    product: windows
detection:
    process_creation:
        Channel: Microsoft-Windows-Sysmon/Operational
        EventID: 1
    selection:
        - Image|endswith: '.exe'
    condition: process_creation and selection

……以及適用於 Windows 內建記錄的 Hayabusa 相容規則:

logsource:
    category: process_creation
    product: windows
detection:
    process_creation:
        Channel: Security
        EventID: 4688
    selection:
        - NewProcessName|endswith: '.exe'
    condition: process_creation and selection

如你所見,已建立兩條規則:一條用於 Sysmon 1 記錄,一條用於內建的 Security 4688 記錄。新增了一個帶有通道與事件 ID 資訊的 process_creation 條件,並將它加入 condition 欄位以要求符合此條件。此外,原本的 Image 欄位名稱已變更為 NewProcessName

轉換的共通處理

在詳細說明我們如何轉換特定類別之前,以下是適用於所有規則的轉換部分。

  1. 任何 ID 出現在 ignore-uuid-list.txt 中的規則都會被忽略。目前我們只會忽略那些因為含有 mimikatz 之類關鍵字而在 Windows Defender 上造成誤報的規則。
  2. 「Placeholder」(佔位)規則會被忽略,因為它們無法直接使用。這些是放在 Sigma 儲存庫中 rules-placeholder 資料夾內的規則。
  3. 使用不相容欄位修飾子的規則會被捨棄。Hayabusa 支援大多數的欄位修飾子,因此為了避免剖析錯誤,轉換器不會輸出任何使用下列以外修飾子的規則(請參閱 欄位修飾子):

    all, base64, base64offset, cased, cidr, contains, endswith, endswithfield, equalsfield, exists, fieldref, gt, gte, lt, lte, re, startswith, utf16, utf16be, utf16le, wide, windash

  4. 含有語法錯誤的規則不會被轉換。

  5. deprecatedunsupported 規則中的標籤會從 V1 格式更新為 V2 格式,V2 格式使用 - 而非 _,以保持一致並讓 Hayabusa 更容易處理縮寫。例如:initial_access 會變成 initial-access
  6. 由於我們會在規則中加入 ChannelEventID 資訊,因此我們會使用原始 ID 的 MD5 雜湊值建立一個新的 UUIDv4 ID,在 related 欄位中指定原始 ID,並將 type 標記為 derived。對於可以轉換成多條規則(sysmonbuiltin)的規則,我們也需要為衍生的 builtin 規則建立新的規則 ID。為此,我們會計算 sysmon 規則 ID 的 MD5 雜湊值,並將其用於 UUIDv4 ID。例如:

    原始的 Sigma 規則:

    title: 7Zip Compressing Dump Files
    id: 1ac14d38-3dfc-4635-92c7-e3fd1c5f5bfc
    

    新的 sysmon 規則:

    title: 7Zip Compressing Dump Files
    id: ec570e53-4c76-45a9-804d-dc3f355ff7a7
    related:
        - id: 1ac14d38-3dfc-4635-92c7-e3fd1c5f5bfc
        type: derived
    

    新的 builtin 規則:

    title: 7Zip Compressing Dump Files
    id: 93586827-5f54-fc91-0b2f-338fd5365694
    related:
        - id: 1ac14d38-3dfc-4635-92c7-e3fd1c5f5bfc
        type: derived
        - id: ec570e53-4c76-45a9-804d-dc3f355ff7a7
        type: derived
    
  7. 在內建 Windows 事件記錄中進行偵測的規則會輸出到 builtin 目錄,而依賴 Sysmon 記錄的規則則輸出到 sysmon 目錄,其子目錄與上游 Sigma 儲存庫中的目錄相符。

轉換的限制

目前只有一個已知的錯誤:Sigma 規則中的註解行不會被包含在輸出規則中,除非這些註解跟在某些原始碼之後。

Sysmon 與內建事件的比較及規則轉換

處理程序建立

  • 類別:process_creation
  • Sysmon
    • 通道:Microsoft-Windows-Sysmon/Operational
    • 事件 ID:1
  • 內建記錄
    • 通道:Security
    • 事件 ID:4688

比較

處理程序建立比較

轉換注意事項

  1. User 欄位資訊需要拆分為 SubjectUserNameSubjectDomainName 兩個欄位。
  2. LogonId 欄位名稱變更為 SubjectLogonId,且十六進位值中的任何字母都需要轉為小寫。
  3. ProcessId 欄位名稱變更為 NewProcessId,且值需要轉換為十六進位。
  4. Image 欄位名稱變更為 NewProcessName
  5. ParentProcessId 欄位名稱變更為 ProcessId,且值需要轉換為十六進位。
  6. ParentImage 欄位名稱變更為 ParentProcessName
  7. IntegrityLevel 欄位名稱變更為 MandatoryLabel,且需要進行以下值的轉換:
    • Low: S-1-16-4096
    • Medium: S-1-16-8192
    • High: S-1-16-12288
    • System: S-1-16-16384
  8. 如果規則包含以下僅存在於 Security 4688 事件中的欄位,我們就不會建立 Sysmon 1 規則:
    • SubjectUserSid, TokenElevationType, TargetUserSid, TargetUserName, TargetDomainName, TargetLogonId
  9. 如果規則包含以下僅存在於 Sysmon 1 事件中的欄位,我們就不會建立 Security 4688 規則:
    • RuleName, UtcTime, ProcessGuid, FileVersion, Description, Product, Company, OriginalFileName, CurrentDirectory, LogonGuid, TerminalSessionId, Hashes, ParentProcessGuid, ParentCommandLine, ParentUser
  10. 第 8 點與第 9 點有一個例外:即使使用了僅存在於某一種記錄事件中的欄位,只要該欄位位於 OR 條件中,你仍然應該建立該規則。例如,以下規則不應產生 Security 4688 規則,因為 OriginalFileName 欄位是必要的(選擇項內為 AND 邏輯):

    selection_img:
        Image|endswith: \addinutil.exe
        OriginalFileName: AddInUtil.exe
    

    然而,具有以下條件的規則應該建立 Security 4688 規則,因為 OriginalFileName 是選用的(選擇項內為 OR 邏輯):

    selection_img:
        - Image|endswith: \addinutil.exe
        - OriginalFileName: AddInUtil.exe
    

    困難之處在於,你的剖析器不僅要理解選擇項內部的邏輯,還要理解 condition 欄位內部的邏輯。例如,以下規則不應建立 Security 4688 規則,因為它使用 AND 邏輯:

    selection_img:
        Image|endswith: \addinutil.exe
    selection_orig:
        OriginalFileName: AddInUtil.exe
    condition: selection_img and selection_orig
    

    然而,以下規則應該建立 Security 4688 規則,因為它使用 OR 邏輯:

    selection_img:
        Image|endswith: \addinutil.exe
    selection_orig:
        OriginalFileName: AddInUtil.exe
    condition: selection_img or selection_orig
    

其他注意事項

  • Security 4688 中的 SubjectUserSid 欄位顯示 SID;然而,在轉譯後的事件記錄 Message 中,它會被轉換為 DOMAIN\User
  • 視設定而定,Security 4688 事件的 CommandLine 中可能不包含命令列選項資訊。
  • TokenElevationTypeMessage 中會原樣顯示,不會被轉譯。
  • MandatoryLabel 中的 S-1-16-4096 等值,在轉譯後的 Message 中會被轉換為 Mandatory Label\Low Mandatory Level 等。

內建記錄設定

預設未啟用

重要的內建 Security 4688 處理程序建立事件記錄預設並未啟用。你需要同時啟用 4688 事件與命令列選項記錄,才能使用大多數的 Sigma 規則。

透過群組原則啟用:

  • Computer Configuration > Policies > Windows Settings > Security Settings > Advanced Audit Configuration > Detailed Tracking > Audit Process Creation: Enabled
  • Administrative Templates > System > Audit Process Creation > Include command line in process creation events: Enabled

透過命令列啟用:

auditpol /set /subcategory:{0CCE922B-69AE-11D9-BED3-505054503030} /success:enable /failure:enable
reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\Audit /v ProcessCreationIncludeCmdLine_Enabled /f /t REG_DWORD /d 1

網路連線

  • 類別:network_connection
  • Sysmon
    • 通道:Microsoft-Windows-Sysmon/Operational
    • 事件 ID:3
  • 內建記錄
    • 通道:Security
    • 事件 ID:5156

比較

網路連線比較

轉換注意事項

  1. ProcessId 欄位名稱變更為 ProcessID
  2. Image 欄位名稱變更為 Application,且 C:\ 變更為 \device\harddiskvolume?\。(注意:由於我們不知道硬碟磁碟區編號,因此以單一字元萬用字元 ? 取代。)
  3. Protocol 欄位值 tcp 變更為 6udp 變更為 17
  4. Initiated 欄位名稱變更為 Direction,且值 true 變更為 %%14593false 變更為 %%14592
  5. SourceIp 欄位名稱變更為 SourceAddress
  6. DestinationIp 欄位名稱變更為 DestAddress
  7. DestinationPort 欄位名稱變更為 DestPort

內建記錄設定

預設未啟用

內建的 Security 5156 網路連線記錄預設並未啟用。它們會產生大量記錄,可能覆寫 Security 事件記錄中的其他重要記錄,並在系統有大量網路連線時可能拖慢系統。請確保 Security 記錄的最大檔案大小夠大,並進行測試以確認不會對系統造成不良影響。

透過群組原則啟用:

  • Computer Configuration -> Windows Settings -> Security Settings -> Advanced Audit Policy Configuration -> System Audit Policies -> Object Access -> Filtering Platform Connection: Success and Failure

透過命令列啟用:

auditpol /set /subcategory:"Filtering Platform Connection" /success:enable /failure:enable

……如果你使用非英文的地區設定,則使用以下命令:

auditpol /set /subcategory:{0CCE922F-69AE-11D9-BED3-505054503030} /success:enable /failure:enable

另請參閱

如需更多關於啟用這些規則所依賴之證據所需的內建 Windows 事件記錄的資訊,請參閱 Windows 記錄與 Sysmon 以及 EnableWindowsLogSettings 專案。

Sigma 規則撰寫建議

Tip

如果你使用了任何存在於 sysmon 記錄但不存在於 builtin 記錄中的欄位,請務必將該欄位設為選用,這樣仍然可以將該規則用於 builtin 記錄。

例如:

selection_img:
    - Image|endswith: \addinutil.exe
    - OriginalFileName: AddInUtil.exe

此選擇項會尋找處理程序(Image)名稱為 addinutil.exe 的情況。問題在於攻擊者只要重新命名檔案就能繞過該規則。僅存在於 Sysmon 記錄中的 OriginalFileName 欄位,是在編譯時嵌入二進位檔的檔名。即使攻擊者重新命名檔案,嵌入的名稱也不會改變,因此在使用 Sysmon 時,此規則能夠偵測攻擊者已重新命名檔案的攻擊;而在使用標準內建記錄時,也能偵測未變更檔名的攻擊。

預先轉換的 Sigma 規則

以本頁所述方式——透過將 logsource 欄位去抽象化——所整理的 Sigma 規則,託管在 hayabusa-rules 儲存庫的 sigma 資料夾下。

工具環境

如果你想在本機將 Sigma 規則轉換為 Hayabusa 相容格式,首先需要安裝 Poetry。請參閱官方 Poetry 安裝文件

工具使用方式

sigma-to-hayabusa-converter.py 是我們用來將 Sigma 規則的 logsource 欄位轉換為 Hayabusa 相容格式的主要工具。執行以下步驟來運行它:

git clone https://github.com/SigmaHQ/sigma.git
git clone https://github.com/Yamato-Security/sigma-to-hayabusa-converter.git
cd sigma-to-hayabusa-converter
poetry install --no-root
poetry run python sigma-to-hayabusa-converter.py -r ../sigma -o ./converted_sigma_rules

執行上述命令後,轉換為 Hayabusa 相容格式的規則會輸出到 ./converted_sigma_rules 目錄。