Snort 规则编写

Snort规则分为两个部分:规则的头部和规则选项。首先,规则头部包含着规则、动作、协议、源地址和目标地址、源端口、目标端口。第二部分是规则选项,它包含着一个警告消息和某数据包有关部分的信息(如果要采取某个动作的话,就应当看一些这种信息)。

例如:alert tcp any any -> 192.168.1.0/24 111 (content:”|00 01 86 a5|”; msg: “mountd access”;)

上例中,圆括号之前的部分属于规则的头部,圆括号内部的属于规则选项部分。

规则动作:

规则动作描述一个数据包的“谁,在何处,什么”的问题,并指明规则被激发后,在事件中应当做什么。在编写规则时,你可以从下面的关键字中选择:

·alert –用选择的警告方法生成一个警告,然后记录这个数据包。

·log -记录这个数据包。

·pass – 忽略此数据包。

协议:

规则的下一部分是协议。一些比较流行的协议包括TCP、UDP、ICMP等,不过Snort支持许多其它的协议,并继续增加新的协议。

源IP地址

紧跟着协议的部分是IP地址。它定义了数据包来自何处。你可以用“any”这个关键字来定义所有的IP地址。你甚至可以编写一个能够匹配除你指定的IP地址之外任何地址的规则。这是通过使用“!”这个否定操作符实现的。

源端口

它说的是数据包来自哪个端口。端口号也可以使用“any”关键字。你还可以通过使用“:”定义一个范围内的端口。例如,1:1000定义了从1到1000范围内的所有端口。

方向操作符:

方向操作符“->”用于定义规则所适用的通信方向。换句话说,即指明通信进入或出自你计算机的什么地方。

目标地址

下一部分是目标地址。它定义了数据包要到何方。与源地址类似,你也可以使用“any”关键字或定义一个不会引起规则被激发的地址。

目标端口

紧随目标IP地址的部分是目标端口号,即数据包设法连接的端口号。这儿的选项与源端口相同。

规则选项

圆括号内的所有内容称为规则选项。一个比较常用的关键字是“content”,不过你还可以用其它许多关键字。关键字“content”允许用户设定规则,搜索数据包有效负荷内的特定内容,并激发一个响应。

例如:

alert tcp any any -> 192.168.1.0/24 143 (content: “|90C8 C0FF FFFF|/bin/sh”;

msg: “IMAP buffer overflow!”;)

通过上例可以看出,我们检查了数据包是否包含了某种二进制字节(Binary Byte)码和文本。

基本格式

动作 协议 源IP地址 源端口 方向 目标地址 目标端口 ( 规则选项)

增加一个新规则

既然我们对要Snort规则的语法有了一个基本的了解,现在我们就可以向系统中增加一条新的规则:

首先以根用户身份登录,并转换到sysadm_r:

[test_server]# newrole -r sysadm_r

Authenticating root.

Password:

[test_server]# setenforce 0

下一步,编辑Snort.conf文件,需要使用自己喜欢的编辑器来修改/var/chroot/Snort/etc/Snort.conf。我们需要包括下面的行:

include local.rules

这会告诉Snort,要求它使用存储在local.rules中的新规则。

现在我们可以创建local.rules文件:

[test_server]# cd /var/chroot/Snort/etc

[test_server]# touch local.rules

下一部分比较有趣,因为我们需要编写规则了。在一个编辑器中打开local.rules,并增加下面的行。注意,这个规则仅是示例,你需要保证不能在一个真实的环境中使用哦:

alert tcp any any -> any 80 (msg: “Sample alert”;classtype:misc-attack;

sid: 2002973; rev:1;)

最后,重新启动Snort,以使新的规则生效

[test_server]# /etc/init.d/Snortd restart

一个简单的例子

既然现在我们增加了一条新规则,现在解释一下这条规则的作用,看一下其具体运用。

我们刚增加的规则是:

alert tcp any any -> any 80 (msg: “示例警告”; classtype:misc-attack;

sid: 2002973; rev:1;)

规则如何工作:

在用户试图访问一个Web站点是,就会激发上面的规则。规则被激发后,会打开警告,显示一个消息。在这里动作的关键字“alert”用所定义的方法生成 一个消息,然后记录这个数据包。我们正检测的数据包的协议是TCP协议,而且所有的IP地址和端口号已经定义。目标地址在连接到端口80的任何 IP地址上定义。最后,规则选项的关键字“msg”告诉记录器和警告引擎来显示消息“示例警告”。

测试

现在你一定对自己的规则是怎样运行的感兴趣。为了看到规则的具体作用,你需要跟踪Snort的警告日志。

[test_server]# cd /var/chroot/Snort/var/log/Snort

[test_server]# tail -f alert

打开一个Web浏览器,输入你的测试服务器的IP地址。

现在可以查看一下Snort的警告记录。你会看到来自Snort的一个消息,这是由我们刚才增加的规则所引起的。

[] [1:2002973:1] Sample alert []

[Classification: Misc Attack] [Priority: 2]

12/12-15:35:22.130162 test_client:35524 -> test_server:80

TCP TTL:64 TOS:0x0 ID:35734 IpLen:20 DgmLen:52 DF

A* Seq: 0x5F3B46F0 Ack: 0x85067266 Win: 0xB7 TcpLen: 32

TCP Options (3) => NOP NOP TS: 49925498 1529581

检测有效负荷样例

将下面的行添加到/var/chroot/Snort/etc/local.rules中:

alert tcp any any -> any 80

(content:”index.pl”;sid:12345678;rev:1;classtype:misc-attack;)

你可以看出,我们编写了一个规则,用以根据内容“index.pl”检测任何连接到端口80的通信。

注意在Snort的警告日志中,你应当能够看到一个与下面类似的消息:

[] [1:2002973:1] Sample alert []

[Classification: Misc Attack] [Priority: 2]

12/13-08:13:20.545431 test_client:32950 -> test_server:80

TCP TTL:64 TOS:0x0 ID:11275 IpLen:20 DgmLen:52 DF

A* Seq: 0x188A67A3 Ack: 0xF74B200C Win: 0xD8 TcpLen: 32

TCP Options (3) => NOP NOP TS: 64899598 45624

文章目录
,