Hi
Jayakrishnan!
I have been testing the scenario and custom rules, I did following test.
Test #1Four times event
"login":"failure", followed by
{"date":"03/01/2023 10:37:18","srcip":"192.168.1.23","name":"Host1","login":"failure"}
**Phase 1: Completed pre-decoding.
full event: '{"date":"03/01/2023 10:37:18","srcip":"192.168.1.23","name":"Host1","login":"failure"}'
**Phase 2: Completed decoding.
name: 'json'
date: '03/01/2023 10:37:18'
login: 'failure'
name: 'Host1'
srcip: '192.168.1.23'
**Phase 3: Completed filtering (rules).
id: '10011' <--------- first "login":"failure", generate event 10011
level: '3'
description: 'Host1 login failure'
groups: '['local', 'syslog', 'sshd']'
firedtimes: '1'
mail: 'False'
**Alert to be generated.
{"date":"03/01/2023 10:37:18","srcip":"192.168.1.23","name":"Host1","login":"failure"}
**Phase 1: Completed pre-decoding.
full event: '{"date":"03/01/2023 10:37:18","srcip":"192.168.1.23","name":"Host1","login":"failure"}'
**Phase 2: Completed decoding.
name: 'json'
date: '03/01/2023 10:37:18'
login: 'failure'
name: 'Host1'
srcip: '192.168.1.23'
**Phase 3: Completed filtering (rules).
id: '10011' <--------- second "login":"failure", generate event 10011
level: '3'
description: 'Host1 login failure'
groups: '['local', 'syslog', 'sshd']'
firedtimes: '2'
mail: 'False'
**Alert to be generated.
{"date":"03/01/2023 10:37:18","srcip":"192.168.1.23","name":"Host1","login":"failure"}
**Phase 1: Completed pre-decoding.
full event: '{"date":"03/01/2023 10:37:18","srcip":"192.168.1.23","name":"Host1","login":"failure"}'
**Phase 2: Completed decoding.
name: 'json'
date: '03/01/2023 10:37:18'
login: 'failure'
name: 'Host1'
srcip: '192.168.1.23'
**Phase 3: Completed filtering (rules).
id: '10011' <--------- third "login":"failure", generate event 10011
level: '3'
description: 'Host1 login failure'
groups: '['local', 'syslog', 'sshd']'
firedtimes: '3'
mail: 'False'
**Alert to be generated.
{"date":"03/01/2023 10:37:18","srcip":"192.168.1.23","name":"Host1","login":"failure"}
**Phase 1: Completed pre-decoding.
full event: '{"date":"03/01/2023 10:37:18","srcip":"192.168.1.23","name":"Host1","login":"failure"}'
**Phase 2: Completed decoding.
name: 'json'
date: '03/01/2023 10:37:18'
login: 'failure'
name: 'Host1'
srcip: '192.168.1.23'
**Phase 3: Completed filtering (rules).
id: '10012' <---------------- After fires 4 times "login":"failure", it triggers event
10012.
level: '6'
description: 'Multiple Host1 login failure'
groups: '['local', 'syslog', 'sshd']'
firedtimes: '2'
frequency: '4'
mail: 'False'
**Alert to be generated.
{"date":"03/01/2023 10:37:20","srcip":"192.168.1.23","name":"FIREWALL1","status":"suspicious"}
**Phase 1: Completed pre-decoding.
full event: '{"date":"03/01/2023 10:37:20","srcip":"192.168.1.23","name":"FIREWALL1","status":"suspicious"}'
**Phase 2: Completed decoding.
name: 'json'
date: '03/01/2023 10:37:20'
name: 'FIREWALL1'
srcip: '192.168.1.23'
status: 'suspicious'
**Phase 3: Completed filtering (rules).
id: '10013' <----------------- If the event "status": "suspicious" is triggered before the 20 second timeout, the level 10 alert is generated.
level: '10'
description: 'Multiple login failure from suspecious traffic'
groups: '['local', 'syslog', 'sshd']'
firedtimes: '1'
frequency: '2'
mail: 'False'
**Alert to be generated.
If the timeout expires, it will fires a 10010 rule with suspicious event.
The sequence login failure 4 times event (in a 20 seconds spam), followed by a FIREWALL1 "status":"suspicious" event, generates a level 10 alert, number 10013.
It's working as the example shows.
Test #2
One firewall1 suspicious traffic come first and then the four Host1 login failures
I did some changes to make it works as you need,
one firewall1 suspicious traffic come first and then the four Host1 login failures , set next rule configuraiton.
<rule id="10010" level="3">
<decoded_as>json</decoded_as>
<match>suspicious</match>
<description>FIREWALL1 suspecious traffic</description>
</rule>
<rule id="10011" level="3">
<decoded_as>json</decoded_as>
<match>failure</match>
<description>Host1 login failure</description>
</rule>
<rule id="10012" level="6" frequency="4" timeframe="20">
<if_matched_sid>10011</if_matched_sid>
<group>suspicious_event</group>
<same_srcip/>
<description>Multiple Host1 login failure</description>
</rule>
<rule id="10013" level="10" timeframe="30">
<if_matched_sid>10010</if_matched_sid>
<if_group>suspicious_event</if_group>>
<same_srcip/>
<description>Multiple login failure from suspecious traffic</description>
</rule>
Wazuh-logtest
/var/ossec/bin/wazuh-logtest
Type one log per line
{"date":"03/01/2023 10:37:20","srcip":"192.168.1.23","name":"FIREWALL1","status":"suspicious"}
**Phase 1: Completed pre-decoding.
full event: '{"date":"03/01/2023 10:37:20","srcip":"192.168.1.23","name":"FIREWALL1","status":"suspicious"}'
**Phase 2: Completed decoding.
name: 'json'
date: '03/01/2023 10:37:20'
name: 'FIREWALL1'
srcip: '192.168.1.23'
status: 'suspicious'
**Phase 3: Completed filtering (rules).
id: '10010'
level: '3'
description: 'FIREWALL1 suspecious traffic'
groups: '['local', 'syslog', 'sshd']'
firedtimes: '1'
mail: 'False'
**Alert to be generated.
{"date":"03/01/2023 10:37:18","srcip":"192.168.1.23","name":"Host1","login":"failure"}
**Phase 1: Completed pre-decoding.
full event: '{"date":"03/01/2023 10:37:18","srcip":"192.168.1.23","name":"Host1","login":"failure"}'
**Phase 2: Completed decoding.
name: 'json'
date: '03/01/2023 10:37:18'
login: 'failure'
name: 'Host1'
srcip: '192.168.1.23'
**Phase 3: Completed filtering (rules).
id: '10011'
level: '3'
description: 'Host1 login failure'
groups: '['local', 'syslog', 'sshd']'
firedtimes: '1'
mail: 'False'
**Alert to be generated.
{"date":"03/01/2023 10:37:18","srcip":"192.168.1.23","name":"Host1","login":"failure"}
**Phase 1: Completed pre-decoding.
full event: '{"date":"03/01/2023 10:37:18","srcip":"192.168.1.23","name":"Host1","login":"failure"}'
**Phase 2: Completed decoding.
name: 'json'
date: '03/01/2023 10:37:18'
login: 'failure'
name: 'Host1'
srcip: '192.168.1.23'
**Phase 3: Completed filtering (rules).
id: '10011'
level: '3'
description: 'Host1 login failure'
groups: '['local', 'syslog', 'sshd']'
firedtimes: '2'
mail: 'False'
**Alert to be generated.
{"date":"03/01/2023 10:37:18","srcip":"192.168.1.23","name":"Host1","login":"failure"}
**Phase 1: Completed pre-decoding.
full event: '{"date":"03/01/2023 10:37:18","srcip":"192.168.1.23","name":"Host1","login":"failure"}'
**Phase 2: Completed decoding.
name: 'json'
date: '03/01/2023 10:37:18'
login: 'failure'
name: 'Host1'
srcip: '192.168.1.23'
**Phase 3: Completed filtering (rules).
id: '10011'
level: '3'
description: 'Host1 login failure'
groups: '['local', 'syslog', 'sshd']'
firedtimes: '3'
mail: 'False'
**Alert to be generated.
{"date":"03/01/2023 10:37:18","srcip":"192.168.1.23","name":"Host1","login":"failure"}
**Phase 1: Completed pre-decoding.
full event: '{"date":"03/01/2023 10:37:18","srcip":"192.168.1.23","name":"Host1","login":"failure"}'
**Phase 2: Completed decoding.
name: 'json'
date: '03/01/2023 10:37:18'
login: 'failure'
name: 'Host1'
srcip: '192.168.1.23'
**Phase 3: Completed filtering (rules).
id: '10013'
level: '10'
description: 'Multiple login failure from suspecious traffic'
groups: '['local', 'syslog', 'sshd']'
firedtimes: '1'
frequency: '2'
mail: 'False'
**Alert to be generated.
Let me know if that works for you.
Regards.