Snort学习体会.docx
- 文档编号:30489699
- 上传时间:2023-08-15
- 格式:DOCX
- 页数:30
- 大小:34.25KB
Snort学习体会.docx
《Snort学习体会.docx》由会员分享,可在线阅读,更多相关《Snort学习体会.docx(30页珍藏版)》请在冰豆网上搜索。
Snort学习体会
Snort
Snort是一款免费、开源的网络入侵防御系统(NetworkIntrusionPreventionSystem,NIPS)和网络入侵检测系统(NetworkIntrusionDetectionSystem,NIDS)工具,可以检测入侵、防止外部攻击损害您的Web设计和应用程序编程。
snort是一个强大的轻量级的网络入侵检测系统。
它具有实时数据流量分析和日志IP网络数据包的能力,能够进行协议分析,对内容进行搜索/匹配。
它能够检测各种不同的攻击方式,对攻击进行实时报警。
此外,snort具有很好的扩展性和可移植性。
一、安装Snort
Snort基于libpcap实现网络监测,RHEL5默认安装libpcap软件包。
从www.snort.org网站下载ForRHEL5的RPM软件包(snort-2.8.4-1.RH5.i386.rpm),然后安装即可,默认安装在/user/sbin目录。
二、Snort命令
命令行是snort-[options]
选项:
-A设置的模式是full,fast,还是none;full模式是记录标准的alert模式到alert文件中;Fast模式只写入时间戳,messages,IPs,ports到文件中,None模式关闭报警。
-a是显示ARP包;
-b是把LOG的信息包记录为TCPDUMP格式,所有信息包都被记录为两进制形式,名字如snort-0612@1385.log,这个选项对于FAST记录模式比较好,因为它不需要花费包的信息转化为文本的时间。
Snort在100Mbps网络中使用"-b"较好。
-c使用配置文件,这个规则文件是告诉系统什么样的信息要LOG,或者要报警,或者通过。
-C在信息包信息使用ASCII码来显示,而不是hexdump。
-d解码应用层。
-D把snort以守护进程的方法来运行,默认情况下ALERT记录发送到/var/log/snort.alert文件中去。
-e显示并记录2个信息包头的数据。
-F从文件中读BPF过滤器(filters),这里的filters是标准的BPF格式过滤器,可以在TCPDump里看到,可以查看TCPDump的man页怎样使用这个过滤器。
-h设置网络地址,如一个C类IP地址192.168.0.1或者其他的,使用这个选项,会使用箭头的方式数据进出的方向。
-I使用网络接口参数
-lLOG信息包记录到目录中去。
-M发送WinPopup信息到包含文件中存在的工作站列表中去,这一选项需要Samba的支持,wkstn文件很简单,每一行只要添加包含在SMB中的主机名即可。
(注意不需要\\两个斜杠)。
-n是指定在处理个数据包后退出。
-N关闭LOG记录,但ALERT功能仍旧正常。
-o改变所采用的记录文件,如正常情况下采用Alert->Pass->Logorder,而采用此选项是这样的顺序:
Pass->Alert->Logorder,其中Pass是那些允许通过的规则而不记录和报警,ALERT是不允许通过的规则,LOG指LOG记录,因为有些人就喜欢奇奇怪怪,象CASPER,QUACK就喜欢反过来操作。
-p关闭杂乱模式嗅探方式,一般用来更安全的调试网络。
-r读取tcpdump方式产生的文件,这个方法用来处理如果得到一个Shadow(ShadowIDS产生)文件,因为这些文件不能用一般的EDIT来编辑查看。
-sLOG报警的记录到syslog中去,在LINUX机器上,这些警告信息会出现在/var/log/secure,在其他平台上将出现在/var/log/message中去。
-S这个是设置变量值,这可以用来在命令行定义Snortrules文件中的变量,如你要在Snortrules文件中定义变量HOME_NET,可以在命令行中给它预定义值。
-v使用为verbose模式,把信息包打印在console中,这个选项使用后会使速度很慢,这样结果在记录多的时候会出现丢包现象。
-V显示SNORT版本并退出;
-?
显示使用列表并退出;
示例
1.snort–v命令会运行Snort,显示IP和TCP/UDP/ICMP头信息。
此时使用了ping192.168.0.1将显示了如下信息:
06/10-10:
21:
13.884925192.168.0.2->192.168.0.1
ICMPTTL:
64TOS:
0x0ID:
4068
ID:
20507Seq:
0ECHO
06/10-10:
21:
13.885081192.168.0.1->192.168.0.2
ICMPTTL:
128TOS:
0x0ID:
15941
ID:
20507Seq:
0ECHOREPLY
06/10-10:
21:
14.884874192.168.0.2->192.168.0.1
ICMPTTL:
64TOS:
0x0ID:
4069
ID:
20507Seq:
256ECHO
06/10-10:
21:
14.885027192.168.0.1->192.168.0.2
ICMPTTL:
128TOS:
0x0ID:
15942
ID:
20507Seq:
256ECHOREPLY
2.snort–vd
不仅显示IP和TCP/UDP/ICMP头信息,而且显示应用层数据。
此时如果使用ping192.168.0.1将显示了如下信息:
06/10-10:
26:
39.894493192.168.0.2->192.168.0.1
ICMPTTL:
64TOS:
0x0ID:
4076
ID:
20763Seq:
0ECHO
58134239E0BB050008090A0B0C0D0E0FX.B9............
101112131415161718191A1B1C1D1E1F................
202122232425262728292A2B2C2D2E2F!
"#$%&()*+,-./
303132333435363701234567
06/10-10:
26:
39.894637192.168.0.1->192.168.0.2
ICMPTTL:
128TOS:
0x0ID:
15966
ID:
20763Seq:
0ECHOREPLY
58134239E0BB050008090A0B0C0D0E0FX.B9............
101112131415161718191A1B1C1D1E1F................
202122232425262728292A2B2C2D2E2F!
"#$%&()*+,-./
303132333435363701234567
3.snort–vde
不仅显示IP和TCP/UDP/ICMP头信息,应用层数据,而且还显示数据链路层数据。
此时使用ping192.168.0.1将显示了如下信息:
-*>Snort!
<*-
Version1.6-WIN32
ByMartinRoesch(roesch@,
WIN32PortByMichaelDavis(Mike@eE,
06/10-10:
32:
01.3459620:
60:
94:
F9:
5E:
17->0:
50:
BA:
BB:
4A:
54type:
0x800len:
0x62
192.168.0.2->192.168.0.1ICMPTTL:
64TOS:
0x0ID:
4079
ID:
21787Seq:
0ECHO
99144239474C0C0008090A0B0C0D0E0F..B9GL..........
101112131415161718191A1B1C1D1E1F................
202122232425262728292A2B2C2D2E2F!
"#$%&()*+,-./
303132333435363701234567
06/10-10:
32:
01.3461640:
50:
BA:
BB:
4A:
54->0:
60:
94:
F9:
5E:
17type:
0x800len:
0x62
192.168.0.1->192.168.0.2ICMPTTL:
128TOS:
0x0ID:
16090
ID:
21787Seq:
0ECHOREPLY
99144239474C0C0008090A0B0C0D0E0F..B9GL..........
101112131415161718191A1B1C1D1E1F................
202122232425262728292A2B2C2D2E2F!
"#$%&()*+,-./
303132333435363701234567
4.snort-dev-l./log
将所有包的记录保存到log目录。
5.snort-dev-l./log-h192.168.1.0/24
将c类网络192.168.1所有包的记录保存到./log目录
6.snort-dev-l./log-h192.168.1.0/24–csnort.conf
按照snort.conf文件的设置,对c类网络192.168.1所有包进行监测,并将所有包的记录保存到./log目录。
7.snort-s-l./log-h192.168.1.0/24–csnort.conf
按照snort.conf文件的设置,对c类网络192.168.1所有包进行监测,并将报警信息保存到syslog
8.snort–b–l./log
按照二进制格式,将所有数据包的记录信息保存到log目录。
9.snort–dv–rpacketlog
将tcpdump格式的二进制文件(packet.log)文件中的数据包信息显示在屏幕。
三、snort的检测规则
1.基础
snort使用一种简单的规则描述语言,这种描述语言易于扩展,功能也比较强大,并遵循以下规则:
1.snort的每条规则必须在一行中,它的规则解释器无法对跨行的规则进行解析。
2.snort的每条规则都可以分成逻辑上的两个部分:
规则头和规则选项。
●规则头包括:
规则行为(rule'saction)、协议(protocol)、源/目的IP地址、子网掩码以及源/目的端口。
●规则选项包含报警信息和异常包的信息(特征码,signature),使用这些特征码来决定是否采取规则规定的行动。
如:
alerttcpanyany->192.168.1.0/24111(content:
"|000186a5|";msg:
"mountdaccess"
从开头到最左边的括号属于规则头部分,括号内的部分属于规则选项。
规则选项中冒号前面的词叫做选项关键词(optionkeywords)。
注意对于每条规则来说,规则选项不是必需的。
规则选项是为了更加详细地定义应该收集或者报警的数据包。
只有匹配所有选项的数据包,snort才会执行其规则行为。
如果许多选项组合在一起,它们之间是逻辑与的关系。
1.1.include
snort使用的规则文件在命令行中指定,include关键词使这个规则文件可以包含其它规则文件中的规则,非常类似与C语言中的#include。
snort会从被包含的文件读出其内容,取代include关键词。
格式:
include<文件路径/文件名>
注意:
行尾没有分号。
1.2.varriables
在snort规则文件中可以定义变量。
格式:
var
例:
varMY_NET192.168.1.0/24,10.1.1.0/24]
S;msg:
'SYNMETApacket"
规则变量名可以使用多种方式来修改,可以使用$操作符来定义元变量(meta-variables)。
这些修改方式可以结合变量修改操作符:
?
和-来使用。
●$var:
定义元变量
●$(var):
以变量var的内容作为变量名
●$(var:
-default):
以变量var的内容作为变量名,如果var没有定义就使用default作为变量名
●$(var:
?
message):
使用变量var的内容作为变量名,如果不成功就打印错误信息message并退出。
例:
varMY_NET$(MYU_NET:
-192.168.1.0/24)tcpanyany->$(MY_NET:
?
MY_NETisundefined!
)23
2.规则头(RuleHeaders)
2.1.RuleAction
规则头包含一些信息,这些信息包括:
哪些数据包、数据包的来源、什么类型的数据包,以及对匹配的数据包如何处理。
每条规则的第一项就是规则行为(ruleaction)。
规则行为告诉snort当发现匹配的数据包时,应该如何处理。
在snort中,有五种默认的处理方式:
alert、log、pass、activate和dynamic。
●alert:
使用选定的报警方法产生报警信息,并且记录数据包
●log:
记录数据包
●pass:
忽略数据包
●activate:
报警,接着打开其它的dynamic规则
●dynamic:
保持空闲状态,直到被activete规则激活,作为一条log规则
也可以定义自己的规则类型,把它们和一个或者几个输出插件联系在一起。
然后你就可以在snort规则中使用这些规则类型了。
下例将建立一个类型,它将只以tcpdump格式输出日志:
ruletypesuspicious
{
typelog
outputlog_tcpdump:
suspocious.log
}
下例将建立一个类型,把日志发送到syslog和MySql数据库:
ruletyperedalert
{
typealert
outputalert_syslog:
LOG_AUTHLOG_ALERT
outputdatabase:
log,user=snortdbname=snorthost=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的地址。
在规则中,可以使用使用否定操作符(negationoperator)对IP地址进行操作。
它告诉snort除了列出的IP地址外,匹配所有的IP地址。
否定操作符使用!
表示。
例:
使用否定操作符可以很轻松地对表1的规则进行改写,使其对从外部网络向内的数据报警。
alerttcp!
192.168.1.0/24any->192.168.1.0/24111(content:
"|000186a5|";msg:
"externalmountdaccess"
上面这条规则中的IP地址表示:
所有IP源地址不是内部网络的地址,而目的地址是内部网络地址。
也可以定义一个IP地址列表(IPlist)。
IP地址列表的格式如下:
[IP地址1/CIDR,IP地址/CIDR,....]
注意每个IP地址之间不能有空格。
例:
alerttcp!
[192.168.1.0/24,10.1.1.1.0/24]any->[192.168.1.0/24,10.1.1.0/24]111(content:
"|000186a5|";msg:
"externalmountdaccess"
2.4.端口号
在规则中,可以有几种方式来指定端口号,包括:
any、静态端口号(staticport)定义、端口范围,以及使用非操作定义。
any表示任意合法的端口号;静态端口号表示单个的端口号,例如:
111(portmapper)、23(telnet)、80(http)等。
使用范围操作符:
可以指定端口号范围。
有例:
logudpanyany->192.168.1.0/241:
1024
记录来自任何端口,其目的端口号在1到1024之间的UDP数据包
logtcpanyany->192.168.1.0/24:
600
记录来自任何端口,其目的端口号小于或者等于6000的TCP数据包
logtcpany:
1024->192.168.1.0/24500:
记录源端口号小于等于1024,目的端口号大于等于500的TCP数据包
还可以使用逻辑非操作符!
对端口进行非逻辑操作(portnegation)。
逻辑非操作符可以用于其它的规则类型(除了any类型)。
例如,如果要日志除了X-window系统端口之外的所有端口,可以使用下面的规则:
logtcpanyany->192.168.1.0/24!
6000:
6010
2.5.方向操作符(directionoperator)
方向操作符->表示数据包的流向。
它左边是数据包的源地址和源端口,右边是目的地址和端口。
此外,还有一个双向操作符<>,它使snort对这条规则中,两个IP地址/端口之间双向的数据传输进行记录/分析,例如telnet或者POP3对话。
下面的规则表示对一个telnet对话的双向数据传输进行记录:
log!
192.168.1.0/24any<>192.168.1.0/2423
2.6.activate/dynamic规则
activate/dynamic规则对扩展了snort功能。
使用activate/dynamic规则对,能够使用一条规则激活另一条规则。
当一条特定的规则启动,如果想要snort接着对符合条件的数据包进行记录时,使用activate/dynamic规则对非常方便。
除了一个必需的选项activates外,激活规则(activaterule)非常类似于报警规则(alertrule)。
动态规则(dynamicrule)和日志规则(logrule)也很相似,不过它需要一个选项:
activated_by。
动态规则还需要另一个选项
:
count。
当一个激活规则启动,它就打开由activate/activated_by选项之后的数字指示的动态规则,记录count个数据包。
下面是一条activate/dynamic规则对的规则:
activatetcp!
$HOME_NETany->$HOME_NET143(flagsA;content:
"|E8C0FFFFFF|in|;activates:
1; "IMAPbufferoverflow! " 这个规则使snort在检测到IMAP缓冲区溢出时发出报警,并且记录后续的50个从$HOME_NET之外,发往$HOME_NET的143号端口的数据包。 如果缓冲区溢出成功,那么接下来50个发送到这个网络同一个服务端口(这个例子中是143号端口)的数据包中,会有很重要的数据,这些数据对以后的分析很有用处。 3.规则选项 规则选项构成了snort入侵检测引擎的核心,它们非常容易使用,同时又很强大和容易扩展。 在每条snort规则中,选项之间使用分号进行分割。 规则选项关键词和其参数之间使用冒号分割。 截止到写本文为止(snort1.7版),snort有23个规则选项关键词: 1).msg: 在报警和日志中打印的消息 2).logto: 把日志记录到一个用户指定的文件,而不是输出到标准的输出文件 3).ttl: 测试IP包头的TTL域的值 4).tos: 测试IP包头的TOS域的值 5).id: 测试IP分组标志符(fragmentID)域是否是一个特定的值 6).ipoption: 查看IP选项(IPoption)域 7).fragbits: 测试IP包头的分片位(fragmentationbit) 8).dsize: 测试数据包包数据段的大小 9).flags: 测试TCP标志(flag)是否是某个值 10).seq: 测试TCP包的序列号是否是某个值 11).ack: 测试TCP包的确认(acknowledgement)域是否为某个值 12).itype: 测试ICMP数据包的类型(type)域 13).icode: 测试ICMP数据包的编码(code)域 14).icmp_id: 测试ICMP回送包的标志符(ICMPECHOID)是否为某个值 15).content: 在数据包的数据段中搜索模式(pattern) 16).content-list: 在数据包的数据段中搜索模式清单 17).offset: 问题点数: 0、回复次数: 2Top 3.1.msg msg规则选项告诉日志引擎在复制包时同时打印的信息,以及让报警引擎输出的警告消息。 它只是一个简单的文本字符串,使用作为转义符。 格式: msg: " 3.2.logto logto选项告诉snort把触发某条规则所有的数据包都记录到指定的文件。 使用这个选项,对处理来自nmap扫描、HTTPCGI扫描的数据非常方便。 注意如果使用二进制日志模式,这个选项会失效。 格式: logto: "<文件名>"; 3.3.ttl 这个选项设置要测试的生命周期(time-to-live)值。 只有数据包的TTL和这个选项设置的值精确匹配,测试才会成功。 这个选项主要用来检测路由企图。 格式: ttl: " 3.4.tos 可以使用tos关键词检查IP包头的TOS(typeofservice)域是否是一个特定的值。 也是只有在被检测包TOS域的值和给定的值精确匹配时,这个测试才会成功。 格式: tos: " 3.5.ID 这个选项关键词用来
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Snort 学习体会