
概述 snrot使用一种简单的轻量级的规则描述语言来描述他的规则配置信息,他灵活而强大。在版本1.8之前snort规则必须写在一个单行上,在现在的版本里能够用‘\’来进行折行。 Snort规则被分成两个逻辑部分:规则头和规则选项。规则头包含规则的动作,协议,源和目标ip地址和网络掩码,连同源和目标端口信息;规则选项部分包含报警消息内容和要检查的包的具体部分。下面是个规则范例:
alert tcp any any -> 192.168.1.0/24 111 (content:"|00 01 86 a5|"; msg: "mountd access";) 例1 括号前的部分是规则头,括号内的部分是规则选项。规则选项部分中冒号前的单词称为选项关键字。注意:不是任何规则都必须包含规则选项部分,选项部分只是为了使对要收集或报警,或丢弃的包的定义更加严格。组成一个规则的任何元素对于指定的要采取的行动都必须是真的。当多个元素放在一起时,能够认为他们组成了一个逻辑和(AND)语句。同时,snort规则库文档中的不同规则能够认为组成了一个大的逻辑或(OR)语句。
我们先分别讨论规则头和选项部分。 规则头部分: 规则动作: 规则的头包含了定义一个包的who,where和what信息,连同当满足规则定义的任何属性的包出现时要采取的行动。规则的第一项是"规则动作""规则动作"告诉snort在发现满足规则标准的包时要干什么。在snort中有五种动作:alert,log和pass,activate和dynamic。 1. Alert-使用选择的报警方法生成一个警报,然后记录(log)这个包 2. Log-记录这个包 3. Pass-丢弃(忽略)这个包 4. 报警然后打开另外一个dynamic规则 5. 等待一个activate来激活,在被激活后,向log规则相同记录数据包
协议: 规则的下一部分是协议。Snort当前分析可疑包的ip协议有三种:tcp ,udp和icmp。将来可能会更多,例如arp,igrp,gre,ospf,rip,ipx等。 IP地址: 规则头的下一个部分处理一个给定规则的ip地址和端口号信息。关键字"any"能够被用来定义任何地址。Snort没有提供根据ip地址查询域名的机制。地址就是由直接的数字型ip地址和一个cidr块组成的。Cidr块指示作用在规则地址和需要检查的进入的任何包的网络掩码。/24表示c类网络,/16 表示b类网络,/32表示一个特定的机器的地址。例如,192.168.1.0/24代表从192.168.1.1到192.168.1.255的地址块。在这个地址范围的任何地址都匹配使用这个192.168.1.0/24标志的规则。这种记法给我们提供了一个很好的方法来表示一个很大的地址空间。 在“例一”中,源ip地址被配置为任何连接的电脑,而目标地址被配置为192.168.1.0上的c类网络。 有一个操作符能够应用在ip地址上,他是否定运算符(negation operator)。这个操作符告诉snort匹配除了列出的ip地址以外的任何ip地址。否定操作符用"!"表示。例如,使用否定操作符对“例一”做一个简单修改,使他对任何来自本地网络以外的流都进行报警,如:
alert tcp !192.168.1.0/24 any -> 192.168.1.0/24 111 (content: "|00 01 86 a5|"; msg: "external mountd access";) 例2
这个规则的ip地址代表“任何源ip地址不是来自内部网络而目标地址是内部网络的tcp包” 端口号: 端口号能够用几种方法表示,包括"any"端口,静态端口定义,范围,连同通过否定操作符定义。"any"端口是个通配符,表示任何端口。静态端口定义表示一个单个端口号,例如:111表示portmapper,23表示telnet,80表示http等等。端口范围用范围操作符“:”表示。范围操作符能够有几种使用方法,如: log udp any any -> 192.168.1.0/24 1:1024 记录来自任何端口的,目标端口范围在1到1024的udp数据流 log tcp any any -> 192.168.1.0/24 :6000 记录来自任何端口,目标端口小于等于6000的tcp流 log tcp any :1024 -> 192.168.1.0/24 500: 记录来自任何小于等于1024的特权端口,目标端口大于等于500的tcp流 例3:端口范围 端口否定操作符用“!”表示。他能够用于任何规则类型(除了any)。例如,由于某个古怪的原因您需要记录除x windows端口以外的任何一切,您能够使用 如下的规则:
log tcp any any -> 192.168.1.0/24 !6000:6010 例4:端口否定操作符范例
方向操作符: 方向操作符“->”表示规则所施加的流的方向。方向操作符左边的ip地址和端口号被认为是流来自的源主机,方向操作符右边的ip地址和端口信息是目标主机,更有一个双向操作符“<>”。他告诉snort把地址/端口号对既作为源,又作为目标来考虑。这对于记录/分析双向对话很方便,例如 telnet或pop3会话。用来记录一个telnet会话的两侧的流的范例如下:
log !192.168.1.0/24 any <> 192.168.1.0/24 23 例5:方向操作符示例
activate/dynamic规则 : activate/dynamic规则对扩展了snort功能。使用activate/dynamic规则对,您能够使用一条规则激活另一条规则。当一条特定的规则启动,假如您想要snort接着对符合条件的数据包进行记录时,使用activate/dynamic规则对很方便。除了一个必需的选项 activates外,激活规则(activate rule)很类似于报警规则(alert rule)。动态规则(dynamic rule)和日志规则(log rule)也很相似,但是他需要一个选项:activated_by。动态规则还需要另一个选项:count。当一个激活规则启动,他就打开由 activate/activated_by选项之后的数字指示的动态规则,记录count个数据包。
下面是一条activate/dynamic规则对的规则: activate tcp !$HOME_NET any -> $HOME_NET 143 (flags:PA;content:"|E8C0FFFFFF| in|;activates:1;例6 这个规则使snort在检测到IMAP缓冲区溢出时发出报警,并且记录后续的50个从$HOME_NET之外,发往$HOME_NET的143号端口的数据包。假如缓冲区溢出成功,那么接下来50个发送到这个网络同一个服务端口(这个例子中是143号端口)的数据包中,会有很重要的数据,这些数据对以后的分析很有用处。 下面介绍规则选项部分: 规则选项部分: 规则选项组成了snort入侵检测引擎的核心,既易用又强大还灵活。任何的snort规则选项用分号“;”隔开。规则选项关键字和他们的参数用冒号“:”分开。按照这种写法,snort中有一下一些规则选项关键字。 1、 msg - 在报警和包日志中打印一个消息 2、 logto - 把包记录到用户指定的文档中而不是记录到标准输出 3、 ttl - 检查ip头的ttl的值 4、 tos- 检查ip头的tos域的值 5、 id - 检查ip头的分片id值 6、 ipoption- 检查ip头的option域 7、 fragbits- 检查ip头的分片标志位 8、 dsize - 检查包的数据部分大小 9、 content - 在包的数据部分中搜索指定的样式 10、 offset - content选项的修饰符,设定开始搜索的位置 11、 depth - content选项的修饰符,设定搜索的最大深度 12、 nocase - 指定对content字符串大小写不敏感 13、 content-list ? 在数据包中搜索多种可能匹配 14、 flags -检查tcp flags的值 15、 seq - 检查tcp顺序号的值 16、 ack - 检查tcp应答(acknowledgement)的值 17、 itype - 检查icmp type的值 18、 icode - 检查icmp code的值 19、 session - 记录指定会话的应用层信息的内容 20、 icmp_id - 检查ICMP ECHO ID的值 21、 icmp_seq - 检查ICMP ECHO 顺序号的值 22、 ipoption - 监控IP option的特定代码 23、 rpc - 监控特定应用/进程调用的RPC服务 24、 resp - 主动反应(切断连接等) 25、 reference- 外部参考id 26、 sid- snort的规则id 27、 rev- 规则的修正号 28、 classtype- 规则的分类号 29、 priority- 规则的优先级 30、 uricontent- 在数据包的URI部分搜索指定的匹配 31、 tag- 高级记录动作 32、 ip_proto- ip头的协议值 33、 sameip- 源地址和目标地址相同 34、 stateless- 无状态连接 35、 regex- 通配符模式匹配
msg: msg规则选项告诉记录和报警引擎记录或报警一个包的内容的同时打印的消息。他是个简单的文本字符串,转义符是“\”。 格式:msg:“”; logto: logto选项告诉snort把触发该规则的任何的包记录到一个指定的输出日志文档中。这在把来自诸如nmap活动,http cgi扫描等等的数据组合到一起时很方便。需要指出的是当snort工作在二进制记录模式下时这个选项不起作用。 格式:logto: “”; ttl: 这个规则选项用于指定一个要检查的存活期的值。只有确切地匹配时他所进行的检查才成功。这个选项关键字用于检测traceroute。 格式:ttl: “”; tos: 这个规则选项用于指定要检查指定的tos值。只有确切地匹配时他所进行的检查才成功。 格式:tos:“” id: 这个选项关键字用于检测ip头的分片id的值。有些黑客工具(连同别的程式)为了各种目的配置这个域的值,例如一些黑客常使用31337。用一个简单的规则检查这个值就能够对付他们。 格式:id:“”; ipoption: 假如ip数据包中包含选项域的话,系统将检查选项中指定的参数,有效的参数有: rr-路由记录 eol -列表结束 nop- 无操作(end of list) ts - 时间戳 sec- ip安全选项 lsrr- 宽松源路由 ssrr- 严格源路由 satid- 流标识 格式:ipopts: |