snort
Snort规则被分成两个逻辑部分:规则头和规则选项。规则头包含规则的动作,协议,源和目标ip地址与网络掩码,以及源和目标端口信息;规则选项部分包含报警消息内容和要检查的包的具体部分。
1. 规则头
- 规则的头部包含规则所做的动作的信息,也包含与包所比对的一些条件。选项部分通常包含一个告警消息以及包的那个部分被用来产生这个消息。一条规则可以用来探测一个或多个类型的入侵活动,一个好的规则可以来探测多种入侵特征。
- 在2.x中,只有包和所有相应规则比对后,才根据最严重的情况发出告警。
规则动作
在snort中有五种动作:alert、log、pass、activate和dynamic.
Alert-使用选择的报警方法生成一个警报,然后记录(log)这个包。 Alert动作用来在一个包符合规则条件时发送告警消息。告警的发送有多种方式,例如可以发送到文件或者控制台。Log动作与Alert动作的不同在于:Alert动作是发送告警然后记录包,Log动作仅仅记录包。
Log-记录这个包。Log动作用来记录包,记录包有不同的方式,例如,可以记录到文件或者数据库,这将在以后讨论。根据命令行参数和配置文件,包可以被记录为不同的详细程度。你可以用“snort - ?”命令来查看你所用版本Snort的命令行可用参数。
Pass-丢弃(忽略)这个包。 这个动作告诉Snort不理会这个包,这个动作在你不想检查特定的包的时候可以加快Snort的操作速度。例如,如果你在网络中有一台包含一些弱点的主机,用来检测网络安全漏洞,可能会希望不理会对这台机器的攻击,pass规则这时就可以用到了。
activate-报警并且激活另一条dynamic规则。Activate动作用来产生告警然后激活其它规则来进行进一步的检验。如下面所说的,动态规则就是用于这个目的。当你需要对捕获的包进行进一步检验的时候,就可以用activate动作。
dynamic-保持空闲直到被一条activate规则激活,被激活后就作为一条log规则执行。Dynamic规则动作由其它用activate动作的规则调用,在正常情况下,他们不会被用来检测包。一个动态规则仅能被一个“activate”动作激活。
自定义动作
除了以上动作外,你也可以定义自己的动作,以用于不同的目的,例如:
- 向Syslog发送消息。Syslog是系统日志守护进程,它在/var/log中创建日志文件,这些文件的位置可以通过修改/etc/syslog.conf来改变。你可以在UNIX系统中用命令“man syslog”或者“man syslog.conf”来获得更多信息。Syslog相当于windows中的事件查看器。
- 向如HP OpenView或Open NMS(http://www.opennms.org)等网管系统发送SNMP trap。
- 在一个包上应用多个动作。如你前面所看到的,一个规则仅仅规定了一个动作,自定义动作可以用来产生多个动作。例如,你可以在发送SNMP trap的同时记录Syslog。
- 将数据记录到XML文件中。 将信息记录到数据库中,Snort可以将数据记录到mysql, Postgress SQL, oracle 和Microsoft SQL server中。
这些新的动作类型在配置文件snort.conf中定义。一个新动作用下面的通用结构来定义:
ruletype action_name
{
action definition
}
关键字ruletype后面跟随动作的名称,两个大括号中是实际的动作定义,类似于C语言中的函数。
协议类型
Snort当前分析可疑包的ip协议有四种:tcp 、udp、icmp和ip。将来可能会更多,例如ARP、IGRP、GRE、OSPF、RIP、IPX等。
地址
关键字”any”可以被用来定义任何地址。地址就是由直接的数字型ip地址和一个cidr块组成的。cidr块指示作用在规则地址和需要检查的进入的任何包的网络掩码。/24表示c类网络, /16表示b类网络,/32表示一个特定的机器的地址。
否定操作符用”!”表示。
你也可以指定ip地址列表,一个ip地址列表由逗号分割的ip地址和CIDR块组成,并且要放在方括号内“[”,“]”。此时,ip列表可以不包含空格在ip地址之间。
alert tcp ![192.168.1.0/24,10.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";)
var MY_NET $(MY_NET:-192.168.1.0/24)
log tcp any any -> $(MY_NET:?MY_NET is undefined!) 23
端口号可以用几种方法表示,包括”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 :6000
记录来自任何端口,目标端口小于等于6000的tcp流
log tcp any :1024 -> 192.168.1.0/24 500:
记录来自任何小于等于1024的特权端口,目标端口大于等于500的tcp流
共用端口号 描述
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
方向操作符
方向操作符”->”表示规则所施加的流的方向。方向操作符左边的ip地址和端口号被认为是流来自的源主机,方向操作符右边的ip地址和端口信息是目标主机,还有一个双向操作符”<>”。
2. 规则选项
规则选项组成了snort入侵检测引擎的核心,既易用又强大还灵活。所有的snort规则选项用分号”;”隔开。规则选项关键字和它们的参数用冒号”:”分开。
- msg - 在报警和包日志中打印一个消息。
- flags -检查tcp flags的值。
- content -在包的净荷中搜索指定的样式。它可以包含混合的文本和二进制数据。二进制数据一般包含在管道符号中(”|”),表示为字节码(bytecode)。字节码把二进制数据表示为16进制数字,是描述复杂二进制数据的好方法。
例如:`content: "|90C8 C0FF FFFF|/bin/sh";`字符 : ; \ "在content选项内容中出现时必须被转义(有两个方法:1.用前导“\”字符 2. 使用字节的二进制表示方式,比如用“|3A|”表示“:”)。内容匹配项的默认是区分大小写的。
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相等。
- offset - content选项的修饰符,设定开始搜索的位置 。
- depth - content选项的修饰符,设定搜索的最大深度。
- nocase - 指定对content字符串大小写不敏感。
- distance - content选项的修饰符,设定模式匹配间的最小间距。确信在使用content时模式匹配间至少有N个字节存在。它被设计成在规则选项中和其他选项联合使用。
- within - content选项的修饰符,设定模式匹配间的最大间距。确保在使用content时模式匹配间至多有N个字节存在。它被设计成在规则选项中和distance选项联合使用。
- byte_test - 数字模式匹配。把数据包净载中特定位置的字串转换为数值类型与指定的值进行比较。
byte_test: , , , [[relative],[big],[little],[string],[hex],[dec],[oct]]
bytes_to_convert 从数据包取得的字节数。
operator 对检测执行的操作 (<,>,=,!)。
value 和转换后的值相测试的值。
offset 开始处理的字节在负载中的偏移量。
relative 使用一个相对于上次模式匹配的相对的偏移量。
big 以网络字节顺序处理数据(缺省)。
little 以主机字节顺序处理数据。
string 数据包中的数据以字符串形式存储。
hex 把字符串数据转换成十六进制数形式。
dec 把字符串数据转换成十进制数形式。
oct 把字符串数据转换成八进制数形式。
alert udp $EXTERNAL_NET any -> $HOME_NET any (msg:"AMD procedure 7 plog overflow "; content: "|00 04 93 F3|"; content: "|00 00 00 07|"; distance: 4; within: 4; byte_test: 4,>, 1000, 20, relative;)
- uricontent - 用于匹配正规化处理后URI字段。这个关键字允许只在一个请求的URI(URL)部分进行搜索匹配。它允许一条规则只搜索请求部分的攻击,这样将避免服务数据流的错误报警。这个选项将和HTTP解析器一起工作。(只能搜索第一个“/”后面的内容)。
- 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 不在重建的流数据包上触发。
only_stream 只在重建的流数据包上触发。
格式:flow:[to_client|to_server|from_client|from_server|established|stateless|no_stream|only_stream]
- reference - 外部攻击参考ids。这个关键字允许规则包含一个外面的攻击识别系统。这个插件目前支持几种特定的系统,它和支持唯一的URL一样好。这些插件被输出插件用来提供一个关于产生报警的额外信息的连接。
- sid - snort规则id。用来识别snort规则的唯一性。这个信息允许输出插件很容易的识别规则的ID号。sid 的范围是如下分配的
<100 保留做将来使用
100-1000,000 包含在snort发布包中
1000,000 作为本地规则使用
- rev - 规则版本号。
这个关键字是被用来识别规则修改的。修改,随同snort规则ID,允许签名和描述被较新的信息替换。
- 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。
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)
分类和优先级的意义在于,我们可以了解告警是否紧急,这在我们要对威胁性高的告警提高警惕的时候非常有用。
- pcre-允许用户使用与PERL语言相兼容的正则表达式。
pcre:[!]"(/<regex>/|m<delim><regex><delim>)[ismxAEGRUB]";
在表达式后的修饰符设置编译正则表达式的一些标志。
Perl兼容的修饰符:
|i| 对大小不敏感
|s| 在点转义符号中包含换行符, 一般情况下被匹配的缓冲区是作为一个大字符串
|m| 的,和$分别匹配串头和串尾。当设置了m修饰符,和$匹配跟紧跟换行符和紧先导于换行符的情况
|x| 要匹配的模式中的空格符被忽略,除非是被转义过的或在一个字符集中。
PCRE兼容的修饰符:
|A| 模式必须在缓冲区的开头匹配到(同^) 设置指定的$必须匹配到缓冲区末尾。如果不用E |
|E| 修饰符,$则可能只匹配到串尾之前换行符。
|G| 在默认情况下不使用“贪婪”模式,只有在模式后面跟了“?”字符的情况下贪婪。
Snort特定的修饰符:
|R| 此匹配相对于前一个匹配成功串尾开始(类似于distance:0)
|U| 匹配解码后的URI缓冲区(类似于uricontent
|B| 不使用解码后的缓冲区(类似于rawbytes)
修饰符R和B不能同时使用。
- ack - Tcp头部中包含一个32位的Acknowldege Number字段,这个字段表示希望对端发送的下一个Tcp包的序列号。仅当TCP头部的ACK标志位被设为1的时候,这个字段才起作用。类似于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包的时候,发送一个告警信息。在本规则中,定义包的目的是192.168.1.0/24,你可以用其它的值。关键字ack基本上用来探测这种类型的攻击,一般情况下,如果A位为1,Ack的值是不等于0的。
相关阅读
淘宝商城的618活动已经马上就要来临了,在活动的期间,会有很多的优惠券可以领取,使用了后会优惠不少呢!大家知道淘宝618优惠券使用规
阴阳师春樱对决-为崽而战在体验服率先开启,那么此次为崽而战第二期活动怎么玩,本篇就带来本次的玩法规则和奖励内容,看看和去年第一
本文是关于百度搜索引擎的工作原理分析。在正式学习SEO之前,您需要了解搜索引擎的工作原理。毕竟,SEO是针对搜索引擎的,所以了解搜索
微信永久封号新规:这些违规方式千万别碰 随着平台的不断完善,微信越来越注重用户隐私安全的管理。最近,微信进一步升级《微信外部链
A5创业网(公众号:iadmin5)2月27日消息,,因所谓的战略升级而卷入“变相裁员”风暴的人人车,日前发布了一项在员工看来很是奇