Snort是一个开源的网络入侵检测系统,它是一个可以实时监视网络通信的数据包嗅探器。通过协议分析和内容搜索与匹配,Snort能够检测攻击方法,包括拒绝服务器攻击、缓冲区溢出、CGI攻击、秘密的端口扫描等。Snort的生命力在于其功能强大的规则。
可以认为编写Snort规则就像编写程序一样。Snort规则包括变量、关键字和函数。为什么我们需要编写规则?其原因是没有这些规则,Snort将不可能检测黑客的攻击行为。本文将讨论编写规则的问题。
先决条件:
你需要:
1.一台可以进行开发规则的机器。这些规则不应当运行在一台产生性服务器上,因为这些规则只能作为你参考的例子。
2.你还需要一台客户端计算机,并使其与运行Snort的机器相连接。
3.安装有Snort的EnGarde Secure Community 3.0.18(或以上版本)。
语法问题
其语法初看起来可能有点儿奇怪,不过本节将解释这个问题,这样您就可以开始编写自己的规则。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 |
这仅仅是个开始
通过你所拥有的知识,现在你就可以开始更深入地研究如何编写自己的规则。官方的Snort文档包含着语法的每一个细节。随着你更深入编写你的Snort规则,你就会注意到以前没有注意到网络攻击者。