CopyRight owned by the original author.--(www.MegaEntry.com)
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地址命名,例如:192.168.10.1 如果你只指定了-l命令开关,而没有设置目录名,snort有时会使用远程主机的IP地址作为目录,有时会使用本地主机IP地址作为目录名。为了只对本地网络进行日志,你需要给出本地网络: ./snort -dev -l ./log -h 192.168.1.0/24MegaEntry - Social networking and discussion site!
这个命令告诉snort把进入C类网络192.168.1的所有包的数据链路、TCP/IP以及应用层的数据记录到目录./log中。 如果你的网络速度很快,或者你想使日志更加紧凑以便以后的分析,那么应该使用二进制的日志文件格式。所谓的二进制日志文件格式就是tcpdump程序使用的格式。使用下面的命令可以把所有的包记录到一个单一的二进制文件中: ./snort -l ./log -b 注意此处的命令行和上面的有很大的不同。我们勿需指定本地网络,因为所有的东西都被记录到一个单一的文件。你也不必冗余模式或者使用-d、-e功能选项,因为数据包中的所有内容都会被记录到日志文件中。 你可以使用任何支持tcpdump二进制格式的嗅探器程序从这个文件中读出数据包,例如:tcpdump或者Ethereal。使用-r功能开关,也能使 snort读出包的数据。snort在所有运行模式下都能够处理tcpdump格式的文件。例如:如果你想在嗅探器模式下把一个tcpdump格式的二进制文件中的包打印到屏幕上,可以输入下面的命令: ./snort -dv -r packet.log 在日志包和入侵检测模式下,通过BPF(BSD Packet Filter)接口,你可以使用许多方式维护日志文件中的数据。例如,你只想从日志文件中提取ICMP包,只需要输入下面的命令行: ./snort -dvr packet.log icmpMegaEntry - Social networking and discussion site!
要日志包,可以使用-N选项。 snort有6种报警机制:full、fast、socket、syslog、smb(winpopup)和none。其中有4个可以在命令行状态下使用-A选项设置。这4个是:MegaEntry - Social networking and discussion site!
第一个括号前的部分是规则头(rule header),包含的括号内的部分是规则选项(rule options)。规则选项部分中冒号前的单词称为选项关键字(option keywords)。注意,不是所有规则都必须包含规则选项部分,选项部分只是为了使对要收集或报警,或丢弃的包的定义更加严格。组成一个规则的所有元素对于指定的要采取的行动都必须是真的。当多个元素放在一起时,可以认为它们组成了一个逻辑与(AND)语句。同时,snort规则库文件中的不同规则可以认为组成了一个大的逻辑或(OR)语句。MegaEntry - Social networking and discussion site!
$(var) - 用变量 "var "的值替换。$(var:-default) - 用变量 "var "的值替换,如果 "var "没有定义用 "default "替换。 $(var:?message) - 用变量 "var "的值替换或打印出错误消息 "message "然后退出。 例子: var MY_NET $(MY_NET:-192.168.1.0/24) log tcp any any -> $(MY_NET:?MY_NET is undefined!) 23 Config Snort的很多配置和命令行选项都可以在配置文件中设置。 格式: configMegaEntry - Social networking and discussion site!
3、Pass-丢弃(忽略)这个包。4、activate-报警并且激活另一条dynamic规则。5、dynamic-保持空闲直到被一条activate规则激活,被激活后就作为一条log规则执行。你可以定义你自己的规则类型并且附加一条或者更多的输出模块给它,然后你就可以使用这些规则类型作为snort规则的一个动作。 下面这个例子创建一条规则,记录到tcpdump。 ruletype suspicious{type log outputlog_tcpdump: suspicious.log}下面这个例子创建一条规则,记录到系统日志和MySQL数据库ruletype redalert{type alert outputalert_syslog: LOG_AUTH LOG_ALERToutput database: log, mysql, user=snort dbname=snort host=localhostCopyRight owned by the original author.--(www.MegaEntry.com)
} 协议 规则的下一部分是协议。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表示一个特定的机器的地址。例如,192.168.1.0/24代表从192.168.1.1 到192.168.1.255的地址块。在这个地址范围的任何地址都匹配使用这个192.168.1.0/24标志的规则。这种记法给我们提供了一个很好的方法来表示一个很大的地址空间。 有一个操作符可以应用在ip地址上,它是否定运算符(negation operator)。这个操作符告诉snort匹配除了列出的ip地址以外的所有ip地址。否定操作符用 "! "表示。下面这条规则对任何来自本地网络以外的流都进行报警。 alert tcp !192.168.1.0/24 any -> 192.168.1.0/24 111 (content: "|00 01 86 a5| "; msg: "external mountd access ";) 这个规则的ip地址代表 "任何源ip地址不是来自内部网络而目标地址是内部网络的tcp包 "。你也可以指定ip地址列表,一个ip地址列表由逗号分割的ip地址和CIDR块组成,并且要放在方括号内“[”,“]”。此时,ip列表可以不包含空格在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 ";) 端口号 端口号可以用几种方法表示,包括 "any "端口、静态端口定义、范围、以及通过否定操作符。 "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 :6000CopyRight owned by the original author.--(www.MegaEntry.com)
记录来自任何端口,目标端口小于等于6000的tcp流 log tcp any :1024 -> 192.168.1.0/24 500:记录来自任何小于等于1024的特权端口,目标端口大于等于500的tcp流 端口否定操作符用 "! "表示。它可以用于任何规则类型(除了any,这表示没有,呵呵)。例如,由于某个古怪的原因你需要记录除x windows端口以外的所有一切,你可以使用类似下面的规则:log tcp any any -> 192.168.1.0/24 !6000:6010 方向操作符 方向操作符 "-> "表示规则所施加的流的方向。方向操作符左边的ip地址和端口号被认为是流来自的源主机,方向操作符右边的ip地址和端口信息是目标主机,还有一个双向操作符 "<> "。它告诉snort把地址/端口号对既作为源,又作为目标来考虑。这对于记录/分析双向对话很方便,例如 telnet或者pop3会话。用来记录一个telnet会话的两侧的流的范例如下: log !192.168.1.0/24 any <> 192.168.1.0/24 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规则发生后被动态加载的。把他们放在一起如下图所示: activate tcp !$HOME_NET any -> $HOME_NET 143 (flags: PA; content: "|E8C0FFFFFF|/bin "; activates: 1; msg: "IMAP buffer overflow! ";)dynamic tcp !$HOME_NET any -> $HOME_NET 143 (activated_by: 1; count: 50;)MegaEntry - Social networking and discussion site!
规则选项 规则选项组成了snort入侵检测引擎的核心,既易用又强大还灵活。所有的snort规则选项用分号 "; "隔开。规则选项关键字和它们的参数用冒号 ": "分开。按照这种写法,snort中有42个规则选项关键字。 msg - 在报警和包日志中打印一个消息。logto - 把包记录到用户指定的文件中而不是记录到标准输出。ttl - 检查ip头的ttl的值。tos 检查IP头中TOS字段的值。id - 检查ip头的分片id值。ipoption 查看IP选项字段的特定编码。fragbits 检查IP头的分段位。dsize - 检查包的净荷尺寸的值 。flags -检查tcp flags的值。seq - 检查tcp顺序号的值。ack - 检查tcp应答(acknowledgement)的值。window 测试TCP窗口域的特殊值。itype - 检查icmp type的值。icode - 检查icmp code的值。CopyRight owned by the original author.--(www.MegaEntry.com)
icmp_id - 检查ICMP ECHO ID的值。icmp_seq - 检查ICMP ECHO 顺序号的值。content - 在包的净荷中搜索指定的样式。content-list 在数据包载荷中搜索一个模式集合。offset - content选项的修饰符,设定开始搜索的位置 。depth - content选项的修饰符,设定搜索的最大深度。nocase - 指定对content字符串大小写不敏感。session - 记录指定会话的应用层信息的内容。rpc - 监视特定应用/进程调用的RPC服务。resp - 主动反应(切断连接等)。react - 响应动作(阻塞web站点)。reference - 外部攻击参考ids。sid - snort规则id。rev - 规则版本号。classtype - 规则类别标识。priority - 规则优先级标识号。CopyRight owned by the original author.--(www.MegaEntry.com)
uricontent - 在数据包的URI部分搜索一个内容。tag - 规则的高级记录行为。ip_proto - IP头的协议字段值。sameip - 判定源IP和目的IP是否相等。stateless - 忽略刘状态的有效性。regex - 通配符模式匹配。distance - 强迫关系模式匹配所跳过的距离。within - 强迫关系模式匹配所在的范围。byte_test - 数字模式匹配。byte_jump - 数字模式测试和偏移量调整。 msg msg规则选项告诉记录和报警引擎,记录或报警一个包的内容的同时打印的消息。它是一个简单的文本字符串,转义符是 " "。格式:msg: "CopyRight owned by the original author.--(www.MegaEntry.com)
格式:logto: "filename "; ttl 这个规则选项用于设置一个要检查的存活期的值。只有确切地匹配时它所进行的检查才成功。这个选项关键字用于检测traceroute。格式:ttl:CopyRight owned by the original author.--(www.MegaEntry.com)
rr - Record route(记录路由) eol - End of list (列表结尾)nop - No op (无所作为)ts - Time Stamp (时间戳)sec - IP security option (IP安全选项)lsrr - Loose source routing (松散源路由)ssrr - Strict source routing (严格源路由)satid - Stream identifier (流标示符) 松散和严格源路由是IP选项中最经常被检查的内容,但是它们并没有被用在任何广泛使用的Internet应用中。每一个特定的规则只能用这个选项一次。 格式: ipoption: option;Fragbits 这条规则检测IP头中的分段和保留位字段的值,共有三个位能被检测,保留位RB(Reserved Bit ), 更多分段位MF(More Fragments ), 和不分段位DF(Don’t Fragment)。这些位可以结合在一起来检测。使用下面的值来代表这些位,R-RB,M-MF,D-DF。你也可以使用修饰语对特殊的位来指出合理的匹配标准:* + 所有标记匹配特殊位外加任何其他*;*-任何标记匹配如果任何位被设置为*;!如果指定位没有设置就没有标记匹配。 格式:fragbits:CopyRight owned by the original author.--(www.MegaEntry.com)
例子:alert tcp !$HOME_NET any -> $HOME_NET any (fragbits: R+; msg: "Rerserved bit set! ";) dsize dsize选项用于检查包的净荷的大小。它可以设置成任意值,可以使用大于/小于符号来指定范围。例如,如果你知道某个特定的服务有一个特定大小的缓冲区,你可以设定这个选项来监视缓冲区溢出的企图。它在检查缓冲区溢出时比检查净荷内容的方法要快得多。 格式:dsize: [<>]MegaEntry - Social networking and discussion site!
offset 规则选项被用作使用content规则选项关键字的规则的修饰符。这个关键字修饰符指定模式匹配函数从包净荷开始处开始搜索的偏移量。它对于cgi扫描检测规则很有用,cgi扫描的内容搜索字符串不会在净荷的前4个字节中出现。小心不要把这个偏移量设置的太严格了,会有可能漏掉攻击!这个规则选项关键字必须和content规则选项一起使用。 格式:offset:CopyRight owned by the original author.--(www.MegaEntry.com)
这个规则检查tcp标志。在snort中有9个标志变量: F - FIN (LSB in TCP Flags byte) S - SYN R - RST P - PSH A - ACK U - URG 2 - Reserved bit 2 1 - Reserved bit 1 (MSB in TCP Flags byte) 0 - No TCP Flags Set在这些标志之间还可以使用逻辑操作符:+ ALL flag, 匹配所有的指定的标志外加一个标志。* ANY flag, 匹配指定的任何一个标志。! NOT flag, 如果指定的标志不在这个数据包中就匹配成功。保留位可以用来检测不正常行为,例如IP栈指纹攻击或者其他可疑的行为。 格式:CopyRight owned by the original author.--(www.MegaEntry.com)
flags:CopyRight owned by the original author.--(www.MegaEntry.com)
window:[!]MegaEntry - Social networking and discussion site!
Icmp_id Icmp_id 选项检查ICMP ECHO数据包中ICMP ID数值是否是指定值。许多秘密通道(covert channel)程序使用静态ICMP字段通讯,所以该选项在检查这种流量时非常有用。这个特别的插件用于增强由Max Vision编写的stacheldraht探测规则,但是在探测一些潜在攻击时确实有效。 格式:icmp_id:CopyRight owned by the original author.--(www.MegaEntry.com)
Resp Resp关键字可以对匹配一条Snort规则的流量进行灵活的反应(flexible reponse -FlexResp)。FlexResp代码允许Snort主动地关闭恶意的连接。该插件合法的参数如下:rst_snd - 向发送方发送TCP-RST数据包rst_rcv - 向接受方发送TCP-RST数据包rst_all - 向收发双方发送TCP_RST数据包icmp_net - 向发送方发送ICMP_NET_UNREACHicmp_host - 向发送方发送ICMP_HOST_UNREACHicmp_port - 向发送方发送ICMP_PORT_UNREACH icmp_all - 向发送方发送上述所有的ICMP数据包 在向目标主机发送多种响应数据包时,这些选项组合使用。多个参数之间使用逗号分隔。 格式:resp:CopyRight owned by the original author.--(www.MegaEntry.com)
content_list 关键字允许多内容字符串被放在一个单独的内容匹配选项中,被匹配的字符串被存放在指定的文件中,而且每个字符串要单独占用一行。否则他们就等同于一个content字符串。这个选项是react关键字的基础。 格式;content-list:MegaEntry - Social networking and discussion site!
proxyCopyRight owned by the original author.--(www.MegaEntry.com)
这个关键字被用来识别snort规则的唯一性。这个信息允许输出插件很容易的识别规则的ID号。sid 的范围是如下分配的: <100 保留做将来使用100-1000,000 包含在snort发布包中>1000,000 作为本地规则使用文件sid-msg.map 包含一个从msg标签到snort规则ID的映射。这将被post-processing 输出模块用来映射一个ID到一个报警信息。 格式:sid:MegaEntry - Social networking and discussion site!
在文件classification.config中定义规则类。这个配置文件使用如下的语法:config classification:MegaEntry - Social networking and discussion site!
session 记录触发这条规则的会话的数据包host 记录激活tag规则的主机的所有数据包(这里将使用[direction]修饰词count Count 指定一个单位的数量。这个单位由CopyRight owned by the original author.--(www.MegaEntry.com)
Sameip关键字允许规则检测源IP和目的IP是否相等。 格式:sameip; 例子:alert ip $HOME_NET any -> $HOME_NET any (msg: "SRC IP == DST IP "; sameip;) Regex这个模块现在还正在开发,所以在当前的产品规则集中还不能使用。如果使用的话,它将触发一个错误信息。 Flow 这个选项要和TCP流重建联合使用。它允许规则只应用到流量流的某个方向上。这将允许规则只应用到客户端或者服务器端。这将能把内网客户端流览web页面的数据包和内网服务器所发送的数据包区分开来。这个确定的关键字能够代替标志:A+ 这个标志在显示已建立的TCP连接时都将被使用。 选项:to_client 触发服务器上从A到B的响应。to_server 触发客户端上从A到B的请求。from_client 触发客户端上从A到B的请求。from_server触发服务器上从A到B的响应。established 只触发已经建立的TCP连接。stateless 不管流处理器的状态都触发(这对处理那些能引起机器崩溃的数据包很有用。CopyRight owned by the original author.--(www.MegaEntry.com)
no_stream 不在重建的流数据包上触发(对dsize 和 stream4 有用。only_stream 只在重建的流数据包上触发。 格式:flow:[to_client|to_server|from_client|from_server|established|stateless|no_stream|only_stream]} 例子:alert tcp !$HOME_NET any -> $HOME_NET 21 (flow: from_client; content: "CWD incoming "; nocase; msg: "cd incoming detected "; )alert tcp !$HOME_NET 0 -> $HOME_NET 0 (msg: "Port 0 TCP traffic "; flow: stateless;)Fragoffset 这个关键字允许把IP分段偏移值和一个十进制数相比较。为了抓到一个IP会话的第一个分段,你可以使用这个fragbits关键字并且和fragoffset:0 选项一起查看更多的分段选项。 格式:fragoffset:[<|>]MegaEntry - Social networking and discussion site!
Rawbytes关键字允许规则查看telnet 解码数据来处理不常见的数据。这将使得telnet 协议代码独立于预处理程序来检测。这是对前面的content 的一个修饰。 格式:rawbytes; 例子:alert tcp any any -> any any (msg: "Telnet NOP "; content: "|FF F1| "; rawbytes;) distance distance关键字是content关键字的一个修饰词,确信在使用content时模式匹配间至少有N个字节存在。它被设计成在规则选项中和其他选项联合使用。 格式:distance:MegaEntry - Social networking and discussion site!
alert tcp any any -> any any (content: "2 Patterns "; content: "ABCDE "; content: "EFGH "; within: 10;)Byte_Test 测试一个字节的域为特定的值。能够测试二进制值或者把字节字符串转换成二进制后再测试。 格式:byte_test:CopyRight owned by the original author.--(www.MegaEntry.com)
例子: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;)alert tcp $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;) Byte_Jump Byte_jump 选项用来取得一定数量的字节,并把它们转换成数字形式,跳过一些字节以进一步进行模式匹配。这就允许相对模式匹配在网络数据中进行数字值匹配。 格式:byte_jump:MegaEntry - Social networking and discussion site!
dec 把字符串数据转换成十进制数形式。oct 把字符串数据转换成八进制数形式。align 以32位为边界对转换的字节数对齐,即转换的字节数为4的倍数。CopyRight owned by the original author.--(www.MegaEntry.com)
Snort Portscan预处理程序的用处:向标准记录设备中记录从一个源IP地址来的端口扫描的开始和结束。如果指定了一个记录文件,在记录扫描类型的同时也记录目的IP地址和端口。端口扫描定义为在时间T(秒)之内向超过P个端口进行TCP连接尝试,或者在时间T(秒)之内向超过P个端口发送UDP数据包。端口扫描可以是对任一IP 地址的多个端口,也可以是对多个IP地址的同一端口进行。现在这个版本可以处理一对一和一对多方式的端口扫描,下一个完全版本将可以处理分布式的端口扫描(多对一或多对多)。端口扫描也包括单一的秘密扫描(stealth scan)数据包,比如NULL,FIN,SYNFIN,XMAS等。如果包括秘密扫描的话,端口扫描模块会对每一个扫描数据包告警。为避免这种情况,可以在Snort标准发行版中的scan-lib文件里把有关秘密扫描数据包的小节注释掉,这样对每次扫描就只记录一次。如果使用外部记录特性,可以在记录文件中看到(端口扫描的?)技术和类型。该模块的参数如下:CopyRight owned by the original author.--(www.MegaEntry.com)
timeoutCopyRight owned by the original author.--(www.MegaEntry.com)
detect_state_problems 打开流事件报警能力,例如,没有RST的数据包、带有数据的SYN包和超出窗口序列号的包。 disable_evasion_alerts 关闭事件报警能力,例如,TCP重叠。 ttl_limit 设置ttl的极限值。 Stream4_Reassemble 格式:preprocessor stream4_reassemble: [clientonly], [serveronly],[noalerts], [portsMegaEntry - Social networking and discussion site!
这个模块将检测端口扫描。它要求包含Conversation预处理器以便判定一个会话是什么时间开始的。它的目的是能够检测快速扫描,例如,快速的nmap扫描。 格式:preprocessor portscan2: [scanners_maxMegaEntry - Social networking and discussion site!
注意:如果在运行时指定了命令行的输出开关,在Snort规则文件中指定的输出插件会被替代。例如,如果在规则文件中指定了alert_syslog插件,但在命令行中使用了 "-A fast "选项,则alert_syslog插件会被禁用而使用命令行开关。多个输出插件是在snort的配置文件中指定的。当指定多个输出插件时,它们被压入栈并且在事件发生时按顺序调用。关于标准的记录和报警系统,输出模块缺省把数据发送到 /var/log/snort.或者通过使用-l命令行参数输出到一个用户指定的目录。在规则文件中通过指定output关键字,使得在运行时加载输出模块。 格式:outputMegaEntry - Social networking and discussion site!
LOG_DAEMON LOG_LOCAL0 LOG_LOCAL1 LOG_LOCAL2 LOG_LOCAL3 LOG_LOCAL5 LOG_LOCAL6 LOG_LOCAL7 LOG_USER 优先级(Priorities) LOG_EMERG LOG_ALERT LOG_CRIT LOG_ERR LOG_WARNING LOG_NOTICEMegaEntry - Social networking and discussion site!
LOG_INFO LOG_DEBUG 格式:alert_syslog:MegaEntry - Social networking and discussion site!
output alert_full: alert.full Alert_smb 这个插件将把WinPopup报警信息发送给NETBIOS命名的机器上的一个文件。并不鼓励使用这个插件,因为它以snort权限执行了一个外部可执行二进制程序,通常是root权限。那个工作站上接受报警信息的文件每行存放一条报警信息。 格式:alert_smb:CopyRight owned by the original author.--(www.MegaEntry.com)
log_tcpdump: 例子:output log_tcpdump: snort.log database 该插件由Jed Pickel提供将Snort数据记录到Postgres SQL数据库中。更多的有关安装和配置该插件的信息可以在Incident.org (http://www.incident.org/snortdb)找到。这个插件的参数是数据库名称和一个参数列表。参数由格式parameter = argument来指定。可用参数如下: host - 连接主机。如果指定了一个非零字串,就使用TCP/IP通讯。如果不指定主机名,就会使用Unix domain socket连接。port - 连接服务器主机的端口号,或者是Unix-domain连接的socket文件名扩展。dbname - 数据库名。user 数据库中身份认证用的用户名。password - 如果数据库要求口令认证,就使用这个口令。sensor_name 为snort指定一个你自己的名字。如果你不指定,这里就自动产生一个。encoding 因为数据包负载和选项都是二进制的,所以没有一个轻便简单的方法把它存储在数据库中。没有使用BLOBS,因为它们在穿越数据库时不是那么轻便的。所以,我们提供了一个encoding 选项给你。你可以从下面的选项中选择。它们有各自的优缺点。hex (default) 把二进制数据表示成十六进制字符串storage requirements 二进制的二倍容量searchability 很好用human readability 不是很好读除非你很滑稽,要求邮件处理。CopyRight owned by the original author.--(www.MegaEntry.com)
base64 把二进制数据表示成以64为基的字符串。storage requirements二进制的1.3倍容量。searchability 没有邮件处理是不可能的。human readability 不易读,要求邮件处理。ascii 把二进制数据表示成 ascii 码字符串。这是唯一的可以释放数据的选项。非ascii码数据用… 代替。即使你选择了这个选项,ip和tcp选项数据还将用十六进制表示,因为那些数据用ascii码标上没有任何意义。storage requirements 稍微比二进制大,因为避免了一些字符(&,<,>)。searchability 对于搜索文本字符串很好用,而搜索二进制串是不可能的。human readability 很好用。detail 你想存储多少细节数据,有如下选项:full (缺省值)记录一个引起报警数据包的所有的细节(包括ip/tcp选项和负载)。fast 只记录少量数据。如果选择了这个选项,你将削减了潜在的分析能力,但这仍是一些应用的最佳选项。这将记录下面的字段(timestamp, signature, source ip, destination ip, source port, destination port, tcp flags, and protocol)此外,还必须定义一个记录方法和数据库类型。有两种记录方法,log和alert。设置为log类型,将启动这个程序的数据库记录功能。如果你设置为log类型,输出链表将调用这个插件。设置为alert类型,将启动这个程序的数据库报警输出功能。当前共有四种数据库类型:MySQL, PostgreSQL, Oracle, 和 unixODBC-兼容数据库。 格式:output database: log, mysql, dbname=snort user=snort host=localhost password=xyz CSVMegaEntry - Social networking and discussion site!
CSV输出插件可以将报警数据以一种方便的形式输出到一个数据库。这个插件要求两个参数,一个全路径文件名和输出模式选项。下面是模式选项列表。如果模式选项缺省,就按模式选项列表中的顺序输出。 timestampmsgprotosrcsrcportdstdstportethsrcethdstethlentcpflagstcpseqtcpacktcplentcpwindowCopyRight owned by the original author.--(www.MegaEntry.com)
ttltosiddgmleniplenicmptypeicmpcodeicmpidicmpseq 格式:output alert_CSV:CopyRight owned by the original author.--(www.MegaEntry.com)
这两个文件都是以spo_unified.h文件中描述的二进制形式写的。以unix秒为单位的时间将附加到每个文件的后面写出。 格式output alert_unified:MegaEntry - Social networking and discussion site!
} 自己动手编写好的规则 当编写snort规则时,首先考虑的是效率和速度。 好的规则要包含content选项。2.0版本以后,snort改变了检测引擎的工作方式,在第一阶段就作一个集合模式匹配。一个content选项越长,这个匹配就越精确。如果一条规则不包含content选项,它们将使整个系统慢下来。 当编写规则时,尽量要把目标定位在攻击的地方(例如,将目标定位在1025的偏移量等等)而不仅仅是泛泛的指定(如,在这匹配脚本代码)。Content规则是大小写敏感的(除非你使用了nocase选项)。不要忘记content是大小写敏感的和大多数程序的命令都是大写字母。FTP就是一个很好的例子。考虑如下的规则: alert tcp any any -> 192.168.1.0/24 21 (content: "user root "; msg: "FTP root login ";)alert tcp any any -> 192.168.1.0/24 21 (content: "USER root "; msg: "FTP root login ";) 上面的第二条规则能检测出大多数的自动以root登陆的尝试,而第一条规则就不行。Internet 守护进程在接受输入时是很随便的。在编写规则时,很好的理解协议规范将降低错过攻击的机会。 加速含有内容选项的规则 探测引擎运用规则的顺序和它们在规则中的书写顺序无关。内容规则选项总是最后一个被检验。利用这个事实,应该先运用别的快速规则选项,由这些选项决定是否需要检查数据包的内容。例如:在TCP会话建立起来后,从客户端发来的数据包,PSH和ACK这两个TCP标志总是被置位的。如果想检验从客户端到服务器的有效载荷,利用这个事实,就可以先进行一次TCP标志检验,这比模式匹配算法(pattern match algorithm)在计算上节约许多。使用内容选项的规则要加速的一个简便方法就是也进行一次标志检验。基本思想是,如果PSH和ACK标志没有置位,就不需要对数据包的有效载荷进行检验。如果这些标志置位,检验标志而带来的计算能力消耗是可以忽略不计的。 alert tcp any any -> 192.168.1.0/24 80 (content: "cgi-bin/phf "; flags: PA; msg: "CGI-PHF probe ";)