OSSEC是一款开源的多平台的入侵检测系统,一个很显著的特点是容易定制,基于XML更改配置和增加规则。OSSEC通过规则实现数据的解码和分析。

用户可以根据自己的理解,编写解码规则,对数据进行解码和分析。在编写自己的规则之前,首先要了解decoder的规则语言。

研究一下decoder的规则语言。

decoder 中的关键字及含义:

实例分析decoder规则的实现:

<decoder name="pam">
  <program_name>(pam_unix)$</program_name>
</decoder>
   
<decoder name="pam">
  <program_name></program_name>
  <prematch>^pam_unix|^(pam_unix)</prematch>
</decoder>
   
<decoder name="pam-user">
  <parent>pam</parent>
  <prematch>^session w+ </prematch>
  <regex offset="after_prematch">^for user (S+)</regex>
  <order>user</order>
</decoder>
   
<decoder name="pam-host-user">
  <parent>pam</parent>
  <prematch>rhost=S+s+user=S+</prematch>
  <regex>rhost=(S+)s+user=(S+)</regex>
  <order>srcip, user</order>
</decoder>
   
<decoder name="pam-host">
  <parent>pam</parent>
  <prematch> rhost</prematch>
  <regex offset="after_prematch">^=(S+)</regex>
  <order>srcip</order>
</decoder>

程序中如何实现规则树:decoder链表在内存中有两个:forpname;nopname。

如果规则节点有program_name,则保存到forpname链表中,否则保存到nopname链表中。

然后找规则节点中的parent关系,找到每一个规则节点的父节点,构建规则树。

匹配的时候,首先匹配program_name找到规则树的根节点,然后匹配prematch继续匹配child项,也就是父节点的子规则节点,prematch匹配成功后,继续匹配regex,如果没有prematch项,直接匹配regex。

当有offset条件时,AFTER_PARENT是在匹配完父节点的结果上继续匹配,如果没有offset,则匹配整条日志内容。AFTER_PREMATCH是在匹配完子节点的prematch的基础上继续匹配,如果没有,则匹配整条日志内容。(实现函数:void DecodeEvent(Eventinfo *lf))

order是要获取的字段的名称,根据order中定义的字段,获取日志中的信息(ReadDecodeXML)

然后看有没有插件解码规则: plugin_decoder(系统中实现的)

<decoder name="windows-date-format">
  <prematch>^dddd-dd-dd dd:dd:dd </prematch>
</decoder>
   
<decoder name="windows-firewall">
  <parent>windows-date-format</parent>
  <type>firewall</type>
  <use_own_name>true</use_own_name>
  <prematch offset="after_parent">^OPEN|^CLOSE|^DROP</prematch>
  <regex offset="after_parent">^(w+) (w+) </regex>
  <regex>(S+) (S+) (d+) (d+) </regex>
  <order>action, protocol, srcip, dstip, srcport, dstport</order>
</decoder>

有的decoder中还包含一些特殊的关键字,type表示decoder的类型,也就是日志的类型,表示特殊的日志,包括firewall、syslog、IDS、Apache等。这些特殊的日志,当获取到信息之后,可以通过算法实现进一步的分析,如firewall日志中,可以通过id和type分析得到防火墙的状态。

use_own_name为true时,为规则节点分配独立的ID,否则与父节点一样。这里主要是为了后面的rule匹配的decoded_as.

<decoder name="cisco-ios-ids">
  <parent>cisco-ios</parent>
  <type>ids</type>
  <prematch>^%IPS-4-SIGNATURE: </prematch>
  <regex offset="after_prematch">^Sig:(d+) .+[(S+):(d+) -> </regex>
  <regex>(S+):(d+)]</regex>
  <order>id, srcip, srcport, dstip, dstport</order>
  <fts>name, id, srcip, dstip</fts>
  <ftscomment>First time Cisco IOS IDS/IPS module rule fired.</ftscomment>
</decoder>
   
<decoder name="symantec-websecurity">
  <prematch>^dddddddd,ddd+,</prematch>
  <plugin_decoder>SymantecWS_Decoder</plugin_decoder>   插件解码规则(程序中实现)
</decoder>

fts(First Time Seen),对应rule中的if_fts,第一次触发的规则。(如第一次执行sudo命令)

Ftscomment这里没有用到。程序中为空。(与rule中description重复)

源链接

Hacking more

...