• Sigma用于日志文件,就像Snort用于网络流量,YARA用于文件一样——还是觉得yara 2.0 设计更优雅


    来源:https://github.com/Neo23x0/sigma

    一、什么是sigma

    Sigma是一种通用的开放签名格式,允许您以一种直接的方式描述相关的日志事件。规则格式非常灵活,易于编写,适用于任何类型的日志文件。该项目的主要目的是提供一种结构化的形式,在这种结构中,研究人员或分析人员可以描述他们曾经开发的检测方法,并使其与他人共享。

    Sigma用于日志文件,就像Snort用于网络流量,YARA用于文件一样。

    这个库包含:

    (1)Wiki中的Sigma规则规范

    (2)./rulessubfolder中n个sigma签名存储库

    (3)为不同SIEM系统生成搜索/查询的转换器[正在进行中] 

    二、用例

    描述你在Sigma中的检测方法,使其可共享

    使用Sigma编写SIEM搜索,以避免供应商锁定

    与IOCs和YARA规则一起在分析的附录中共享签名

    在威胁情报社区共享签名-例如通过MISP

    为您自己的应用程序中的恶意行为提供Sigma签名

    三、为什么Sigma

    今天,每个人都收集日志数据进行分析。人们开始自己动手,处理大量白皮书、博客文章和日志分析指南,提取必要的信息,构建自己的搜索和仪表板。他们的一些搜索和关联是伟大的,非常有用,但他们缺乏一个标准化的格式,他们可以与他人分享他们的工作。

    其他一些则提供了出色的分析,包括IOCs和YARA规则来检测恶意文件和网络连接,但无法描述日志事件中的特定或通用检测方法。西格玛应该是一个开放的标准,这样的检测机制可以被定义,共享和收集,以提高每个人的检测能力。

    YARA-L 2.0 语言概览

    https://go.chronicle.security/hubfs/YARA-L%20Overview%20White%20Paper.pdf 论文地址

    YARA-L 2.0 是一种计算机语言,用于创建搜索企业日志数据的规则,因为它被注入到您的 Chronicle 帐号中。YARA-L 语法派生自 VirusTotal 开发的 YARA 语言。该语言与 Chronicle Detection Engine 配合使用,让您可以在大量数据中寻找威胁和其他事件。另请参阅 YARA-L 2.0 语言语法

    注意:YARA-L 2.0 与旧版 YARA-L 语言不兼容。以旧版 YARA-L 编写的规则不适用于当前版本的 Detection Engine,需要经过修改才能使用新语法。

    规则结构

    对于 YARA-L 2,您必须按以下顺序指定变量声明、定义和用法:

    1. meta
    2. events
    3. match(可选)
    4. condition

    注意:如果您省略可选 match 部分,规则就可以与单个事件进行匹配。

    下面说明了规则的通用结构:

     
    rule <rule Name>
    {
      meta:
        // Stores arbitrary key-value pairs of rule details, such as who wrote
        // it, what it detects on, version control, etc.
        // Identical to the meta section in YARA-L.
        //
        // For example:
        // author = "Analyst #2112"
        // date = "08/09/2020"
        // description = "suspicious domain detected"
    
      events:
        // Conditions to filter events and the relationship between events.
    
      match:
        // Values to return when matches are found.
    
      condition:
        // Condition to check events and the variables used to find matches.
    }
    

    YARA-L 2.0 示例规则

    以下示例展示了使用 YARA-L 2.0 编写的规则。每个示例都展示了如何关联规则语言中的事件。

    不同城市的登录信息

    以下规则会在 5 分钟内搜索从两个或多个城市登录过您的企业的用户:

     
    rule DifferentCityLogin {
      meta:
    
      events:
        $udm.metadata.event_type = "USER_LOGIN"
        $udm.principal.user.userid = $user
        $udm.principal.location.city = $city
    
      match:
        $user over 5m
    
      condition:
        #city > 1
    }
    

    Match 变量:$user

    事件变量:$udm

    Placeholder 变量:$city $user

    下面介绍了此规则的工作原理:

    • 对用户名为 $user 的活动进行分组,并在找到匹配项时返回 ($user)。
    • 时间范围为 5 分钟,表示只有间隔不到 5 分钟的事件相关联。
    • 搜索事件类型为 USER_LOGIN 的事件组 ($udm)。
    • 对于该事件组,该规则会将用户 ID 命名为 $user,并将登录城市命名为 $city.
    • 如果 5 分钟时间范围内事件组 ($udm) 中的不同 $city 值数量大于 1,则返回匹配项。

    快速创建和删除用户

    以下规则可搜索在 4 小时内创建然后删除的用户:

     
      rule UserCreationThenDeletion {
      meta:
    
      events:
        $create.target.user.userid = $user
        $create.metadata.event_type = "USER_CREATION"
    
        $delete.target.user.userid = $user
        $delete.metadata.event_type = "USER_DELETION"
    
        $create.metadata.event_timestamp.seconds <=
           $delete.metadata.event_timestamp.seconds
    
      match:
        $user over 4h
    
      condition:
        $create and $delete
    }
    

    事件变量:$create 和 $delete

    Match 变量:$user

    占位符变量:不适用

    下面介绍了此规则的工作原理:

    • 对用户名为 $user 的活动进行分组,并在找到匹配项时返回 ($user)。
    • 时间范围为 4 小时,这意味着只有不到 4 小时的事件才会关联。
    • 搜索两个事件组($create 和 $delete,其中 $create 等同于 #create >= 1)。
    • $create 对应于 USER_CREATION 事件,并将用户 ID 调用为 $user
    • $user 用于将两组事件联接在一起。
    • $delete 对应于 USER_DELETION 事件,并以 $user 形式调用用户 ID。此规则查找两个事件组中用户标识符相同的匹配项。
    • 此规则查找事件 $delete 发生的时间晚于 $create 事件的情况,并在发现时返回匹配项。

    单事件与多事件

    以下示例规则展示了如何创建用于搜索单个事件的规则,然后对其进行修改以搜索多个事件。

    下面是该规则的单个事件版本:

     
    rule SingleEventRule {
      meta:
        author = "noone@altostrat.com"
    
      events:
        $e.metadata.event_type = "USER_LOGIN"
    
      condition:
        $e
    }
    

    此规则仅搜索用户的登录事件,然后返回在 Chronicle 帐号中存储的企业数据中首次遇到的事件。

    下面是该规则的多事件版本:

     
    rule MultiEventRule {
      meta:
        author = "noone@altostrat.com"
    
      events:
        $e.metadata.event_type = "USER_LOGIN"
        $e.principal.user.userid = $user
    
      match:
        $user over 10m
    
      condition:
        #e >= 10
    }
    

    该规则会搜索在 10 分钟内至少登录了 10 次的用户。

    IP 地址范围内的单个事件

    以下示例展示了一条规则,用于搜索两个特定用户和特定 IP 地址范围之间的匹配项:

     
    rule OrsAndNetworkRange {
      meta:
        author = "noone@altostrat.com"
    
      events:
        // Checks CIDR ranges.
        net.ip_in_range_cidr($e.principal.ip, "203.0.113.0/24")
    
        // Detection when the hostname field matches either value using or.
        $e.principal.hostname = /pbateman/ or $e.principal.hostname = /sspade/
    
      condition:
        $e
    }
    

    重复字段

    在 YARA-L 2.0 中,重复字段表示为数组。

    例如,主机可能有多个 IP 地址:

     
    principal.ip [192.168.1.2, 10.3.4.100, 192.168.12.16]
    

    或者一个电子邮件地址可能有多个收件人:

     
    network.email.to ["a@google.com", "b@google.com", "c@google.com"]
    

    语法

    重复字段可以与非重复字段相同。在这种情况下,它们会自动消除歧义,这意味着系统会针对重复字段的各个元素检查条件。

    例如,如果您在规则中包含以下语句:

     
    $e.principal.ip = "192.168.12.16"
    

    Chronicle 会在数组中搜索与 "192.168.12.16" 匹配的 IP 地址。在此示例中,将会找到匹配的地址并返回检测结果。

    例如,如果您在规则中包含以下语句:

     
    $e.principal.ip = "192.168.12.16" and $e.principal.ip = "10.3.4.100"
    

    Chronicle 会在数组中搜索与 "192.168.12.16" 和 "10.3.4.100" 匹配的 IP 地址。在此示例中,将找不到匹配的地址,因此不会返回检测结果。

    重复字段示例

    以下规则会搜索来源 IP 地址已连接到目标 IP 地址的事件,同时在不到一分钟的时间内向 50 多个不同的目标端口发出请求。这可能是恶意实体搜索不安全的网络端口。

     
    rule RepeatedFieldsRuleExample {
      meta:
        author = "noone@google.com"
    
      events:
        $e.principal.ip = $source_ip
        $e.target.ip = $target_ip
        $e.target.port = $target_port
    
      match:
        $source_ip, $target_ip over 1m
    
      condition:
        #target_port > 50
    }
    

    any 和 all 运算符

    您还可以使用 any 和 all 运算符引用重复字段。如果是这样,它们不会消除歧义,也就是说,系统会针对重复字段的所有元素检查条件。

    例如,如果您在规则中包含以下语句:

     
    any $e.principal.ip = "192.168.12.16"
    

    Chronicle 会检查数组中的任何 IP 地址是否与 "192.168.12.16" 匹配。在此示例中,数组将满足检查条件并返回检测结果。

    如果您在规则中包含以下语句:

     
    all $e.principal.ip = "192.168.12.16"
    

    Chronicle 会检查数组中的所有 IP 地址是否与 "192.168.12.16" 匹配。在此示例中,数组不满足检查条件,因此不会返回检测结果。

    如果您在规则中包含以下语句:

     
    any $e.principal.ip = "192.168.12.16" and any $e.principal.ip = "10.3.4.100"
    

    Chronicle 会检查数组中的任何 IP 地址是否与 "192.168.12.16" 匹配,以及数组中的任何 IP 地址是否与 "10.3.4.100" 匹配。在此示例中,数组会满足检查条件,并返回检测结果。

    以下是使用 any 和 all 运算符的有效谓词示例:

    • any $e.principal.ip = "192.168.12.16"
    • net.ip_in_range_cidr(any $e.principal.ip, "192.168.12.16/24")
    • all $e.network.email.to = /.*@google\.com/
    • re.regex(all $e.network.email.to, `.*google\.com`)

    以下是使用 any 和 all 运算符的无效谓词示例:

    • any $ip = "192.168.12.16"
    • any $e.principal.ip = all $e.target.ip
    • any $e.principal.ip in %reference_list

    any 和 all 运算符的限制

    any 和 all 运算符只能用于重复字段。此外,在将重复字段分配给 placeholder 变量或与其他事件的字段联接时,不能使用它们。

    例如,any $e.principal.ip = $ip 和 any $e1.principal.ip = $e2.principal.ip 不是有效的语法。如需匹配或联接重复字段,请使用 $e.principal.ip = $ip。重复字段的每个元素都有一个 match 变量值或联接。

    使用 any 或 all 编写条件时,请注意使用 not 来排除条件的含义可能与使用否定运算符不同。

    例如:

    • not all $e.principal.ip = "192.168.12.16" 会检查是否所有 IP 地址都与 "192.168.12.16" 不匹配,这意味着该规则会检查任何 IP 地址是否都与 "192.168.12.16" 不匹配。
    • all $e.principal.ip != "192.168.12.16" 会检查所有 IP 地址是否都不匹配 "192.168.12.16",这意味着规则会检查没有 IP 地址与 "192.168.12.16" 匹配。

    any 和 all 规则示例

    以下规则会搜索所有来源 IP 地址在 5 分钟的时间内与已知安全的 IP 地址不匹配的登录事件。

     
    rule SuspiciousIPLogins {
      meta:
        author = "noone@google.com"
    
      events:
        $e.metadata.event_type = "USER_LOGIN"
    
        // Detects if all source IP addresses in an event do not match "100.97.16.0"
        // For example, if an event has source IP addresses
        // ["100.97.16.1", "100.97.16.2", "100.97.16.3"],
        // it will be detected since "100.97.16.1", "100.97.16.2",
        // and "100.97.16.3" all do not match "100.97.16.0".
    
        all $e.principal.ip != "100.97.16.0"
    
        // Assigns placeholder variable $ip to the $e.principal.ip repeated field.
        // There will be one detection per source IP address.
        // For example, if an event has source IP addresses
        // ["100.97.16.1", "100.97.16.2", "100.97.16.3"],
        // there will be one detection per address.
    
        $e.principal.ip = $ip
    
      match:
        $ip over 5m
    
      condition:
        $e
    }
    

    规则中的正则表达式

    以下 YARA-L 2.0 正则表达式示例搜索从 altostrat.com 网域收到电子邮件的事件。由于 nocase 已添加到 $host 变量 regex 比较和 regex 函数中,因此两种比较都不区分大小写。

     
    rule RegexRuleExample {
      meta:
        author = "noone@altostrat.com"
    
      events:
        $e.principal.hostname = $host
        $host = /.*HoSt.*/ nocase
        re.regex($e.network.email.from, `.*altostrat\.com`) nocase
    
      match:
        $host over 10m
    
      condition:
        #e > 10
    }
    

    YARA-L 滑动窗口

    默认情况下,YARA-L 2.0 规则使用跃点窗口进行评估。企业事件数据的时间范围分为一组重叠的跃点窗口,每个窗口的持续时间都在 match 部分指定。然后,在每个跃点窗口中关联事件。使用跃点窗口时,无法搜索按特定顺序发生的事件(例如,e1 最多发生在 e2 之后 2 分钟内)。只要 e1 事件与 e2 事件的发生时间在彼此之间的跃点持续时间内,系统就会对其进行关联。

    还可以使用滑动窗口评估规则。在滑动窗口时,以指定的数据透视事件变量开始或结束时,会生成时长为 match 区段的滑动窗口。然后,在每个滑动窗口内,事件是相关的。这样一来,便可以搜索按特定顺序发生的事件(例如,e1 会在 e2 的 2 分钟内发生)。如果事件 e1 在事件 e2 之后的滑动窗口内出现,则事件 e1 和事件 e2 的发生次数是相关的。

    注意:已知使用滑动窗口代替跃点窗口会导致性能下降。Google 建议仅在特定情况下使用滑动窗口,例如绝对有必要使用事件顺序或搜索不存在的事件时。

    滑动窗口规则语法

    在规则的 match 部分中指定滑动窗口,如下所示:

    <match-variable-name-1><match-variable-name-2>, ... over <sliding-window- duration> before|after <pivot-event-variable-name>

    数据透视事件变量是滑动窗口所基于的事件变量。如果使用 before 关键字,则系统会生成滑动窗口,以每次执行数据透视事件结尾。如果使用了 after 关键字,则系统会从每次发生透视事件开始生成滑动窗口。

    注意:数据透视事件变量必须是有界限的。这意味着,condition 部分中事件变量必须至少存在一个边界条件。

    滑动窗口规则示例

    以下 YARA-L 2.0 滑动窗口示例搜索 firewall_1 事件后缺少 firewall_2 事件。after 关键字与数据透视事件变量 $e1 结合使用,指定在关联事件时每个 firewall_1 事件仅检查 10 分钟的时间范围。

     
    rule SlidingWindowRuleExample {
      meta:
        author = "noone@google.com"
    
      events:
        $e1.metadata.product_name = "firewall_1"
        $e1.principal.hostname = $host
    
        $e2.metadata.product_name = "firewall_2"
        $e2.principal.hostname = $host
    
      match:
        $host over 10m after $e1
    
      condition:
        $e1 and !$e2
    }

    1 Sigma概述

    Sigma 是一种通用且开放的签名格式,允许您以直接的方式描述相关的日志事件。规则格式非常灵活,易于编写,适用于任何类型的日志文件。

    Sigma 是一个开放的规则标准,允许您以通用形式描述对日志数据的搜索。这些规则可以转换并应用于许多日志管理或 SIEM 系统,甚至可以在命令行上与 grep 一起使用。

    GitHub地址:https://github.com/SigmaHQ/sigma

    使用方法:https://www.nextron-systems.com/2018/02/10/write-sigma-rules/

    使用方法:https://github.com/SigmaHQ/sigma/wiki/Specification

    2 Sigma规则

    2.1 规则模板

    1. title: 小于50个字符的大写短标题
    2. id: 可以在如下网站生成 https://www.uuidgenerator.net/version4
    3. status: 状态
    4. description: 对检测规则的描述
    5. references:
    6. - 可以帮助读者或分析人员理解被触发规则的含义的所有引用的列表
    7. tags:
    8. - attack.execution # 例如 MITRE ATT&CK category
    9. - attack.t1059 # 例如 MITRE ATT&CK technique id
    10. - car.2014-04-003 # 例如 CAR id
    11. author: Michael Haag, Florian Roth, Markus Neis # 作者列表
    12. date: 2018/04/06 # 规则日期
    13. logsource: # 重要的字段映射在预定义或您的其他配置文件
    14. category: process_creation # 在这个例子中使用了process_creation
    15. product: windows # 产品
    16. detection:
    17. selection:
    18. FieldName: 'StringValue'
    19. FieldName: IntegerValue
    20. FieldName|modifier: 'Value'
    21. condition: selection
    22. fields:
    23. - 日志源中需要进一步研究的重要字段
    24. falsepositives:
    25. - 描述可能的假阳性情况,以帮助分析人员进行调查
    26. level: 四个级别 (low, medium, high, critical)
    1. type: //rec
    2. 必需的:
    3. title: //规则的简短标题,应包含规则应检测的内容(最多 256 个字符)
    4. 类型: //字符串
    5. 长度:
    6. min: 1
    7. max: 256
    8. logsource: //日志源 描述了检测所需的日志来源、平台、应用程序和类型
    9. 类型: //rec
    10. 可选的:
    11. category: //分类 例如防火墙,web,防病毒
    12. product: //产品 例如windows,apache
    13. service: //服务 例如sshd,applocker
    14. definition: //定义 字符串
    15. detection: //表示对日志数据的搜索的搜索标识符
    16. 类型: //rec
    17. 必需的:
    18. condition:
    19. 类型:
    20. 包括:
    21. - type: //str
    22. - type: //arr
    23. contents: //str
    24. length:
    25. min: 2
    26. 可选的:
    27. timeframe: //字符串 使用天、小时、分钟、秒的典型缩写 例如15s、30m、12h、7d、3M
    28. 其他:
    29. 类型: any
    30. 包括:
    31. - type: arr
    32. contents: //str
    33. - type: //map
    34. values:
    35. type: //any
    36. of:
    37. - type: //str
    38. - type: //arr
    39. contents: //str
    40. length:
    41. min: 2
    42. 可选择的:
    43. id: //Sigma 规则应由id属性中的全局唯一标识符标识。建议网络生成
    44. type: //any
    45. of:
    46. - type: //str
    47. length:
    48. min: 1
    49. max: 64
    50. related:
    51. type: //arr
    52. contents:
    53. type: //rec
    54. required:
    55. type:
    56. type: //any
    57. of:
    58. - type: //str
    59. value: derived
    60. - type: //str
    61. value: obsoletes
    62. - type: //str
    63. value: merged
    64. - type: //str
    65. value: renamed
    66. id:
    67. type: //any
    68. of:
    69. - type: //str
    70. length:
    71. min: 1
    72. max: 64
    73. - type: //arr
    74. contents: //str
    75. length:
    76. min: 1
    77. max: 64
    78. status: //声明规则的状态(stable、test、experimental)
    79. type: //any
    80. of:
    81. - type: //str
    82. value: stable //稳定的,可用于生产系统或仪表板
    83. - type: //str
    84. value: testing //一个几乎稳定的规则,可能需要一些微调
    85. - type: //str
    86. value: experimental //一种实验性规则,可能导致错误结果或噪音
    87. description: //规则和可以检测到的恶意活动的简短描述
    88. author: //规则作者
    89. license: //许可证
    90. references: //对规则来源的引用
    91. type: //arr
    92. contents: //str
    93. fields: //有价值显示给分析人员的日志字段列表
    94. type: //arr
    95. contents: //str
    96. falsepositives: //可能发生的已知误报列表
    97. type: //any
    98. of:
    99. - type: //str
    100. - type: //arr
    101. contents: //str
    102. length:
    103. min: 2
    104. level: //等级
    105. type: //any
    106. of:
    107. - type: //str
    108. value: low //值得注意的事件,但很少发生事件
    109. - type: //str
    110. value: medium //应该更频繁地手动审查的相关事件
    111. - type: //str
    112. value: high //应触发内部警报并需要及时审查的相关事件
    113. - type: //str
    114. value: critical //表示事件的高度相关事件。应立即审查关键事件
    115. tags: //标签 小写字母,下划线,连字符组成 尽量简短 预定义标签:https://github.com/SigmaHQ/sigma/wiki/Tags
    116. type: //arr
    117. contents: //str
    118. rest: //any

    3 编些Sigma规则

    3.1 获取存储库

    下载或git存储库:https://github.com/SigmaHQ/sigma

    ./rules 规则库

    ./tools/sigmac 规则编译器

    3.2 复制和编辑 YAML 文件

    推荐VScode:https://code.visualstudio.com/

    可以默认支持YAML突出显示和语法检查。



    作者:Threathunter
    链接:https://www.jianshu.com/p/cedef8f47488
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 相关阅读:
    百度相关应用
    超实用js代码段一
    js模块化开发
    常见注入手法第一讲EIP寄存器注入
    异常处理第一讲(SEH),筛选器异常,以及__asm的扩展,寄存器注入简介
    32位汇编第六讲,OllyDbg逆向植物大战僵尸,快速定位阳光基址
    32位汇编第五讲,逆向实战干货,(OD)快速定位扫雷内存.
    32位汇编第四讲,干货分享,汇编注入的实现,以及快速定位调用API的数量(OD查看)
    32位汇编第三讲,RadAsm,IDE的配置和使用,以及汇编代码注入方式
    32位汇编第二讲,编写窗口程序,加载资源,响应消息,以及调用C库函数
  • 原文地址:https://www.cnblogs.com/bonelee/p/15933462.html
Copyright © 2020-2023  润新知