snort规则选项
说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。
snort规则选项 规则选项组成了入侵检测引擎的核心,既易用又强大还灵活。所有的snort规则选项用分号";"隔开。规则选项关键字和它们的参数用冒号":"分开。按照这种写法,snort中有42个规则选项关键字。 msg - 在报警和包日志中打印一个消息。 logto - 把包记录到用户指定的文件中而不是记录到标准输出。 ttl - 检查ip头的ttl的值。 tos 检查IP头中TOS字段的值。 id - 检查ip头的分片id值。 ipoption 查看IP选项字段的特定编码。 fragbits 检查IP头的分段位。 dsize - 检查包的净荷尺寸的值 。 flags -检查tcp flags的值。 seq - 检查tcp顺序号的值。 ack - 检查tcp应答(acknowledgement)的值。 window 测试TCP窗口域的特殊值。 itype - 检查icmp type的值。 icode - 检查icmp code的值。 icmp_id - 检查ICMP ECHO ID的值。 icmp_seq - 检查ICMP ECHO 顺序号的值。 content - 在包的净荷中搜索指定的样式。 content-list 在数据包载荷中搜索一个模式集合。 offset - content选项的修饰符,设定开始搜索的位置 。 depth - content选项的修饰符,设定搜索的最大深度。 nocase - 指定对content字符串大小写不敏感。 session - 记录指定会话的应用层信息的内容。 rpc - 监视特定应用/进程调用的RPC服务。 resp - 主动反应(切断连接等)。 react - 响应动作(阻塞web站点)。 reference - 外部攻击参考ids。 sid - snort规则id。 rev - 规则版本号。 classtype - 规则类别标识。 priority - 规则优先级标识号。 uricontent - 在数据包的URI部分搜索一个内容。 tag - 规则的高级记录行为。 ip_proto - IP头的协议字段值。 sameip - 判定源IP和目的IP是否相等。 stateless - 忽略刘状态的有效性。 regex - 通配符模式匹配。 distance - 强迫关系模式匹配所跳过的距离。 within - 强迫关系模式匹配所在的范围。 byte_test - 数字模式匹配。 byte_jump - 数字模式测试和偏移量调整。 msg msg规则选项告诉记录和报警引擎,记录或报警一个包的内容的同时打印的消息。它是一个简单的文本字符串,转义符是""。 格式: msg: ""; logto logto选项告诉snort把触发该规则的所有的包记录到一个指定的输出日志文件中。这在把来自诸如nmap活动,http cgi扫描等等的数据组合到一起时很方便。需要指出的是当snort工作在二进制记录模式下时这个选项不起作用。 格式: logto:"filename"; ttl 这个规则选项用于设置一个要检查的存活期的值。只有确切地匹配时它所进行的检查才成功。这个选项关键字用于检测traceroute。 格式: ttl:; TOS tos关键字允许你验证IP头中TOS字段为一个特殊的值。只有匹配时才执行成功。 格式: tos: ; id 这个选项关键字用于检测ip头的分片id的值。有些黑客工具(以及别的程序)为了各种目的设置这个域的值,例如一些黑客常使用31337。用一个简单的规则检查这个值就可以对付他们。 格式: id: ; 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: option; Fragbits 这条规则检测IP头中的分段和保留位字段的值,共有三个位能被检测,保留位RB(Reserved Bit ), 更多分段位MF(More Fragments ), 和不分段位DF(Don’t Fragment)。这些位可以结合在一起来检测。使用下面的值来代表这些位,R-RB,M-MF,D-DF。你也可以使用修饰语对特殊的位来指出合理的匹配标准:* + 所有标记匹配特殊位外加任何其他*;*-任何标记匹配如果任何位被设置为*;!如果指定位没有设置就没有标记匹配。 格式: fragbits: ; 例子: alert tcp !$HOME_NET any -> $HOME_NET any (fragbits: R+; msg: "Rerserved bit set!";) dsize dsize选项用于检查包的净荷的大小。它可以设置成任意值,可以使用大于/小于符号来指定范围。例如,如果你知道某个特定的服务有一个特定大小的缓冲区,你可以设定这个选项来监视缓冲区溢出的企图。它在检查缓冲区溢出时比检查净荷内容的方法要快得多。 格式: dsize: [<>][<>]; 说明:“> <”号是可选的。 content content关键字是snort中比较重要的一个。它允许用户设置规则在包的净荷中搜索指定的内容并根据内容触发响应。当进行content选项模式匹配时,Boyer-Moore模式匹配函数被调用,并且对包的内容进行检查(很花费计算能力)。如果包的净荷中包含的数据确切地匹配了参数的内容,这个检查成功并且该规则选项的其他部分被执行。注意这个检查是大小写敏感的。 Content关键字的选项数据比较复杂;它可以包含混合的文本和二进制数据。二进制数据一般包含在管道符号中("|"),表示为字节码(bytecode)。字节码把二进制数据表示为16进制数字,是描述复杂二进制数据的好方法。下面是包含了一个混合数据的snort规则范例。 格式: content: [!] ""; 例子: alert tcp any any -> 192.168.1.0/24 143 (content: "|90C8 C0FF FFFF|/bin/sh"; msg: "IMAP buffer overflow!";) 注:多内容的规则可以放在一条规则中,还有(: ; / “)不能出现在content规则中。如果一条规则前面有一个“!”。那么那些不包含这些内容的数据包将触发报警。这对于关注那些不包含一定内容的数据包是有用的。 offset offset规则选项被用作使用content规则选项关键字的规则的修饰符。这个关键字修饰符指定模式匹配函数从包净荷开始处开始搜索的偏移量。它对于cgi扫描检测规则很有用,cgi扫描的内容搜索字符串不会在净荷的前4个字节中出现。小心不要把这个偏移量设置的太严格了,会有可能漏掉攻击!这个规则选项关键字必须和content规则选项一起使用。 格式: offset: ; depth depth也是一个content规则选项修饰符。它设置了内容模式匹配函数从他搜索的区域的起始位置搜索的最大深度。它对于限制模式匹配函数超出搜索区域指定范围而造成无效搜索很有用。(也就是说,如果你在一个web包中搜索"cgi-bin/phf",你可能不需要浪费时间搜索超过净荷的头20个字节)。 格式: depth: ; 例子: alert tcp any any -> 192.168.1.0/24 80 (content: "cgi-bin/phf"; offset: 3; depth: 22; msg: "CGI-PHF access";) 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";) flags 这个规则检查tcp标志。在snort中有9个标志变量: F - FIN (LSB in TCP Flags byte) S - SYN R - RST P - PSH A - ACK U - URG 2 - Reserved bit 2 1 - Reserved bit 1 (MSB in TCP Flags byte) 0 - No TCP Flags Set 在这些标志之间还可以使用逻辑操作符: + ALL flag, 匹配所有的指定的标志外加一个标志。 * ANY flag, 匹配指定的任何一个标志。 ! NOT flag, 如果指定的标志不在这个数据包中就匹配成功。 保留位可以用来检测不正常行为,例如IP栈指纹攻击或者其他可疑的行为。 格式: 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" "[url]www.pornsite.com[/url]" 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一样好。这些插件被输出插件用来提供一个关于产生报警的额外信息的连接。 确信先看一看如下地方: [url]http://www.snort.org/snort-db[/url] 格式: 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: "|e8 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";) 本文来源:https://www.wddqw.com/doc/9fbad0f1cd2f0066f5335a8102d276a2002960b3.html