如何编写snort的检测规则
2013年09月08日 ⁄ 综合 ⁄ 共 16976字
前言
snort是一个强大的轻量级的网络入侵检测系统。它具有实时数据流量分析和日志IP网络数据包的能力,能够进行协议分析,
对内容进行搜索/匹配。它能够检测各种不同的攻击方式,对攻击进行实时报警。此外,snort具有很好的扩展性和可移植性。本文将讲述如何开发snort
规则。
1.基础
snort使用一种简单的规则描述语言,这种描述语言易于扩展,功能也比较强大。下面是一些最基本的东西:
snort的每条规则必须在一行中,它的规则解释器无法对跨行的规则进行解析。注意:由于排版的原因本文的例子有的分为两行。
snort
的每条规则都可以分成逻辑上的两个部分:规则头和规则选项。规则头包括:规则行为(rule's
action)、协议(protocol)、源/目的IP地址、子网掩码以及源/目的端口。规则选项包含报警信息和异常包的信息(特征
码,signature),使用这些特征码来决定是否采取规则规定的行动。
这是一个例子:
alert tcp any any -> 192.168.1.0/24 111(content:"|00 01 86 a5|";msg:"mountd access";)
表1.一条简单的snort规则
从开头到最左边的括号属于规则头部分,括号内的部分属于规则选项。规则选项中冒号前面的词叫做选项关键词(option
keywords)。注意对于每条规则来说规则选项不是必需的,它们是为了更加详细地定义应该收集或者报警的数据包。只有匹配所有选项的数据
包,snort才会执行其规则行为。如果许多选项组合在一起,它们之间是逻辑与的关系。让我们从规则头开始。
1.1 include
snort使用的规则文件在命令行中指定,include关键词使这个规则文件可以包含其它规则文件中的规则,非常类似与C语言中的#include。snort会从被包含的文件读出其内容,取代include关键词。
格式:
include <文件路径/文件名>
注意:行尾没有分号。
1.2 varriables
在snort规则文件中可以定义变量。
格式:
var
例子:
var MY_NET 192.168.1.0/24,10.1.1.0/24] $MY_NET any (flags:S;msg:'SYNMETA packet";)
表2.变量的定义和使用
规则变量名可以使用多种方式来修改,你可以使用$操作符来定义元变量(meta-variables)。这些修改方式可以结合变量修改操作符:?和-来使用。
$var:定义元变量
$(var):以变量var的内容作为变量名
$(var:-default):以变量var的内容作为变量名,如果var没有定义就使用default作为变量名
$(var:?message):使用变量var的内容作为变量名,如果不成功就打印错误信息message并退出。
例如:
var MY_NET $(MYU_NET:-192.168.1.0/24) tcp any any -> $(MY_NET:?MY_NET is undefined!) 23
表3.高级变量应用
2.规则头(Rule Headers)
2.1 Rule Action
规则头包含一些信息,这些信息包括:哪些数据包、数据包的来源、什么类型的数据包,以及对匹配的数据包如何处理。每条规则的第一项就是规则行为
(rule
action)。规则行为告诉snort当发现匹配的数据包时,应该如何处理。在snort中,有五种默认的处理方式:alert、log、pass、
activate和dynamic。
alert:使用选定的报警方法产生报警信息,并且记录数据包
log:记录数据包
pass:忽略数据包
activate:报警,接着打开其它的dynamic规则
dynamic:保持空闲状态,直到被activete规则激活,作为一条log规则
你也可以定义自己的规则类型,把它们和一个或者几个输出插件联系在一起。然后你就可以在snort规则中使用这些规则类型了。
这个例子将建立一个类型,它将只以tcpdump格式输出日志:
ruletype suspicious
{
type log
output log_tcpdump: suspocious.log
}
下面这个例子将建立一个类型,把日志发送到syslog和MySql数据库:
ruletype redalert
{
type alert
output alert_syslog:LOG_AUTH LOG_ALERT
output database:log,user=snort dbname=snort host=localhost
}
2.2 协议
每条规则的第二项就是协议项。当前,snort能够分析的协议是:TCP、UDP和ICMP。将来,可能提供对ARP、ICRP、GRE、OSPF、RIP、IPX等协议的支持。
2.3 IP地址
规则头下面的部分就是IP地址和端口信息。关键词any可以用来定义任意的IP地址。snort不支持对主机名的解析。所以地址只能使用数字/CIDR
的形式。/24表示一个C类网络;/16表示一个B类网络;而/32表示一台特定的主机地址。例如:192.168.1.0/24表示从
192.168.1.1到192.168.1.255的地址。
在规则中,可以使用使用否定操作符(negation
operator)对IP地址进行操作。它告诉snort除了列出的IP地址外,匹配所有的IP地址。否定操作符使用!表示。例如,使用否定操作符可以很
轻松地对表1的规则进行改写,使其对从外部网络向内的数据报警。
alert tcp !192.168.1.0/24 any -> 192.168.1.0/24 111(content:"|00 01 86 a5|";msg:"external mountd access";)
表4.使用IP地址否定操作符的规则
上面这条规则中的IP地址表示:所有IP源地址不是内部网络的地址,而目的地址是内部网络地址。
你也可以定义一个IP地址列表(IP list)。IP地址列表的格式如下:
[IP地址1/CIDR,IP地址/CIDR,....]
注意每个IP地址之间不能有空格。例如:
alert tcp ![192.168.1.0/24,10.1.1.1.0/24] any
->[192.168.1.0/24,10.1.1.0/24] 111 (content:"|00 01 86
a5|";msg:"external mountd access";)
2.4 端口号
在规则中,可以有几种方式来指
定端口号,包括:any、静态端口号(static
port)定义、端口范围,以及使用非操作定义。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 :600
记录来自任何端口,其目的端口号小于或者等于6000的TCP数据包
log tcp any :1024 -> 192.168.1.0/24 500:
记录源端口号小于等于1024,目的端口号大于等于500的TCP数据包
表5.端口范围示例
你还可以使用逻辑非操作符!对端口进行非逻辑操作(port negation)。逻辑非操作符可以用于其它的规则类型(除了any类型,道理很简单)。例如,你如果要日志除了X-window系统端口之外的所有端口,可以使用下面的规则:
log tcp any any -> 192.168.1.0/24 !6000:60 10
表6.对端口进行逻辑非操作
2.5 方向操作符(direction operator)
方向操作符->表示数据包的流向。它左边是数据包的源地址和源端口,右边是目的地址和端口。此外,还有一个双向操作符<>,它使
snort对这条规则中,两个IP地址/端口之间双向的数据传输进行记录/分析,例如telnet或者POP3对话。下面的规则表示对一个telnet对
话的双向数据传输进行记录:
log !192.168.1.0/24 any <> 192.168.1.0/24 23
表7.使用双向操作符的snort规则
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;
表8.activate/dynamic规则对
这个规则使snort在检测到IMAP缓冲区溢出时发出报警,并且记录后续的50个从$HOME_NET之外,发往$HOME_NET的143号端口的
数据包。如果缓冲区溢出成功,那么接下来50个发送到这个网络同一个服务端口(这个例子中是143号端口)的数据包中,会有很重要的数据,这些数据对以后
的分析很有用处。
3.规则选项
规则选项构成了snort入侵检测引擎的核心,它们非常容易使用,同时又很强大和容易扩展。在每条snort规则中,选项之间使用分号进行分割。规则选项关键词和其参数之间使用冒号分割。截止到写本文为止(snort 1.7版),snort有23个规则选项关键词:
msg:在报警和日志中打印的消息
logto:把日志记录到一个用户指定的文件,而不是输出到标准的输出文件
ttl:测试IP包头的TTL域的值
tos:测试IP包头的TOS域的值
id:测试IP分组标志符(fragment ID)域是否是一个特定的值
ipoption:查看IP选项(IP option)域
fragbits:测试IP包头的分片位(fragmentation bit)
dsize:测试数据包包数据段的大小
flags:测试TCP标志(flag)是否是某个值
seq:测试TCP包的序列号是否是某个值
ack:测试TCP包的确认(acknowledgement)域是否为某个值
itype:测试ICMP数据包的类型(type)域
icode:测试ICMP数据包的编码(code)域
icmp_id:测试ICMP回送包的标志符(ICMP ECHO ID)是否为某个值
content:在数据包的数据段中搜索模式(pattern)
content-list:在数据包的数据段中搜索模式清单
offset:设置开始搜索的偏移量
depth:设置搜索最大深度
nocase:大小写不敏感匹配内容字符串
session:剥离一个对话的应用层信息
rpc:观察RPC服务对特定应用程序的调用
resp:激活反应措施(断开连接等)
react:激活反应措施(阻塞WEB站点)
3.1 msg
msg规则选项告诉日志引擎在复制包时同时打印的信息,以及让报警引擎输出的警告消息。它只是一个简单的文本字符串,使用作为转义符。
格式:
msg:"";
3.2 logto
logto选项告诉snort把触发某条规则所有的数据包都记录到指定的文件。使用这个选项,对处理来自nmap扫描、HTTP CGI扫描的数据非常方便。注意如果使用二进制日志模式,这个选项会失效。
格式:
logto:"<文件名>";
3.3 ttl
这个选项设置要测试的生命周期(time-to-live)值。只有数据包的TTL和这个选项设置的值精确匹配,测试才会成功。这个选项主要用来检测路由企图。
格式:
ttl:"";
3.4 tos
你可以使用tos关键词检查IP包头的TOS(type of service)域是否是一个特定的值。也是只有在被检测包TOS域的值和给定的值精确匹配时,这个测试才会成功。
格式:
tos:"";
3.5 ID
这个选项关键词用来测试IP分片包头的ID域。一些黑客工具为了不同的目的把这个域设置为特殊的值,例如:31337是在一些黑客中比较流行的值。使用这个选项就可以阻止这种攻击。
格式:
id: "";
3.6 lpoption
如果IP包中有选项域,可以使用这个规则选项搜索IP包头的特定选项,例如源路由。这个规则选项可以使用的参数如下:
rr:路由记录
eof:End of list
nop:无操作
ts:时间戳
sec:IP安全选项
lsrr:宽松源路由(loose source routing)
ssrr:严格源路由(strict source roution)
satid:流标识符
最常被注意的IP选项是loose&strict source routing,不过在Internet上广泛使用的任何应用程序中都没使用这两个选项。每条规则中只能设定一个IP规则。
格式:
ipopts: ;
3.7 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!";)
表9.fragbits示例
3.8 dsize
这个规则选项用来测试数据包负载的大小。它可以被设置为任意值,还可以使用大于/小于号。例如,如果你知道某个服务有一个特定大小的缓冲区,你就能够设置这个选项来捕获制造缓冲区溢出的企图。它比检查数据包的内容速度快的多。
格式:
dsize: [>|<]
<、>是可选的
3.9 content
关键词content是snort一个非常重要的特征。用户可以在规则中使用这个关键词,snort就会搜索数据包中content指定的内容,并且触
发对于这些数据的反应。每当对一个content规则选项进行模式匹配时,snort都会调用Boyer-Moore模式匹配函数,测试数据包的内容。无
论在数据包的那个位置发现要搜索的数据,就算测试成功。接下来,snort就会对这条规则中其余的选项进行测试。注意:测试是大小写敏感的。
content选项包含的数据可以混合有文本和二进制数据。二进制数据一般被包在管道符(|)中,由字节码(bytecode)表示。字节码使用16进制数字表示二进制数据。表10是一条混有文本和二进制数据的snort规则。
alert tcp any any -> 192.168.1.0/24 143(content:"|90c8 c0ff ffff|/bin/sh";msg:"IMAP buffer overflow");
表10.content规则选项中混有文本和二进制数据
格式:
content:"";
3.10 offset
在使用content规则选项时,offset规则选项作为其修饰符。这个关键词设置对content的内容进行模式匹配时的起始位置。这个规则选项在
某些情况下很有用,例如CGI扫描,要搜索的字符串从来不会在数据包的前4个字节出现。注意:设置偏移值一定要小心,它可能会造成漏检!这个规则选项只能
和content规则选项搭配使用。
格式:
offset: ;
3.11 depth
depth是content规则选项的另一个修饰符。它用来设置最大的搜索深度,以减少无谓的搜索,使snort只在特征码可能出现的区域内搜索,例如
如果在一个web绑定(web-bound)包中搜索“cgi-bin/phf",你就不必浪费时间在数据包负载数据的前20个字节之外搜索。表11的规
则结合了content、offset、depth。
alert tcp any any -> 192.168.1.0/24 80 (content:"cgi-bin/phf";offset:3;depth:22;msg:"CGI-PHF access";)
表11.含有content、offset和depth规则选项的规则
格式:
depth: ;
3.12 nocase
nocase使对content进行模式匹配时大小写不敏感。snort将不再区别每个ASCII字符的大小写。
格式:
nocase;
例如:
alert tcp any any -> 192.168.1.0/24 21 (content:"USER root";nocase;msg:"FTP root login attempt";)
表12.使用nocase修饰符的规则
3.13 flags
这个规则选项用来测试TCP包头的标志。实际上,在snort中有8个有效的标志:
F:FIN(TCP标志字节最左边一位)
S:SYN
R:RST
P:PSH
A:ACK
S:ACK
U:URG
2:保留位2
1:保留位1(标志字节最右边一位)
还可以使用逻辑操作符对指定的标志位进行操作:
+:ALL,指定的标志位和其它任意的标志位为真
*:ANY,指定的标志位中任意的标志位为真
!:NOT,除了指定标志位外,任意的标志位为真
保留位能够用来检测非正常的行为,例如对IP协议栈指纹特征的探测企图或者其它可疑行为。表13是一条针对SYN-FIN扫描的检测规则。
alert any any -> 192.168.1.0/24 any (flags:SF;msg:"Possible SYN FIN scan";)
表13.TCP标志
格式:
flags: ;
3.14 seq
这个规则选项涉及TCP包的序列号。实质上,它检测包是否有一个静态的序列号集合,因此这个规则选项非常没有用处。指示出于完整性的考虑才包含了这个选项。
格式:
seq:
3.15 ack
这个规则选项涉及TCP包头的确认域(acknowledge)。迄今为止,它只有一个实际的用途:检测NMAP TCP
ping扫描。扫描程序nmap进行TCP ping扫描时,把TCP包头的确认号(4个字节)设置为0,然后向目标主机发出TCP
ACK包,确定目标主机是否正在运行。表14是一个检测这种探测的规则:
alert any any -> 192.168.1.0/24 any (flags:A;ack:0;msg:"nmap TCP ping";)
表14.TCP ACK域的使用
格式:
ack:;
3.16 itype
itype规则选项用来测试ICMP包头的类型域,使用数字进行设置。每种ICMP包对应的数值如下:
0:回送应答
3:无法到达目的地
4:抑制包源
5:重定向(改变路径)
8:回送请求
11:IP分组超时
12:IP分组参数有问题
13:时间戳请求
14:时间戳应答
15:信息请求
16:信息应答
17:地址掩码请求
18:地址掩码应答
注意:拒绝服务和淹没攻击的数据包有时使用无效的ICMP类型,可以使用这个规则选项对无效的ICMP类型进行检测,也就是说,这个规则选项中的值可以不是上面所列的数值。
格式:
itype:;
3.17 icode
icode规则选项和itype非常相似,也是使用数字进行设置,具体数值见snort源代码的decode.h文件。同样,也可以使用其它的数值来检测可疑的数据包。
格式:
icode:;
3.18 session
sesion关键词是从snort-1.3.1.1版加入的,用来从TCP会话中剥离用户的数据。如果想观察用户在telnet、rlogin、
ftp,甚至WEB会话过程中输入了什么,就可以使用这个规则选项。session规则选项有两个参数关键词:printable、all。使用
printable,snort就会只输出可打印数据;使用all,snort就会输出所有的数据,不可打印的数据以16进制表示。不过,这个功能会大大
降低snort的速度,所以不太适合大负载的情况,而且最好使用二进制日志文件格式。表15是一条记录telnet会话的规则:
log tcp any any <> 192.168.1.0/24 23 (session: printable;)
表15.记录可打印的telnet会话数据
格式:
session:[printable|all];
3.19 icmp_id
icmp_id规则选项用来检测ICMP回送(echo)数据包的ICMP
ID号是否为一个特定的值。之所以会用到这个规则选项,是因为一些隐秘通道(covert
channel)程序在通讯时使用静态的ICMP域。为了执行stacheldreht检测规则,开发了这个特别的插件,这些规则是由Max
Vision(一位著名的白帽黑客,译者注)编写的。不过,它有助于检测其它一些潜在的攻击。
格式:
icmp_id:;
3.20 icmp_seq
icmp_seq规则选项用来检测一个ICMP回送包的ICMP序列号是否是一个特定的值。之所以会用到这个规则选项,是因为一些隐秘通道
(covert
channel)程序在通讯时使用静态的ICMP域。为了执行stacheldreht检测规则,开发了这个特别的插件,这些规则是由Max
Vision编写的。不过,它有助于检测其它一些潜在的攻击。
格式:
icmp_seq:
3.21 rpc
规则选项rpc可以使snort观察RPC请求,并且自动对应用程序、过程(procedure)和程序版本进行解码。只有这三个变量都匹配时,才算成功。统配符*可以用来代替过程(procedure)和版本号。
格式:
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:"RPCsadmin";)
表16.几条RPC报警规则
3.22 resp
对于匹配某个规则的数据包,可以通过resp关键词使snort的灵活反应(flexible reponse,FlexResp)机制生效。使用FlexResp插件,snort能够主动断开恶意连接。下面是这个模块的参数:
rst_snd:向发送方套接字发送TCP-RST数据包
rst_rcv:向接受方套接字发送TCP-RST数据包
rst_all:在两个方向上发送TCP-TST数据包
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.1.168.1.0/ 31 (resp:icmp_port,icmp_host;msg:"Hacker's Paradise access attempt";)
表17.FlexResp规则
3.23 content-list
使用content-list关键词可以指定更多的正文字符串,突破了content规则选项只能指定单一字符串的限制。表18是一个conternt-list文件。每个要搜索的字符串占一行。这个规则选项是使用react关键词的基础。
#adult sites
porn
adults
hard core
www.pornsite.com
# ...
表18.content-list文件
格式:
content-list:"";
3.24 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;)
表19.react规则
格式:
react:;
4.预处理器(preprocessors)
4.1 预处理器综述
从snort-1.5开始加入了对预处理器的支持。有了这种支持,用户和程序员能够比较容易地编写模块化的插件,扩展snort的功能。预处理器在调用
检测引擎之前,在数据包被解码之后运行。通过这种机制,snort可以以一种out of band的方式对数据包进行修改或者分析。
预处理器可以使用preprocessor关键词来加载和配置,格式如下:
preprocessor :
例如:
preprocessor minfrag: 128
表20.预处理器指令格式
4.2 可用的预处理器模块
4.2.1 minfrag
这个预处理器测试分片包的大小是否为一个特定的值。数据包分片,通常是源/目的地址之间的路由器完成的。一般来说,商业网络设备产生的分片不会小于
512个字节,基于这种情况,我们可以对很小的分片进行监视,很小的分片包一般是人为产生的,主要为了使用很小的碎片隐藏数据。
格式:
minfreg:<大小阀值>
4.2.2 HTTP decode预处理插件
HTTP解码预处理模块用来处理HTTP URI字符串,把它们转换为清晰的ASCII字符串。这样就可以对抗evasice web URL扫描程序和能够避开字符串内容分析的恶意攻击者。这个预处理模块使用WEB端口号作为其参数,每个端口号使用空格分开。
格式:
http_decode:<端口号列表>
例如:
preprocessor http_decode: 80 8080
表21.使用HTTP decode预处理模块的规则
4.2.3 端口扫描检测模块
snort端口扫描检测预处理模块是Patrick Mullen开发的,从他的个人主页可以得到更多信息。
snort端口扫描检测预处理模块主要做如下工作:
把由单个源IP地址发起的端口扫描从开始到结束的全过程记录到标准日志设备。
如果指定了一个日志文件,就把被扫描的IP地址和端口号和扫描类型都记录到这个日志文件。
这个模块使用的参数包括:
监视的网络: 以IP地址/子网掩码的格式指定要进行端口扫描监视的网络。
端口数: 在检测周期(detection period)内访问的端口数目。
检测周期(detection period): 达到某个设定的端口访问量需要的时间,以秒计。
日志目录/文件: 保存警告信息的目录/文件。警告信息也可以写到默认警告文件中。
格式:
portscan:<要监视的网络> <端口数> <检测周期> <日志目录/文件>
例子:
preprocessor portscan:192.168.1.0/24 5 7 /var/log/portscan.log
表22.端口扫描检测模块的配置
4.2.4 portscan ignorehosts
Patrick Mullen对端口扫描检测系统进行了改进,形成了另一个模块--portscan
ignorehosts。有些服务器程序容易和端口扫描检测模块造成冲突,例如NTP、NFS和DNS,如果你运行这些服务器程序,可以告诉端口扫描检
测模块忽略对由特定主机发起的TCP SYN和UDP端口扫描的检测。这个模块使用的参数是一个要忽略的IP地址/CIDR的列表。
格式:
portscan-ignorehosts:<主机列表>
例子:
preprocessor portscan-ignorehosts:192.168.1.5/32 192.168.3.0/24
表23.portscan ignorehosts模块的配置
4.2.5 defrag模块
defrag插件是由Dragos
Rulu开发的,它使snort能够消除IP碎片包,给黑客使用IP碎片包绕过系统的检测增加了难度。这个模块非常容易配置,不需要参数,直接放在
preprocessor关键词之后即可。它的功能超过了migfrag模块的功能,所以你如果使用defrag,就不用在用minfrag模块了。
格式:
defrag
例子:
preprocessor defrag
defrag模块的配置
4.2.6 stream模块
stream插件为snort提供了TCP数据包重组的功能。在配置的端口上,stream插件能够对TCP数据包的细小片段进行重组成为完整的TCP数据包,然后snort可以对其可疑行为进行检查。这个插件有好多参数:
超时(timeout): 在一个TCP数据包送达之前,保存一个
TCP数据流缓冲的最长时间。
端口(port): 要监视的服务器端口。我们不想监视所有的
TCP端口,这也不太现实。
最大字节数(maxbytes): 重组包的最大长度。
格式:
stream:timeout ,ports ,maxbytes
例如:
preprocessor stream:timeout 5,ports 21 23 80 8080,maxbytes 16384
TCP数据包重组插件配置
4.2.7 spade:the Statisical Packet Anomaly Dection Engine
如果需要了解更多关于spade的信息,请参考snort源代码中的README.Spake文件,或者http://www.silicondefense.com/spice/。
使用这个模块使snort能够在你的网络上进行统计异常检测(statistical anomaly dection),这是一个全新的检测引擎。如果你对此感兴趣,请参考源代码中的有关文档和SiliconDefense站点的有关文档。
5.输出模块
5.1 输出模块综述
snort输出模块是从1.6版加入的新特征,使snort的输出更为灵活。snort调用其报警或者日志子系统时,就会调用指定的输出模块。设置输出模块的规则和设置预处理模块的非常相似。
在snort配置文件中可以指定多个输出插件。如果对同一种类型(报警、日志)指定了几个输出插件,那么当事件发生时,snort就会顺序调用这些插
件。使用标准日志和报警系统,默认情况下,输出模块就会将数据发送到/var/log/snor目录,或者用户使用-l命令行开关指定的目录。
在规则文件中,输出模块使用output关键词指定:
格式:
output name:<选项>
例子:
output alert_syslog: LOG_AUTH LOG_ALERT
表26.输出模块的配置
5.2 可用的输出模块
5.2.1 alert_syslog
使用这个输出模块,snort把报警信息发送到syslog,与-s命令行开关非常类似。这个输出模块允许用户在规则文件中指定logging facility和优先级,给用户以更大的灵活性。
有效的关键词:
选项:
LOG_CONS
LOG_NDELAY
LOG_PERROR
LOG_PID
facility
LOG_AUTH
LOG_AUTHPRIV
LOG_DAEMON
LOG_LOCAL0
LOG_LOCAL1
LOG_LOCAL3
LOG_LOCAL4
LOG_LOCAL5
LOG_LOCAL6
LOG_LOCAL7
优先级
LOG_EMERG
LOG_ALERT
LOG_ERR
LOG_WARNING
LOG_NOTICE
LOG_INFO
LOG_DEBUG
格式:
alert_syslog: <优先级> <选项>
5.2.2 alert_fast
使用快速单行格式(quick on line format)把snort报警信息输出到指定的输出文件。这种报警方式比完全(full)报警模式速度快,因为使用这种报警模式不需要把全部的数据包头都输出到指定的文件。
格式:
alert_fast: <输出文件>
例子:
output alert_fast: alert.fast
表27.快速报警配置
5.2.3 alert_full
把全部的数据包头都输出到snort报警信息。这种报警机制一般较满,因为程序需要对整个数据包进行分析。报警信息可以输出到默认的日志目录/var/log/snort,也可以使用命令行指定日志目录。
格式:
alert_full:<输出文件>
例子:
output alert_full:alert_full
表28.full报警配置
5.2.4 alert_smb
snort使用这个插件把WinPopup报警信息输出到由NETBIOS命名的主机,主机名由参数指定的文件给出。注意我们不鼓励使用这种报警方式,
因为samba客户程序smbclient以root权限运行。接收报警信息工作站的名字列表由保存在一个文件中,每行是一台主机的NETBIOS名字。
格式:
alert_smb:<文件>
例子:
output alert_smb:workstation.list
表29.SMB报警配置
5.2.5 alert_unixsock
设置一个UNIX域套接字(UNIX domain socket),把报警信息发送到这个套接字。外部程序/进程可以在这个套接字上监听,实时接收snort报警信息和数据包数据。这个接口目前尚处于实验状态。
格式:
alert_unixsock
示例:
output alert_unixsock
表30.UnixSock报警配置
5.2.6 log_tcpdump
log_tcpdump输出模块使用tcpdump格式的文件记录数据包日志。这种日志文件格式便于使用很多外部的工具对数据进行分析,只要这些工具软件支持tcpdump格式的文件。这个模块只有一个参数,就是输出文件的名字。
格式:
log_tcpdump:<输出文件名>
示例:
output log_tcpdump:snort.log
表31.tcpdump输出模块的配置
5.2.7 数据库输出模块
snort的数据库输出模块是JedPickel开发的,用来将snort产生的数据送到各种SQL数据库系统。如果要获得安装和配置这个模块更为详尽
的信息,可以参考ncident.org web
page。这个插件使用的参数是记录snort日志的数据库名和参数表。参数表使用这种格式:parameter=argument。有如下参数可以使
用:
host: 数据库所在的主机。如果指定了一个非零字符串,snort就使用TCP/IP协议连接以此命名的主机。如果没有主机名,snort就使用一个本地UNIX-domain套接字连接本地主机。
port: 数据库所在服务器的端口号,或者一个UNIX-domain套接字文件。
dbname: 数据库名字。
user: 数据库用户名。
passwd: 密码。
sensor_name: 指定这个snort触发器的名字,如果没有指定就自动产生。
encoding: 因为数据包的负载和选项都是二进制数据,所以没有一种简单和可移植的方式将snort的数据保存在数据库。所以在snort数据库输出插件中提供了一些选项,让你自己决定使用那种编码。下面是这几种编码的优点和缺点:
hex: 默认编码选项,使用16进制字符串代表二进制数据。
存储空间: 两倍于二进制数据
搜索性: 极好
可读性: 极差
base64: 使用base64字符串代表二进制数据。
存储空间: 大约是直接存储二进制数据的1.3倍
搜索性: 可能无须后续处理。
可读性: 不可读需要后续处理。
ascii:: 使用ASCII字符串代替二进制数据。非ASCII字符使用.代替。如果你选择这个选项,那么IP和TCP包头的选项会仍然使用hex表示。
存储空间: 比直接存储二进制数据稍大。
搜索性: 非常便于二进制数据中搜索文本字符串。
可读性: 很好。
detail: 设置你要保存多少细节数据,有如下选项:
full: 保存引起报警的数据包的所有细节,包括IP/TCP包头和负载数据。
fast: 只记录少量的数据。如果选择这种记录方式,不利于以后对数据的分析,但在某些情况下还有其用处。使用这种方式,将记录数据包的以下域:时间戳(timestamp)、签名(signature)、源地址、目的地址、源端口、目的端口、TCP标志和协议。
还需要定义日志方法和数据库类型。有两种日志方法:log和alert。如果使用log,snort就会调用log输出,将日志数据记录到数据库;如果设置为alert,snort就会调用alert输出,在数据库中记录报警信息。
当前版本中,snort可以使用四种数据库:MySQL、PostgreSQL、Oracle以及和unixODBC兼容的数据库。可以使用你喜欢的数据库。
格式:
database:,<数据库类型>,<参数表>
例子:
output database:log,mysql,dbname=snort user=snort host=localhost password=xyz
表33.数据库输出插件配置
6.如何建立好的snort规则
在开发高效、高速的snort规则时,有几个概念要铭记于心。
关键词content指定的内容是大小写敏感的,除非你使用nocase选项
不要忘记content规则选项指定的内容是大小写敏感的,许多程序一般使用大写表示命令。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";)
第二条规则可以使snort捕获大多数使用root用户名的自动登录企图,而在数据包中从来就没有小写的user。
提高snort对含有content规则选项的规则的检测速度
snort检测引擎对各个规则选项的测试顺序与其在各条规则中所处的位置无关。在各个规则选项中,检测引擎最后测试的总是content规则选项。因
此,在开发规则时,要尽量使用快速的选项筛选掉根本不必对其内容进行检查的包。例如,如果实现了一个TCP会话过程,那么在会话过程的大部分时间内,双方
传输的数据包的TCP标志ACK、PSH都被置位。而测试包头的TCP标志比对数据包的内容进行模式匹配需要的计算量要小的多。所以,在开发相关的检测规
则时,需要设置flags规则选项对PSH和ACK没有置位的数据包进行过滤。而这样做,增加的额外计算量微乎其微。例如:
alert tcp any any -> 192.168.1.0/24 80 (content:"cgi-bin/phf";flags:PA;msg:"CGI-PHF probe";)
--------------------------------------------
Snort 规则编写
I 总体结构分析:
alert tcp any any -> 192.168.1.0/24 111 (content:"|00 01 86 a5|"; msg: "mountd access";)
分析:
多行之间用 / 分开
规则包括:规则头rule header: alert tcp any any -> 192.168.1.0/24 111 和规则选项 rule options:(content:"|00 01 86 a5|"; msg: "mountd access";)
II 规则头:3个要素: who , where, what,how(行动)
2.1 规则动作 rule action。告诉snort一旦匹配干什么事,原来的snort共5种:alert, log,pass,activate,dynamic
(alert:警报并且记录; log:记录; pass::丢弃(忽略); activate:报警并且激活另外一条dynamic规则;dynamic:被激活后log,也可自己自定义,参考manual)
******************************************
以下是2.9版本的mannal中新添加的action:
1. alert - generate an alert using the selected alert method, and then log the packet
2. log - log the packet
3. pass - ignore the packet
4. activate - alert and then turn on another dynamic rule
5. dynamic - remain idle until activated by an activate rule , then act as a log rule
6. drop - block and log the packet
7. reject - block the packet, log it, and then send a TCP reset if the protocol is TCP or an ICMP port unreachable
message if the protocol is UDP.
8. sdrop - block the packet but do not log it.
******************************************
2.2 协议。snort当前可分析的协议包有:tcp,udp,ip,icmp。
2.3 ip地址。ip地址可以用any定义任何地址,并且需要添加掩码(16-B类,24-C类,32-特定的机器),并且可以使用!操作符。如果ip地址是个列表,需要[192.168.1.0/24,10.1.1.0/24]类似,使用[],中间用逗号隔开,如果要加!,要加到[]外部。
2.4 端口号。any表示全部,如果表示范围,eg:1:1024,中间用冒号隔开。但是:200也可,表示小于等于200的,反之:1024:表示大于等于1024的。当然也可以类似ip地址使用!否定操作符。
2.5 方向操作符。规则所施加的流的方向. 单向,从源到目的 ->; 双向,既是源又是目标<>.
III 规则选项:nids的核心,所有选项用“;”隔开,规则选项关键字和他们的参数用“:”分开,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 - 数字模式测试和偏移量调整
*****************************************
在2.9的mannal中把它们分为了4类:
*******************************************
general :These options provide information about the rule but do not have any affect during detection
对检测无影响
payload :These options all look for data inside the packet payload and can be inter-related
需要深入到包中的数据。
non-payload: These options look for non-payload data
不需要包数据。
post-detection :These options are rule specific triggers that happen after a rule has “fired.”
触发器,只有当一个规则触发后才发生。
*******************************************
在对各种分类介绍之前,我观察了rules下面的系统原有的rules,发现在规则选项中如下几项用的十分多:(尤其是前8项)
1 msg:
2 content
3 nocase
4 flow
5 reference
6 classtype
7 sid
8 rev
9 icmp_id
10 icmp_seq
11 itype
12 offset
13 depth
给出几个常见的eg:(从snort发布的rule中摘录)
***********************************
1 alert icmp $EXTERNAL_NET any -> $HOME_NET any (msg:"ICMP PING NMAP"; dsize:0; itype:8; reference:arachnids,162; classtype:attempted-recon; sid:469; rev:3;
2 # These rules look for specific Agobot/PhatBot commands on an IRC session
alert tcp $HOME_NET any -> $EXTERNAL_NET any (msg:"COMMUNITY BOT Agobot/PhatBot bot.about command"; flow: established; flowbits:isset,community_is_proto_irc; content:"bot.about"; classtype: trojan-activity; sid:100000242; rev:2;
***********************************
下面把以上常用的进行分类着重介绍(这个分类是2.9版manual中分类,这样能更清晰地给出规则选型的使用环境)
A : general有那些:
1 msg: alert和log的同时,同时print的东西
2 reference: 允许规则包含外面的攻击系统: arachnids(一个攻击特征数据库),cve(这个不用说了吧),bugtraq(一个完整的对计算机安全漏洞(它们是什么,如何利用它们,以及如何修补它们)的公告及详细论述进行适度披露的邮件列表)等.
3 sid:规则的唯一序列 (<100保留,100~999999为snrot发布用,>=1000,000本地用),允许输出插件容易识别规则的ID好,常和rev一起使用。rev:用来标记规则修改,按照我的理解,就是当前规则改了一次,rev就记录这个次数。
4 classtype:这个选项把alert分为不同的攻击类。通过使用这个关键字和优先级,用户可以指定每个类型需要的优先级。比如上文的classtype为trojan-activity就属于high类别。
总体描述:
**********************************
msg
The msg keyword tells the logging and alerting engine the message to print with
the packet dump or alert.
reference
The reference keyword allows rules to include references to external attack identification
systems.
gid
The gid keyword (generator id) is used to identify what part of Snort generates the
event when a particular rule fires.
sid
The sid keyword is used to uniquely identify Snort rules.
rev
The rev keyword is used to uniquely identify revisions of Snort rules.
classtype
The classtype keyword is used to categorize a rule as detecting an attack that is
part of a more general type of attack class.
priority
The priority keyword assigns a severity level to rules.
metadata
The metadata keyword allows a rule writer to embed additional information about
the rule, typically in a key-value format.
**********************************
B:payload类型
1 content:最重要的rule option之一。它允许用户设置规则在包的净荷中搜索指定的内容并根据内容触发响应。当进行content选项模式匹配时, Boyer-Moore模式匹配函数被调用,并且对包的内容进行检查(很花费计算能力)。如果包的净荷中包含的数据确切地匹配了参数的内容,这个检查成功并且该规则选项的其他部分被执行。注意这个检查是大小写敏感的。
Content关键字的选项数据比较复杂;它可以包含混合的文本和二进制数据。二进制数据一般包含在管道符号中("|"),表示为字节码 (bytecode)。字节码把二进制数据表示为16进制数字,是描述复杂二进制数据的好方法。下面是包含了一个混合数据的snort规则范例
eg: 1) content:"/bin/sh";
2)content:"|90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90|";
3) content:"name=|22 CC CC CC CC CC|"; 来自web-php.rules.
2 nocase: 用于取消content中的大小写敏感
3 depth:depth也是一个content规则选项修饰符。它设置了内容模式匹配函数从他搜索的区域的起始位置搜索的最大深度。它对于限制模式匹配函数超出 搜索区域指定范围而造成无效搜索很有用。(也就是说,如果你在一个web包中搜索"cgi-bin/phf",你可能不需要浪费时间搜索超过净荷的头20 个字节)。eg: content:"NICK "; nocase; offset: 0; depth: 5; (来自community-bot.rules)
4 offset: offset规则选项被用作使用content规则选项关键字的规则的修饰符。这个关键字修饰符指定模式匹配函数从包净荷开始处开始搜索的偏移量。 它对于cgi扫描检测规则很有用,cgi扫描的内容搜索字符串不会在净荷的前4个字节中出现。小心不要把这个偏移量设置的太严格了,会有可能漏掉攻击!这 个规则选项关键字必须和content规则选项一起使用。
其它的payload类型的规则选项:
**********************************
part1: content及其修饰符
Modifier Section
nocase 3.5.2
rawbytes 3.5.3
depth 3.5.4
offset 3.5.5
http_client_body 3.5.8
http_cookie 3.5.9
http_raw cookie 3.5.10
http_header 3.5.11
http_raw_header 3.5.12
http_method 3.5.13
http_uri 3.5.14
http_raw uri 3.5.15
http_stat code 3.5.16
http_stat msg 3.5.17
fast_pattern 3.5.19
distance
The distance keyword allows the rule writer to specify how far into a packet Snort should ignore before
starting to search for the specified pattern relative to the end of the previous pattern match.
within
The within keyword is a content modifier that makes sure that at most N bytes are between pattern
matches using the content keyword.
part2: 其它的:
uricontent
The uricontent keyword in the Snort rule language searches the normalized request URI field.
isdataat
The isdataat keyword verifies that the payload has data at a specified location.
pcre
The pcre keyword allows rules to be written using perl compatible regular expressions.
byte_test
The byte test keyword tests a byte field against a specific value (with operator).
byte_jump
The byte jump keyword allows rules to read the length of a portion of data, then skip that far forward
in the packet.
ftpbounce
The ftpbounce keyword detects FTP bounce attacks.
asn1
The asn1 detection plugin decodes a packet or a portion of a packet, and looks for various malicious
encodings.
cvs
The cvs keyword detects invalid entry strings.
dce_iface
See the DCE/RPC 2 Preprocessor section 2.2.13.
dce_opnum
See the DCE/RPC 2 Preprocessor section 2.2.13.
dce_stub_data
See the DCE/RPC 2 Preprocessor section 2.2.13.
**********************************
C: non-payload类型:
1 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;)
2 Icmp_id
Icmp_id选项检查ICMP ECHO数据包中ICMP ID数值是否是指定值。许多秘密通道(covert channel)程序使用静态ICMP字段通讯,所以该选项在检查这种流量时非常有用。这个特别的插件用于增强由Max Vision编写的stacheldraht探测规则,但是在探测一些潜在攻击时确实有效。
3 Icmp_seq
Icmp_seq选项检查ICMP ECHO数据包中ICMP sequence字段数值是否是指定值。许多秘密通道(covert channel)程序使用静态ICMP字段通讯,所以该选项在检查这种流量时非常有用。这个特别的插件用于增强由Max Vision编写的stacheldraht探测规则,但是在探测一些潜在攻击时确实有效。(我知道该字段的信息和icmp_id的描述几乎完全相同,实际上它们就是同样的东西!)
其它:
*************************************
fragoffset
The fragoffset keyword allows one to compare the IP fragment offset field against a decimal value.
ttl
The ttl keyword is used to check the IP time-to-live value.
tos
The tos keyword is used to check the IP TOS field for a specific value.
id
The id keyword is used to check the IP ID field for a specific value.
ipopts
The ipopts keyword is used to check if a specific IP option is present.
fragbits
The fragbits keyword is used to check if fragmentation and reserved bits are set in the IP header.
dsize The dsize keyword is used to test the packet payload size.
flags
The flags keyword is used to check if specific TCP flag bits are present.
flow
The flow keyword allows rules to only apply to certain directions of the traffic flow.
flowbits
The flowbits keyword allows rules to track states during a transport protocol session.
seq
The seq keyword is used to check for a specific TCP sequence number.
ack
The ack keyword is used to check for a specific TCP acknowledge number.
window
The window keyword is used to check for a specific TCP window size.
itype
The itype keyword is used to check for a specific ICMP type value.
icode
The icode keyword is used to check for a specific ICMP code value.
icmp_id
The icmp id keyword is used to check for a specific ICMP ID value.
icmp_seq
The icmp seq keyword is used to check for a specific ICMP sequence value.
rpc
The rpc keyword is used to check for a RPC application, version, and procedure numbers in SUNRPC
CALL requests.
ip_proto
The ip_proto keyword allows checks against the IP protocol header.
sameip
The sameip keyword allows rules to check if the source ip is the same as the destination IP.
*****************************************
D: post-Detection 规则选项:
logto
The logto keyword tells Snort to log all packets that trigger this rule to a special output log file.
session
The session keyword is built to extract user data from TCP Sessions.
resp
The resp keyword is used attempt to close sessions when an alert is triggered.
react
This keyword implements an ability for users to react to traffic that matches a Snort rule by closing
connection and sending a notice.
tag
The tag keyword allow rules to log more than just the single packet that triggered the rule.
activates
This keyword allows the rule writer to specify a rule to add when a specific network event occurs.
activated_by
This keyword allows the rule writer to dynamically enable a rule when a specific activate rule is
triggered.
count
This keyword must be used in combination with the activated by keyword. It allows the rule writer
to specify how many packets to leave the rule enabled for after it is activated.
replace Replace the prior matching content with the given string of the same length. Available in inline mode
only.
detection filter Track by source or destination IP address and if the rule otherwise matches more than the configured rete it will fire.
IV 规则临界值:不被推荐,在以后的版本中被替代。
Rule thresholds are deprecated and will not be supported in a future release. Use detection filters (3.7.10) within rules, or
event filters (2.4.2) as standalone configurations instead.
eg:
alert tcp $external_net any -> $http_servers $http_ports /
(msg:"web-misc robots.txt access"; flow:to_server, established; /
uricontent:"/robots.txt"; nocase; reference:nessus,10302; /
classtype:web-application-activity; threshold:type limit, track /
by_src, count 1 , seconds 60; sid:1000852; rev:1;)
******************
type limit|threshold|both
type limit alerts on the 1st m events during the time interval, then ignores events
for the rest of the time interval. Type threshold alerts every m times we see
this event during the time interval. Type both alerts once per time interval after
seeing m occurrences of the event, then ignores any additional events during the
time interval.
track by src|by dst
rate is tracked either by source IP address, or destination IP address. This means
count is maintained for each unique source IP addresses, or for each unique destination
IP addresses. Ports or anything else are not tracked.
count c
number of rule matching in s seconds that will cause event filter limit to be
exceeded. c must be nonzero value.
seconds s
time period over which count is accrued. s must be nonzero value.
************************
V: 如何写出好的规则(来自manual2.9)
1 Content_matching :
如果可能,至少在你的规则中包含一次Content
If at all possible, try and have at least one content (or uricontent)
rule option in your rule.
2 Catch the Vulnerability, Not the Exploit
针对漏洞本身写rule,而不是利用代码
Try to write rules that target the vulnerability, instead of a specific exploit.
For example, look for a the vulnerable command with an argument that is too large, instead of shellcode that binds a shell.
By writing rules for the vulnerability, the rule is less vulnerable to evasion when an attacker changes the exploit slightly.
3 Catch the Oddities of the Protocol in the Rule
抓住协议中奇特的部分
以FTP协议为例:
Many services typically send the commands in upper case letters. FTP is a good example. In FTP, to send the username, the client sends:
user username_here
A simple rule to look for FTP root login attempts could be:
alert tcp any any -> any any 21 (content:"user root";)
4 Optimizing Rules 优化规则(摘自2.9 manual)
The content matching portion of the detection engine has recursion to handle a few evasion cases. Rules that are not properly written can cause Snort to waste time duplicating checks.
The way the recursion works now is if a pattern matches, and if any of the detection options after that pattern fail, then look for the pattern again after where it was found the previous time. Repeat until the pattern is not found again or the opt functions all succeed.
On first read, that may not sound like a smart idea, but it is needed. For example, take the following rule:
alert ip any any -> any any (content:"a"; content:"b"; within:1;) (逻辑关系不对,影响判断)
This rule would look for “a”, immediately followed by “b”. Without recursion, the payload “aab” would fail, even though it is obvious that the
payload “aab” has “a” immediately followed by “b”, because the first ”a” is not immediately followed by “b”.
While recursion is important for detection, the recursion implementation is not very smart.
For example, the following rule options are not optimized:
content:"|13|"; dsize:1; (位置先后很重要)
By looking at this rule snippit, it is obvious the rule looks for a packet with a single byte of 0x13. However, because of recursion, a packet with
1024 bytes of 0x13 could cause 1023 too many pattern match attempts and 1023 too many dsize checks. Why? The content 0x13 would be found
in the first byte, then the dsize option would fail, and because of recursion, the content 0x13 would be found again starting after where the previous
0x13 was found, once it is found, then check the dsize again, repeating until 0x13 is not found in the payload again.
Reordering the rule options so that discrete checks (such as dsize) are moved to the beginning of the rule speed up Snort.
The optimized rule snipping would be:
dsize:1; content:"|13|";
A packet of 1024 bytes of 0x13 would fail immediately, as the dsize check is the first option checked and dsize is a discrete check without recursion.
The following rule options are discrete and should generally be placed at the beginning of any rule:(下列rule option是离散的,应该放在任何rule的前面)
• dsize
• flags
• flow
• fragbits
• icmp id
• icmp seq
• icode
• id
• ipopts
• ip proto
• itype
• seq
• session
• tos
• ttl
• ack
• window
• resp
• sameip
5 Testing Numerical Values
snort manual 2.9 180-182页,很好的一个解决方案。
======================= End