0x00 前言
对Wazuh安装部署和数据解码有了一定了解后,接下来就是要掌握Wazuh规则的玩法,之前就提到过 Wazuh是ossec的分支,那为啥非要用分支不用原生呢?其实问题就在于Wazuh对ossec的规则引擎进行改良和扩展,使得规则不限制于 少量且写死的字段,譬如源地址、目的地址等字段,可以进行无限制的字段扩展!
本篇不会去讲规则具体字段的使用,这个主要原因是Wazuh官方的文档写的实在是太详细了。
0x01 规则类型
1. 根规则与派生规则(Parent/Child)
根规则
,就是基础规则,只负责区分规则类别。
派生规则
,可以引用根规则去做更细节的过滤和匹配,从而派生出更具体的描述安全事件的规则。
案例
❶ <rule id="5700" level="0" noalert="1">
<decoded_as>sshd</decoded_as>
<description>SSHD messages grouped.</description>
</rule>
❷ <rule id="5710" level="5">
<if_sid>5700</if_sid> ❸
<match>illegal user|invalid user</match>
<description>sshd: Attempt to login using a non-existent user</description>
<mitre>
<id>T1110</id>
</mitre>
<group>invalid_login,authentication_failed,pci_dss_10.2.4,pci_dss_10.2.5,pci_dss_10.6.1,gpg13_7.1,gdpr_IV_35.7.d,gdpr_IV_32.2,hipaa_164.312.b,nist_800_53_AU.14,nist_800_53_AC.7,nist_800_53_AU.6,tsc_CC6.1,tsc_CC6.8,tsc_CC7.2,tsc_CC7.3,</group>
</rule>
规则说明
❶ 规则ID5700是根规则,它代表的是与SSHD这个进程相关的事件
❷ 规则ID5710是5700的派生规则,引用根规则后,进一步进行匹配派生出更具有可描述性的事件
❸ 派生规则引用根规则的方法,使用if_sid字段,与关联规则使用的if_matched_sid有所区别,区别在下面会进行阐述,可以重点关注下
理解
规则ID:5710
规则说明:派生规则ID(5710)引用规则ID(5700)为根规则,进行条件匹配 illegal user|invalid user后 形成了 sshd: Attempt to login using a non-existent user 事件
2. 原子规则和关联规则(Atomic/Composite)
原子规则
,用于描述发生的个别事件,各个事件之间没有相关性,比如说发生了一次登录失败或发生了一次登录成功 但我们无从得知,发生了多少次登录失败,或者说多少次登录失败后发生了登录成功。
关联规则
,将一段时间内的多个事件相关联,譬如可以知道在某个时间段,同一个源地址IP发生了多少次登录失败,从而识别为暴力破解事件。
案例
❶ <rule id="100302" level="3">
<if_sid>86620</if_sid>
<field name="event_name">^login_audit$</field>
<field name="app_type">^web$</field>
<field name="http.results">^failed$</field>
<description>Suricata Rules - $(event_name). $(srcip) -> $(http.email) -> $(http.hostname) -> $(http.url) = $(http.results).</description>
<options>no_full_log</options>
<group>login_audit,authentication_failures,</group>
</rule>
❷ <rule id="100401" level="7" frequency="20" timeframe="120" ignore="300"> ❸
<if_matched_sid>100302</if_matched_sid> ❹ <!-- login_audit failed web -->
<same_source_ip /> ❺
<description>Wazuh Rules - Multiple login failures events from same IP ($IP_FREQ hit/$IP_TIME sec). $(srcip) -> $(http.email) -> $(http.hostname) -> $(http.url) = $(http.results).</description>
<options>no_full_log</options>
<group>brute_force_web,</group>
</rule>
规则说明
❶ 规则ID100302是原子规则,在这个例子里它表示登录失败的事件规则
❷ 规则ID100401是100302的关联规则
❸ 关联规则ID100401,定义了在120s的时间范围内发生次数达到20次,则触发该规则
❹ 使用if_matched_sid字段来引用原子规则100302,与if_sid的区别在于,前者需要在时间范围内发生,后者则没有时间的概念
❺ same_source_ip代表同一个源地址IP进行的访问
理解
规则ID:100401
规则说明:在120s为统计周期内,同一个源IP地址发生超过20次登录失败,触发告警规则
0x02 关联规则的玩法
having count(*)
某个事件数目出现次数
❶ ❷
<rule id="102399" level="10" frequency="30" timeframe="900">
<if_matched_group>nids_phase1</if_matched_group>
<options>no_full_log</options>
<group>suricata_alert_phase2,nids_phase2</group>
<description>Phase 2: Alarm - Phase 1 Alarm of occurred 60 times within 900 seconds. $(srcip) -> $(dstip) -> $(alert.signature) -> $(alert.signature_id).</description>
</rule>
字段说明
❶ frequency定义事件发生的次数>=30次
❷ timeframe定义事件检测事件时间窗在900s内
follow by
某事件A之后发生了事件B
<rule id="100410" level="12" timeframe="900">
<if_matched_sid>100409</if_matched_sid> ❶ <!-- login_audit failed app -->
<if_sid>100303</if_sid> ❷ <!-- login_audit success app -->
<same_field>http.device_id</same_field>
<description>Wazuh Rules - Multiple authentication failures from same device_id, followed by a success ($BRUTE_TIME sec). </description>
</rule>
字段说明
❶ A事件(login_audit failed app)
❷ B事件(login_audit success app)
having count(DISTINCT)
连续多次事件中某个属性出现不同的次数
<rule id="100413" level="7" timeframe="900" ignore= "120">
<if_matched_sid>100411</if_matched_sid>
<same_field>http.device_id</same_field>
<not_same_field>http.email</not_same_field> ❶
<description>Wazuh Rules - Multiple authentication failures from same device_id ($DEVICE_FREQ hit/$DEVICE_TIME sec). </description>
</rule>
规则说明
❶ 规则匹配事件的http.email字段值出现不同的类型