Snort(入侵检测系统)中文手册 (2)
flags: [,mask value];
例子:
alert any any -> 192.168.1.0/24 any (flags: SF,12; msg: "Possible SYN FIN scan";)
seq
这个规则选项引用tcp顺序号(sequence number)。基本上,它探测一个包是否有一个静态的顺序号集,因此很少用。它是为了完整性而包含进来的。
格式:
seq: ;
ack
ack规则选项关键字引用tcp头的确认(acknowledge)部分。这个规则的一个实用的目的是:检查nmap tcp ping,nmap tcp ping把这个域设置为0,然后发送一个tcp ack flag置位的包来确定一个网络主机是否活着。
格式:
ack: ;
例子:
alert any any -> 192.168.1.0/24 any (flags: A; ack: 0; msg: "NMAP TCP ping";)
Window
这条规则选项指向TCP窗口大小。这个选项检查静态窗口大小,此外别无他用。包括它只是为了完整性。
格式:
window:[!];
Itype
这条规则测试ICMP的type字段的值。它被设置为使用这个字段的数字值。要得到所有可能取值的列表,可以参见Snort包中自带的decode.h文件,任何ICMP的参考资料中也可以得到。应该注意的是,type字段的取值可以超过正常范围,这样可以检查用于拒绝服务或flooding攻击的非法type值的ICMP包。
格式:
itype: ;
Icode
Icode规则选项关键字和itype规则非常接近,在这里指定一个数值,Snort会探测使用该值作为code值的ICMP包。超出正常范围的数值可用于探测可疑的流量。
格式:
icode: ;
Session
Session关键字用于从TCP会话中抽取用户数据。要检查用户在telnet,rlogin,ftp或web sessions中的用户输入,这个规则选项特别有用。Session规则选项有两个可用的关键字作为参数:printable或all。Printable关键字仅仅打印用户可以理解或者可以键入的数据。All关键字使用16进制值来表示不可打印的字符。该功能会显著地降低Snort的性能,所以不能用于重负载环境。它适合于对二进制(tcpdump格式)log文件进行事后处理。
格式:
session: [printable all];
例子
log tcp any any <> 192.168.1.0/24 23 (session: printable;)
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_id的描述几乎完全相同,实际上它们就是同样的东西!)
格式:
icmp_seq: ;
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";)
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:
使用resp选项时要小心,因为很容易就会使snort陷入无限循环中,例如如下规则:
alert tcp any any -> 192.168.1.1/24 any (msg: "aiee!"; resp: rst_all;)
content_list
content_list 关键字允许多内容字符串被放在一个单独的内容匹配选项中,被匹配的字符串被存放在指定的文件中,而且每个字符串要单独占用一行。否则他们就等同于一个content字符串。这个选项是react关键字的基础。
格式;
content-list: ;
下面是一个文件的内容:
# adult sites
"porn"
"porn"
"adults"
"hard core"
"www.pornsite.com"
React
注意,使用这个功能很容易使网络流量陷入回路。React关键字以匹配一个规则时所作出的灵活的反应为基础。基本的反应是阻塞一些引人注意的站点的用户的访问。响应代码允许snort积极的关掉有冒犯行为的访问和/或发送一个通知给浏览者。这个通知可以包含你自己的注释。这个选项包括如下的基本修饰词:
block——关闭连接并且发送一个通知
warm——发送明显的警告信息
基本修饰词可以和如下的附加修饰词组合使用:
msg——把msg选项的内容包含进阻塞通知信息中
proxy——使用代理端口发送通知信息
大量的附加修饰词由逗号隔开,react 关键字将被放在选项的最后一项。
格式:
react: ;
例子:
alert tcp any any <> 192.168.1.0/24 80 (content: "bad.htm"; msg: "Not for children!"; react: block, msg;)
reference
这个关键字允许规则包含一个外面的攻击识别系统。这个插件目前支持几种特定的系统,它和支持唯一的URL一样好。这些插件被输出插件用来提供一个关于产生报警的额外信息的连接。
确信先看一看如下地方:
http://www.snort.org/snort-db
格式:
reference: ,;
例子:
alert tcp any any -> any 7070 (msg: "IDS411/dos-realaudio"; flags: AP; content: " fff4 fffd 06 "; reference: arachNIDS,IDS411;)
alert tcp any any -> any 21 (msg: "IDS287/ftp-wuftp260-venglin-linux"; flags: AP; content: " 31c031db 31c9b046 cd80 31c031db "; reference: arachNIDS,IDS287; reference: bugtraq,1387; reference: cve,CAN-2000-1574; )
Sid
这个关键字被用来识别snort规则的唯一性。这个信息允许输出插件很容易的识别规则的ID号。
sid 的范围是如下分配的:
<100 保留做将来使用
100-1000,000 包含在snort发布包中
>1000,000 作为本地规则使用
文件sid-msg.map 包含一个从msg标签到snort规则ID的映射。这将被post-processing 输出模块用来映射一个ID到一个报警信息。
格式:
sid: ;
rev
这个关键字是被用来识别规则修改的。修改,随同snort规则ID,允许签名和描述被较新的信息替换。
格式:
rev:
Classtype
这个关键字把报警分成不同的攻击类。通过使用这个关键字和使用优先级,用户可以指定规则类中每个类型所具有的优先级。具有classification的规则有一个缺省的优先级。
格式:
classtype:
在文件classification.config中定义规则类。这个配置文件使用如下的语法:
config classification: ,
Priority
这个关键字给每条规则赋予一个优先级。一个classtype规则具有一个缺省的优先级,但这个优先级是可以被一条priority规则重载的。
格式:
priority: ;
Uricontent
这个关键字允许只在一个请求的URI(URL)部分进行搜索匹配。它允许一条规则只搜索请求部分的攻击,这样将避免服务数据流的错误报警。关于这个关键字的参数的描述可以参考content关键字部分。这个选项将和HTTP解析器一起工作。(只能搜索第一个“/”后面的内容)。
格式:
uricontent:[!];
Tag
这个关键字允许规则记录不仅仅是触发这条规则的那个数据包。一旦一条规则被触发,来自这个主机的数据包将被贴上“标签”。被贴上标签的数据流将被记录用于随后的响应代码和提交攻击流量的分析。
格式:
tag: , , , [direction]
type
session 记录触发这条规则的会话的数据包
host 记录激活tag规则的主机的所有数据包(这里将使用[direction]修饰词
count Count 指定一个单位的数量。这个单位由给出。
metric
packets 标记主机/会话的个数据包。
seconds 标记主机/会话的秒。
例子:
alert tcp !$HOME_NET any -> $HOME_NET 143 (flags: A+; content: " e 8 c0ff ffff /bin/sh"; tag: host, 300, packets, src; msg: "IMAP Buffer overflow, tagging!";)
alert tcp !$HOME_NET any -> $HOME_NET 23 (flags: S; tag: session, 10, seconds; msg: "incoming telnet session";)
Ip_proto
Ip_proto关键字允许检测IP协议头。这些协议可以是由名字标识的,参考/etc/protocols文件。在规则中要谨慎使用ip_protocol关键字。
格式:
ip_proto:[!] ;
例子:
alert ip !$HOME_NET any -> $HOME_NET any (msg: "IGMP traffic detected"; ip_proto: igmp;)
SameIP
Sameip关键字允许规则检测源IP和目的IP是否相等。
格式:
sameip;
例子:
alert ip $HOME_NET any -> $HOME_NET any (msg: "SRC IP == DST IP"; sameip;)
Regex
这个模块现在还正在开发,所以在当前的产品规则集中还不能使用。如果使用的话,它将触发一个错误信息。
Flow
这个选项要和TCP流重建联合使用。它允许规则只应用到流量流的某个方向上。这将允许规则只应用到客户端或者服务器端。这将能把内网客户端流览web页面的数据包和内网服务器所发送的数据包区分开来。这个确定的关键字能够代替标志:A+ 这个标志在显示已建立的TCP连接时都将被使用。
选项:
to_client 触发服务器上从A到B的响应。
to_server 触发客户端上从A到B的请求。
from_client 触发客户端上从A到B的请求。
from_server触发服务器上从A到B的响应。
established 只触发已经建立的TCP连接。
stateless 不管流处理器的状态都触发(这对处理那些能引起机器崩溃的数据包很有用。
no_stream 不在重建的流数据包上触发(对dsize 和 stream4 有用。
only_stream 只在重建的流数据包上触发。
格式:
flow:[to_client to_server from_client from_server established stateless no_stream only_stream]}
例子:
alert tcp !$HOME_NET any -> $HOME_NET 21 (flow: from_client; content: "CWD incoming"; nocase; msg: "cd incoming detected"; )
alert tcp !$HOME_NET 0 -> $HOME_NET 0 (msg: "Port 0 TCP traffic"; flow: stateless;)
Fragoffset
这个关键字允许把IP分段偏移值和一个十进制数相比较。为了抓到一个IP会话的第一个分段,你可以使用这个fragbits关键字并且和fragoffset:0 选项一起查看更多的分段选项。
格式:
fragoffset:[< >]
例子:
alert ip any any -> any any (msg: "First Fragment"; fragbits: M; fragoffset: 0;)
Rawbytes
Rawbytes关键字允许规则查看telnet 解码数据来处理不常见的数据。这将使得telnet 协议代码独立于预处理程序来检测。这是对前面的content 的一个修饰。
格式:
rawbytes;
例子:
alert tcp any any -> any any (msg: "Telnet NOP"; content: " FF F1 "; rawbytes;)
distance
distance关键字是content关键字的一个修饰词,确信在使用content时模式匹配间至少有N个字节存在。它被设计成在规则选项中和其他选项联合使用。
格式:
distance: ;
例子:
alert tcp any any -> any any (content: "2 Patterns"; content: "ABCDE"; content: "EFGH"; distance: 1;)
Within
Winthin关键字是content关键字的一个修饰词,确保在使用content时模式匹配间至多有N个字节存在。它被设计成在规则选项中和distance选项联合使用。
格式:
within: ;
例子:
alert tcp any any -> any any (content: "2 Patterns"; content: "ABCDE"; content: "EFGH"; within: 10;)
Byte_Test
测试一个字节的域为特定的值。能够测试二进制值或者把字节字符串转换成二进制后再测试。
格式:byte_test: , , , [relative],[big],[little],[string],[hex],[dec],[oct]
bytes_to_convert 从数据包取得的字节数。
operator 对检测执行的操作 (<,>,=,!)。
value 和转换后的值相测试的值。
offset 开始处理的字节在负载中的偏移量。
relative 使用一个相对于上次模式匹配的相对的偏移量。
big 以网络字节顺序处理数据(缺省)。
little 以主机字节顺序处理数据。
string 数据包中的数据以字符串形式存储。
hex 把字符串数据转换成十六进制数形式。
dec 把字符串数据转换成十进制数形式。
oct 把字符串数据转换成八进制数形式。
例子:
alert udp $EXTERNAL_NET any -> $HOME_NET any (msg:"AMD procedure 7 plog overflow "; content: " 00 04 93 F3 "; content: " 00 00 00 07 "; distance: 4; within: 4; byte_test: 4,>, 1000, 20, relative;)
alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg:"AMD procedure 7 plog overflow "; content: " 00 04 93 F3 "; content: " 00 00 00 07 "; distance: 4; within: 4; byte_test: 4, >,1000, 20, relative;)
Byte_Jump
Byte_jump 选项用来取得一定数量的字节,并把它们转换成数字形式,跳过一些字节以进一步进行模式匹配。这就允许相对模式匹配在网络数据中进行数字值匹配。
格式:
byte_jump: , [relative],[big],[little],[string],[hex],[dec],[oct],[align]
bytes_to_convert 从数据包中选出的字节数。
offset 开始处理的字节在负载中的偏移量。
relative 使用一个相对于上次模式匹配的相对的偏移量。
big 以网络字节顺序处理数据(缺省)。
little 以主机字节顺序处理数据。
string 数据包中的数据以字符串形式存储。
hex 把字符串数据转换成十六进制数形式。
dec 把字符串数据转换成十进制数形式。
oct 把字符串数据转换成八进制数形式。
align 以32位为边界对转换的字节数对齐,即转换的字节数为4的倍数。
例子:
alert udp any any -> any 32770:34000 (content: " 00 01 86 B8 "; content: " 00 00 00 01 "; distance: 4; within: 4; byte_jump: 4, 12, relative, align; byte_test: 4, >, 900, 20, relative; msg: "statd format string buffer overflow";)