荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: georgehill (人生不定式), 信区: Linux
标  题: Snort规则的编写!(转寄)
发信站: BBS 荔园晨风站 (Fri Sep  8 17:51:13 2000), 站内信件

【 以下文字转载自 georgehill 的信箱 】
【 原文由 georgehill.bbs@smth.org 所发表 】
发信人: xuzq (奔腾), 信区: Security
标  题: Snort规则的编写!(转寄)
发信站: BBS 水木清华站 (Thu Sep  7 15:47:42 2000)

怎样写snort规则(1.6版)
Martin Roesch
翻译:   cyz(cyz@chinasafer.com)
                xuzq(xuzq@chinasafer.com)
目录
基础
规则头
        规则动作
        协议
        ip地址
        端口号
        方向操作符
规则选项
        msg
logto
ttl
id
dsize
content
offset
depth
nocase
flags
seq
ack
itype
icode
session
icmp_id
icmp_seq
ipoption
rpc
resp
预处理器preprocessors
        最小分片(minfrag)
        http解码
        端口扫描
        忽略的端口扫描主机
输出模块
        报警syslog
        记录到tcpdump格式
        记录到postgres
高级规则概念
        包含includes
变量variables
建立好的规则
        内容(content)规则是大小写敏感的
        加速含有content选项的规则



基础
snrot使用一种简单的,轻量级的规则描述语言,踏灵活而强大。在开发snort规则时要记
住几个简单的原则。
第一, snort规则必须写在一个单行上,snort的规则分析器不会处理多行上的规则。
Snort规则被分成两个逻辑部分:规则头和规则选项。规则头包含规则的动作,协议,源
和目标ip地址与网络掩码,以及源和目标端口信息;规则选项部分包含报警消息内容和要
检查的包的具体部分。
下面是一个规则范例:
alert tcp any any -> 192.168.1.0/24 111 (content:"|00 01 86 a5|"; msg:
"mountd access";)
图1-简单的snort规则
第一个括号前的部分是规则头(rule header),包含的括号内的部分是规则选项(rule
options)。规则选项部分中冒号前的单词称为选项关键字(option
keywords)。注意,不是所有规则都必须包含规则选项部分,选项部分只是为了使对要收
集或报警,或丢弃的包的定义更加严格。组成一个规则的所有元素对于指定的要采取的行
动都必须是真的。当多个元素放在一起时,可以认为它们组成了一个逻辑与(AND)语句
。同时,snort规则库文
件中的不同规则可以认为组成了一个大的逻辑或(OR)语句。我们先讨论规则头部分。
规则头
规则动作:
规则的头包含了定义一个包的who,where和what信息,以及当满足规则定义的所有属性的
包出现时要采取的行动。规则的第一项是"规则动作"(rule action),"规则动作"告诉
snort在发现满足规则标准的包时要干什么。在snort中有三种动作:alert,log和pass。
l Alert-使用选择的报警方法生成一个警报,然后记录(log)这个包
l Log-记录这个包
l Pass-丢弃(忽略)这个包
协议
规则的下一部分是协议。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标志的规则。这种记法给我们提供了一个很好的方法来表示一个很大的地
址空间。
在图1中,源ip地址被设置为任何连接的计算机,而目标地址被设置为192.168.1.0上的c
类网络。
有一个操作符可以应用在ip地址上,它是否定运算符(negation operator)。这个操作
符告诉snort匹配除了列出的ip地址以外的所有ip地址。否定操作符用"!"表示。例如,
使用否定操作符对图1中例子做一个简单修改,使它对任何来自本地网络以外的流都进行
报警,如图2:
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地址代表"任何源ip地址不是来自内部网络而目标地址是内部网络的tcp包"
端口号
端口号可以用数中方法表示,包括"any"端口,静态端口定义,范围,以及通过否定操作
符。"any"端口是一个通配符,表示任何端口。静态端口定义表示一个单个端口号,例如
111表示portmapper,12表示telnet,80表示http等等。端口范围用范围操作符":"表示
。范围操作符可以有数中
使用方法,例如图3:
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端口以外的所有一切,你可以使用
类似图4的规则:
log tcp any any -> 192.168.1.0/24 !6000:6010
图4-端口否定操作符范例
方向操作符
方向操作符"->"表示规则所施加的流的方向。方向操作符左边的ip地址和端口号被认为是
流来自的源主机,方向操作符右边的ip地址和端口信息是目标主机,还有一个双向操作符
"<>"。它告诉snort把地址/端口号对既作为源,又作为目标来考虑。这对于记录/分析双
向对话很方便,例如tel
net或者pop3会话。用来记录一个telnet会话的两侧的流的范例见图5:
log !192.168.1.0/24 any <> 192.168.1.0/24 23
图5-使用双向操作符的snort规则
规则选项
规则选项组成了snort入侵检测引擎的核心,既易用又强大还灵活。所有的snort规则选项
用分号";"隔开。规则选项关键字和它们的参数用冒号":"分开。按照这种写法,snort
中有15个规则选项关键字。
l msg - 在报警和包日志中打印一个消息
l logto - 把包记录到用户指定的文件中而不是记录到标准输出
l ttl - 检查ip头的ttl的值
l id - 检查ip头的分片id值
l dsize - 检查包的净荷尺寸的值
l content - 在包的净荷中搜索指定的样式
l offset - content选项的修饰符,设定开始搜索的位置
l depth - content选项的修饰符,设定搜索的最大深度
l nocase - 指定对content字符串大小写不敏感
l flags -检查tcp flags的值
l seq - 检查tcp顺序号的值
l ack - 检查tcp应答(acknowledgement)的值
l itype - 检查icmp type的值
l icode - 检查icmp code的值
l session - 记录指定会话的应用层信息的内容
l icmp_id - 检查ICMP ECHO ID的值
l icmp_seq - 检查ICMP ECHO 顺序号的值
l ipoption - 监视IP option的特定代码
l rpc - 监视特定应用/进程调用的RPC服务
l resp - 主动反应(切断连接等)
msg
msg规则选项告诉记录和报警引擎记录或报警一个包的内容的同时打印的消息。它是一个
简单的文本字符串,转义符是"\"。
格式:
msg: "<message text>";
logto
logto选项告诉snort把触发该规则的所有的包记录到一个指定的输出日志文件中。这在把
来自诸如nmap活动,http cgi扫描等等的数据组合到一起时很方便。需要指出的是当
snort工作在二进制记录模式下时这个选项不起作用。
格式:
        logto: "<filename>";
ttl
这个规则选项用于指定一个要检查的存活期的值。只有确切地匹配时它所进行的检查才成
功。这个选项关键字用于检测traceroute。
格式:
ttl: "<number>";
id
这个选项关键字用于检测ip头的分片id的值。有些黑客工具(以及别的程序)为了各种目
的设置这个域的值,例如一些黑客常使用31337。用一个简单的规则检查这个值就可以对
付他们。
格式:
id: "<number>";
id
dsize选项用于检查包的净荷的大小。它可以设置成任意值,可以使用大于/小于符号来指
定范围。例如,如果你知道某个特定的服务有一个特定大小的缓冲区,你可以设定这个选
项来监视缓冲区溢出的企图。它在检查缓冲区溢出时比检查净荷内容的方法要快得多。
格式:
dsize: [>|<] <number>;
说明:><号是可选的。
content
content关键字是snort中比较重要的一个。它允许用户设置规则在包的净荷中搜索指定的
内容并根据数据触发响应。当进行content选项模式匹配时,Boyer-Moore模式匹配函数被
调用,并且对包的内容进行检查(很花费计算能力)。如果包的净荷中包含的数据确切地
匹配了参数的数据,这
个检查成功,该规则选项检查的其他部分被执行。注意这个检查是大小写敏感的。
Content关键字的选项数据比较复杂;它可以包含混合的文本和二进制数据。二进制数据
一般包含在管道符号中("|"),表示为字节码(bytecode)。字节码把二进制数据表示
为16进制数字,是描述复杂二进制数据的好方法。图7包含了一个混合数据的snort规则范
例。
alert tcp any any -> 192.168.1.0/24 143 (content: "|90C8 C0FF FFFF|/bin/sh";
msg: "IMAP buffer overflow!";)
图7-content规则选项中的混合二进制字节码和文本
格式:
        content: "<content string>";
offset
offset规则选项被用作使用content规则选项关键字的规则的修饰符。这个关键字修饰符
指定模式匹配函数从包净荷开始处开始搜索的偏移量。它对于cgi扫描检测规则很有用,
cgi扫描的内容搜索字符串不会在净荷的前4个字节中出现。小心不要把这个偏移量设置的
太严格了,会有可能漏掉
攻击!这个规则选项关键字必须和content规则选项一切使用。
格式:
offset:<number>;
depth
depth也是一个content规则选项修饰符。它设置了内容模式匹配函数从他搜索的区域的其
始位置搜索的最大深度。它对于限制模式匹配函数超出搜索区域指定范围而造成无效搜索
很有用。(也就是说,如果你在一个web包中搜索"cgi-bin/phf",你可能不需要浪费时间
搜索超过净荷的头20个
字节)组合content,offset,和depth的搜索规则的范例参看图8。
格式:
        depth: <number>;
alert tcp any any -> 192.168.1.0/24 80 (content: "cgi-bin/phf"; offset: 3;
depth: 22; msg: "CGI-PHF access";)
图8-组合content,offset和depth的规则
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";)
图9-带有nocase修饰符的content规则
flags
这个规则检查tcp标志。在snort中有8个标志变量:
l F - FIN (LSB in TCP Flags byte)
l S - SYN
l R - RST
l P - PSH
l A - ACK
l U - URG
l 2 - Reserved bit 2
l 1 - Reserved bit 1 (MSB in TCP Flags byte)
保留位可以用于检测不正常的行为,例如ip栈探测或者其他可疑活动。对于这个检查所有
指定的flags都被处理,这个规则要成功,它们必须都是up的。例如,图10显示了一个
syn-fin扫描检测规则。
格式:
        flags: <flag values>;
alert any any -> 192.168.1.0/24 any (flags: SF; msg: "Possible SYN FIN scan";)
图10-tcp flags指定范例
flags
这个规则选项引用tcp顺序号(sequence number)。基本上,它探测一个包是否有一个静
态的顺序号集,因此很少用。它是为了完整性而包含进来的。
格式:
        seq: <number>;

ack
ack规则选项关键字引用tcp头的确认(acknowledge)部分。这个规则的一个实用的目的
是:检查nmap tcp ping,nmap tcp ping把这个域设置为0,然后发送一个tcp ack flag
置位的包来确定一个网络主机是否活着。这个规则探测到这种活动,如图11:
格式:
ack: <number>;

alert any any -> 192.168.1.0/24 any (flags: A; ack: 0; msg: "NMAP TCP ping";)
图11-tcp ack域的用法
Itype
这条规则测试ICMP的type字段的值。它被设置为使用这个字段的数字值。要得到所有可能
取值的列表,可以参见Snort包中自带的decode.h文件,任何ICMP的参考资料中也可以得
到。应该注意的是,type字段的取值可以超过正常范围,这样可以检查用于拒绝服务或
flooding攻击的非法type
值的ICMP包。
格式:
itype: <number>;

Icode
Icode规则选项关键字和itype规则非常接近,在这里指定一个数值,Snort会探测使用该
值作为code值的ICMP包。超出正常范围的数值可用于探测可疑的流量。
格式:
icode: <number>;

Session
Session关键字是1.3.1.1版本之后新引入的,用于从TCP会话中抽取用户数据。要检查用
户在telnet,rlogin,ftp或web
sessions中的用户输入,这个规则选项特别有用。Session规则选项有两个可用的关键字
作为参数:printable或all。Printable关键字仅仅打印用户可以理解或者可以键入的数
据。All关键字使用16进制值来表示不可打印的字符。该功能会显著地降低Snort的性能,
所以不能用于重载环境。
它适合于对二进制(tcpdump格式)log文件进行后处理。参见图12,是记录telnet会话的
一个好例子。
格式:
session: [printable|all];

log tcp any any <> 192.168.1.0/24 23 (session: printable;)
图12 - 记录可打印的Telnet会话数据。

Icmp_id
Icmp_id选项检查ICMP ECHO数据包中ICMP ID数值是否是指定值。许多秘密通道(covert
channel)程序使用静态ICMP字段通讯,所以该选项在检查这种流量时非常有用。这个特
别的插件用于增强由Max Vision编写的stacheldraht探测规则,但是在探测一些潜在攻击
时确实有效。
格式:
icmp_id: <number>;

Icmp_seq
Icmp_seq选项检查ICMP ECHO数据包中ICMP sequence字段数值是否是指定值。许多秘密通
道(covert channel)程序使用静态ICMP字段通讯,所以该选项在检查这种流量时非常有
用。这个特别的插件用于增强由Max
Vision编写的stacheldraht探测规则,但是在探测一些潜在攻击时确实有效。(我知道该
字段的信息和icmp_id的描述几乎完全相同,实际上它们就是同样的东西!)
格式:
icmp_seq: <number>;

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>;

Rpc
这个选项查看RPC请求,并自动将应用(Application),过程(procedure)和程序版本
(program version)译码,如果所有三个值都匹配的话,该规则就显示成功。这个选项
的格式为"应用,过程,版本"。在过程和版本域中可以使用通配符"*"。
格式:
icmp_seq: <number, [number|*], [number|*]>;

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: <resp_modifier[, resp_modifier...]>;
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使用示例

预处理程序
预处理程序概述
预处理程序从Snort版本1.5开始引入,使得Snort的功能可以很容易地扩展,用户和程序
员能够将模块化的插件方便地融入Snort之中。预处理程序代码在探测引擎被调用之前运
行,但在数据包译码之后。通过这个机制,数据包可以通过额外的方法被修改或分析。
使用preprocessor关键字加载和配置预处理程序。在Snort规则文件中的preprocessor指
令格式如下:
preprocessor <name>: <options>

preprocessor minfrag: 128
图15 - preprocessor指令格式示例

可用的预处理程序模块

Minfrag
Minfrag预处理程序检查给定尺寸限制的分片数据包。数据包被分片通常是由源和目的主
机之间的路由器引起的。一般说来,商业网络设备不会产生小于512字节的分片包。所以
我们可以利用这个事实,来监控含有小分片的流量,这些分片通常是由某人为了隐藏在分
片之中的信息而产生的。

格式:
minfrag: <threshold number>

HTTP Decode
HTTP Decode用于处理HTTP URI字符串,将串中的数据转化为可读的ASCII字串。可以击败
隐蔽(evasive?)的Web
URL扫描器和敌对的入侵者,如果不对HTTP流量内容进行可以行为分析,这些攻击手段可
能漏网而不会被检测出来。该预处理程序模块使用HTTP端口号(通常是80和8080)作为其
参数。
格式:
http_decode: <port list>

preprocessor http_decode: 80 8080
图16 - HTTP Decode指令格式示例

Portscan Detector
Snort Portscan预处理程序由Patrick Mullen开发,更多的信息在他的主页上可以找到(
http://spyjurenet.com/linuxrc.org/projects/snort/)。
Snort Portscan预处理程序的用处:
向标准记录设备中记录从一个源IP地址来的端口扫描的开始和结束。
如果指定了一个记录文件,在记录扫描类型的同时也记录目的IP地址和端口。
端口扫描定义为在时间T(秒)之内向超过P个端口进行TCP连接尝试,或者在时间T(秒)
之内向超过P个端口发送UDP数据包。端口扫描可以是对任一IP地址的多个端口,也可以是
对多个IP地址的同一端口进行。现在这个版本可以处理一对一和一对多方式的端口扫描,
下一个完全版本将可以
处理分布式的端口扫描(多对一或多对多)。端口扫描也包括单一的秘密扫描(stealth
scan)数据包,比如NULL,FIN,SYNFIN,XMAS等。如果包括秘密扫描的话,端口扫描模
块会对每一个扫描数据包告警。为避免这种情况,可以在Snort标准发行版中的scan-lib
文件里把有关秘密扫描数据包的小节注释掉,这样对每次扫描就只记录一次。如果使用外
部记录特性,可以在记录
文件中看到(端口扫描的?)技术和类型。
该模块的参数如下:
network to monitor - 监视端口扫描的目标网络以network/CIDR表示
number of ports - 在探测期间访问的端口数目
detection period - 以秒计数的端口访问时间限制
logdir/filename - 告警信息存放的目录/文件名,告警也可以写入标准的告警文件中。
格式:
portscan: <network to monitor> <number of ports> <detection period>
<logdir/filename>

preprocessor portscan: 192.168.1.0/24 5 7 /var/log/portscan.log
图17 - 端口扫描模块的配置示例

Portscan Ignorehosts
由Patrick Mullen编写的另一个模块修改了端口扫描探测的系统操作。如果用户的服务器
(比如NTP,NFS和DNS服务器)会妨碍端口扫描的探测,可以通知portscan模块忽略源自
这些主机的TCP SYN和UDP端口扫描。该模块的参数为IPs/CIDR的列表。
格式:
portscan-ignorehosts: <host list>

preprocessor portscan-ignorehosts: 192.168.1.5/32 192.168.3.0/24
图18 - Portscan Ignorehosts 模块配置示例


输出模块
输出模块概述
输出模块是版本1.6的新特性。这个模块使得Snort在向用户提供格式化输出时更加灵活。
输出模块在Snort的告警和记录子系统被调用时运行,在预处理程序和探测引擎之后。规
则文件中指令的格式非常类似于预处理程序。
注意:如果在运行时指定了命令行的输出开关,在Snort规则文件中指定的输出模块会被
替代。例如,如果在规则文件中指定了alert_syslog模块,但在命令行中使用了"-A
fast"选项,则alert_syslog模块会被禁用而使用命令行开关。
在规则文件中通过指定output关键字,使得在运行时加载输出模块。
格式:
output <name>: <options>

output alert_syslog: LOG_AUTH LOG_ALERT
图19 - 输出模块配置示例

可用的输出模块:
Alert_syslog
该模块向syslog设备发送告警(很像命令行中的-s开关)。该模块也允许用户指定记录设
备,优先于Snort规则文件中的设定,从而在记录告警方面给用户更大的灵活性。
可用关键字:
选项(Options)
LOG_CONS
LOG_NDELAY
LOG_PERROR
LOG_PID
设备(Facilities)
LOG_AUTH
LOG_AUTHPRIV
LOG_DAEMON
LOG_LOCAL0
LOG_LOCAL1
LOG_LOCAL2d
LOG_LOCAL3
LOG_LOCAL5
LOG_LOCAL6
LOG_LOCAL7
LOG_USER
优先级(Priorities)
LOG_EMERG
LOG_ALERT
LOG_CRIT
LOG_ERR
LOG_WARNING
LOG_NOTICE
LOG_INFO
LOG_DEBUG

格式:
alert_syslog: <facility> <priority> <options>


Log_tcpdump
log_tcpdump模块将数据包记录到tcpdump格式的文件中。这便于使用已有的多种检查
tcpdump格式文件的工具,来对收集到的流量数据进行后处理工作。该模块只接受一个参
数,即输出文件名
格式:
log_tcpdump: <output filename>

output log_tcpdump: snort.log
图20 - Tcpdump输出模块的配置示例

 Log_postgresql
该模块由Jed Pickel提供将Snort数据记录到Postgres SQL数据库中。更多的有关安装和
配置该模块的信息可以在Incident.org (http://www.incident.org/snortdb)找到。这
个插件的参数是数据库名称和一个参数列表。参数由格式parameter = argument来指定。
可用参数如下:
host - 连接主机。如果指定了一个非零字串,就使用TCP/IP通讯。如果不指定主机名,
libpq会使用Unix domain socket连接。
port - 连接服务器主机的端口号,或者是Unix-domain连接的socket文件名扩展。
dbname - 数据库名。
user - 身份认证用的用户名。
password - 如果对端要求口令认证,就使用这个口令。
options - 向对端发送trace/debug选项。
tty -- file or tty 从对端发来的可选调试输出。

格式:
log_postgresql: <database name>, <parameter list>

规则高级概念:
Includes
这是Snort版本1.3.1.2之后加入的新规则,提供了文件剖析功能,由Christian Lademann
开发,包含两个新的文件规则关键字。第一个关键字是include,允许由命令行指定的规
则文件包含其他的规则文件。

格式:
include: <include file path/name>
注意在该行结尾处没有分号。被包含的文件会把任何预先定义的变量值替换为自己的变量
引用。参见变量(Variables)一节以获取关于在SNORT规则文件中定义和使用变量的更多
信息。

Variables

从版本1.3.1.2开始,Snort中开始定义变量。图21中显示了使用var关键字的简单替换变
量集。

格式:

var: <name> <value>

var MY_NET 192.168.1.0/24
alert tcp any any -> $MY_NET any (flags: S; msg: "SYN packet";)
图21 - 定义和使用变量的示例

规则变量名可以用多种方法修改。可以在"$"操作符之后定义变量。"?" 和 "-"可用于变
量修改操作符。
$var - 定义变量
$(var) - 用变量"var"的值替换
$(var:-default) - 用变量"var"的值替换,如果"var"没有定义用"default"替换。
$(var:?message) - 用变量"var"的值替换或打印出错误消息"message"然后退出。
Action中规则修改符的例子参见图13。

var MY_NET $(MY_NET:-192.168.1.0/24)
log tcp any any -> $(MY_NET:?MY_NET is undefined!) 23
图22 - 高级变量使用示例

创建好的规则:

为了开发最有效和注重速度的Snort规则,必须记住一些通用的概念。
规则的内容选项(内容规则)是大小写敏感的(除非使用了"nocase"选项)
不要忘了内容规则是大小写敏感的,而且许多程序通常使用大写字母来代表命令。FTP是
一个好例子。考察下面这两个例子:
alert tcp any any -> 192.168.1.0/24 21 (content: "user root"; msg: "FTP root
login";)
alert tcp any any -> 192.168.1.0/24 21 (content: "USER root"; msg: "FTP root
login";)
第二个规则可以捕获几乎每一个自动的root登录尝试,但是使用小写user的第一个规则就
不能。

加速含有内容选项的规则

探测引擎运用规则的顺序和它们在规则中的书写顺序无关。内容规则选项总是最后一个被
检验。利用这个事实,应该先运用别的快速规则选项,由这些选项决定是否需要检查数据
包的内容。例如:在TCP会话建立起来后,从客户端发来的数据包,PSH和ACK这两个TCP标
志总是被置位的。如果
想检验从客户端到服务器的有效载荷,利用这个事实,就可以先进行一次TCP标志检验,
这比式样匹配算法(pattern match
algorithm)在计算上节约许多。使用内容选项的规则要加速的一个简便方法就是也进行
一次标志检验,如图23。基本思想是,如果PSH和ACK标志没有置位,就不需要对数据包的
有效载荷进行检验。如果这些标志置位,检验标志而带来的计算能力消耗是可以忽略不计
的。

alert tcp any any -> 192.168.1.0/24 80 (content: "cgi-bin/phf"; flags: PA;
msg: "CGI-PHF probe";)
图23 - 使用TCP标志检验来加速内容规则

Version 1.1, All rights reserved, ? Copyright 1999,2000 Martin Roesch



--

※ 来源:·BBS 水木清华站 smth.org·[FROM: 210.73.88.186]
--
※ 转载:·BBS 荔园晨风站 bbs.szu.edu.cn·[FROM: 192.168.1.115]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店