您想了解的有关Sigma规则的所有信息。第2部分

本文是我们致力于Sigma-rules格式描述的系列材料的延续。让我们简要回顾一下周期的结构。一篇文章中,我们给出了一个简单规则的示例,并详细介绍了描述事件源的部分。现在,我们对规则的结构有了大致的了解,并且我们还可以指出必须向何处以及向该规则提供哪些信息以检测可疑活动。



现在,我们需要学习如何描述将对接收到的数据进行操作的逻辑,并对我们的规则在给定情况下是否有效做出判断。本文专门讨论的是规则的这一部分及其功能。检测逻辑部分的描述是语法中最重要的部分,必须了解其知识才能理解现有规则并编写自己的规则。



接下来的出版物,我们要住在细节上的元信息的描述(即是提供信息或在自然界中基础设施的属性,如描述或标识符)和规则集合。关注我们的出版物!



检测逻辑的描述(检测属性)



检测属性中设置规则触发条件它的子字段描述了规则的主要技术部分。重要的是要注意,一条规则只能包含一个描述部分,并且可以包含多个日志源和检测。由于检测部分基于来自源部分的数据来描述触发标准,因此这两个部分具有1到1。



通常,检测字段的内容由两个逻辑部分组成:



  • 有关事件字段(搜索ID)的假设的描述,
  • 这些描述之间的逻辑关系(时间范围条件字段中的表达式)。






通过指定搜索标识符来完成有关事件字段内容的假设的描述。这样的标识符可以是一个(如此),也可以是多个(如此)。



第二部分可以是三种类型:



  • 通常情况
  • 具有聚合表达式的条件(如上例所示),
  • 条件与关键字附近


本文相应部分中介绍了每个部分的元素的语法。



搜索ID



搜索标识符是键值对,其中键是搜索标识符的名称,值是列表或字典(也称为关联数组)。类似于编程语言-列表或地图。指定列表和字典的格式由YAML标准定义,可以在此处找到值得注意的是,Sigma规则格式不能固定搜索标识符的名称,但是大多数情况下,您可以找到单词选择的变体。



对于列表项和词典项,有一些通用要求:



  • 所有值都被视为不区分大小写的字符串,即大写字母和小写字母之间没有区别。
  • (wildcards) ‘*’ ‘?’. ‘*’ — ( ), ‘?’ — ( ).
  • ‘\’, ‘\*’. , : ‘\\*’. .
  • , .
  • ‘ .


值列表搜索标识符值

列表包含在整个事件消息中搜索的字符串。列表中的元素与逻辑或组合。



detection: 
  keywords: 
	- EVILSERVICE 
	- svchost.exe -n evil 
  condition: keywords 
 






包含搜索标识符作为值列表的规则示例:



字典搜索标识符



字典由一组键值对组成,其中键是事件中字段的名称,值可以是字符串,整数或这些类型之一的列表(字符串或数字的列表与逻辑或组合)。字典集通过逻辑AND组合起来



通用方案:







让我们考虑几个示例。



示例1.事件日志清除检测规则



规则/windows/builtin/win_susp_security_eventlog_cleared.yml


如果事件满足以下条件,则将触发此规则:



EventID = 517  OR EventID = 1102



在规则中,它看起来像这样:



detection: 
  selection: 
      EventID: 
        - 517 
        - 1102 
  condition: selection 


这里的选择是唯一搜索标识符的名称,其余子字段是其值,并且该值的类型为“字典”。在此字典中,EventID是键,数字5171102构成一个列表,该列表是该字典键的值。



例子2.一个可疑的票务请求,很可能是Kerberoasting



规则/ windows /内置/win_susp_rc4_kerberos.yml


如果事件满足以下条件,则将触发此规则:



EventID = 4679 AND  TicketOptions = 0x40810000 AND TicketEncryption = 0x17 AND ServiceName不以'$'符号结尾



在规则中,它看起来像这样:



detection: 
  selection: 
    EventID: 4769 
    TicketOptions: '0x40810000' 
    TicketEncryption: '0x17' 
  reduction: 
	- ServiceName: '*$' 
  condition: selection and not reduction 


特殊字段值



可以使用两个特殊的字段值:



  • 用两个单引号指定的空值''
  • 由null关键字指定的null值


注意:不能通过not null构造指定非空值


这些值的应用取决于目标SIEM系统。为了描述不为空的条件,您需要创建一个单独的搜索标识符,该标识符具有空值,并从中获取条件中的否定(条件字段,在本文结尾处进行介绍)。考虑使用空字段描述的规则的其他示例。



例子3.远程流的可疑启动



规则/windows/sysmon/sysmon_password_dumper_lsass.yml


如果事件满足以下条件,则将触发指定的规则:



EventID = 8 AND TargetImage ='C:\ Windows \ System32 \ lsass.exe'AND St​​artModule为空字段



在规则中,它看起来像这样:



detection: 
	selection: 
        EventID: 8 
        TargetImage: 'C:\Windows\System32\lsass.exe' 
        StartModule: null 
	condition: selection 


示例4.将可执行文件写入备用文件流NTFS



规则/windows/sysmon/sysmon_ads_executable.yml


所考虑的规则是正确指定非空值的示例。如果事件满足以下条件,则将触发此规则:



EventID = 15 AND Imphash != '00000000000000000000000000000000' Imphash



在规则中,它看起来像这样:



detection: 
    selection: 
        EventID: 15 
	filter: 
        Imphash:  
        	- '00000000000000000000000000000000' 
        	- null 
	condition: selection and not filter 


如上所述,否定词现在必须放在条件(条件字段)中,而不是搜索标识符中。



值修饰符



规则中字段值的解释可以使用修饰符进行更改。在字段名称之后添加修饰符,每个修饰符前面都有竖线(“ |”)。可以将它们链接起来以构建修改器的链(管道):







字段值根据修改器在链中的顺序进行修改。修饰符可以有两种类型:变换修饰符和类型修饰符。



转换修饰符是将原始字段值转换为其他值或转换用于处理搜索标识符中的值列表的逻辑的修饰符。第一种是Base64修饰符,第二种是all修饰符。稍后将更详细地讨论所有修饰符。



让我们看一下每个转换修饰符。为了清楚起见,我们将示意性地显示此修饰符或该修饰符如何精确更改初始值。



以。。开始



startswith 修饰符用于将字符串的开头与所需值匹配。







使用示例:





以。。结束



endswith 修饰符用于将字符串的结尾与搜索值进行匹配。







使用示例:





包含



contains 修饰符检查字段值中是否存在子字符串。实际上,此修饰符按如下所示转换字段值:







也就是说,如果我们考虑应用考虑的修饰符的结果,则可以编写以下公式:



startswith + endswith = contains



示例:





所有



通常,图纸元素与逻辑或结合。all修饰符将逻辑OR更改为逻辑AND,即列表中的所有元素都必须存在。让我们看一下本节开头的一般方案中的条件将如何变化:







如您所见,当应用all修饰符时,列表项之间的逻辑连接变为AND。通常,all修饰符与contains修饰符一起使用。如果静态部分的顺序未知,则可以使用通配符将此类字符串替换为模式。



使用all修饰符的示例





base64



当字段值在Base64中编码时,将应用此修饰符,为清楚起见,我们将编码后的文本写入规则中,而不是生成的Base64字符串中。







此修饰符假定字段与编码的字符串完全匹配。通常,在原始数据中识别可疑活动的征兆比寻找与编码结果的精确匹配更为有用。因此,还没有使用base64修饰符的示例



base64offset



由于Base64编码的性质,您不能使用来自base64的管道,并且包含来查找已编码的substring 为此创建了base64offset修饰符当字符串是Base64编码的并且我们想找到编码字符串的子字符串时使用。此外,包围所需子字符串的字符是预先未知的,并且子字符串相对于字符串开头的偏移量也是未知的。您可以清楚地看到这里有什么危险。



几乎总是这个修饰符,连同包含修改







使用的例子:





重要!以下三个编码转换修饰符仅与Base64修饰符一起使用。


utf16le或宽



utf16lewide 修饰符是同义词。它们以UTF-16LE编码(即)转换字符串字段“123” -> 0x31 0x00 0x32 0x00 0x33 0x00







utf16be



utf16be 修饰符字段字符串值转换为UTF-16BE “123” -> 0x00 0x31 0x00 0x32 0x00 0x33







utf16



修饰符utf16添加字节顺序标记(BOM),并以UTF-16编码字符串,即“123” -> 0xFF 0xFE 0x31 0x00 0x32 0x00 0x33 0x00当前只有一种







类型修饰符-re



回覆



此类型修饰符将字段值解释为正则表达式模式。到目前为止,转换器仅支持对Elasticsearch查询的支持,因此实际上它并未出现在公共规则中。



使用示例:





时间间隔(时间框架属性)



另外,可以通过指定搜索标识符应出现的时间间隔来完善检测逻辑。标准缩写用于表示时间单位:



15s  (15 ) 
30m  (30 ) 
12h  (12 ) 
7d   (7 ) 
3M   (3 ) 


使用示例:





规则触发条件的描述(条件属性)



根据Sigma官方文档,规则中包含触发条件的部分是最复杂的,并且会随着时间而变化。以下表达式当前可用。



逻辑运算AND,OR



它们分别关键字指示。这些表达式是在搜索标识符之间建立逻辑关系的主要元素。



detection: 
  keywords1: 
      - EVILSERVICE
      - svchost.exe -n evil 
  keywords2: 
	- SERVICEEVIL 
	- svchost.exe -n live 
  condition: keywords1 or keywords2 




使用示例:





搜索ID值之一/所有搜索ID值(1 /全部搜索标识符)

与前一种情况相同,如果搜索ID



  • 1-替代方案之间的逻辑或,
  • 全部-逻辑“与”方案。


默认情况下condition: keywords,关键字标识符中列出的值是逻辑或,即与写入相同condition: 1 of keywords如果我们想将值与逻辑AND相结合,则需要编写condition: all of keywords



使用示例:







在所有给定的搜索ID 中,搜索ID之一/所有搜索ID(全部1个)或逻辑(1个)或逻辑与(所有)。默认情况下,如果搜索ID是字典的元素,则通过逻辑AND链接,如果它们是列表的元素,则通过逻辑OR链接。为了更改这些关系,创建了此结构。因此,条件,条件:其中之一,意味着至少一个搜索标识符必须出现在事件中。



使用示例:





与名称模式匹配的搜索ID之一/与名称模式匹配的所有搜索ID(1 /所有搜索标识符模式)



与上一段相同,但是选择仅限于名称与模式匹配的搜索标识符。在名称模式中的特定位置使用通配符*(任意数量的字符)来构造此类模式。



语法如下:



condition: 1 of selection* 
 
condition: all of selection* 


使用示例:





逻辑否定



逻辑否定是使用not关键字构造的如上所述,必须在条件字段中而不是在搜索ID的描述中指定表达式“ not empty” 下面的示例清楚地显示了表达式“字段值不为空”的正确描述。







使用示例:







竖线(或竖线)指示表达式的结果将传递给聚合函数,该聚合函数的结果可能会与某个值进行比较。



总体方案:



_ | _  
 
condition: selection | count(category) by dst_ip > 30 


使用示例:





括弧



括号用于指定子表达式。这对于指定评估逻辑表达式的顺序或否定包含多个表达式的谓词很有用。它们是操作的最高优先级。



condition: selection and (keywords1 or keywords2) 
 
condition: selection and not (filter1 or filter2) 


用法示例:





聚合函数表达式



聚合表达式(或聚合函数表达式)用于量化已发生的事件。



聚合表达式架构:







count之外的所有聚合函数都需要一个字段名称作为参数。如果未指定字段名称,则count函数将对所有匹配的事件进行计数。如果指定了字段名称,则该函数在该字段中计数不同的值。例如,以下表达式计算从一个IP地址建立连接的不同端口的数目,如果该数目超过10,则将触发规则:



condition: selection | count(dst_port) by src_ip > 10 




使用示例:





聚集附近的表达



near 关键字用于生成查询(如果目标系统和后端支持此功能),该查询在找到第一个ID之后的指定时间间隔内识别所有指定搜索ID的出现。



通用架构:



near search-id-1 [ [ and search-id-2 | and not search-id-3 ] ... ]



语法示例:



timeframe: 30s 
condition: selector | near dllload1 and dllload2 and not exclusion 


相同的规则适用 于与竖线之前的搜索表达式相似的单词附近的搜索表达式,我们已经在上面进行了详细介绍。



使用示例:





操作的默认优先级是:

  1. (表达)
  2. 搜索模式的X
  3. 要么
  4. |


因此,括号的优先级最高,而管道的优先级最低。



注意:如果指定了多个条件字段,则通过将逻辑或应用于所有表达式值来获得最终值。


在本文中,我们描述了检测逻辑。跟随我们的帖子,在下一篇文章中,我们将研究规则的其余字段。它们中的大多数具有信息性或基础结构性质。除了具有元信息的字段外,让我们关注规则组成的这种特征,称为规则集合。对于不熟悉YAML语言复杂性的人,在阅读陌生人并编写自己的规则时,考虑语法的这一方面将非常有用。



作者:积极技术开发和专家服务部(PT专家安全中心)专家Anton Kutepov



All Articles