概述 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:; fragbits: 使
用这个规则选项可以观察IP包头的分片位和保留位。它们在IP包头的标识域,共有3位,分别是:保留为(reserved
bit,RB)、还有分组片位(more fragments,MF)、不可分片(dont
fragment,DF)。这些位可以以各种方式组合检查,使用下面的值指定: R:保留位 D:DF位 M:MF位 你也可以使用修饰符号对特定的位进行逻辑组合: +--ALL标志,指定的位加上任何其它的位为真 *--ANY标志,指定的任何位为真 !--NOT标志,指定的位不为真 格式: fragbits: ; alert tcp !$HOME_NET any -> $HOME_NET any (fragbits:R+;msg:"Reserverd IP bit set!";) 例7 dsize: 选项用于检查包的数据区的大小。它可以设置成任意值,可以使用大于/小于符号来指定范围。例如,如果你知道某个特定的服务有一个特定大小的缓冲区,你可以设定这个选项来监视缓冲区溢出的企图。它在检查缓冲区溢出时比检查数据区内容的方法要快得多。 格式:dsize: [>|<] (><号是可选的)。 content: content
关键字是snort中比较重要的一个。它允许用户设置规则在包的数据区中搜索指定的内容并根据数据触发响应。当进行content选项模式匹配时,
Boyer-Moore模式匹配函数被调用,并且对包的内容进行检查(很花费计算能力)。如果包的数据区中包含的数据确切地匹配了参数的数据,这个检查成
功,该规则选项检查的其他部分被执行。注意这个检查是大小写敏感的。Content关键字的选项数据比较复杂;它可以包含混合的文本和二进制数据。二进制
数据一般包含在管道符号中(“|”),表示为字节码(bytecode)。字节码把二进制数据表示为16进制数字,是描述复杂二进制数据的好方法。
content选项也可以使用“!”符号来标识。下面的例子中包含了一个混合数据的snort规则: alert tcp any any -> 192.168.1.0/24 143 (content: "|90C8 C0FF FFFF|/bin/sh"; msg: "IMAP buffer overflow!";)
例8 格式:content: “<匹配串>”; offset: offset规则选项被用作使用
content规则选项关键字的规则的修饰符。这个关键字修饰符指定模式匹配函数从数据包开始处开始搜索的偏移量。它对于
cgi扫描检测规则很有用,cgi扫描的内容搜索字符串不会在数据区的前4个字节中出现。小心不要把这个偏移量设置的太严格了,会有可能漏掉攻击!这个规
则选项关键字必须和content规则选项一切使用。 格式:offset:; depth: depth
也是一个content规则选项修饰符。它设置了内容模式匹配函数从他搜索的区域的其始位置搜索的最大深度。它对于限制模式匹配函数超出搜索域指定范围而
造成无效搜索很有用。(也就是说,如果你在一个web包中搜索"cgi-bin/phf",你可能不需要浪费时间搜索超过数据区的头20个字节)组合
content,offset,和depth的搜索规则的范例参看例八: 格式:depth: ; alert tcp any any -> 192.168.1.0/24 80 (content: "cgi-bin/phf"; offset: 3; depth: 22; msg: "CGI-PHF access";) 例9 nocase: nocase选项用于取消content规则中的大小写敏感性。它在规则中指定后,任何与包数据区进行比较的ascii字符都被即作为大写又作为小写对待。 格式:nocase; alert tcp any any -> 192.168.1.0/24 21 (content: "USER root"; nocase; msg: "FTP root user access attempt";) 例10 content-list: 使用content-list关键词可以指定更多的正文字符串,突破了content规则选项只能指定单一字符串的限制。表18是一个conternt-list文件。每个要搜索的字符串占一行。这个规则选项是使用react关键词的基础。 #adult sites porn adults hard core # ... content-list文件 格式: content-list:"";
flags: 这个规则检查tcp标志。在snort中有8个标志变量: 1、 F - FIN (LSB in TCP Flags byte) 2、 S - SYN 3、 R - RST 4、 P - PSH 5、 A - ACK 6、 U - URG 7、 2 - Reserved bit 2 8、 1 - Reserved bit 1 (MSB in TCP Flags byte) 9、 0-没有tcp标志被设置 保留位可以用于检测不正常的行为,例如ip栈探测或者其他可疑活动。对于这个检查所有指定的flags都被处理,这个规则要成功,它们必须都是up的。例如,例十显示了一个syn-fin扫描检测规则。 格式中也可以使用逻辑操作符对指定的标志位进行操作: +:ALL,指定的标志位和其它任意的标志位为真 *:ANY,指定的标志位中任意的标志位为真 !:NOT,除了指定标志位外,任意的标志位为真
格式: flags: ; alert any any -> 192.168.1.0/24 any (flags: SF; msg: "Possible SYN FIN scan";) 例11-tcp flags指定范例
seq: 这个规则选项引用tcp顺序号(sequence number)。基本上,它探测一个包是否有一个静态的顺序号集,因此很少用。它是为了完整性而包含进来的。 格式:seq: ;
ack: ack规则选项关键字引用tcp头的确认(acknowledge)部分。这个规则的一个实用的目的是:检查nmap
tcp ping,nmap tcp ping把这个域设置为0,然后发送一个tcp ack
flag置位的包来确定一个网络主机是否活着。这个规则探测到这种活动,如例11: 格式:ack: ;
alert any any -> 192.168.1.0/24 any (flags: A; ack: 0; msg: "NMAP TCP ping";) 例12-tcp ack域的用法 Itype : 这
条规则测试ICMP的type字段的值。它被设置为使用这个字段的数字值。要得到所有可能取值的列表,可以参见Snort包中自带的decode.h文
件,任何ICMP的参考资料中也可以得到。应该注意的是,type字段的取值可以超过正常范围,这样可以检查用于拒绝服务或flooding攻击的非法
type值的ICMP包。 格式:itype: ; Icode : Icode规则选项关键字和itype规则非常接近,在这里指定一个数值,Snort会探测使用该值作为code值的ICMP包。超出正常范围的数值可用于探测可疑的流量。 格式:icode: ; Session: Session
关键字是1.3.1.1版本之后新引入的,用于从TCP会话中抽取用户数据。要检查用户在telnet,rlogin,ftp或web
sessions中的用户输入,这个规则选项特别有用。Session规则选项有两个可用的关键字作为参数:printableall。
Printable关键字仅仅打印用户可以理解或者可以键入的数据。All关键字使用16进制值来表示不可打印的字符。该功能会显著地降低Snort的性
能,所以不能用于重载环境。它适合于对二进制(tcpdump格式)log文件进行后处理。 格式:session: [printable|all]; Icmp_id : Icmp_id
选项检查ICMP ECHO数据包中ICMP ID数值是否是指定值。许多秘密通道(covert
channel)程序使用静态ICMP字段通讯,所以该选项在检查这种流量时非常有用。这个特别的插件用于增强由Max
Vision编写的stacheldraht探测规则,但是在探测一些潜在攻击时确实有效。 格式:icmp_id: ; Icmp_seq : Icmp_seq选项检查ICMP ECHO数据包中ICMP sequence字段数值是否是指定值。许多秘密通道(covert channel)程序使用静态ICMP字段通讯,所以该选项在检查这种流量时非常有用。这个特别的插件用于增强由Max Vision编写的stacheldraht探测规则,但是在探测一些潜在攻击时确实有效。 格式:icmp_seq: ; Ipoption: 如果数据包中使用了IP选项,Ipoption选项会查找使用中的某个特别IP选项,比如源路由。这个选项的合法参数如下: rr - Record route(记录路由) eol - End of list (列表结尾) nop - No op (无所作为) ts - Time Stamp (时间戳) sec - IP security option (IP安全选项) lsrr - Loose source routing (松散源路由) ssrr - Strict source routing (严格源路由) satid - Stream identifier (流标示符) 松散和严格源路由是IP选项中最经常被检查的内容,但是它们并没有被用在任何广泛使用 的Internet应用中。每一个特定的规则只能用这个选项一次。 格式:ipoption: ; Rpc: 这
个选项查看RPC请求,并自动将应用(Application),过程(procedure)和程序版本(program
version)译码,如果所有三个值都匹配的话,该规则就显示成功。这个选项的格式为"应用,过程,版本"。在过程和版本域中可以使用通配符"*"。
格式:rpc:; alert tcp any any -> 192.168.1.0/24 111 (rpc: 100000,*,3; msg:"RPC getport (TCP)";) alert udp any any -> 192.168.1.0/24 111 (rpc: 100000,*,3; msg:"RPC getport (UDP)";) alert udp any any -> 192.168.1.0/24 111 (rpc: 100083,*,*; msg:"RPC ttdb";) alert udp any any -> 192.168.1.0/24 111 (rpc: 100232,10,*; msg:"RPC sadmin";) 例13-多种RPC调用告警 Resp : Resp关键字可以对匹配一条Snort规则的流量进行灵活的反应(flexible reponse -FlexResp)。FlexResp代码允许Snort主动地关闭恶意的连接。该模块合法的参数如下: rst_snd - 向发送方发送TCP-RST数据包 rst_rcv - 向接受方发送TCP-RST数据包 rst_all - 向收发双方发送TCP_RST数据包 icmp_net - 向发送方发送ICMP_NET_UNREACH icmp_host - 向发送方发送ICMP_HOST_UNREACH icmp_port - 向发送方发送ICMP_PORT_UNREACH icmp_all - 向发送方发送上述所有的ICMP数据包 在向目标主机发送多种会应数据包时,这些选项组合使用。多个参数之间使用逗号分隔。 格式:resp: ;
alert tcp any any -> 192.168.1.0/24 1524 (flags: S; resp: rst_all; msg: "Root shell backdoor attempt";) alert udp any any -> 192.168.1.0/24 31 (resp: icmp_port,icmp_host; msg: "Hacker's Paradise access attempt";) 例14 - FlexResp使用示例 react : react
关键词是基于FlexResp(flexible
response)的,它使snort对匹配某个规则的数据包作出反应。基本的反应就是阻塞用户要访问的站点,例如色情站点。snort的
FlexResp插件能够主动关闭恶意连接,如果连接使用的是http或者代理服务器端口,FlexResp插件就会向浏览器发出一条
HTML/JavaScript警告信息。这个规则选项可以使用下面几个参数: block:关闭连接并发出注意信息 warn:发出警告信息 这两个参数是基本参数,它们可以和下面的可选参数组合使用: msg:定义要包含在警告信息中的文本 proxy::使用代理服务器端口发送警告信息 可选参数使用逗号分开,react关键词应该放在选项的最后。例如: alert tcp any any <> 192.168.1.0/24 80 (content-list:"adults";msg:"Not for children!";react:block,msg;)
alert tcp any any <> 192.168.1.0/24 any (content-list:"adults";msg:"Adults list access attempt";react:block;) 例15 react规则 格式:
react:;
sid: 这个选项用来唯一标识snort规则,sid的范围有如下的设定: <100 当前保留 100—1,000,000 snort 使用 >1,000,000 用户可自由使用 格式:sid:
classtype:
这个选项对攻击行为进行归类,归类可以和优先级一起使用,使某种类型的攻击行为可得到优先的处理。
格式:classtype:<类型名>
priority:
这个选项用来限定指定规则的优先级。
格式:priority:
uricontent: 这个选项使只在请求数据包的URI部分搜索指定的模式串。 格式:urico