Snort中文手册.docx
《Snort中文手册.docx》由会员分享,可在线阅读,更多相关《Snort中文手册.docx(35页珍藏版)》请在冰豆网上搜索。
Snort中文手册
Snort用户手册
第一章snort简介
snort有三种工作模式:
嗅探器、数据包记录器、网络入侵检测系统。
嗅探器模式仅仅是从网络上读取数据包并作为连续不断的流显示在终端上。
数据包记录器模式把数据包记录到硬盘上。
网路入侵检测模式是最复杂的,而且是可配置的。
我们可以让snort分析网络数据流以匹配用户定义的一些规则,并根据检测结果采取一定的动作。
嗅探器
所谓的嗅探器模式就是snort从网络上读出数据包然后显示在你的控制台上。
首先,我们从最基本的用法入手。
如果你只要把TCP/IP包头信息打印在屏幕上,只需要输入下面的命令:
./snort-v
使用这个命令将使snort只输出IP和TCP/UDP/ICMP的包头信息。
如果你要看到应用层的数据,可以使用:
./snort-vd
这条命令使snort在输出包头信息的同时显示包的数据信息。
如果你还要显示数据链路层的信息,就使用下面的命令:
./snort-vde
注意这些选项开关还可以分开写或者任意结合在一块。
例如:
下面的命令就和上面最后的一条命令等价:
./snort-d-v–e
数据包记录器
如果要把所有的包记录到硬盘上,你需要指定一个日志目录,snort就会自动记录数据包:
./snort-dev-l./log
当然,./log目录必须存在,否则snort就会报告错误信息并退出。
当snort在这种模式下运行,它会记录所有看到的包将其放到一个目录中,这个目录以数据包目的主机的IP地址命名,例如:
如果你只指定了-l命令开关,而没有设置目录名,snort有时会使用远程主机的IP地址作为目录,有时会使用本地主机IP地址作为目录名。
为了只对本地网络进行日志,你需要给出本地网络:
./snort-dev-l./log-h
这个命令告诉snort把进入C类网络的所有包的数据链路、TCP/IP以及应用层的数据记录到目录./log中。
如果你的网络速度很快,或者你想使日志更加紧凑以便以后的分析,那么应该使用二进制的日志文件格式。
所谓的二进制日志文件格式就是tcpdump程序使用的格式。
使用下面的命令可以把所有的包记录到一个单一的二进制文件中:
./snort-l./log-b
注意此处的命令行和上面的有很大的不同。
我们勿需指定本地网络,因为所有的东西都被记录到一个单一的文件。
你也不必冗余模式或者使用-d、-e功能选项,因为数据包中的所有内容都会被记录到日志文件中。
你可以使用任何支持tcpdump二进制格式的嗅探器程序从这个文件中读出数据包,例如:
tcpdump或者Ethereal。
使用-r功能开关,也能使snort读出包的数据。
snort在所有运行模式下都能够处理tcpdump格式的文件。
例如:
如果你想在嗅探器模式下把一个tcpdump格式的二进制文件中的包打印到屏幕上,可以输入下面的命令:
./snort-dv-r
在日志包和入侵检测模式下,通过BPF(BSDPacketFilter)接口,你可以使用许多方式维护日志文件中的数据。
例如,你只想从日志文件中提取ICMP包,只需要输入下面的命令行:
./snort-dvricmp
网络入侵检测系统
snort最重要的用途还是作为网络入侵检测系统(NIDS),使用下面命令行可以启动这种模式:
./snort-dev-l./log-h-c
是规则集文件。
snort会对每个包和规则集进行匹配,发现这样的包就采取相应的行动。
如果你不指定输出目录,snort就输出到/var/log/snort目录。
注意:
如果你想长期使用snort作为自己的入侵检测系统,最好不要使用-v选项。
因为使用这个选项,使snort向屏幕上输出一些信息,会大大降低snort的处理速度,从而在向显示器输出的过程中丢弃一些包。
此外,在绝大多数情况下,也没有必要记录数据链路层的包头,所以-e选项也可以不用:
./snort-d-h-l./log-c
这是使用snort作为网络入侵检测系统最基本的形式,日志符合规则的包,以ASCII形式保存在有层次的目录结构中。
网络入侵检测模式下的输出选项
在NIDS模式下,有很多的方式来配置snort的输出。
在默认情况下,snort以ASCII格式记录日志,使用full报警机制。
如果使用full报警机制,snort会在包头之后打印报警消息。
如果你不需要日志包,可以使用-N选项。
snort有6种报警机制:
full、fast、socket、syslog、smb(winpopup)和none。
其中有4个可以在命令行状态下使用-A选项设置。
这4个是:
-Afast:
报警信息包括:
一个时间戳(timestamp)、报警消息、源/目的IP地址和端口。
-Afull:
是默认的报警模式。
-Aunsock:
把报警发送到一个UNIX套接字,需要有一个程序进行监听,这样可以实现实时报警。
-Anone:
关闭报警机制。
使用-s选项可以使snort把报警消息发送到syslog,默认的设备是LOG_AUTHPRIV和LOG_ALERT。
可以修改文件修改其配置。
snort还可以使用SMB报警机制,通过SAMBA把报警消息发送到Windows主机。
为了使用这个报警机制,在运行./configure脚本时,必须使用--enable-smbalerts选项。
下面是一些输出配置的例子:
使用默认的日志方式(以解码的ASCII格式)并且把报警发给syslog:
./snort-c-l./log-s-h
使用二进制日志格式和SMB报警机制:
./snort-c-b-MWORKSTATIONS
第二章编写snort规则
基础:
snort使用一种简单的,轻量级的规则描述语言,这种语言灵活而强大。
在开发snort规则时要记住几个简单的原则。
第一,大多数snort规则都写在一个单行上,或者在多行之间的行尾用/分隔。
Snort规则被分成两个逻辑部分:
规则头和规则选项。
规则头包含规则的动作,协议,源和目标ip地址与网络掩码,以及源和目标端口信息;规则选项部分包含报警消息内容和要检查的包的具体部分。
下面是一个规则范例:
alerttcpanyany->111(content:
"|000186a5|";msg:
"mountdaccess"
第一个括号前的部分是规则头(ruleheader),包含的括号内的部分是规则选项(ruleoptions)。
规则选项部分中冒号前的单词称为选项关键字(optionkeywords)。
注意,不是所有规则都必须包含规则选项部分,选项部分只是为了使对要收集或报警,或丢弃的包的定义更加严格。
组成一个规则的所有元素对于指定的要采取的行动都必须是真的。
当多个元素放在一起时,可以认为它们组成了一个逻辑与(AND)语句。
同时,snort规则库文件中的不同规则可以认为组成了一个大的逻辑或(OR)语句。
规则高级概念:
Includes
include允许由命令行指定的规则文件包含其他的规则文件。
格式:
include:
注意在该行结尾处没有分号。
被包含的文件会把任何预先定义的变量值替换为自己的变量引用。
参见变量(Variables)一节以获取关于在SNORT规则文件中定义和使用变量的更多信息。
Variables
变量可能在snort中定义。
格式:
var:
例子:
varMY_NET
alerttcpanyany->$MY_NETany(flags:
S;msg:
"SYNpacket"
规则变量名可以用多种方法修改。
可以在"$"操作符之后定义变量。
"?
"和"-"可用于变量修改操作符。
$var-定义变量。
$(var)-用变量"var"的值替换。
$(var:
-default)-用变量"var"的值替换,如果"var"没有定义用"default"替换。
$(var:
?
message)-用变量"var"的值替换或打印出错误消息"message"然后退出。
例子:
varMY_NET$(MY_NET:
logtcpanyany->$(MY_NET:
?
MY_NETisundefined!
)23
Config
Snort的很多配置和命令行选项都可以在配置文件中设置。
格式:
config[:
]
Directives
order改变规则的顺序(snort-o)
alertfile设置报警输出文件,例如:
configalertfile:
alerts
classification创建规则分类。
decode_arp开启arp解码功能。
(snort-a)
dump_chars_only开启字符倾卸功能。
(snort-C)
dump_payload倾卸应用层数据。
(snort-d)
decode_data_link解码第二层数据包头。
(snort-e)
bpf_file指定BPF过滤器(snort-F)。
例如:
configbpf_file:
set_gid改变GID(snort-g)。
例如:
configset_gid:
snort_group
daemon以后台进程运行。
(snort-D)
reference_net设置本地网络。
(snort-h).例如:
configreference_net:
interface设置网络接口(snort–i)。
例如:
configinterface:
xl0
alert_with_interface_name报警时附加上接口信息。
(snort-I)
logdir设置记录目录(snort-l)。
例如:
configlogdir:
/var/log/snort
umask设置snort输出文件的权限位。
(snort-m).Example:
configumask:
022
pkt_count处理n个数据包后就退出。
(snort-n).Example:
configpkt_count:
13
nolog关闭记录功能,报警仍然有效。
(snort-N)
obfuscate使IP地址混乱(snort-O)
no_promisc关闭混杂模式。
(snort-p)
quiet安静模式,不显示标志和状态报告。
(snort-q)
checksum_mode计算校验和的协议类型。
类型值:
none,noip,notcp,noicmp,noudp,all
utc在时间戳上用UTC时间代替本地时间。
(snort-U)
verbose将详细记录信息打印到标准输出。
(snort-v)
dump_payload_verbose倾卸数据链路层的原始数据包(snort-X)
show_year在时间戳上显示年份。
(snort-y)
stateful为stream4设置保证模式。
min_ttl设置一个snort内部的ttl值以忽略所有的流量。
disable_decode_alerts关闭解码时发出的报警。
disable_tcpopt_experimental_alerts关闭tcp实验选项所发出的报警。
disable_tcpopt_obsolete_alerts关闭tcp过时选项所发出的报警。
disable_tcpopt_ttcp_alerts关闭ttcp选项所发出的报警。
disable_tcpopt_alerts关闭选项长度确认报警。
disable_ipopt_alerts关闭IP选项长度确认报警。
detection配置检测引擎。
(例如:
search-methodlowmem)
reference给snort加入一个新的参考系统。
规则头
规则动作:
规则的头包含了定义一个包的who,where和what信息,以及当满足规则定义的所有属性的包出现时要采取的行动。
规则的第一项是"规则动作"(ruleaction),"规则动作"告诉snort在发现匹配规则的包时要干什么。
在snort中有五种动作:
alert、log、pass、activate和dynamic.
1、Alert-使用选择的报警方法生成一个警报,然后记录(log)这个包。
2、Log-记录这个包。
3、Pass-丢弃(忽略)这个包。
4、activate-报警并且激活另一条dynamic规则。
5、dynamic-保持空闲直到被一条activate规则激活,被激活后就作为一条log规则执行。
你可以定义你自己的规则类型并且附加一条或者更多的输出模块给它,然后你就可以使用这些规则类型作为snort规则的一个动作。
下面这个例子创建一条规则,记录到tcpdump。
ruletypesuspicious
{
typelogoutput
log_tcpdump:
}
下面这个例子创建一条规则,记录到系统日志和MySQL数据库
ruletyperedalert
{
typealertoutput
alert_syslog:
LOG_AUTHLOG_ALERT
outputdatabase:
log,mysql,user=snortdbname=snorthost=localhost
}
协议
规则的下一部分是协议。
Snort当前分析可疑包的ip协议有四种:
tcp、udp、icmp和ip。
将来可能会更多,例如ARP、IGRP、GRE、OSPF、RIP、IPX等。
Ip地址
规则头的下一个部分处理一个给定规则的ip地址和端口号信息。
关键字"any"可以被用来定义任何地址。
Snort没有提供根据ip地址查询域名的机制。
地址就是由直接的数字型ip地址和一个cidr块组成的。
Cidr块指示作用在规则地址和需要检查的进入的任何包的网络掩码。
/24表示c类网络,/16表示b类网络,/32表示一个特定的机器的地址。
例如,代表从到的地址块。
在这个地址范围的任何地址都匹配使用这个标志的规则。
这种记法给我们提供了一个很好的方法来表示一个很大的地址空间。
有一个操作符可以应用在ip地址上,它是否定运算符(negationoperator)。
这个操作符告诉snort匹配除了列出的ip地址以外的所有ip地址。
否定操作符用"!
"表示。
下面这条规则对任何来自本地网络以外的流都进行报警。
alerttcp!
any->111(content:
"|000186a5|";msg:
"externalmountdaccess"
这个规则的ip地址代表"任何源ip地址不是来自内部网络而目标地址是内部网络的tcp包"。
你也可以指定ip地址列表,一个ip地址列表由逗号分割的ip地址和CIDR块组成,并且要放在方括号内“[”,“]”。
此时,ip列表可以不包含空格在ip地址之间。
下面是一个包含ip地址列表的规则的例子。
alerttcp!
[10.1.1any->[111(content:
"|000186a5|";msg:
"externalmountdaccess"
端口号
端口号可以用几种方法表示,包括"any"端口、静态端口定义、范围、以及通过否定操作符。
"any"端口是一个通配符,表示任何端口。
静态端口定义表示一个单个端口号,例如111表示portmapper,23表示telnet,80表示http等等。
端口范围用范围操作符":
"表示。
范围操作符可以有数种使用方法,如下所示:
logudpanyany->1:
1024
记录来自任何端口的,目标端口范围在1到1024的udp流
logtcpanyany->:
6000
记录来自任何端口,目标端口小于等于6000的tcp流
logtcpany:
1024->500:
记录来自任何小于等于1024的特权端口,目标端口大于等于500的tcp流
端口否定操作符用"!
"表示。
它可以用于任何规则类型(除了any,这表示没有,呵呵)。
例如,由于某个古怪的原因你需要记录除xwindows端口以外的所有一切,你可以使用类似下面的规则:
logtcpanyany->!
6000:
6010
方向操作符
方向操作符"->"表示规则所施加的流的方向。
方向操作符左边的ip地址和端口号被认为是流来自的源主机,方向操作符右边的ip地址和端口信息是目标主机,还有一个双向操作符"<>"。
它告诉snort把地址/端口号对既作为源,又作为目标来考虑。
这对于记录/分析双向对话很方便,例如telnet或者pop3会话。
用来记录一个telnet会话的两侧的流的范例如下:
log!
any<>23
Activate和dynamic规则:
注:
Activate和dynamic规则将被tagging所代替。
在snort的将来版本,Activate和dynamic规则将完全被功能增强的tagging所代替。
Activate和dynamic规则对给了snort更强大的能力。
你现在可以用一条规则来激活另一条规则,当这条规则适用于一些数据包时。
在一些情况下这是非常有用的,例如你想设置一条规则:
当一条规则结束后来完成记录。
Activate规则除了包含一个选择域:
activates外就和一条alert规则一样。
Dynamic规则除了包含一个不同的选择域:
activated_by外就和log规则一样,dynamic规则还包含一个count域。
Actevate规则除了类似一条alert规则外,当一个特定的网络事件发生时还能告诉snort加载一条规则。
Dynamic规则和log规则类似,但它是当一个activate规则发生后被动态加载的。
把他们放在一起如下图所示:
activatetcp!
$HOME_NETany->$HOME_NET143(flags:
PA;content:
"|E8C0FFFFFF|/bin";activates:
1;msg:
"IMAPbufferoverflow!
\"
dynamictcp!
$HOME_NETany->$HOME_NET143(activated_by:
1;count:
50;)
规则选项
规则选项组成了snort入侵检测引擎的核心,既易用又强大还灵活。
所有的snort规则选项用分号";"隔开。
规则选项关键字和它们的参数用冒号":
"分开。
按照这种写法,snort中有42个规则选项关键字。
msg-在报警和包日志中打印一个消息。
logto-把包记录到用户指定的文件中而不是记录到标准输出。
ttl-检查ip头的ttl的值。
tos检查IP头中TOS字段的值。
id-检查ip头的分片id值。
ipoption查看IP选项字段的特定编码。
fragbits检查IP头的分段位。
dsize-检查包的净荷尺寸的值。
flags-检查tcpflags的值。
seq-检查tcp顺序号的值。
ack-检查tcp应答(acknowledgement)的值。
window测试TCP窗口域的特殊值。
itype-检查icmptype的值。
icode-检查icmpcode的值。
icmp_id-检查ICMPECHOID的值。
icmp_seq-检查ICMPECHO顺序号的值。
content-在包的净荷中搜索指定的样式。
content-list在数据包载荷中搜索一个模式集合。
offset-content选项的修饰符,设定开始搜索的位置。
depth-content选项的修饰符,设定搜索的最大深度。
nocase-指定对content字符串大小写不敏感。
session-记录指定会话的应用层信息的内容。
rpc-监视特定应用/进程调用的RPC服务。
resp-主动反应(切断连接等)。
react-响应动作(阻塞web站点)。
reference-外部攻击参考ids。
sid-snort规则id。
rev-规则版本号。
classtype-规则类别标识。
priority-规则优先级标识号。
uricontent-在数据包的URI部分搜索一个内容。
tag-规则的高级记录行为。
ip_proto-IP头的协议字段值。
sameip-判定源IP和目的IP是否相等。
stateless-忽略刘状态的有效性。
regex-通配符模式匹配。
distance-强迫关系模式匹配所跳过的距离。
within-强迫关系模式匹配所在的范围。
byte_test-数字模式匹配。
byte_jump-数字模式测试和偏移量调整。
msg
msg规则选项告诉记录和报警引擎,记录或报警一个包的内容的同时打印的消息。
它是一个简单的文本字符串,转义符是"\"。
格式:
msg:
"";
logto
logto选项告诉snort把触发该规则的所有的包记录到一个指定的输出日志文件中。
这在把来自诸如nmap活动,httpcgi扫描等等的数据组合到一起时很方便。
需要指出的是当snort工作在二进制记录模式下时这个选项不起作用。
格式:
logto:
"filename";
ttl
这个规则选项用于设置一个要检查的存活期的值。
只有确切地匹配时它所进行的检查才成功。
这个选项关键字用于检测traceroute。
格式:
ttl:
;
TOS
tos关键字允许你验证IP头中TOS字段为一个特殊的值。
只有匹配时才执行成功。
格式:
tos:
;
id
这个选项关键字用于检测ip头的分片id的值。
有些黑客工具(以及别的程序)为了各种目的设置这个域的值,例如一些黑客常使用31337。
用一个简单的规则检查这个值就可以对付他们。
格式:
id:
;
Ipoption
如果数据包中使用了IP选项,Ipoption选项会查找使用中的某个特别IP选项,比如源路由。
这个选项的合法参数如下:
rr-Recordroute(记录路由)
eol-Endoflist(列表结尾)
nop-Noop(无所作为)
ts-TimeStamp(时间戳)
sec-IPsecurityoption(IP安全选项)
lsrr-Loosesourcerouting(