基于Snort的入侵检测系统 3

 
第三章 使用 Snort 规则
如同病毒,大多数入侵行为都具有某种特征, Snort 的规则就是用这些特征的有关信息构建的。在第 1 章中我们提到,你可以用蜜罐来取得入侵者所用的工具和技术的信息,以及他们都做了什么。此外,还有入侵者会利用的已知的系统弱点数据库,如果入侵者试图利用这些弱点来实施攻击,也可以作为一些特征。这些特征可能出现在包的头部,也可能在数据载荷中。 Snort 的检测系统是基于规则的,而规则是基于入侵特征的。 Snort 规则可以用来检测数据包的不同部分。 Snort 1.x 可以分析第 3 层和第 4 层的信息,但是不能分析应用层协议。 Snort v 2.x 增加了对应用层头部分析的支持。所有的数据包根据类型的不同按顺序与规则比对。
规则可以用来产生告警信息、记录日志,或使包通过( pass :对 Snort 来说,也就是悄悄丢弃 (drop) ,通过在这里的意义与防火墙或路由器上的意义是不同的,在防火墙和路由其中,通过丢弃是两个相反的概念。 Snort 规则用简明易懂的语法书写,大多数规则写在一个单行中。当然你也可以行末用反斜线将一条规则划分为多个行。规则文件通常放在配置文件 snort.conf 文件中,你也可以用其他规则文件,然后用主配置文件引用它们。
本章将提供给你不同类型规则的信息以及规则的基本结构。在本章的最后,你可以找到一些用来检测入侵活动的规则的例子。读完本章以及后面两章后,你所获得的信息就可以使你建立一个基本的 Snort 入侵检测系统了。
3 1 TCP/IP 网络分层
在你开始书写规则之前,我们先来简要讨论一下 TCP/IP 的网络层次结构 nort 规则是常重要的,因为 Snort 规则依赖于这些层中的协议。
TCP/IP 协议族分为 5 层,这些层之间相互作用来完成通讯处理工作,它们是:
1、 物理层
2、 数据链路层,某些文章中也把它们叫做网络接口层。物理层和数据链路层由物理介质、网络接口适配器和网络适配器驱动所构成。以太网地址在数据链路层定义。
3、 网络层,也就是 IP 层。这一层负责点到点的数据通信并提供数据完整性。在这一层,所有的主机以 IP 地址来区分彼此。除了 IP 协议之外,这一层的主要协议还有 ICMP 。关于 IP 协议的更多信息参见 RFC791, 关于 ICMP 协议的更多信息查看 RFC792
4、 传输层,也就是 TCP/UDP 层。 TCP( 传输控制协议 ) 用来建立从源到目的的可靠的、面向连接的数据传输。而 UDP (用户数据报协议)提供无连接的数据传输, UDP 在进行数据传输的时候,并不提供数据送达的保证,常用在可以容忍数据丢失的情况下。参见 RFC 768 获取 UDP 的更多信息。参见 RFC 793 来获得更多的关于 TCP 的信息。
5、 应用层,包含提供用户与网络接口的应用程序,例如 Telnet Web 浏览器、 ftp 客户端等。这些应用程序常有自己用来进行数据通信的应用层协议。
Snort 规则可以在网络层和传输层进行操作,另外也有一些方法来探测数据链路层和应用层的异常。 Snort 规则的第二个部分显示了对应的协议,你很快将了解如何书写这些规则。
3 2 第一个不可用的规则
这里有个非常不好用的规则,事实上,也许是最差的规则,但是它可以很好的检测 Snort 是否正常工作,并可以产生告警:
alert ip any any -> any any (msg: "IP Packet detected";)
你可以在你第一次安装 Snort 的时候在 snort.conf 的末尾加上这条规则,这个规则可以使每当捕获一个 IP 包都产生告警信息,如果你就这样离开的话,你的硬盘空间很快就会被填满。这个规则之所以不可用,是因为它不信任任何信息。难道你用一个永久规则的目的就是为了检测 Snort 是否在工作吗?它应该是用来在你安装完 Snort 后做测试,以确定其工作正常,然后就去掉这条规则。下面的部分你可以了解 Snort 规则的不同部分,但为完整性起见,下面将简要解释一下刚才的那条规则所用的语句:
l        alert ”表示如果包与条件匹配,就产生一个告警信息。条件由下面的语句定义。
l        ip ”表示规则将被用在所有的 IP 包上。
l        第一个“ any ”是对 IP 包源地址部分的条件定义,表示来自任何一个 IP 地址的 IP 包都符合条件,任何 IP 包都符合本条件。
l        第二个“ any ”用来定义端口号,因为端口号与 IP 层无关,任何 IP 包都符合条件。
l        -> ”符号表示数据包传送的方向。
l        3 个“ any ”用来定义目的地址的条件, any 表示这条规则并不关心所有包的目的地址。
l        4 个“ any ”用来定义目的端口条件,再说明一次,因为 IP 层与端口无关。
l        最后一部分是规则的选项,,并包含一条将被纪录的告警消息。
下一条规则不想前面那个那么糟糕,它将对所有捕获的 ICMP 包产生告警。重申一次,这条规则也是来检测 Snort 是否正常工作的。
如果你想测试 Snort ,就发送一个 ping (在 UNIX 机器中,基本上是发送 ECHO 请求)包。再次重复,它应该是用来在你安装完 Snort 后做测试,以确定其工作正常,然后就去掉这条规则。以下面的命令为例,你可以向你的网关或其他什么主机发送 ICMP 包。
ping 192.168.2.1
注意, 192.168.2.1 是与 Snort 机器在同一网络的网关、路由器或其他机器。你可以在你安装 Snort 的机器上运行这个命令,这个命令在 UNIX Windows 机器上都可以运行。
 
3.3 CIDR
   RFC 1519 定义了无类域间路由或称 CIDR 。目前有将不同的地址类(比如 A B )做更好的利用的趋势。在 CIDR 的支持下,你可以用任意长度的掩码,这在基于地址类的网络中是不行的,因为基于类的网络中,掩码的长度是固定的。使用 CIDR 的时候,网络地址的后面附加上掩码所用的位数,例如 192.168.1.0/24 表示一个网络的网络地址是 192.168.1.0 ,掩码是 24 位。 24 位掩码相当于 255.255.255.0 。表示一个主机可以用到所有的掩码位,也就是 32 位。下面的规则表示 : 只有发送到 IP 地址为 192.168.2.113 的主机的 ICMP 包才会触发告警:
alert icmp any any -> 192.168.1.113/32 any /
(msg: "Ping with TTL=100"; ttl:100;)
3.4 规则的结构
   你已经看到了一些规则,尽管它们不那么好,但在某种意义上还是有用的。现在让我们来看一下 Snort 规则的结构。所有的 Snort 规则都可以分为两个逻辑组成部分:规则头部和规则选项。参见图 3-1
 
规则头部
规则选项
3-1 Snort 规则的基本结构。
规则的头部包含规则所做的动作的信息,也包含与包所比对的一些条件。选项部分通常包含一个告警消息以及包的那个部分被用来产生这个消息。一条规则可以用来探测一个或多个类型的入侵活动,一个好的规则可以来探测多种入侵特征。
Snort 规则头部的主要结构如图 3-2 所示:
动作
协议
地址
端口
方向
地址
端口
3-2 Snort 规则头部结构
动作 部分表示,当规则与包比对并符合条件是,会采取什么类型的动作。通常的动作时产生告警或记录日志或向其他规则发出请求。你可以来本章的后面了解关于动作的更多信息。
协议部分用来在一个特定协议的包上应用规则。这是规则所涉及的第一个条件。一些可以用到的协议如: IP,ICMP,UDP 等等。
地址部分定义源或目的地址。地址可以是一个主机,一些主机的地址或者网络地址。你也可以用这些部分将某些地址从网络中排除。后面将详细讨论。注意,在规则中有两个地址段,依赖于方向段决定地址是源或者是目的,例如,方向段的值是“ -> ”那么左边的地址就是源地址,右边的地址是目的地址。
如果协议是 TCP UDP ,端口部分用来确定规则所对应的包的源及目的端口。如果是网络层协议,如 IP ICMP ,端口号就没有意义了。
方向部分用来确定那一边的地址和端口是源,哪一边是目的。
例如,我们来看一下第 2 章曾经用到过的这样一个规则,当它探测到 TTL 100 ICMP ping 包的时候,就会产生告警:
alert icmp any any -> any any (msg: "Ping with TTL=100"; /
ttl: 100;)
括号之前的部分叫做规则头部,括号中的部分叫做规则选项。头部依次包括下面部分:
l        规则的动作:在这个规则中,动作是 alert( 告警 ) ,就是如果符合下面的条件,就会产生一个告警。记住如果产生告警,默认的情况下是会记录日志的。
l        协议:在这个规则中,协议是 ICMP ,也就是说这条规则仅仅对 ICMP 包有效,如果一个包的协议不是 ICMP Snort 探测引擎就不理会这个包以节省 CPU 时间。协议部分在你对某种协议的包应用 Snort 规则的时候是非常重要的。
l        源地址和源端口。在这个例子中,它们都被设置成了 any ,也就是这条规则将被应用在来自任何地方的 ICMP 包上,当然,端口号与 ICMP 是没有什么关系的,仅仅和 TCP UDP 有关系。
l        方向。在这个例子中,方向用 -> 表示从左向右的方向,表示在这个符号的左面部分是源,右面是目的,也表示规则应用在从源到目的的包上。如果是 <- ,那么就相反。注意,也可以用 <> 来表示规则将应用在所有方向上。
l        目的地址和端口。这个例子中,它们也都是“ any ”,表示规则并不关心它们的目的地址。在这个规则中,由于 any 的作用,方向段并没有实际的作用,因为它将被应用在所有方向的 ICMP 包上。
在括号中的选项部分表示:如果包符合 TTL=100 的条件就产生一条包含文字:“ Ping with TTL=100”的告警。TTL IP 包头部字段。参见 RFC 791 或者附录 C
3 5 规则头部
   如前面提到的,规则的头部包括括号前面的一些部分,现在让我们从动作开始来详细的看一下规则头部的每个部分。
3.5.1 规则动作
动作是 Snort 规则中的第一个部分,它表示规则的条件符合的时候,将会有什么样的动作产生。 Snort 5 个预定义的动作,你也可以定义自己的动作,需要注意的是, Snort 1.x 2.x 对规则的应用是不同的,在 1.x 中,只要包符合第一个条件,它就会做出动作,然后就不再管它,尽管它可能符合多个条件;在 2.x 中,只有包和所有相应规则比对后,才根据最严重的情况发出告警。
 
3.5.1 .1 pass
这个动作告诉 Snort 不理会这个包,这个动作在你不想检查特定的包的时候可以加快 Snort 的操作速度。例如,如果你在网络中有一台包含一些弱点的主机,用来检测网络安全漏洞,可能会希望不理会对这台机器的攻击, pass 规则这时就可以用到了。
3.5.1 .2 Log
Log 动作用来记录包,记录包有不同的方式,例如,可以记录到文件或者数据库,这将在以后讨论。根据命令行参数和配置文件,包可以被记录为不同的详细程度。你可以用“ snort - ? ”命令来查看你所用版本 Snort 的命令行可用参数。
3.5.1 .3 Alert
Alert 动作用来在一个包符合规则条件时发送告警消息。告警的发送有多种方式,例如可以发送到文件或者控制台。 Log 动作与 Alert 动作的不同在于: Alert 动作是发送告警然后记录包, Log 动作仅仅记录包。
3.5.1 .4 Activate
Activate 动作用来产生告警然后激活其它规则来进行进一步的检验。如下面所说的,动态规则就是用于这个目的。当你需要对捕获的包进行进一步检验的时候,就可以用 activate 动作。
3.5.1 .5 Dynamic
Dynamic 规则动作由其它用 activate 动作的规则调用,在正常情况下,他们不会被用来检测包。一个动态规则仅能被一个“ activate” 动作激活。
3.5.1 .6 自定义动作
除了以上动作外,你也可以定义自己的动作,以用于不同的目的,例如:
l        Syslog 发送消息。 Syslog 是系统日志守护进程,它在 /var/log 中创建日志文件,这些文件的位置可以通过修改 /etc/syslog.conf 来改变。你可以在 UNIX 系统中用命令“ man syslog ”或者“ man syslog.conf ”来获得更多信息。 Syslog 相当于 Windows 中的事件查看器。
l        向如 HP OpenView Open NMS(http://www.opennms.org) 等网管系统发送 SNMP trap
l        在一个包上应用多个动作。如你前面所看到的,一个规则仅仅规定了一个动作,自定义动作可以用来产生多个动作。例如,你可以在发送 SNMP trap 的同时记录 Syslog
l        将数据记录到 XML 文件中。
将信息记录到数据库中, Snort 可以将数据记录到 MySQL, Postgress SQL, Oracle Microsoft SQL server 中。
这些新的动作类型在配置文件 snort.conf 中定义。一个新动作用下面的通用结构来定义:
ruletype action_name
{
action definition
}
    关键字 ruletype 后面跟随动作的名称,两个大括号中是实际的动作定义,类似于 C 语言中的函数。例如,我们定义一个叫做 smb_db_alert 的动作,用来向 workstation.list 中的主机发送 SMB 告警,同时在 MySQL 中的“ Snort ”数据库记录,如下所示:
ruletype smb_db_alert
{
type alert
output alert_smb: workstation.list
output database: log, mysql, user=rr password=rr /
dbname=snort host=localhost
}
 
这些规则的类型我们会在下一章详细讨论,通常它们与配置和输出插件有关。
3.5.2 协议
协议是 Snort 规则中的第二部分,这一部分将显示那种类型的包将与该规则比对。到目前为止, Snort 可以支持以下协议:
l        IP
l        ICMP
l        TCP
l        UDP
如果协议是 IP Snort 检测包中的数据链路层头部来确定包的类型,如果协议类型是其他任何一种, Snort 检测 IP 头部来确定协议类型。不同的包头部将在附录 C 中讨论。
协议部分仅仅在规则头部的条件中起作用。规则中的选项部分可以附加与协议无关的条件。如下面协议为 ICMP 的规则:
alert icmp any any -> any any (msg: "Ping with TTL=100"; /
ttl: 100;)
选项部分检测 TTL 值,它并不是 ICMP 头部的内容,而是 IP 头部内容。这就是说选项部分可以检测属于其它协议的一些参数。常用协议的头部和相关分析见附录 C
3.5.3 地址
Snort 规则中,有两个地址部分,用来检测包的来源和目的地。地址可以是一个主机地址或者网络地址。你可以用关键字 any 来指定所有的地址。地址后面用斜线来附加一个数字,表示掩码的位数。比如 192.168.2.0/24 代表一个 C 类网络 192.168.2.0 ,其子网掩码是 255.255.255.0 。记住下面的一些子网掩码:
l        如果子网掩码是 24 位,它是一个 C 类网络。
l        如果子网掩码是 16 位,它是一个 B 类网络。
l        如果子网掩码是 24 位,它是一个 A 类网络。
l        表示一个主机用 32 位掩码。
根据 CIDR 的支持,你可以用任何位数的掩码。参考 RFC 791 取得关于 IP 地址和子网掩码的信息。 CIDR 的更多信息参考 RFC 1519
前面我们提到, Snort 规则中有两个地址段,其中一个是源地址,另外一个是目的地址。方向段指明那个是源地址,哪个是目的地址。参考方向段部分的叙述来了解更多信息。
下面是一个在 Snort 规则中地址部分的例子:
l        192.168.1.3/32 定义一个地址为 192.168.1.3 的主机。
l        192.168.1.0/24 定义从 192.168.1.0 192.168.1.255 C 类网络地址,子网掩码是 24 位,相当于 255.255.255.0
l        152.168.0.0/24 定义从 152.168.0.0 192.168.255.255 B 类网络地址,子网掩码是 16 位,相当于 255.255.0.0
l        10.0.0 .0/8 定义从 10.0.0.0 10.255.255.255 A 类网络地址,子网掩码是 8 位,相当于 255.0.0.0
l        192.168.1.16/28 定义从 192.168.1.16 192.168.1.31 的网络地址,子网掩码是 28 位,相当于 255.255.255.240 。在这 16 个地址中有 14 个可以用作主机地址,因为还有一个网络地址和一个广播地址,注意,在任何网络中的一个地址总是网络地址,最后一个是广播地址。在这个例子中 192.168.1.16 是网络地址, 192.168.1.31 是广播地址。
 
例,你可以用下面的规则,使到 web 服务器 192.168.1.10/32 80 端口的 TTL 100 的数据包触发告警:
alert tcp any any -> 192.168.1.10/32 80 (msg: "TTL=100"; /
ttl: 100;)
这个规则仅仅用来示例 IP 地址是如何在 Snort 规则中应用的。
3.5.3 .1 排除某些地址
Snort 提供一种机制,可以是你用否定符号“!”,也就是感叹号,来排除某些地址,这个符号用来限制 Snort 不对某些源或目的地址的包做检测。例如,西面的规则将检测除了来自 C 类网络 192.168.2.0 之外所有的包:
alert icmp ![192.168.2.0/24] any -> any any /
(msg: "Ping with TTL=100"; ttl: 100;)
当你想测试不包括你自己的网络的其它的包的时候,这个规则非常有用,这也意味着你信任自己所在网络的所有人!
3.5.3 .2 地址列表
你也可以在 Snort 规则中指定一个地址的列表,比如,你的网络中包含两个 C 类网络: 192.168.2.0 192.168.8.0 ,你想对除了这两个网络之外的其它地址应用规则,你可以用下面的规则,其中两个地址用逗号分隔:
  alert icmp ![192.168.2.0/24,192.168.8.0/24] any -> any /
any (msg: "Ping with TTL=100"; ttl: 100;)
注意,方括号是与否定符号以器用的,如果没有否定符号,你可以不用方括号。
3.5.1 端口号
端口号用来在进出特定的某个或一系列端口的包上运用规则,例如,你可以用源端口 23 来对来自 Telnet 服务器的包应用规则。你可以用关键字 any 来对包应用规则,而不管它的端口号。段口号仅仅对 TCP UDP 协议有意义,如果你选择的协议是 IP 或者 ICMP ,端口号就不起作用。下面的规则用来检测来自 C 类网络 192.168.2.0/24 中的 Telnet 服务器,并包含“ confidential”( 机密 ) 的包:
alert tcp 192.168.2.0/24 23 -> any any /
(content: "confidential"; msg: "Detected confidential";)
同类的规则也可以用在这个网络中来自或者去向任何 Telnet 服务器的包,我们改以下方向段为任何方向,如下所示:
alert tcp 192.168.2.0/24 23 <> any any /
(content: "confidential"; msg: "Detected confidential";)
当你想仅对某种类型的包应用规则的时候,端口号是非常有用的。例如,一种攻击仅与 HTTP web 服务器相关,你可以在规则中设置端口号 80 来检测试图进行这种攻击的人,这样 Snort 规则仅仅监视 web 服务,不对其它的 TCP 包应用规则。制订良好的规则一定能提高 IDS 的性能。
3.5.4 .1 端口范围
你也可以在规则中的端口段设置一系列的端口,而不只是一个。用冒号分隔起始和结束。例如下面的规则将对来自 1024-2048 的所有 UDP 包告警:
alert udp any 1024:2048 -> any any (msg: “UDP ports”;)
3.5.4 .2 上限与下限
你可以仅用一个起始端口号或结束端口号来表示端口列表,例如: 1024 表示比 1024 小,包含 1024 的所有端口, 1000 :表示比 1000 大,包括 1000 的所有端口。
3.5.4 .3 否定符
与地址段相同,你也可以在 Snort 规则中的端口段用否定符号来排除一个或多个端口。下面的规则将记录除了 53 段口外的其它所有 UDP 通信。
log udp any !53 -> any any log udp
但是你不能用逗号来分隔多个端口,如 53 54 这样的表示是不允许的,但是你可以用 53 54 来表示一个端口范围。
3.5.4 .4 共用端口号。
共用端口号是提供给一些公用应用的,表 3-1 列举了其中一些及应用。
端口号
描述
20
FTP 数据
21
FTP
22
SSH 或安全 Shell
23
Telnet
25
SMTP 或类似于 Sendmail e-mail 服务器
37
NTP (网络时钟协议,用来同步网络主机时间)
53
DNS 服务器
67
BootP/DHCP 客户端
68
BootP/DHCP 服务器
69
TFTP
80
HTTP,web 服务器
110
POP3 ,供类似于 OE 的邮件客户端使用
161
SNMP
162
SNMP trap
443
HTTPS 或安全 HTTP
514
Syslog
 
UNIX 平台上,你可以查看 /etc/services 文件,可以看到更多的端口的定义。 RFC 1700 中包含详细列表。目前 ICANN 负责管理这些端口号,你可以在 http://www.icann.org 获得更多信息。
3.5.5 方向段
Snort 规则中,方向段确定源和目的。下面是方向段的相关规定:
-> 表示左边的地址和端口是源而右边的是目的。
<- 表示右边的地址和端口是源而左边的是目的。
<> 表示规则将被应用在两个方向上,在你想同时监视服务器和客户端的时候,可以用到这个标示。例如,你可以监视往来 POP 或者 Telnet 服务器的数据流。
3.6 规则选项
   Snort 规则的选项在头部的后面,在一对圆括号里面,其中可能包含一个选项,也可能包含用分号分隔的多个选项,这些选项的关系是逻辑与的关系,只有当选项中的条件都满足的时候,规则动作才会被执行。在前面的例子中,你已经来规则中应用了 msg ttl 的选项。所有的选项都是由关键字来定义的,一些选项中还会包含变量值。一个选项包含两个主要部分:一个关键字和变量值。关键字和变量值由冒号分隔。如你前面看到的:
msg: "Detected confidential";
   在这个选项中,关键字是 msg, "Detected confidential" 是变量值。
   本部分的后面将叙述在 Snort 规则的选项部分的各种关键字:
  
   3.6.1 关键字 ack
   Tcp 头部中包含一个 32 位的 Acknowldege Number 字段,这个字段表示希望对端发送的下一个 Tcp 包的序列号。仅当 TCP 头部的 ACK 标志位被设为 1 的时候,这个字段才起作用。关于 TCP 头部的详细资料,参考附录 C 或者 RFC 793
   类似于 nmap 的工具用 TCP 头部的这个特征来扫描计算机,例如,在这些工具所用的技术中,它们向目标主机发送至 80 端口, ACK 标志为 1 ,序列号为 0 TCP 包,这样目标主机就不会接受这个包,并发回一个 RST 标志为 1 的包,当 nmap 受到这个包的时候,就知道那台主机是存在的。当目标主机不对 ICMP 做出回应的时候,这个方法可以起到作用。
   为了探测到这种 TCP ping, 你可以用类似于下面的规则来产生告警信息:
      alert tcp any any -> 192.168.1.0/24 any (flags: A; /
ack: 0; msg: "TCP ping detected";)
   这条规则的作用是在当你收到标志位 A 1 acknowledgement 段的值为 0 TCP 包的时候,发送一个告警信息。表 3-2 列举了其他的 TCP 标志位。在本规则中,定义包的目的是 192.168.1.0/24 ,你可以用其它的值。关键字 ack 基本上用来探测这种类型的攻击,一般情况下,如果 A 位为 1 Ack 的值是不等于 0 的。
3.6.2 关键字 classtype
Snort 规则可以分配类别和优先级以便区分,为全面了解关键字 classtype, 首先我们来看被 snort.conf include 关键字所引用的 classifacation.config 文件,该文件的每一行都遵循下面的语法:
config classification: name,description,priority
其中 name 用来表示类别名称,在 Snort 规则中用 classtype 关键字来指定, description 是对类别的简单描述。 Priority 是这个类别的默认优先级,用数字表示,并可以在 Snort 选项中用关键字 priority 改变。你也可以把这些语句放在 snort.conf 中。下面是一个例子:
config classification: DoS,Denial of Service Attack,2
   上面的一行中,定义了一个类别 DoS ,其优先级为 2 。在第 6 章中,你将看到在基于 web Snort 分析工具 ACID 中用到这个类别。现在让我们在规则中应用这个类别,如下例,优先级为默认值:
alert udp any any -> 192.168.1.0/24 6838 (msg:"DoS"; /
content: "server"; classtype:DoS;)
我们改变这个规则,可以覆盖默认优先级:
alert udp any any -> 192.168.1.0/24 6838 (msg:"DoS"; /
content: "server"; classtype:DoS; priority:1)
   分类和优先级的意义在于,我们可以了解告警是否紧急,这在我们要对威胁性高的告警提高警惕的时候非常有用。
   如果你看到在第 6 章中讨论的 ACID 浏览器窗口,就可以看到图 3-3 中所示的 classifacation , 在窗口中间的第二列是所捕获数据包的分类。其他的一些分析工具也用关键字 classification 来区分入侵行为的类别。典型的 classification.conf 文件如下所示,这个文件与 Snort1.9.0 共同发行,你可以在这个文件中增加自己的分类并在自己的规则中应用。
# $Id: classification.config,v 1.10 2002/08/11 23:37:18 cazz Exp $
# The following includes information for prioritizing rules
#
# Each classification includes a shortname, a description, and a
default
# priority for that classification.
#
# This allows alerts to be classified and prioritized. You can specify
# what priority each classification has. Any rule can override the
default
# priority for that rule.
#
# Here are a few example rules:
#
# alert TCP any any -> any 80 (msg: "EXPLOIT ntpdx overflow";
# dsize: > 128; classtype:attempted-admin; priority:10;
#
# alert TCP any any -> any 25 (msg:"SMTP expn root"; flags:A+; /
# content:"expn root"; nocase; classtype:attempted-recon;)
#
# The first rule will set its type to "attempted-admin" and override
# the default priority for that type to 10.
#
# The second rule set its type to "attempted-recon" and set its
# priority to the default for that type.
#
#
# config classification:shortname,short description,priority
#
config classification: not-suspicious,Not Suspicious Traffic,3
config classification: unknown,Unknown Traffic,3
config classification: bad-unknown,Potentially Bad Traffic, 2
config classification: attempted-recon,Attempted Information Leak,2
config classification: successful-recon-limited,Information Leak,2
config classification: successful-recon-largescale,Large Scale
Information Leak,2
config classification: attempted-dos,Attempted Denial of Service,2
config classification: successful-dos,Denial of Service,2
config classification: attempted-user,Attempted User Privilege Gain,1
config classification: unsuccessful-user,Unsuccessful User Privilege
Gain,1
config classification: successful-user,Successful User Privilege Gain,1
config classification: attempted-admin,Attempted Administrator
Privilege Gain,1
config classification: successful-admin,Successful Administrator
Privilege Gain,1
# NEW CLASSIFICATIONS
config classification: rpc-portmap-decode,Decode of an RPC Query,2
config classification: shellcode-detect,Executable code was detected,1
config classification: string-detect,A suspicious string was detected,3
config classification: suspicious-filename-detect,A suspicious filename
was detected,2
config classification: suspicious-login,An attempted login using a
suspicious username was detected,2
config classification: system-call-detect,A system call was detected,2
config classification: tcp-connection,A TCP connection was detected,4
config classification: trojan-activity,A Network Trojan was detected, 1
config classification: unusual-client-port-connection,A client was
using an unusual port,2
config classification: network-scan,Detection of a Network Scan,3
config classification: denial-of-service,Detection of a Denial of
Service Attack,2
config classification: non-standard-protocol,Detection of a nonstandard
protocol or event,2
config classification: protocol-command-decode,Generic Protocol Command
Decode,3
config classification: web-application-activity,access to a potentially
vulnerable web application,2
config classification: web-application-attack,Web Application Attack,1
config classification: misc-activity,Misc activity,3
config classification: misc-attack,Misc Attack,2
config classification: icmp-event,Generic ICMP event,3
config classification: kickass-porn,SCORE! Get the lotion!,1
config classification: policy-violation,Potential Corporate Privacy
Violation,1
config classification: default-login-attempt,Attempt to login by a
default username and password,2
3.6.3 关键字 content
Snort 的一个重要特征就是它可以在包的里面发现数据特征,这些特征可能以 ASCII 字符的形式出现,也可能是 16 进制字符所表示的二进制数据。如同病毒,入侵者的行为也通常会在数据包中表现某种特征,关键字 content 就使用来发现这些特征的。 Snort1.x 版本不支持应用层协议,但是用 content offset 关键字联合使用,也可以找到应用层的数据。
下面的规则可以检测离开网络 192.168.1.0 并在数据段含有“ GET ”的 TCP 包。在 HTTP 相关的攻击中, GET 是经常被用到的一个关键字。然而,这个规则仅仅能够使你了解如何用关键字 content 来工作。
alert tcp 192.168.1.0/24 any -> ![192.168.1.0/24] any /
(content: "GET"; msg: "GET matched";)
以下的规则作用与上面一条相同,但是特征以 16 进制表示。
alert tcp 192.168.1.0/24 any -> ![192.168.1.0/24] any /
(content: "|47 45 54|"; msg: "GET matched";)
16 进值的数字 47 ASCII 字符 G 的值相等, 45 E 相等, 54 T 相等。你可以在同一条规则中同时用 ASCII 16 进制来进行特征比对。用 16 进值表示时,应当用双竖线 || 将字符包括进去。
在用 content 关键字的时候,要记住以下的原则:
内容比对是
 

3.6.34

3.7Snort配置文件

Snort通过配置文件来完成启动配置,例如下面的启动命令:

/opt/snort/snort -c /opt/snort/snort.conf

配置文件包括6个基本的部分:

 

变量定义,变量用于Snort规则和其他的目的,比如规则文件的路径。

配置参数,指定Snort配置的选项,其中有些参数也可以用在命令行中。

预处理器配置。用来在探测引擎执行特定的动作前对包进行处理。

输出模块配置。控制如何记录数据。

定义新的动作类型。如果预定义的动作类型不能够满足你的要求你可以在配置文件中自定义动作。

规则配置和引用文件。尽管你可以在snort.conf中定义规则,将规则放在不同的文件中还是更加方便管理。你可以用关键字include来指定你所引用的规则文件。

 

3.7.1 在规则中使用变量

在配置文件中,你可以使用变量,这样会带来一些方便。例如,你可以在配置文件中定义HOME_NET变量。

var HOME_NET 192.168.1.0/24

 

然后你就可以在你的规则中引用这个变量:

alert ip any any -> $HOME_NET any (ipopts: lsrr; /

msg: “Loose source routing attempt”; sid: 1000001;)

 

这样做的好处是可以使配置文件用在不同环境中,你所做的只是改变变量的值,而不需要修改每个规则。

3.7.11 在变量中使用网络列表

你也可以定义一个包含多个条目的变量,例如一个包含两个网段的网络:

var HOME_NET [192.168.1.0/24,192.168.10.0/24]

不同的网络用逗号分隔。

3.7.1 .2 在变量中使用网络接口名称

在定义变量的时候,你可以用网络接口名称:

var HOME_NET $eth0_ADDRESS

var EXTERNAL_NET $eth1_ADDRESS

3.7.1 .3 使用关键字any

关键字any也可以成为一个变量。它匹配任何值,例如:

var EXTERNAL_NET any

 

在系统自带的snort.conf文件中,已经定义了很多变量,你可以根据自己的需要修改。

 

3.7.2 配置指令

snort.conf文件中用配置指令可以让用户配置Snort的全局设定。例如日志文件的路径,规则的应用顺序等等。配置指令的大体格式如下:

config directive_name[: value]

3-6是一个指令列表

指令

描述

Order

改变规则应用的顺序,相当于命令行中的-o选项。

Alertfile

用来设置告警文件的名称。

Classification

用来建立规则的分类。

Decode_arp

打开arp解码,相当于命令行-a选项

Dump_chars_only

相当于命令行选项 –C

Dump_payload

相当于命令行选项 –d,用来从包中获得数据载荷的内容

Decode_data_link

相当于命令行选项 –e,用来数据链路层头部的解码。

Bpf_file

相当于命令行选项 –F

Set_gid

相当于命令行选项 –g,用来设定运行Snort的组用户ID

Daemon

相当于命令行选项 –D,这样用守护进程的模式调用Snort

Reference_net

相当于命令行选项 –h.用来设置本地网络地址

Interface

相当于命令行选项 –i.用来设置Snort的网络接口。

Alert_with_interface_name

相当于命令行选项 –T,用来在告警消息的后面附加接口信息。

Logdir

相当于命令行选项 –l.

Umask

相当于命令行选项 –m,用来在运行Snort的时候设置Umask.

Pkt_count

相当于命令行选项 –n,用来在接受到一定数量的包后退出Snort

Nolog

相当于命令行选项 –N,用来停止告警以外的日志。

Obfuscate

相当于命令行选项-O,用来在以伪装的IP来向其他人发送消息,这样可以掩藏自己的IP地址。

No_promisc

相当于命令行选项 –p,用来关闭混杂模式。

Quite

相当于命令行选项-q,用来关闭Snort启动时候的欢迎信息和统计信息。

Chroot

相当于命令行选项-t,用来改变根目录

Checksum_mod

用来检验特定类型的包的校验值。

Set_uid

相当于命令行选项-u,用来设置运行Snort的用户ID

Utc

相当于命令行选项-U,用UTC时间代替本地时间作为日志的时钟。

Verbose

相当于命令行选项-v,在记录日志的同时,将日志信息输出到标准输出。

Dump_payload_verbose

相当于命令行选项-X,将原始包信息传送到标准输出

Show_year

在日志时间戳中加上年份

Stateful

设置stream4预处理器的声明模式

 

3.7.3 预处理器的配置

预处理器的配置格式如下:

preprocessor <preprocessor_name>[: <configuration_options>]

详细内容在第四章解释。

3.7.4 输出模块配置

输出模块的配置格式如下:

output <output_module_name>[: <configuration_options>]

详细内容在第四章解释。

 

3.7.5 定义新的动作类型

每个Snort规则的第一个部分都是动作。Snort有很多预定义的动作,但是如果这些动作仍然不能满足你的要求,你可以定义自己的动作。

一个新的动作类型可以包含多个输出模块。例如:

ruletype dump_database

{

type alert

output database: alert, mysql, user=rr dbname=snort /

host=localhost

output log_tcpdump: tcpdump_log_file

}

新定义的动作类型同样可以在规则种应用:

dump_database icmp any any -> 192.168.1.0/24 any /

(fragbits: D; msg: "Don’t Fragment bit set";)

如上面的例子,日志将同时被记录到数据库和日志文件。

3.7.6 规则的配置

规则的配置往往是配置文件中的最后部分。你可以用include关键字将其他的规则文件引用。

3.7.8 示例

下面是一个配置文件的示例,如果你修改了配置文件,就需要重新启动Snort使之生效。

# Variable Definitions

var HOME_NET 192.168.1.0/24

var EXTERNAL_NET any

var HTTP_SERVERS $HOME_NET

var DNS_SERVERS $HOME_NET

var RULE_PATH ./

# preprocessors

preprocessor frag2

preprocessor stream4: detect_scans

preprocessor stream4_reassemble

preprocessor http_decode: 80 -unicode -cginull

preprocessor unidecode: 80 -unicode -cginull

preprocessor bo: -nobrute

preprocessor telnet_decode

preprocessor portscan: $HOME_NET 4 3 portscan.log

preprocessor arpspoof

# output modules

output alert_syslog: LOG_AUTH LOG_ALERT

output log_tcpdump: snort.log

output database: log, mysql, user=rr password=boota /

dbname=snort host=localhost

output xml: log, file=/var/log/snortxml

# Rules and include files

include $RULE_PATH/bad-traffic.rules

include $RULE_PATH/exploit.rules

include $RULE_PATH/scan.rules

include $RULE_PATH/finger.rules

include $RULE_PATH/ftp.rules

include $RULE_PATH/telnet.rules

include $RULE_PATH/smtp.rules

include $RULE_PATH/rpc.rules

include $RULE_PATH/dos.rules

include $RULE_PATH/ddos.rules

include $RULE_PATH/dns.rules

include $RULE_PATH/tftp.rules

include $RULE_PATH/web-cgi.rules

include $RULE_PATH/web-coldfusion.rules

include $RULE_PATH/web-iis.rules

include $RULE_PATH/web-frontpage.rules

include $RULE_PATH/web-misc.rules

include $RULE_PATH/web-attacks.rules

include $RULE_PATH/sql.rules

include $RULE_PATH/x11.rules

include $RULE_PATH/icmp.rules

include $RULE_PATH/netbios.rules

include $RULE_PATH/misc.rules

include $RULE_PATH/attack-responses.rules

include $RULE_PATH/myrules.rules

 

3.8 基于动作的Snort规则包检验顺序

5种类型的Snort规则可以归为3个大类:

告警规则

通过规则

日志规则

Snort收到包的时候,会按照上面三种规则依次检验,这样的设计是安全性非常高的。但是因为大多数包是正常的包,因此这样做也会耗费一些系统资源,Snort提供一种方法改变顺序来提高效率,但是这样做也会使安全性降低。将顺序改变为:

通过规则

告警规则

日志规则

在改变规则的时候要仔细,因为可能一个比较差的规则就可能让很多恶意的包通过。你可以在配置文件中用config order来实现顺序的改变:

config order

如果你定义了自己的规则类型,它们一般会在监测顺序的最后。

 

3.9自动升级Snort规则

有许多工具可以用来升级Snort的特征库,下面介绍两个升级Snort规则的方法

39.1简单的方法

这个方法包含一个简单的shell脚本,你需要在你的系统中安装wget程序。这个程序用来用HTTP协议来获得文件的信息,与浏览器类似,但是它用命令行来取得文件的信息。

#!/bin/sh

# Place of storing your Snort rules. Change these variables

# according to your installation.

RULESDIR=/etc/snort

RULESDIRBAK=/etc/snort/bak

# Path to wget program. Modify for your system if needed.

WGETPATH=/usr/bin

# URI for Snort rules

RULESURI=http://www.snort.org/downloads/snortrules.tar.gz

# Get and untar rules.

cd /tmp

rm -rf rules

$WGETPATH/wget $RULESURI

tar -zxf snortrules.tar.gz

rm –f snortrules.tar.gz

# Make a backup copy of existing rules

mv $RULESDIR/*.rules $RULESDIRBAK

# Copy new rules to the location

mv /tmp/rules/*.rules $RULESDIR

下面让我们来看这个脚本是如何工作的。下面的几行是定义一些变量:

RULESDIR=/etc/snort

RULESDIRBAK=/etc/snort/bak

WGETPATH=/usr/bin

RULESURI=http://www.snort.org/downloads/snortrules.tar.gz

下面的3行用来删除/tmp目录下面的/tmp/rules并从$RULESURI变量中指定的URI下载snortrules.tar.gz文件然后用下面的两行命令解压并删除它。

tar -zxf snortrules.tar.gz

rm -f snortrules.tar.gz

下面的一行用来备份现有的规则文件的拷贝,以便你需要使用它们。

mv $RULESDIR/*.rules $RULESDIRBAK

脚本中的最后一行将新的规则文件从/tmp/rules目录移动到工作目录./etc/snort这样Snort就可以读取它们了。

mv /tmp/rules/*.rules $RULESDIR

运行脚本之后要重新启动Snort

 

3.9.2 复杂的方法

这一部分介绍关于Oinkmaster的信息。你可以在http:// www.algonet.se/~nitzer/oinkmaster/找到关于这个工具的信息。这个工具是用perl写的,所以你必须在运行Snort的机器上安装Perl

 

 

 

 

3.10 默认的Snort规则和分类

Snort发行版含有很多的规则,它们被存放到不同的文件中,每个文件代表一类规则。例如 1.9.0 附带的规则文件:

attack-responses.rules

backdoor.rules

bad-traffic.rules

chat.rules

ddos.rules

deleted.rules

dns.rules

dos.rules

experimental.rules

exploit.rules

finger.rules

ftp.rules

icmp-info.rules

icmp.rules

imap.rules

info.rules

local.rules

Makefile

Makefile.am

Makefile.in

misc.rules

multimedia.rules

mysql.rules

netbios.rules

nntp.rules

oracle.rules

other-ids.rules

p2p.rules

policy.rules

pop3.rules

porn.rules

rpc.rules

rservices.rules

scan.rules

shellcode.rules

smtp.rules

snmp.rules

sql.rules

telnet.rules

tftp.rules

virus.rules

web-attacks.rules

web-cgi.rules

web-client.rules

web-coldfusion.rules

web-frontpage.rules

web-iis.rules

web-misc.rules

web-php.rules

x11.rules

例如,所有和X-window攻击相关的规则都在x11.rules文件中。

# (C) Copyright 2001,2002, Martin Roesch, Brian Caswell, et al.

# All rights reserved.

# $Id: x11.rules,v 1.12 2002/08/18 20:28:43 cazz Exp $

#----------

# X11 RULES

#----------

alert tcp $EXTERNAL_NET any -> $HOME_NET 6000 (msg:"X11 MIT Magic

Cookie detected"; flow:established

; content: "MIT-MAGIC-COOKIE-1"; reference:arachnids,396;

classtype:attempted-user; sid:1225; rev:3;

)

alert tcp $EXTERNAL_NET any -> $HOME_NET 6000 (msg:"X11 xopen";

flow:established; content: "| 6c 00 0b

00 0000 0000 0000 0000|"; reference:arachnids,395; classtype:unknown;

sid:1226; rev:2;)

3.10.1 local.rules文件

local.rules文件中没有规则,它是用来存放管理员自定义的规则的。你也可以用其他文件来存放自定义的规则。

 

 

3.11一些默认的规则的样板

这一部分分析一些随Snort发行的预先定义的规则,这里的规则都是来自于telnet.rules文件,现在让我们来分析它们:

3.11.1 监测telnet会话中的su尝试

下面的规则探测尝试在telnet进程中su超级用户的尝试:

alert tcp $TELNET_SERVERS 23 -> $EXTERNAL_NET any (msg:"TELNET

Attempted SU from wrong group"; flow:

from_server,established; content:"to su root"; nocase;

classtype:attempted-admin; sid:715; rev:6;)

在这个规则中,有很多地方需要注意:

 

变量是$TELNET_SERVERSsnort.conf中定义的Telnet服务器列表。

规则仅仅监测telnet服务器的回应,而不是请求

变量$EXTERNAL_NET是在snort.conf中定义的外部网络。规则将监测来自于外部的telnet会话,对于内部网络的telnet会话,就不会做出监测。

关键字flow用来将规则仅仅应用在已经建立的会话上面。

关键字content用来监测含有“to su root”的包,如果有,则产生告警。

关键字nocase使规则忽略包内容的大小写。

关键字classtype给规则归类


规则的ID715

关键字rev显示规则的版本

 

3.11.2 监测telnet会话中的登录失败

下面的规则与上个规则类似,它可以监测登录Telnet服务器的失败尝试:

alert tcp $TELNET_SERVERS 23 -> $EXTERNAL_NET any (msg:"TELNET login

incorrect"; content:"Login inco

rrect"; flow:from_server,established; reference:arachnids,127;

classtype:bad-unknown; sid:718; rev:6;)

它比上个规则多出了一个指定参考地址的关键字。

 

 

 

3.12写有质量的规则

Snort的发行版中有已经定义好的规则,这些规则对于你编写优质的规则是个不错的参考。尽管不是强制性的,但是你最好在每个规则的选项中用到下面的部分:

msg关键字引导的消息

classification关键字引导的规则分类

sid关键字引导的的数字用来标示规则

reference关键字引导的系统弱点参考URL

rev来表明不同的规则版本

 

另外,你应该用不同的方法来攻击你的网络来测试你的规则,因为恶意用户也会用各种方法来攻击网络。好的规则应该能够探测到各种攻击。

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值