Поле виявлення¶
Основи selection¶
Спершу буде пояснено основи того, як створити правило selection.
Як писати логіку AND та OR¶
Щоб записати логіку AND, ми використовуємо вкладені словники. Правило виявлення нижче визначає, що обидві умови мають бути істинними, щоб правило спрацювало.
- EventID має точно дорівнювати
7040. - AND
- Channel має точно дорівнювати
System.
Щоб записати логіку OR, ми використовуємо списки (словники, що починаються з -).
У правилі виявлення нижче будь-яка одна з умов призведе до спрацювання правила.
- EventID має точно дорівнювати
7040. - OR
- Channel має точно дорівнювати
System.
detection:
selection:
- Event.System.EventID: 7040
- Event.System.Channel: System
condition: selection
Ми також можемо комбінувати логіку AND та OR, як показано нижче.
У цьому випадку правило спрацьовує, коли обидві наступні умови є істинними.
- EventID є точно або
7040, OR7041. - AND
- Channel є точно
System.
detection:
selection:
Event.System.EventID:
- 7040
- 7041
Event.System.Channel: System
condition: selection
Eventkeys¶
Нижче наведено уривок журналу подій Windows, відформатований у вихідному XML.
Поле Event.System.Channel у наведеному вище прикладі файлу правила посилається на вихідний XML-тег: <Event><System><Channel>System<Channel><System></Event>
Вкладені XML-теги замінюються іменами тегів, розділеними крапками (.).
У правилах hayabusa ці рядки полів, з'єднані разом крапками, називаються eventkeys.
<Event xmlns='http://schemas.microsoft.com/win/2004/08/events/event'>
<System>
<EventID>7040</EventID>
<Channel>System</Channel>
</System>
<EventData>
<Data Name='param1'>Background Intelligent Transfer Service</Data>
<Data Name='param2'>auto start</Data>
</EventData>
</Event>
Псевдоніми Eventkey¶
Довгі eventkeys з багатьма розділеннями . є поширеними, тому hayabusa використовуватиме псевдоніми, щоб з ними було легше працювати. Псевдоніми визначаються у файлі rules/config/eventkey_alias.txt. Цей файл є CSV-файлом, що складається зі зіставлень alias та event_key. Ви можете переписати наведене вище правило, як показано нижче, з псевдонімами, що робить правило легшим для читання.
Увага: невизначені псевдоніми Eventkey¶
Не всі псевдоніми eventkey визначені у rules/config/eventkey_alias.txt. Якщо ви не отримуєте правильні дані у повідомленні details (Alert details), а замість цього отримуєте n/a (недоступно), або якщо selection у вашій логіці виявлення не працює належним чином, то вам, можливо, потрібно оновити rules/config/eventkey_alias.txt новим псевдонімом.
Як використовувати XML-атрибути в умовах¶
XML-елементи можуть мати атрибути, встановлені додаванням пробілу до елемента. Наприклад, Name у Provider Name нижче є XML-атрибутом елемента Provider.
<Event xmlns='http://schemas.microsoft.com/win/2004/08/events/event'>
<System>
<Provider Name='Microsoft-Windows-Security-Auditing' Guid='{54849625-5478-4994-a5ba-3e3b0328c30d}'/>
<EventID>4672</EventID>
<EventRecordID>607469</EventRecordID>
<Channel>Security</Channel>
<Security />
</System>
</Event>
Щоб вказати XML-атрибути в eventkey, використовуйте формат {eventkey}_attributes.{attribute_name}. Наприклад, щоб вказати атрибут Name елемента Provider у файлі правила, це виглядатиме так:
detection:
selection:
Channel: Security
EventID: 4672
Event.System.Provider_attributes.Name: 'Microsoft-Windows-Security-Auditing'
condition: selection
Пошук grep¶
Hayabusa може виконувати пошук grep у файлах журналів подій Windows, не вказуючи жодних eventkeys.
Щоб виконати пошук grep, вкажіть detection, як показано нижче. У цьому випадку, якщо рядки mimikatz або metasploit присутні в журналі подій Windows, він спрацює. Також можливо вказувати символи підстановки.
Примітка: Hayabusa внутрішньо перетворює дані журналу подій Windows у формат JSON перед обробкою даних, тому неможливо зіставляти з XML-тегами.
EventData¶
Журнали подій Windows поділяються на дві частини: частину System, де записуються фундаментальні дані (Event ID, Timestamp, Record ID, ім'я журналу (Channel)), та частину EventData або UserData, де записуються довільні дані залежно від Event ID.
Одна проблема, що часто виникає, полягає в тому, що імена полів, вкладених у EventData, усі називаються Data, тому описані досі eventkeys не можуть розрізнити SubjectUserSid та SubjectUserName.
<Event xmlns='http://schemas.microsoft.com/win/2004/08/events/event'>
<System>
<EventID>5379</EventID>
<TimeCreated SystemTime='2021-10-20T10:16:18.7782563Z' />
<EventRecordID>607469</EventRecordID>
<Channel>Security</Channel>
<Security />
</System>
<EventData>
<Data Name='SubjectUserSid'>S-1-1-11-1111111111-111111111-1111111111-1111</Data>
<Data Name='SubjectUserName'>hayabusa</Data>
<Data Name='SubjectDomainName'>DESKTOP-HAYABUSA</Data>
<Data Name='SubjectLogonId'>0x11111111</Data>
</EventData>
</Event>
Щоб впоратися з цією проблемою, ви можете вказати значення, призначене у Data Name. Наприклад, якщо ви хочете використати SubjectUserName та SubjectDomainName у EventData як умову правила, ви можете описати це наступним чином:
detection:
selection:
Channel: System
EventID: 7040
Event.EventData.SubjectUserName: hayabusa
Event.EventData.SubjectDomainName: DESKTOP-HAYBUSA
condition: selection
Аномальні шаблони в EventData¶
Деякі з тегів, вкладених у EventData, не мають атрибута Name.
<Event xmlns='http://schemas.microsoft.com/win/2004/08/events/event'>
<System>
<EventID>5379</EventID>
<Channel>Security</Channel>
<Security />
</System>
<EventData>
<Data>Available</Data>
<Data>None</Data>
<Data>NewEngineState=Available PreviousEngineState=None (...)</Data>
</EventData>
</Event>
Щоб виявити журнал подій, подібний до наведеного вище, ви можете вказати eventkey з ім'ям Data.
У цьому випадку умова спрацює, доки будь-який з вкладених тегів Data дорівнює None.
Виведення даних поля з кількох полів з однаковим ім'ям¶
Деякі події зберігатимуть свої дані в полях, усі з яких називаються Data, як у попередньому прикладі.
Якщо ви вкажете %Data% у details:, усі дані будуть виведені у вигляді масиву.
Наприклад:
["rundll32.exe","6.1.7600.16385","4a5bc637","KERNELBASE.dll","6.1.7601.23392","56eb2fb9","c0000005"]
Якщо ви хочете вивести лише дані першого поля Data, ви можете вказати %Data[1]% у вашому рядку сповіщення details:, і буде виведено лише rundll32.exe.
Модифікатори полів¶
Символ вертикальної риски можна використовувати з eventkeys, як показано нижче, для зіставлення рядків.
Усі умови, які ми описали досі, використовують точні збіги, але за допомогою модифікаторів полів ви можете описувати гнучкіші правила виявлення.
У наступному прикладі, якщо значення Data містить рядок EngineVersion=2, воно спрацює за умовою.
detection:
selection:
Channel: 'Windows PowerShell'
EventID: 400
Data|contains: 'EngineVersion=2'
condition: selection
Зіставлення рядків нечутливі до регістру. Однак вони стають чутливими до регістру щоразу, коли використовуються |re або |equalsfield.
Підтримувані модифікатори полів Sigma¶
Hayabusa наразі є єдиним інструментом з відкритим кодом, який повністю підтримує всю специфікацію Sigma.
Ви можете перевірити поточний статус усіх підтримуваних модифікаторів полів, а також скільки разів ці модифікатори використовуються в правилах Sigma та Hayabusa, за адресою https://github.com/Yamato-Security/hayabusa-rules/blob/main/field-modifiers.md . Цей документ динамічно оновлюється щоразу, коли відбувається оновлення правил Sigma або Hayabusa.
-
'|all':: Цей модифікатор поля відрізняється від наведених вище, оскільки він застосовується не до певного поля, а до всіх полів.У цьому прикладі обидва рядки
-Keyword-1таKeyword-2мають існувати, але можуть існувати будь-де в будь-якому полі:|base64offset|contains: Дані будуть закодовані в base64 трьома різними способами залежно від їхньої позиції в закодованому рядку. Цей модифікатор закодує рядок усіма трьома варіаціями та перевірить, чи закодований рядок десь у рядку base64. -|cased: Робить пошук чутливим до регістру. -|cidr: Перевіряє, чи значення поля відповідає нотації CIDR IPv4 або IPv6. (Напр.:192.0.2.0/24) -|contains: Перевіряє, чи значення поля містить певний рядок. -|contains|all: Перевіряє, чи містяться кілька слів у даних. -|contains|all|windash: Те саме, що|contains|windash, але всі ключові слова мають бути присутні. -|contains|cased: Перевіряє, чи значення поля містить певний чутливий до регістру рядок. -|contains|expand: Перевіряє, чи значення поля містить рядок у конфігураційному файліexpandвсередині/config/expand/. -|contains|windash: Перевірятиме рядок як є, а також перетворить перший символ-на перестановки символів/,–(en dash),—(em dash) та―(horizontal bar). -|endswith: Перевіряє, чи значення поля закінчується певним рядком. -|endswith|cased: Перевіряє, чи значення поля закінчується певним чутливим до регістру рядком. -|endswith|windash: Перевіряє кінець рядка та виконує варіації для тире. -|exists: Перевіряє, чи поле існує. -|expand: Перевіряє, чи значення поля дорівнює рядку в конфігураційному файліexpandвсередині/config/expand/. -|fieldref: Перевіряє, чи значення у двох полях однакові. Ви можете використовуватиnotуcondition, якщо хочете перевірити, чи два поля різні. -|fieldref|contains: Перевіряє, чи значення одного поля міститься в іншому полі. -|fieldref|endswith: Перевіряє, чи поле зліва закінчується рядком поля справа. Ви можете використовуватиnotуcondition, щоб перевірити, чи вони різні. -|fieldref|startswith: Перевіряє, чи поле зліва починається з рядка поля справа. Ви можете використовуватиnotуcondition, щоб перевірити, чи вони різні. -|gt: Перевіряє, чи значення поля більше за певне число. -|gte: Перевіряє, чи значення поля більше або дорівнює певному числу. -|lt: Перевіряє, чи значення поля менше за певне число. -|lte: Перевіряє, чи значення поля менше або дорівнює певному числу. -|re: Використовуйте чутливі до регістру регулярні вирази. (Ми використовуємо regex crate, тому, будь ласка, ознайомтеся з документацією за адресою https://docs.rs/regex/latest/regex/#syntax, щоб дізнатися, як писати підтримувані регулярні вирази.)Увага: Синтаксис регулярних виразів у правилах Sigma використовує PCRE з певними метасимволами для класів символів, lookbehind, atomic grouping тощо, які не підтримуються. Rust regex crate має бути в змозі використовувати всі регулярні вирази в правилах Sigma, але існує ймовірність несумісності. -
|re|i: (Insensitive) Використовуйте нечутливі до регістру регулярні вирази. -|re|m: (Multi-line) Зіставлення через кілька рядків.^/$зіставляють початок/кінець рядка. -|re|s: (Single-line) крапка (.) зіставляє всі символи, включаючи символ нового рядка. -|startswith: Перевіряє, чи значення поля починається з певного рядка. -|startswith|cased: Перевіряє, чи значення поля починається з певного чутливого до регістру рядка. -|utf16|base64offset|contains: Перевіряє, чи певний рядок UTF-16 закодований всередині рядка base64. -|utf16be|base64offset|contains: Перевіряє, чи певний рядок UTF-16 big-endian закодований всередині рядка base64. -|utf16le|base64offset|contains: Перевіряє, чи певний рядок UTF-16 little-endian закодований всередині рядка base64. -|wide|base64offset|contains: Псевдонім дляutf16le|base64offset|contains, перевіряє на рядки UTF-16 little-endian.
Застарілі модифікатори полів¶
Наступні модифікатори тепер застарілі та замінені модифікаторами, які більше відповідають специфікаціям sigma.
|equalsfield: Тепер замінено на|fieldref.|endswithfield: Тепер замінено на|fieldref|endswith.
Модифікатори полів Expand¶
Модифікатори полів expand унікальні тим, що вони є єдиним модифікатором поля, який вимагає попереднього налаштування для використання.
Наприклад, вони використовують заповнювачі, такі як %DC-MACHINE-NAME%, і вимагають конфігураційного файлу з ім'ям /config/expand/DC-MACHINE-NAME.txt, який містить усі можливі імена машин DC.
Як це налаштувати, детальніше пояснюється тут.
Символи підстановки¶
Символи підстановки можна використовувати в eventkeys. У прикладі нижче, якщо ProcessCommandLine починається з рядка "malware", правило спрацює.
Специфікація фундаментально така сама, як і символи підстановки правил sigma, тому буде нечутливою до регістру.
detection:
selection:
Channel: Security
EventID: 4688
ProcessCommandLine: malware*
condition: selection
Можна використовувати наступні два символи підстановки.
*: Зіставляє будь-який рядок з нуля або більше символів. (Внутрішньо він перетворюється на регулярний вираз.*)?: Зіставляє будь-який окремий символ. (Внутрішньо перетворюється на регулярний вираз.)
Про екранування символів підстановки:
- Символи підстановки (
*та?) можна екранувати за допомогою зворотної косої риски:\*,\?. - Якщо ви хочете використати зворотну косу риску безпосередньо перед символом підстановки, то пишіть
\\*або\\?. - Екранування не потрібне, якщо ви використовуєте зворотні косі риски самі по собі.
Ключове слово null¶
Ключове слово null можна використовувати для перевірки, чи поле не існує.
Примітка: Це відрізняється від ProcessCommandLine: '', яке перевіряє, чи значення поля порожнє.
condition¶
За допомогою нотації, яку ми пояснили вище, ви можете виразити логіку AND та OR, але це буде заплутано, якщо ви намагаєтеся визначити складну логіку.
Коли ви хочете створити складніші правила, вам слід використовувати ключове слово condition, як показано нижче.
detection:
SELECTION_1:
EventID: 3
SELECTION_2:
Initiated: 'true'
SELECTION_3:
DestinationPort:
- '4444'
- '666'
SELECTION_4:
Image: '*\Program Files*'
SELECTION_5:
DestinationIp:
- 10.*
- 192.168.*
- 172.16.*
- 127.*
SELECTION_6:
DestinationIsIpv6: 'false'
condition: (SELECTION_1 and (SELECTION_2 and SELECTION_3) and not ((SELECTION_4 or (SELECTION_5 and SELECTION_6))))
Для condition можна використовувати наступні вирази.
{expression1} and {expression2}: Вимагає обидва {expression1} AND {expression2}{expression1} or {expression2}: Вимагає або {expression1} OR {expression2}not {expression}: Обертає логіку {expression}( {expression} ): Встановлює пріоритет {expression}. Він дотримується тієї самої логіки пріоритету, що і в математиці.
У наведеному вище прикладі використовуються імена selection, такі як SELECTION_1, SELECTION_2 тощо, але їх можна назвати як завгодно, доки вони містять лише наступні символи: a-z A-Z 0-9 _
Однак, будь ласка, використовуйте стандартну угоду
selection_1,selection_2,filter_1,filter_2тощо, щоб робити речі легкими для читання, коли це можливо.
логіка not¶
Багато правил призведуть до хибних спрацювань, тому дуже поширеним є наявність selection для сигнатур для пошуку, а також filter selection, щоб не сповіщати про хибні спрацювання. Наприклад:
detection:
selection:
Channel: Security
EventID: 4673
filter:
- ProcessName: C:\Windows\System32\net.exe
- ProcessName: C:\Windows\System32\lsass.exe
- ProcessName: C:\Windows\System32\audiodg.exe
- ProcessName: C:\Windows\System32\svchost.exe
- ProcessName: C:\Windows\System32\mmc.exe
- ProcessName: C:\Windows\System32\net.exe
- ProcessName: C:\Windows\explorer.exe
- ProcessName: C:\Windows\System32\SettingSyncHost.exe
- ProcessName: C:\Windows\System32\sdiagnhost.exe
- ProcessName|startswith: C:\Program Files
- SubjectUserName: LOCAL SERVICE
condition: selection and not filter
Кореляції Sigma¶
Ми реалізували всі кореляції Sigma версії 2.0.0, як визначено тут.
Підтримувані кореляції:
- Event Count (
event_count) - Value Count (
value_count) - Temporal Proximity (
temporal) - Ordered Temporal Proximity (
temporal_ordered)
Нові кореляційні правила "metrics" (value_sum, value_avg, value_percentile), випущені 12 вересня 2025 року в Sigma версії 2.1.0, наразі не підтримуються.