论坛: 菜鸟乐园 标题: 看到一点关于SNORT的资料,一时兴起,就贴过来了!(凌浪转载) 复制本贴地址    
作者: danjames [danjames]    论坛用户   登录
强大的轻量级网络入侵检测系统SNORT 
--------------------------------------------------------------------------------
作者:gemini  来源:www.linuxaid.com.cn  类别:入侵检测系统  日期:  今日/总浏览: 5/284  


   强大的轻量级网络入侵检测系统SNORT 
2001-06-06 15:03 

发布者:gemini 
1.简介 

在网络日益普及的今天,网络安全变的越来越重要,作为网络安全的一个重要组成部分网络入侵检测系统(Network Intrusion Detection System,NIDS)也越来越显示出其重要性。NIDS用来监视网络数据流动情况,当入侵发生时能够提供报警。现在已经出现了很多商业的NIDS,但是它们大多比较复杂,比较难以掌握,而且比较昂贵,比较小的公司无法承受。本文将介绍一个出色的免费NIDS系统---snort,它基于GPL,作者是Martin Roesch。最新版本是1.70版。本文将介绍snort的技术特点及如何使用snort作为NIDS。 

2.SNORT的特点 

snort是一个强大的轻量级的网络入侵检测系统。它具有实时数据流量分析和日志IP网络数据包的能力,能够进行协议分析,对内容进行搜索/匹配。它能够检测各种不同的攻击方式,对攻击进行实时报警。此外,snort具有很好的扩展性和可移植性。还有,这个软件遵循通用公共许可证GPL,所以只要遵守GPL任何组织和个人都可以自由使用。 

1).snort是一个轻量级的入侵检测系统 
snort虽然功能强大,但是其代码极为简洁、短小,其源代码压缩包只有大约110KB。 

2).snort的可移植性很好 
snort的跨平台性能极佳,目前已经支持Linux,Solaris,BSD,IRIX,HP-UX,WinY2K等系统。 

3)。snort的功能非常强大 
snort具有实时流量分析和日志IP网络数据包的能力。能够快速地检测网络攻击,及时地发出报警。snort的报警机制很丰富,例如:syslog、用户指定的文件、一个UNIX套接字,还有使用SAMBA协议向Windows客户程序发出WinPopup消息。利用XML插件,snort可以使用SNML(简单网络标记语言,simple network markup language)把日志存放到一个文件或者适时报警。 

snort能够进行协议分析,内容的搜索/匹配。现在snort能够分析的协议有TCP、UDP和ICMP。将来,可能提供对ARP、ICRP、GRE、OSPF、RIP、IPX等协议的支持。它能够检测多种方式的攻击和探测,例如:缓冲区溢出、秘密端口扫描、CGI攻击、SMB探测、探测操作系统指纹特征的企图等等。 

snort的日志格式既可以是tcpdump式的二进制格式,也可以解码成ASCII字符形式,更加便于用户尤其是新手检查。使用数据库输出插件,snort可以把日志记入数据库,当前支持的数据库包括:Postgresql、MySQL、任何unixODBC数据库,还有Oracle(对Oracle的支持目前处于测试阶段)。 

使用TCP流插件(tcpstream),snort可以对TCP包进行重组。snort能够对IP包的内容进行匹配,但是对于TCP攻击,如果攻击者使用一个程序,每次发送只有一个字节的TCP包,完全可以避开snort的模式匹配。而被攻击的主机的TCP协议栈会重组这些数据,将其送给在目标端口上监听的进程,从而使攻击包逃过snort的监视。使用TCP流插件,可以对TCP包进行缓冲,然后进行匹配,使snort具备了对付上面这种攻击的能力。 

使用spade(Statistical Packet Anomaly Detection Engine)插件,snort能够报告非正常的可疑包,从而对端口扫描进行有效的检测。 

snort还有很强的系统防护能力。使用FlexResp功能,snort能够主动断开恶意连接。 

4).扩展性能较好,对于新的攻击威胁反应迅速 
作为一个轻量级的网络入侵检测系统,snort有足够的扩展能力。它使用一种简单的规则描述语言。最基本的规则只是包含四个个域:处理动作、协议、方向、注意的端口。例如: 
log tcp any any -> 10.1.1.0/24 79 。还有一些功能选项可以组合使用,实现更为复杂的功能。将有一篇单独的文章讨论如何写snort规则。用户可以从http://www.snort.org得到其规则集。另外,著名的黑客Max Vision在http://www.whitehats.com提供在线的技术支持。 

snort支持插件,可以使用具有特定功能的报告、检测子系统插件对其功能进行扩展。snort当前支持的插件包括:数据库日志输出插件、碎数据包检测插件、端口扫描检测插件、HTTP URI normalization插件、XML插件等。 

snort的规则语言非常简单,能够对新的网络攻击做出很快的反应。发现新的攻击后,可以很快根据Bugtraq邮件列表,找出特征码,写出检测规则。因为其规则语言简单,所以很容易上手,节省人员的培训费用。 

5).遵循公共通用许可证GPL 
snort遵循GPL,所以任何企业、个人、组织都可以免费使用它作为自己的NIDS。 

3.安装 

3.1.如何获得snort 
可以从snort的站点http://www.snort.org获得其源代码或者RPM包。使用源代码安装snort需要libpcap库,可以从ftp://ftp.ee.lbl.gov下载, 

3.2.安装snort 

3.2.1.RPM包,可以使用下面的命令进行安装: 
bash#rpm -ihv --nodeps snort-1.7-1.i386.rpm 

3.2.2.源代码: 

1).解压libpcap包: 
bash#uncompress libpcap.tar.Z 
bash#tar xvf libpcap.tar 
2).编译libpcap库: 
bash#./configure 
bash#make 
3).解压snort-1.7.0.tar.gz 
bash#tar zxvf snort-1.7.0.tar.gz 
4).进入到其所在目录,编译snort: 
bash# ./configure --with-libpcap-includes=/path/to/your/libcap/headers 
bash# make 
bash# make install 
5).configure脚本还有一些选项:--enable-smbalerts编译SMB报警代码;--enable-flexresp编译Flexible Response代码;--with-mysql=DIR支持mysql数据库;--with-postgresql=DIR支持postsql数据库;--with-odbc=DIR支持ODBC数据库;--enable-openssl支持SSL。可以根据自己的实际情况选择这些选项。 

4.使用 
现在,snort已经安装完成。我们将在这一节讨论如何使用snort。作为一个网络入侵检测的软件,snort有三种用途:数据包嗅探器(packet sniffer)、数据包分析器(packet analyser)以及网络入侵检测系统。让我们从最简单的命令开始,输入一个简单的命令列出所有的命令行开关。 

bash# snort -? 
-*> Snort! <*- 
Version 1.7 
By Martin Roesch (roesch@clark.net, www.snort.org) 
USAGE: snort [-options] 
Options: 
-A 设置报警模式:fast、full、none(只是使用报警文件)、 
unsock(使用UNIX套接字记入日志,出于测试阶段) 
-a 显示ARP(Address Resolution Protocol,地址解析 
协议)包 
-b 日志文件使用tcpdump格式(更快) 
-c 使用规则文件rules 
-C 只使用字符方式打印负载信息(不使用hex方式) 
-d 复制应用层 
-D 在后台运行snort(精灵状态) 
-e 显示第二层(数据链路层)包头信息 
-F Read BPF filters from file 
-g 初始化完成后,使snort的gid为gname 
-h Home网络为hn 
-i 在接口if上监听 
-I 把界面名加入到报警输出界面。 
-l 设置目录ld为日志目录 
-M 把SMB消息发送到文件wrkst列出的工作站中 
(Requires smbclient to be in PATH) 
-n 收到cnt个包后退出 
-N 关闭日志功能(警报功能仍然有效) 
-o 把规则测试顺序修改为:Pass|Alert|Log 
-O 打乱被日志的IP地址 
-p 关闭混杂嗅探模式 
-P 设置复制的包的长度为snaplen(默认: 1514) 
-q 安静模式。不输出banner和状态报告。 
-r 读取并处理tcpdump文件tf(回放功能) 
-s 把所有警告信息记入syslog 
-S 设置规则文件中的n的值等于v的值 
-t 
初始化完成后Chroot到dir目录 
-u 初始化完成后,把snort的uid设置为uname 
-v 设置冗余模式 
-V 显示版本号 
-X 从链路层开始复制包的数据 
-? 显示帮助信息 
<包过滤选项>基于BPF,可参考TCPDump 

4.1.作为嗅探器 
所谓的嗅探器模式就是snort从网络上读出数据包然后显示在你的控制台上。首先,我们从最基本的用法入手。如果你只要把TCP/IP包头信息打印在屏幕上,只需要输入下面的命令: 

./snort -v 

使用这个命令将使snort只输出IP和TCP/UDP/ICMP的包头信息。如果你要看到应用层的数据,可以使用: 

./snort -vd 

这条命令使snort在输出包头信息的同时显示包的数据信息。如果你还要显示数据链路层的信息,就使用下面的命令: 

./snort -vde 

注意这些选项开关还可以分开写或者任意结合在一块。例如:下面的命令就和上面最后的一条命令等价: 

./snort -d -v -e 

4.2.记录数据包 
如果要把所有的包记录到硬盘上,你需要指定一个日志目录,snort就会自动对数据包进行日志: 

./snort -dev -l ./log 

当然,./log目录必须存在,否则snort就会报告错误信息并退出。当snort在这种模式下运行,它会日志所有看到的包将其放到一个目录中,这个目录以数据包目的主机的IP地址命名,例如1192.168.10.1 

如果你只指定了-l命令开关,而没有设置目录名,snort有时会使用远程主机的IP地址作为目录,有时会使用本地主机IP地址作为目录名。为了只对本地网络进行日志,你需要给出home net: 

./snort -dev -l ./log -h 192.168.1.0/24 

这个命令告诉snort把进入C类网络192.168.1的所有包的数据链路、TCP/IP以及应用层的数据记录到目录./log中。 

如果你的网络速度很快,或者你想使日志更加紧凑以便以后的分析,那么应该使用二进制的日志文件格式。所谓的二进制日志文件格式就是tcpdump程序使用的格式。使用下面的命令可以把所有的包日志到一个单一的二进制文件中: 

./snort -l ./log -b 

注意此处的命令行和上面的有很大的不同。我们勿需指定home network,因为所有的东西都被记录到一个单一的文件。你也不必冗余模式或者使用-d、-e功能选项,因为数据包中的所有内容都会被记录到日志文件中。 

你可以使用任何支持tcpdump二进制格式的嗅探器程序从这个文件中读出数据包,例如:tcpdump或者Ethereal。使用-r功能开关,也能使snort读出包的数据。snort在所有运行模式下都能够处理tcpdump格式的文件。例如:如果你想在嗅探器模式下把一个tcpdump格式的二进制文件中的包打印到屏幕上,可以输入下面的命令: 

./snort -dv -r packet.log 

在日志包和入侵检测模式下,通过BPF(BSD Packet Filter)接口,你可以使用许多方式维护日志文件中的数据。例如,你只想从日志文件中提取ICMP包,只需要输入下面的命令行: 

./snort -dvr packet.log icmp 

4.3.作为入侵检测系统 

snort最重要的用途还是作为网络入侵检测系统(NIDS),使用下面命令行可以启动这种模式: 

./snort -dev -l ./log -h 192.168.1.0/24 -c snort.conf 

snort.conf是规则集文件。snort会对每个包和规则集进行匹配,发现这样的包就采取相应的行动。如果你不指定输出目录,snort就输出到/var/log/snort目录。 

注意:如果你想长期使用snort作为自己的入侵检测系统,最好不要使用-v选项。因为使用这个选项,使snort向屏幕上输出一些信息,会大大降低snort的处理速度,从而在向显示器输出的过程中丢弃一些包。 

此外,在绝大多数情况下,也没有必要记录数据链路层的包头,所以-e选项也可以不用: 

./snort -d -h 192.168.1.0/24 -l ./log -c snort.conf 

这是使用snort作为网络入侵检测系统最基本的形式,日志符合规则的包,以ASCII形式保存在有层次的目录结构中。 

网络入侵检测模式下的输出选项 

在NIDS模式下,有很多的方式来配置snort的输出。在默认情况下,snort以ASCII格式记录日志,使用full报警机制。如果使用full报警机制,snort会在包头之后打印报警消息。如果你不需要日志包,可以使用-N选项。 

snort有6种报警机制:full、fast、socket、syslog、smb(winpopup)和none。其中有4个可以在命令行状态下使用-A选项设置。这4个是: 

-A fast:报警信息包括:一个时间戳(timestamp)、报警消息、源/目的IP地址和端口。 

-A full:是默认的报警模式 

-A unsock:把报警发送到一个UNIX套接字,需要有一个程序进行监听,这样可以实现适时的报警 

-A none:关闭报警机制 

使用-s选项可以使snort把报警消息发送到syslog,默认的设备是LOG_AUTHPRIV和LOG_ALERT。可以修改snort.conf文件修改其配置。 

snort还可以使用SMB报警机制,通过SAMBA把报警消息发送到Windows主机。为了使用这个报警机制,在运行./configure脚本时,必须使用--enable-smbalerts选项。 

下面是一些输出配置的例子: 

1).使用默认的日志方式(以解码的ASCII格式)并且把报警发给syslog: 
./snort -c snort.conf -l ./log -s -h 192.168.1.0/24 

2).使用二进制日志格式和SMB报警机制: 
./snort -c snort.conf -b -M WORKSTATIONS 

snort规则简介 

snort最重要的用途是作为网络入侵检测系统,它有自己的规则语言。从语法上看,这种规则语言非常简单,但是对于入侵检测来说它足够强大。对于匹配特定规则的数据包,snort有三种处理动作:pass、log、alert。 

1).pass:放行数据包 
2).log:把数据包记录到日志文件 
3).alert:产生报警消息并日志数据包 

snort的每条规则都可以分成逻辑上的两个部分:规则头和规则选项。规则头包括:规则行动(rules action)、协议(protocol)、源/目的IP地址、子网掩码以及源/目的端口。规则选项包含报警消息和异常包的信息(特征码),使用这些特征码来决定是否采取规则规定的行动。最基本的规则只是包含四个个域:处理动作、协议、方向、注意的端口。例如: 

log tcp any any -> 10.1.1.0/24 79 

这条规则表示:让snort记录从外部网络到C类网址10.l.1所有数据包。 

snort规则中还可以有规则选项(rule option),使用规则选项可以定义更为复杂的行为,实现更加强大的功能。下面是一条含有规则选项的规则(注意整个规则应该在一行,是出于版面的原因才分成两行): 

alert tcp any any -> 10.1.1.0/24 80 (content: 

"/cgi-bin/phf";msg "PHF probe!") 

这条规则用来检测对本地网络web服务器的PHF服务的探测,一旦检测到这种探测数据包,snort就发出报警消息,并把整个探测包记录到日志。 

在规则中,IP地址的定义也有很大的灵活性。使用any关键词表示任何IP地址或者端口。一般地,IP地址可以使用xx.xx.xx.xx/子网掩码的形式定义,其中xx.xx.xx.xx是由.分割的四个字节的数字。注意不能使用域名方式,snort不对域名进行解析,当然是出于效率的考虑^_^。还可以使用非操作符!对IP地址和端口进行操作,这个操作符就是逻辑非的意思。对于端口,还可以使用操作符:限制端口的范围。例如: 

alert tcp !10.1.1.0/24 any -> 10.1.1.0/24 6000:6010 ( 

msg: "X traffic" 

这条规则使snort对于从外部网络到内部网络X-window服务端口的数据包发出报警。 

在snort当前版本(1.7)中有23个规则选项关键词,随着snort不断地加入对更多协议的支持以及功能的扩展,会有更多的功能选项加入其中。这些功能选项可以以任意的方式进行组合,对数据包进行分类和检测。现在,snort支持的选项包括:msg、logto、ttl、tos、id、ipoption、fragbits、dsize、flags、seq、ack、itype、icode、icmp_id、content、content-list、offset、depth、nocase、session、rpc、resp、react。每条规则中,各规则选项之间是逻辑与的关系。只有规则中的所有测试选项(例如:ttl、tos、id、ipoption等)都为真,snort才会采取规则动作。 

如何编写规则 

由于snort的规则语言语法非常简单,所以可以对新发现的攻击作出快速的反应,迅速开发新的snort规则。编写新的规则,最重要的是知道新攻击的特征码。要得到一个新的攻击的特征码,一般的方法就是进行实际的测试。对一个测试网络进行攻击,使用snort记录在攻击主机和测试网络之间的数据流。然后,对记录的数据进行分析得到其唯一的特征码,最后把得到的特征码加入到规则中。我们以IMAP缓冲区溢出为例进行说明,图8是一个假想的IMAP缓冲区溢出攻击被记录下的数据包: 

-------------------------------------------------------------------------- 
052499-22:27:58.403313 192.168.1.4:1034 -> 192.168.1.3:143 
TCP TTL:64 TOS:0x0 DF 
***PA* Seq: 0x5295B44E Ack: 0x1B4F8970 Win: 0x7D78 
90 90 90 90 90 90 90 90 90 90 90 90 90 90 EB 3B ...............; 
5E 89 76 08 31 ED 31 C9 31 C0 88 6E 07 89 6E 0C ^.v.1.1.1..n..n. 
B0 0B 89 F3 6E 08 89 E9 6E 0C 89 EA CD 80 .....n....n..... 
31 DB 89 D8 40 CD 80 90 90 90 90 90 90 90 90 90 1...@........... 
90 90 90 90 90 90 90 90 90 90 90 E8 C0 FF FF FF ................ 
2F 62 69 6E 2F 73 68 90 90 90 90 90 90 90 90 90 /bin/sh......... 
--------------------------------------------------------------------------- 

这个攻击的特征码就是/bin/sh字符串及其前面的机器代码。这实际上是一个shellcode。四用这些信息可以很快开发出一条新的规则: 

alert tcp any any -> 192.168.1.0/24 143 (content:"|E8C0 FFF FF|/bin/sh"; 

msg:"New IMAP Buffer Overflow detected!" 

其中的特征码含有文本和16进制两种形式,它们以|分割,snort运行时都被转换为二进制形式。 

总结 

本文介绍了一个轻量级的入侵检测系统snort。主要讨论了其特点、如何安装,最基本的用法,以及如何开发新的规则。snort是一个高性能的入侵检测系统,适用于大中小型网络,尤其适合一些无力承受大型商业入侵检测系统高昂费用中小型公司。 



来源:www.linuxaid.com.cn 

 
 
 
 


地主 发表时间: 03/22 12:18

回复: danjames [danjames]   论坛用户   登录
使用Snort1.7 
--------------------------------------------------------------------------------
作者:westfox(大勇)  来源:westfox  类别:入侵检测系统  日期:  今日/总浏览: 1/113  


  使用Snort1.7 
原创:westfox(大勇) 
来源:westfox 

使用Snort1.7 
westfox(westfoxcs@263.net)06/08/2001 

1. 简介 
2. 安装(Linux)及配置 
3. 使用Snort 
4. 入侵检测 
5. Snort Addons 
6. 参考资料 

1. 简介 

Snort是一个开放源码的网络入侵检测系统。Snort的功能包括 
1) 采用Libpcap捕获数据链路层的分组并进行协议栈分析(TCP/IP协议)。 
2) 在内部Snort使用Misused检测模型进行入侵检测,即通过一个完整的入侵规则库来实时匹配并探测入侵行为。这个规则库非常全面,包含了探测缓冲区溢出,端口扫描,CGI攻击等等,并处于不断更新当中。如果你使用nmap或Trin00等进行攻击,可能你就会被snort轻易的发现。Snort也允许用户方便的编写并加入自己的规则。 
3) 日志可以存储成Tcpdump二进制格式,或ASCII格式,或数据库格式(包括MySQL,PostgreSQL),甚至包括XML格式。 

2. 安装(Linux)及配置 

以Linux平台为例,安装很简单, 
$tar xzvf snort-1.7.tar.gz 
$cd snort-1.7 
$./configure 
$make 
Make之后,在当前目录下会产生一个snort可执行文件。 

snort的配置文件使snort.conf,配置包含四步 

1)设置网络相关变量, 
IDS需要区分“内网”和外网,比如我所在子网IP是202.197.40.91,则配置为 
var HOME_NET 202.197.40.0/24 #内网 
var EXTERNAL_NET any #外网,关键字any这里表示HOME_NET之外的所有地址 
var DNS_SERVERS 202.197.32.12 #DNS 服务器 

2)配置预处理器 
预处理器是snort在捕获分组时对分组作的一些"预处理"动作,比如探测过小的IP碎片,重组 IP分组,重组TCP报文等,snort预处理程序为spp_*.c形式,比如spp_defrag.c实现重组IP包。用户可以预处理配置参数,如 
preprocessor minfrag: 128 
设置碎片小于128字节为非法。 

3) 配置输出插件(output plugins) 
Snort的插件结构允许开发者扩展snort的功能。输出插件负责信息的输出,你可以选择ASCII文本文件存储日志,也可以选择存储到MySQL数据库中,也可以使用IAP协议将信息传给管理器Manager(参见snortnet)。 
这是一个MySQL的例子 
output database: log, mysql, user=westfox dbname=detector host=localhost password=t123 port=1234 
上面例子表示使用MYSQL RDBMS,数据库名为detector,用户名westfox,密码t123,本地存储,MySQL Server端口号为1234。 
Snort源代码中contrib目录下有一个create_mysql文件,可以用来方便的构造snort所需的MySQL库表结构,假设你已新建了一个名为detector,并将足够的权限交给westfox,则 
$mysql detector -u westfox -p <./contrib/create_mysql 
上面的命令就可以建好detector库的表结构。 

4) 定制Snort 规则集(Rule Set) 
Snort的规则集是一般的文本文件,命名为*-lib,如backdoor-lib处理backdoor类型的入侵。所有这些*-lib文件都用“include”包含进snort.conf(1.6.3版本中名为snort-lib)中,如果用户对某种攻击类型的探测不感兴趣,可以简单将相应的一行注释掉。如 
-------Cut from snort.conf--------- 
include webcgi-lib 
#include webcf-lib 你对ColdFusion并不感兴趣 
include webiis-lib 
include webfp-lib 
include webmisc-lib 
include overflow-lib 
include finger-lib 
include ftp-lib 
include smtp-lib 
include my-lib #用户自己编写的规则文件 
------------------------------------- 
用户也可以自己编写规则文件,如My-lib,,Snort规则编写语法以有人译出,这里不再叙述。 

3.使用Snort 

Snort可以工作在三种模式下: 

1) 嗅探器sniffer: 
命令:snort -v [-d][-X] 
Snort使用Libpcap包捕获库,即TCPDUMP使用的库。在这种模式下,Snort使用网络接口的混杂模式读取并解析共享信道中的网络分组。BPF表达式可用来过滤流量。 
-v verbose 
-d 转储应用层数据 
-X 转储从链路层开始的原始包 

2) 分组日志模式 
命令:snort -l dir [-h hn][-b] 
这种模式下以ASCII格式记录解析出的分组。 
-l directory snort将把日志放在这个目录下 
-h X.X.X.X 设置本地子网号 
-b 日志使用TCPDUMP二进制格式 

3) 入侵检测模式 
命令: snort -c snort.conf [-l dir] 
必须载入规则库才能进入入侵检测模式。即 
#./snort -c snort.conf 
snort将报警信息放入/var/log/snort目录下,可以用-l选项来改变目录 

4. 入侵检测 

Snort是一个轻量级的网络入侵检测系统(NIDS),采用Misused 模式进行检测。在1.7里,新增加的Spade插件使得Snort支持Anormal模式检测。Snort的检测规则是二维的,即包含规则头和规则选项两部分,这比较其他IDS定义的规则来说简单的多。Snort新的插件reference可以将确定的攻击行为同Bugtraq, CVE , arachNIDS, McAfee virus这些标准的攻击标识库结合,给出在线的有关此攻击的URL参考资料。snort的探测规则库也是时时更新反映上面这些库的变化,用户可以到www.snort.org上下载新的规则库文件。 
Snort本身具有良好的扩展性,包含预处理插件,插件和输出插件三类plugins,snort运行的一个流程如下 
------------------------------------------------------------------------ 
Libpcap捕获分组---->TCP/IP协议栈分析---->规则探测---->日志和报警 
| | | 
| | | 
|预处理插件| |插件| |输出插件| 
------------------------------------------------------------------------ 
从上面可以知道,在Snort处理流程的三个重要环节,开发者都可以编写自己的plugins来扩展功能。 
当然,一般用户仅用snort自带的探测库也可以探测绝大多数的攻击。以端口扫描攻击为例标准的snort.conf文件有一行配置portscan预处理器(源程序spp_portscan.c): 
preprocessor portscan: $HOME_NET 4 3 portscan.log 
上一行表示对于目标地址属于本地子网的IP流,如果在少于三秒内发现连续四次TCP SYN包或UDP的"SYN"包,指示有portscan攻击,并记录到portscan.log文件中。 
Snort除了统计指定时间内的连接次数外,还根据各种扫描模式的特征来探测,这些规则在scan-lib中,如 
alert tcp any any -> $HOME_NET any (msg:"Possible NMAP Fingerprint attempt"; flags: SFPU 
探测NAMP的Fingerprint扫描,标志是SYN,FIN,PSH,URG全置位。 

5. Snort Addons 
Snort1.7的contrib目录下包含了几个有用的snort工具。 

5.1 snort-net 

Snort-net是一个建立在snort上的分布式入侵检测系统(DIDS)。在snort-net里,多个snort作为感应器(sensor)分布在各网段捕获信息,snort-net提供一个管理器Manager,Manager负责和这些sensor联络,并提供一个管理者界面。Snort-net的Sensor和Manager之间采用IAP协议通信。 
Snort-net远非完善缺陷包括 
1) Snort-net所依赖的libiap库(IAP协议的实现库)现有的实现没有达到IAP0.3协议所规定的功能,包括最重要的TLS1.0协议支持。 
2) Manager只能做简单的信息收集和显示工作,而没有分析综合的能力 
3) 显示界面过于简陋 
4)传递的消息格式缺乏灵活性 
虽然有这些缺点,snort-net给出了snort向DIDS发展的框架。 

5.2 Spade 

Spade即Statistical Packet Anomaly Detection Engine(统计分组异常检测引擎),它作为一个预处理插件存在,对Snort捕获到的包做异常检测(Anomaly Detection)。Spade仅仅是实验性质的,并不实用。 

5.3 IDMEF-XML 
因特网工程任务组织(IETF)设立了一个入侵检测工作小组(IDWG),他们制定了一个入侵检测消息交换格式(IDMEF),IDMEF用XML语言描述。Idmef-xml输出插件将snort报警消息转换成IDMEF-xml格式。Snort通过这种消息格式可以将报警消息传递给别的软件做进一步,只要对方遵循IDMEF-XML格式即可。 

6. 参考资料 

Snort Home http://www.snort.org 
Bugtrap http://www.securityfocus.com 
CVE http://www.cve.mitre.org 
arachNIDS http://www.whitehats.com/ids/ 
IDMEF http://www.silicondefense.com/idwg/idmef/ 


B1层 发表时间: 03/22 12:19

回复: danjames [danjames]   论坛用户   登录
怎样使用Snort! 
--------------------------------------------------------------------------------
作者:xundi(xundi)  来源:不详  类别:入侵检测系统  日期:  今日/总浏览: 5/192  


   怎样使用Snort! 

BY XUNDI 

-------------------------------------------------------------------- 
安装方法: 
如果你安装好了libpcap后,对snort安装将是很简单,关于libpcap的安装说明, 
你可以看看blackfire(http://go.163.com/~bobdai/的一些文章,关于WINDOWS 
下的winpcap你可以看我站上的SNIFFER FOR NT上的安装说明。装好libpcap后, 
你可以使用通常的命令: 
1.) ./configure 
2.) make 
3.) make install 
装好后你可以使用make clean清除一些安装时候产生的文件。 
(有些系统如freebsd已经支持了libpcap,所以很轻松,不用再装了)。 

而WINDOWS更简单,只要解包出来就可以了; 

---------------------------------------------------------------------- 

参数介绍: 

命令行是snort -[options] <filters> 

选项: 
-A <alert> 设置<alert>的模式是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 <cf> 使用配置文件<cf>,这个规则文件是告诉系统什么样的信息要LOG, 
或者要报警,或者通过。 
-C 在信息包信息使用ASCII码来显示,而不是hexdump, 
-d 解码应用层。 
-D 把snort以守护进程的方法来运行,默认情况下ALERT记录发送 
到/var/log/snort.alert文件中去。 
-e 显示并记录2个信息包头的数据。 
-F <bpf>从<bpf>文件中读BPF过滤器(filters),这里的filters是标准 
的BPF格式过滤器,你可以在TCPDump里看到,你可以查看TCPDump 
的man页怎样使用这个过滤器。 
-h <hn>设置网络地址,如一个C类IP地址192.168.0.1或者其他的,使用这个 
选项,会使用箭头的方式数据进出的方向。 
-I <if> 使用网络接口参数<if> 
-l <ld> LOG信息包记录到<ld>目录中去。 
-M <wkstn> 发送WinPopup信息到包含<wkstn>文件中存在的工作站列表中去, 
这选项需要Samba的支持,wkstn文件很简单,每一行只要添加包含 
在SMB中的主机名即可。(注意不需要\\两个斜杠)。 
-n <num> 是指定在处理<num>个数据包后退出。 
-N 关闭LOG记录,但ALERT功能仍旧正常。 
-o 改变所采用的记录文件,如正常情况下采用Alert->Pass->Log order, 
而采用此选项是这样的顺序:Pass->Alert->Log order,其中Pass 
是那些允许通过的规则而不记录和报警,ALERT是不允许通过的规则, 
LOG指LOG记录,因为有些人就喜欢奇奇怪怪,象CASPER,QUACK就喜欢 
反过来操作。 
-p 关闭杂乱模式嗅探方式,一般用来更安全的调试网络。 
-r <tf> 读取tcpdump方式产生的文件<tf>,这个方法用来处理如 
得到一个Shadow(Shadow IDS产生)文件,因为这些文件不能 
用一般的EDIT来编辑查看。 
-s LOG 报警的记录到syslog中去,在LINUX机器上,这些警告信息 
会出现在/var/log/secure,在其他平台上将出现在/var/log/message中去。 
-S <n=v>这个是设置变量值,这可以用来在命令行定义Snort rules文件 
中的变量,如你要在Snort rules文件中定义变量HOME_NET,你 
可以在命令行中给它预定义值。 
-v 使用为verbose模式,把信息包打印在console中,这个选项使用后 
会使速度很慢,这样结果在记录多的是时候会出现丢包现象。 
-V 显示SNORT版本并退出; 
-? 显示使用列表并退出; 

---------------------------------------------------------------------- 

下面是一些命令的组合介绍,当然更多的组合你可以自己去测试: 

Snort存在比较多的命令选项和参数,先来介绍一些基本的一些命令,如果你 
想要把信息包的头显示在屏幕上,你可以使用: 

./snort -v 

这个命令会运行Snort和显示IP和TCP/UDP/ICMP头信息。 
我使用了ping 192.168.0.1就显示了如下信息: 
06/10-10:21:13.884925 192.168.0.2 -> 192.168.0.1 
ICMP TTL:64 TOS:0x0 ID:4068 
ID:20507 Seq:0 ECHO 

06/10-10:21:13.885081 192.168.0.1 -> 192.168.0.2 
ICMP TTL:128 TOS:0x0 ID:15941 
ID:20507 Seq:0 ECHO REPLY 

06/10-10:21:14.884874 192.168.0.2 -> 192.168.0.1 
ICMP TTL:64 TOS:0x0 ID:4069 
ID:20507 Seq:256 ECHO 

06/10-10:21:14.885027 192.168.0.1 -> 192.168.0.2 
ICMP TTL:128 TOS:0x0 ID:15942 
ID:20507 Seq:256 ECHO REPLY 

如果你想要解码应用层,就使用: 

snort -vd 
再次使用ping 192.168.0.1就显示了如下信息: 

06/10-10:26:39.894493 192.168.0.2 -> 192.168.0.1 
ICMP TTL:64 TOS:0x0 ID:4076 
ID:20763 Seq:0 ECHO 
58 13 42 39 E0 BB 05 00 08 09 0A 0B 0C 0D 0E 0F X.B9............ 
10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F ................ 
20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F !"#$%&'()*+,-./ 
30 31 32 33 34 35 36 37 01234567 

06/10-10:26:39.894637 192.168.0.1 -> 192.168.0.2 
ICMP TTL:128 TOS:0x0 ID:15966 
ID:20763 Seq:0 ECHO REPLY 
58 13 42 39 E0 BB 05 00 08 09 0A 0B 0C 0D 0E 0F X.B9............ 
10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F ................ 
20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F !"#$%&'()*+,-./ 
30 31 32 33 34 35 36 37 01234567 

如果要看到更详细的关于有关ethernet头的信息,就要使用: 

snort -vde 

使用ping 192.168.0.1就显示了如下信息: 
-*> Snort! <*- 
Version 1.6-WIN32 
By Martin Roesch (roesch@clark.net, www.clark.net/~roesch) 
WIN32 Port By Michael Davis (Mike@eEye.com, www.datasurge.net/~mike) 
06/10-10:32:01.345962 0:60:94:F9:5E:17 -> 0:50:BA:BB:4A:54 type:0x800 len:0x62 
192.168.0.2 -> 192.168.0.1 ICMP TTL:64 TOS:0x0 ID:4079 
ID:21787 Seq:0 ECHO 
99 14 42 39 47 4C 0C 00 08 09 0A 0B 0C 0D 0E 0F ..B9GL.......... 
10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F ................ 
20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F !"#$%&'()*+,-./ 
30 31 32 33 34 35 36 37 01234567 

06/10-10:32:01.346164 0:50:BA:BB:4A:54 -> 0:60:94:F9:5E:17 type:0x800 len:0x62 
192.168.0.1 -> 192.168.0.2 ICMP TTL:128 TOS:0x0 ID:16090 
ID:21787 Seq:0 ECHO REPLY 
99 14 42 39 47 4C 0C 00 08 09 0A 0B 0C 0D 0E 0F ..B9GL.......... 
10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F ................ 
20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F !"#$%&'()*+,-./ 
30 31 32 33 34 35 36 37 01234567 

当然上面的一些命令你只是在屏幕上看到,如果要记录在LOG文件上,你可以 
先建立一个log目录,在使用下面的命令: 

./snort -dev -l ./log -h 192.168.0.1/24 

这个命令就使Snort把ethernet头信息和应用层数据记录到./log目录总去了,并 
记录的是关于192.168.0.1 CLASS C的信息, 

如果你想利用一些规则文件(一些记录特定数据的规则文件,如SYN ATTACK等记录) 
就使用: 

./snort -dev -l ./log -h 192.168.1.0/24 -c snort-lib 

这里的Snort-lib是你的规则文件的文件名,这将采用snort-lib文件中设置的 
规则来决定是否记录某个信息包。而 

./snort -d -h 192.168.1.0/24 -l ./log -c snort-lib 可以不记录一些ethernet头信息 
如,我用./nmap -sS 192.168.0.1 -p 21就在/log/alert.ids中记录如下信息: 

[**] IDS246 - MISC - Large ICMP Packet [**] 
06/12-13:48:31.992395 192.168.0.1 -> 192.168.0.2 
ICMP TTL:128 TOS:0x0 ID:36579 
ID:46802 Seq:0 ECHO REPLY 

我故意使用了rules出现的规则php.cgi/?,如192.168.0.1/cgi-bin/php.cgi/?,就显示: 

[**] IDS232 - WEB-CGI-PHP CGI access attempt [**] 
06/12-13:53:35.106323 192.168.0.2:1789 -> 192.168.0.1:80 
TCP TTL:64 TOS:0x0 ID:8945 DF 
*****PA* Seq: 0xA070C880 Ack: 0xF113872 Win: 0x7D78 

./snort -d -h 192.168.1.0/24 -l ./log -c snort-lib -s就会把日志记录在你 
规则文件中所定义的LOG文件中,而不是默认的alert.ids中。 

./snort -d -h 192.168.1.0/24 -l ./log -c snort-lib -o此命令是读规则文件的顺序, 
有些人很奇怪,需要先读允许的规则文件,再读alert规则文件,然后来LOG记录,那就 
按照上面的命令来操作。 

如果你的网络请求相当多,你可以使用: 

./snort -b -A fast -c snort-lib 
这样,每一条规则内的警告消息就分开记录,对于多点同步探测和攻击的记录可以不容易丢包。 
当然这样记录的LOG文件是两进制的,类似与tcpdump的格式,你可以使用这样的方法来查看 
这些LOG: 

./snort -d -c snort-lib -l ./log -h 192.168.1.0/24 -r snort.log 

-------------------------------------------------------------------------------- 

最后讲将规则文件中的选项的意义,这些就不翻译了,因为偶比较愚钝,有些东西翻不正确: 
# msg => message to output in the alert/log files 
# flags => TCP flags, use 0 for no flags at all 
# ttl => the TTL value you want to key on (nice for catching traceroutes) 
# content => the packet application layer, look for buffer overflows here 
# itype => the NUMBER of the ICMP type 
# icode => the NUMBER of the ICMP code 
# minfrag => minimum fragment payload size 
# seq => tcp sequence number 
# ack => tcp ack number 
# id => IP header fragment ID number 
# logto => file to log specific alerts to 
# dsize => match on the packet payload size 
# offset => start a content search <offset> bytes into the payload 
# depth => only search <depth> bytes into the payload for a pattern match 
# session => record the session traffic from clear text protocols like 
# ftp or telnet 
# ipopts => check for a specific IP option 

--------------------------------------------------------------------------- 

参考: 
主要站点:www.snort.org 

rules 文件参考:http://www.clark.net/~roesch/snort_rules.html 

winpcap: http://netgroup-serv.polito.it/winpcap/install/Default.htm 

怎样安装winpcap: http://focus.silversand.net/newsite/skill/sniffitfornt.txt 

部分利用snort来查找攻击后的信息介绍:  http://focus.silversand.net/newsite/skill/foresic.txt 




B2层 发表时间: 03/22 12:22

回复: danjames [danjames]   论坛用户   登录
如何编写snort的检测规则 
--------------------------------------------------------------------------------
作者:Martin Roesch  来源:网络  类别:入侵检测系统  日期:  今日/总浏览: 1/140  


  --1.7版 

原著:Martin Roesch 

翻译:Ni-ZhiQiang 

前言 

snort是一个强大的轻量级的网络入侵检测系统。它具有实时数据流量分析和日志IP网络数据包的能力,能够进行协议分析,对内容进行搜索/匹配。它能够检测各种不同的攻击方式,对攻击进行实时报警。此外,snort具有很好的扩展性和可移植性。本文将讲述如何开发snort规则。 

1.基础 

snort使用一种简单的规则描述语言,这种描述语言易于扩展,功能也比较强大。下面是一些最基本的东西: 

1).snort的每条规则必须在一行中,它的规则解释器无法对跨行的规则进行解析。注意:由于排版的原因本文的例子有的分为两行。 
2).snort的每条规则都可以分成逻辑上的两个部分:规则头和规则选项。规则头包括:规则行为(rule's action)、协议(protocol)、源/目的IP地址、子网掩码以及源/目的端口。规则选项包含报警信息和异常包的信息(特征码,signature),使用这些特征码来决定是否采取规则规定的行动。 

这是一个例子: 

alert tcp any any -> 192.168.1.0/24 111(content:"|00 01 86 a5|";msg:"mountd access" 

表1.一条简单的snort规则 

从开头到最左边的括号属于规则头部分,括号内的部分属于规则选项。规则选项中冒号前面的词叫做选项关键词(option keywords)。注意对于每条规则来说规则选项不是必需的,它们是为了更加详细地定义应该收集或者报警的数据包。只有匹配所有选项的数据包,snort才会执行其规则行为。如果许多选项组合在一起,它们之间是逻辑与的关系。让我们从规则头开始。 

1.1.include 

snort使用的规则文件在命令行中指定,include关键词使这个规则文件可以包含其它规则文件中的规则,非常类似与C语言中的#include。snort会从被包含的文件读出其内容,取代include关键词。 

格式: 

include <文件路径/文件名> 

注意:行尾没有分号。 

1.2.varriables 

在snort规则文件中可以定义变量。 

格式: 

var <name><value> 

例子: 

var MY_NET192.168.1.0/24,10.1.1.0/24]<alert tcp any any -> $MY_NET any (flags:S;msg:'SYNMETA packet" 

表2.变量的定义和使用 

规则变量名可以使用多种方式来修改,你可以使用$操作符来定义元变量(meta-variables)。这些修改方式可以结合变量修改操作符:?和-来使用。 

1).$var:定义元变量 
2).$(var):以变量var的内容作为变量名 
3).$(var:-default):以变量var的内容作为变量名,如果var没有定义就使用default作为变量名 
4).$(var:?message):使用变量var的内容作为变量名,如果不成功就打印错误信息message并退出。 

例如: 

var MY_NET $(MYU_NET:-192.168.1.0/24) tcp any any -> $(MY_NET:?MY_NET is undefined!) 23 

表3.高级变量应用 

2.规则头(Rule Headers) 

2.1.Rule Action 

规则头包含一些信息,这些信息包括:哪些数据包、数据包的来源、什么类型的数据包,以及对匹配的数据包如何处理。每条规则的第一项就是规则行为(rule action)。规则行为告诉snort当发现匹配的数据包时,应该如何处理。在snort中,有五种默认的处理方式:alert、log、pass、activate和dynamic。 

1).alert:使用选定的报警方法产生报警信息,并且记录数据包 
2).log:记录数据包 
3).pass:忽略数据包 
4).activate:报警,接着打开其它的dynamic规则 
5).dynamic:保持空闲状态,直到被activete规则激活,作为一条log规则 

你也可以定义自己的规则类型,把它们和一个或者几个输出插件联系在一起。然后你就可以在snort规则中使用这些规则类型了。 

这个例子将建立一个类型,它将只以tcpdump格式输出日志: 
ruletype suspicious 

type log 
output log_tcpdump: suspocious.log 


下面这个例子将建立一个类型,把日志发送到syslog和MySql数据库: 
ruletype redalert 

type alert 
output alert_syslog:LOG_AUTH LOG_ALERT 
output database:log,user=snort dbname=snort host=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的地址。 

在规则中,可以使用使用否定操作符(negation operator)对IP地址进行操作。它告诉snort除了列出的IP地址外,匹配所有的IP地址。否定操作符使用!表示。例如,使用否定操作符可以很轻松地对表1的规则进行改写,使其对从外部网络向内的数据报警。 

alert tcp !192.168.1.0/24 any -> 192.168.1.0/24 111(content:"|00 01 86 a5|";msg:"external mountd access" 

表4.使用IP地址否定操作符的规则 

上面这条规则中的IP地址表示:所有IP源地址不是内部网络的地址,而目的地址是内部网络地址。 

你也可以定义一个IP地址列表(IP list)。IP地址列表的格式如下: 

[IP地址1/CIDR,IP地址/CIDR,....] 

注意每个IP地址之间不能有空格。例如: 

alert tcp ![192.168.1.0/24,10.1.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" 

2.4.端口号 

在规则中,可以有几种方式来指定端口号,包括:any、静态端口号(static port)定义、端口范围,以及使用非操作定义。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 :600 

记录来自任何端口,其目的端口号小于或者等于6000的TCP数据包 

log tcp any :1024 -> 192.168.1.0/24 500: 

记录源端口号小于等于1024,目的端口号大于等于500的TCP数据包 

表5.端口范围示例 

你还可以使用逻辑非操作符!对端口进行非逻辑操作(port negation)。逻辑非操作符可以用于其它的规则类型(除了any类型,道理很简单)。例如,你如果要日志除了X-window系统端口之外的所有端口,可以使用下面的规则: 

log tcp any any -> 192.168.1.0/24 !6000:60 10 

表6.对端口进行逻辑非操作 

2.5.方向操作符(direction operator) 

方向操作符->表示数据包的流向。它左边是数据包的源地址和源端口,右边是目的地址和端口。此外,还有一个双向操作符<>,它使snort对这条规则中,两个IP地址/端口之间双向的数据传输进行记录/分析,例如telnet或者POP3对话。下面的规则表示对一个telnet对话的双向数据传输进行记录: 

log !192.168.1.0/24 any <> 192.168.1.0/24 23 

表7.使用双向操作符的snort规则 

activate/dynamic规则 

activate/dynamic规则对扩展了snort功能。使用activate/dynamic规则对,你能够使用一条规则激活另一条规则。当一条特定的规则启动,如果你想要snort接着对符合条件的数据包进行记录时,使用activate/dynamic规则对非常方便。除了一个必需的选项activates外,激活规则(activate rule)非常类似于报警规则(alert rule)。动态规则(dynamic rule)和日志规则(log rule)也很相似,不过它需要一个选项:activated_by。动态规则还需要另一个选项:count。当一个激活规则启动,它就打开由activate/activated_by选项之后的数字指示的动态规则,记录count个数据包。 

下面是一条activate/dynamic规则对的规则: 

activate tcp !$HOME_NET any -> $HOME_NET 143 (flagsA;content:"|E8C0FFFFFF|in|;activates:1;<msg:"IMAP buffer overflow!" 

表8.activate/dynamic规则对 

这个规则使snort在检测到IMAP缓冲区溢出时发出报警,并且记录后续的50个从$HOME_NET之外,发往$HOME_NET的143号端口的数据包。如果缓冲区溢出成功,那么接下来50个发送到这个网络同一个服务端口(这个例子中是143号端口)的数据包中,会有很重要的数据,这些数据对以后的分析很有用处。 

3.规则选项 

规则选项构成了snort入侵检测引擎的核心,它们非常容易使用,同时又很强大和容易扩展。在每条snort规则中,选项之间使用分号进行分割。规则选项关键词和其参数之间使用冒号分割。截止到写本文为止(snort 1.7版),snort有23个规则选项关键词: 

1).msg:在报警和日志中打印的消息 
2).logto:把日志记录到一个用户指定的文件,而不是输出到标准的输出文件 
3).ttl:测试IP包头的TTL域的值 
4).tos:测试IP包头的TOS域的值 
5).id:测试IP分组标志符(fragment ID)域是否是一个特定的值 
6).ipoption:查看IP选项(IP option)域 
7).fragbits:测试IP包头的分片位(fragmentation bit) 
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回送包的标志符(ICMP ECHO ID)是否为某个值 
15).content:在数据包的数据段中搜索模式(pattern) 
16).content-list:在数据包的数据段中搜索模式清单 
17).offset:设置开始搜索的偏移量 
18).depth:设置搜索最大深度 
19).nocase:大小写不敏感匹配内容字符串 
20).session:剥离一个对话的应用层信息 
21).rpc:观察RPC服务对特定应用程序的调用 
22).resp:激活反应措施(断开连接等) 
23).react:激活反应措施(阻塞WEB站点) 

3.1.msg 

msg规则选项告诉日志引擎在复制包时同时打印的信息,以及让报警引擎输出的警告消息。它只是一个简单的文本字符串,使用作为转义符。 

格式: 

msg:"<message text>"; 

3.2.logto 

logto选项告诉snort把触发某条规则所有的数据包都记录到指定的文件。使用这个选项,对处理来自nmap扫描、HTTP CGI扫描的数据非常方便。注意如果使用二进制日志模式,这个选项会失效。 

格式: 

logto:"<文件名>"; 

3.3.ttl 

这个选项设置要测试的生命周期(time-to-live)值。只有数据包的TTL和这个选项设置的值精确匹配,测试才会成功。这个选项主要用来检测路由企图。 

格式: 

ttl:"<number>"; 

3.4.tos 

你可以使用tos关键词检查IP包头的TOS(type of service)域是否是一个特定的值。也是只有在被检测包TOS域的值和给定的值精确匹配时,这个测试才会成功。 

格式: 

tos:"<number>"; 

3.5.ID 

这个选项关键词用来测试IP分片包头的ID域。一些黑客工具为了不同的目的把这个域设置为特殊的值,例如:31337是在一些黑客中比较流行的值。使用这个选项就可以阻止这种攻击。 

格式: 

id: "<numberz>"; 

3.6.lpoption 

如果IP包中有选项域,可以使用这个规则选项搜索IP包头的特定选项,例如源路由。这个规则选项可以使用的参数如下: 

rr:路由记录 
eof:End of list 
nop:无操作 
ts:时间戳 
secP安全选项 
lsrr:宽松源路由(loose source routing) 
ssrr:严格源路由(strict source roution) 
satid:流标识符 

最常被注意的IP选项是loose&strict source routing,不过在Internet上广泛使用的任何应用程序中都没使用这两个选项。每条规则中只能设定一个IP规则。 

格式: 

ipopts: <option>; 

3.7.fragbits 

使用这个规则选项可以观察IP包头的分片位和保留位。它们在IP包头的标识域,共有3位,分别是:保留为(reserved bit,R、还有分组片位(more fragments,MF)、不可分片(dont fragment,DF)。这些位可以以各种方式组合检查,使用下面的值指定: 

R:保留位 
D:DF位 
M:MF位 

你也可以使用修饰符号对特定的位进行逻辑组合: 

+--ALL标志,指定的位加上任何其它的位为真 
*--ANY标志,指定的任何位为真 
!--NOT标志,指定的位不为真 

格式: 

fragbits: <bit values>; 

例子: 

alert tcp !$HOME_NET any -> $HOME_NET any (fragbits:R+;msg:"Reserverd IP bit set!" 

表9.fragbits示例 

3.8.dsize 

这个规则选项用来测试数据包负载的大小。它可以被设置为任意值,还可以使用大于/小于号。例如,如果你知道某个服务有一个特定大小的缓冲区,你就能够设置这个选项来捕获制造缓冲区溢出的企图。它比检查数据包的内容速度快的多。 

格式: 

dsize: [>|<]<number> 

>、<是可选的 

3.9.content 

关键词content是snort一个非常重要的特征。用户可以在规则中使用这个关键词,snort就会搜索数据包中content指定的内容,并且触发对于这些数据的反应。每当对一个content规则选项进行模式匹配时,snort都会调用Boyer-Moore模式匹配函数,测试数据包的内容。无论在数据包的那个位置发现要搜索的数据,就算测试成功。接下来,snort就会对这条规则中其余的选项进行测试。注意:测试是大小写敏感的。 

content选项包含的数据可以混合有文本和二进制数据。二进制数据一般被包在管道符(中,由字节码(bytecode)表示。字节码使用16进制数字表示二进制数据。表10是一条混有文本和二进制数据的snort规则。 

alert tcp any any -> 192.168.1.0/24 143(content:"|90c8 c0ff ffff|/bin/sh";msg:"IMAP buffer overflow"); 

表10.content规则选项中混有文本和二进制数据 

格式: 

content:"<content string>"; 

3.10.offset 

在使用content规则选项时,offset规则选项作为其修饰符。这个关键词设置对content的内容进行模式匹配时的起始位置。这个规则选项在某些情况下很有用,例如CGI扫描,要搜索的字符串从来不会在数据包的前4个字节出现。注意:设置偏移值一定要小心,它可能会造成漏检!这个规则选项只能和content规则选项搭配使用。 

格式: 

offset: <number>; 

3.11.depth 

depth是content规则选项的另一个修饰符。它用来设置最大的搜索深度,以减少无谓的搜索,使snort只在特征码可能出现的区域内搜索,例如如果在一个web绑定(web-bound)包中搜索“cgi-bin/phf",你就不必浪费时间在数据包负载数据的前20个字节之外搜索。表11的规则结合了content、offset、depth。 

alert tcp any any -> 192.168.1.0/24 80 (content:"cgi-bin/phf";offset:3;depth:22;msg:"CGI-PHF access" 

表11.含有content、offset和depth规则选项的规则 

格式: 

depth: <mumber>; 

3.12.nocase 

nocase使对content进行模式匹配时大小写不敏感。snort将不再区别每个ASCII字符的大小写。 

格式: 

nocase; 

例如: 

alert tcp any any -> 192.168.1.0/24 21 (content:"USER root";nocase;msg:"FTP root login attempt" 

表12.使用nocase修饰符的规则 

3.13.flags 

这个规则选项用来测试TCP包头的标志。实际上,在snort中有8个有效的标志: 

F:FIN(TCP标志字节最左边一位) 
S:SYN 
R:RST 
PSH 
A:ACK 
S:ACK 
U:URG 
2:保留位2 
1:保留位1(标志字节最右边一位) 

还可以使用逻辑操作符对指定的标志位进行操作: 

+:ALL,指定的标志位和其它任意的标志位为真 
*:ANY,指定的标志位中任意的标志位为真 
!:NOT,除了指定标志位外,任意的标志位为真 

保留位能够用来检测非正常的行为,例如对IP协议栈指纹特征的探测企图或者其它可疑行为。表13是一条针对SYN-FIN扫描的检测规则。 

alert any any -> 192.168.1.0/24 any (flags:SF;msg:"Possible SYN FIN scan" 

表13.TCP标志 

格式: 

flags: <flag values>; 

3.14.seq 

这个规则选项涉及TCP包的序列号。实质上,它检测包是否有一个静态的序列号集合,因此这个规则选项非常没有用处。指示出于完整性的考虑才包含了这个选项。 

格式: 

seq:<number> 

3.15.ack 

这个规则选项涉及TCP包头的确认域(acknowledge)。迄今为止,它只有一个实际的用途:检测NMAP TCP ping扫描。扫描程序nmap进行TCP ping扫描时,把TCP包头的确认号(4个字节)设置为0,然后向目标主机发出TCP ACK包,确定目标主机是否正在运行。表14是一个检测这种探测的规则: 

alert any any -> 192.168.1.0/24 any (flags:A;ack:0;msg:"nmap TCP ping" 

表14.TCP ACK域的使用 

格式: 

ack:<number>; 

3.16.itype 

itype规则选项用来测试ICMP包头的类型域,使用数字进行设置。每种ICMP包对应的数值如下: 

0:回送应答 
3:无法到达目的地 
4:抑制包源 
5:重定向(改变路径) 
8:回送请求 
11:IP分组超时 
12:IP分组参数有问题 
13:时间戳请求 
14:时间戳应答 
15:信息请求 
16:信息应答 
17:地址掩码请求 
18:地址掩码应答 

注意:拒绝服务和淹没攻击的数据包有时使用无效的ICMP类型,可以使用这个规则选项对无效的ICMP类型进行检测,也就是说,这个规则选项中的值可以不是上面所列的数值。 

格式: 

itype:<number>; 

3.17.icode 

icode规则选项和itype非常相似,也是使用数字进行设置,具体数值见snort源代码的decode.h文件。同样,也可以使用其它的数值来检测可疑的数据包。 

格式: 

icode:<number>; 

3.18.session 

sesion关键词是从snort-1.3.1.1版加入的,用来从TCP会话中剥离用户的数据。如果想观察用户在telnet、rlogin、ftp,甚至WEB会话过程中输入了什么,就可以使用这个规则选项。session规则选项有两个参数关键词:printable、all。使用printable,snort就会只输出可打印数据;使用all,snort就会输出所有的数据,不可打印的数据以16进制表示。不过,这个功能会大大降低snort的速度,所以不太适合大负载的情况,而且最好使用二进制日志文件格式。表15是一条记录telnet会话的规则: 

log tcp any any <> 192.168.1.0/24 23 (session: printable 

表15.记录可打印的telnet会话数据 

格式: 

session:[printable|all]; 

3.19.icmp_id 

icmp_id规则选项用来检测ICMP回送(echo)数据包的ICMP ID号是否为一个特定的值。之所以会用到这个规则选项,是因为一些隐秘通道(covert channel)程序在通讯时使用静态的ICMP域。为了执行stacheldreht检测规则,开发了这个特别的插件,这些规则是由Max Vision(一位著名的白帽黑客,译者注)编写的。不过,它有助于检测其它一些潜在的攻击。 

格式: 

icmp_id:<number>; 

3.20.icmp_seq 

icmp_seq规则选项用来检测一个ICMP回送包的ICMP序列号是否是一个特定的值。之所以会用到这个规则选项,是因为一些隐秘通道(covert channel)程序在通讯时使用静态的ICMP域。为了执行stacheldreht检测规则,开发了这个特别的插件,这些规则是由Max Vision编写的。不过,它有助于检测其它一些潜在的攻击。 

格式: 

icmp_seq:<number> 

3.21.rpc 

规则选项rpc可以使snort观察RPC请求,并且自动对应用程序、过程(procedure)和程序版本进行解码。只有这三个变量都匹配时,才算成功。统配符*可以用来代替过程(procedure)和版本号。 

格式: 

rpc: <number, [number|*], [number|*]>; 

例子: 

alert tcp any any -> 192.168.1.0/24 111 (rpc: 100000,*,3;msg:"RPC getport (TCP)" 

alert udp any any -> 192.168.1.0/24 111 (rpc: 100000,*,3;msg:"RPC getport (UDP)" 

alert udp any any -> 192.168.1.0/24 111 (rpc: 100083,*,*;msg:"RPC ttdb" 

alert udp any any -> 192.168.1.0/24 111 (rpc: 100232,10,*;msg:"RPCsadmin" 

表16.几条RPC报警规则 

3.22.resp 

对于匹配某个规则的数据包,可以通过resp关键词使snort的灵活反应(flexible reponse,FlexResp)机制生效。使用FlexResp插件,snort能够主动断开恶意连接。下面是这个模块的参数: 

rst_snd:向发送方套接字发送TCP-RST数据包 
rst_rcv:向接受方套接字发送TCP-RST数据包 
rst_all:在两个方向上发送TCP-TST数据包 
icmp_net:向发送方发送ICMP_NET_UNREACH数据包 
icmp_host:向发送方发送ICMP_HOST_UNREACH数据包 
icmp_port:向发送方发送ICMP_PORT_UNREACH数据包 
icmp_all:向发送方发送以上各种类型的ICMP数据包 

多个参数可以结合使用,各个参数之间使用逗号隔开。 

格式: 

resp:<resp_modifier[,resp_modifier...]>; 

例子: 

alert tcp any any -> 192.168.1.0/24 1524 (flags:S;resp:rst_all;msg:"Root shell backdoor attempt" 

alert udp any any -> 192.1.168.1.0/ 31 (resp:icmp_port,icmp_host;msg:"Hacker's Paradise access attempt" 

表17.FlexResp规则 

3.23.content-list 

使用content-list关键词可以指定更多的正文字符串,突破了content规则选项只能指定单一字符串的限制。表18是一个conternt-list文件。每个要搜索的字符串占一行。这个规则选项是使用react关键词的基础。 

#adult sites 
porn 
adults 
hard core  www.pornsite.com 
# ... 

表18.content-list文件 

格式: 

content-list:"<file_name>"; 

3.24.react 

react关键词是基于FlexResp(flexible response)的,它使snort对匹配某个规则的数据包作出反应。基本的反应就是阻塞用户要访问的站点,例如色情站点。snort的FlexResp插件能够主动关闭恶意连接,如果连接使用的是http或者代理服务器端口,FlexResp插件就会向浏览器发出一条HTML/JavaScript警告信息。这个规则选项可以使用下面几个参数: 

block:关闭连接并发出注意信息 
warn:发出警告信息 
这两个参数是基本参数,它们可以和下面的可选参数组合使用: 
msg:定义要包含在警告信息中的文本 
proxy:<number>:使用代理服务器端口发送警告信息 

可选参数使用逗号分开,react关键词应该放在选项的最后。例如: 

alert tcp any any <> 192.168.1.0/24 80 (content-list:"adults";msg:"Not for children!";react:block,msg 

alert tcp any any <> 192.168.1.0/24 any (content-list:"adults";msg:"Adults list access attempt";react:block 

表19.react规则 

格式: 

react:<react_basic_modifier[,react_additionall_modifier...]>; 

4.预处理器(preprocessors) 

4.1.预处理器综述 

从snort-1.5开始加入了对预处理器的支持。有了这种支持,用户和程序员能够比较容易地编写模块化的插件,扩展snort的功能。预处理器在调用检测引擎之前,在数据包被解码之后运行。通过这种机制,snort可以以一种out of band的方式对数据包进行修改或者分析。 

预处理器可以使用preprocessor关键词来加载和配置,格式如下: 

preprocessor <name>: <options> 

例如: 

preprocessor minfrag: 128 

表20.预处理器指令格式 

4.2.可用的预处理器模块 

4.2.1.minfrag 

这个预处理器测试分片包的大小是否为一个特定的值。数据包分片,通常是源/目的地址之间的路由器完成的。一般来说,商业网络设备产生的分片不会小于512个字节,基于这种情况,我们可以对很小的分片进行监视,很小的分片包一般是人为产生的,主要为了使用很小的碎片隐藏数据。 

格式: 

minfreg:<大小阀值) 

4.2.2.HTTP decode预处理插件 

HTTP解码预处理模块用来处理HTTP URI字符串,把它们转换为清晰的ASCII字符串。这样就可以对抗evasice web URL扫描程序和能够避开字符串内容分析的恶意攻击者。这个预处理模块使用WEB端口号作为其参数,每个端口号使用空格分开。 

格式: 

http_decode:<端口号列表> 

例如: 

preprocessor http_decode: 80 8080 

表21.使用HTTP decode预处理模块的规则 

4.2.3.端口扫描检测模块 

snort端口扫描检测预处理模块是Patrick Mullen开发的,从他的个人主页可以得到更多信息。 

snort端口扫描检测预处理模块主要做如下工作: 

1).把由单个源IP地址发起的端口扫描从开始到结束的全过程记录到标准日志设备。 
2).如果指定了一个日志文件,就把被扫描的IP地址和端口号和扫描类型都记录到这个日志文件。 

这个模块使用的参数包括: 

1).监视的网络: 以IP地址/子网掩码的格式指定要进行端口扫描监视的网络。 
2).端口数: 在检测周期(detection period)内访问的端口数目。 
3).检测周期(detection period): 达到某个设定的端口访问量需要的时间,以秒计。 
4).日志目录/文件: 保存警告信息的目录/文件。警告信息也可以写到默认警告文件中。 

格式: 

portscan:<要监视的网络> <端口数> <检测周期> <日志目录/文件> 

例子: 

preprocessor portscan:192.168.1.0/24 5 7 /var/log/portscan.log 

表22.端口扫描检测模块的配置 

4.2.4.portscan ignorehosts 

Patrick Mullen对端口扫描检测系统进行了改进,形成了另一个模块--portscan ignorehosts。有些服务器程序容易和端口扫描检测模块造成冲突,例如NTP、NFS和DNS,如果你运行这些服务器程序,可以告诉端口扫描检测模块忽略对由特定主机发起的TCP SYN和UDP端口扫描的检测。这个模块使用的参数是一个要忽略的IP地址/CIDR的列表。 

格式: 

portscan-ignorehosts:<主机列表> 

例子: 

preprocessor portscan-ignorehosts:192.168.1.5/32 192.168.3.0/24 

表23.portscan ignorehosts模块的配置 

4.2.5.defrag模块 

defrag插件是由Dragos Rulu开发的,它使snort能够消除IP碎片包,给黑客使用IP碎片包绕过系统的检测增加了难度。这个模块非常容易配置,不需要参数,直接放在preprocessor关键词之后即可。它的功能超过了migfrag模块的功能,所以你如果使用defrag,就不用在用minfrag模块了。 

格式: 

defrag 

例子: 

preprocessor defrag 

defrag模块的配置 

4.2.6.stream模块 

stream插件为snort提供了TCP数据包重组的功能。在配置的端口上,stream插件能够对TCP数据包的细小片段进行重组成为完整的TCP数据包,然后snort可以对其可疑行为进行检查。这个插件有好多参数: 

超时(timeout): 在一个TCP数据包送达之前,保存一个 
TCP数据流缓冲的最长时间。 
端口(port): 要监视的服务器端口。我们不想监视所有的 
TCP端口,这也不太现实。 
最大字节数(maxbytes): 重组包的最大长度。 

格式: 

stream:timeout <timeout>,ports <ports>,maxbytes <maxbytes> 

例如: 

preprocessor stream:timeout 5,ports 21 23 80 8080,maxbytes 16384 

TCP数据包重组插件配置 

4.2.7.spade:the Statisical Packet Anomaly Dection Engine 

如果需要了解更多关于spade的信息,请参考snort源代码中的README.Spake文件,或者http://www.silicondefense.com/spice/。 

使用这个模块使snort能够在你的网络上进行统计异常检测(statistical anomaly dection),这是一个全新的检测引擎。如果你对此感兴趣,请参考源代码中的有关文档和SiliconDefense站点的有关文档。 

5.输出模块 

5.1.输出模块综述 

snort输出模块是从1.6版加入的新特征,使snort的输出更为灵活。snort调用其报警或者日志子系统时,就会调用指定的输出模块。设置输出模块的规则和设置预处理模块的非常相似。 

在snort配置文件中可以指定多个输出插件。如果对同一种类型(报警、日志)指定了几个输出插件,那么当事件发生时,snort就会顺序调用这些插件。使用标准日志和报警系统,默认情况下,输出模块就会将数据发送到/var/log/snor目录,或者用户使用-l命令行开关指定的目录。 

在规则文件中,输出模块使用output关键词指定: 

格式: 

output name:<选项> 

例子: 

output alert_syslog: LOG_AUTH LOG_ALERT 

表26.输出模块的配置 

5.2.可用的输出模块 

5.2.1.alert_syslog 

使用这个输出模块,snort把报警信息发送到syslog,与-s命令行开关非常类似。这个输出模块允许用户在规则文件中指定logging facility和优先级,给用户以更大的灵活性。 

有效的关键词: 

1).选项: 
LOG_CONS 
LOG_NDELAY 
LOG_PERROR 
LOG_PID 
2).facility 
LOG_AUTH 
LOG_AUTHPRIV 
LOG_DAEMON 
LOG_LOCAL0 
LOG_LOCAL1 
LOG_LOCAL3 
LOG_LOCAL4 
LOG_LOCAL5 
LOG_LOCAL6 
LOG_LOCAL7 
3).优先级 
LOG_EMERG 
LOG_ALERT 
LOG_ERR 
LOG_WARNING 
LOG_NOTICE 
LOG_INFO 
LOG_DEBUG 

格式: 

alert_syslog:<facility> <优先级> <选项> 

5.2.2.alert_fast 

使用快速单行格式(quick on line format)把snort报警信息输出到指定的输出文件。这种报警方式比完全(full)报警模式速度快,因为使用这种报警模式不需要把全部的数据包头都输出到指定的文件。 

格式: 

alert_fast: <输出文件> 

例子: 

output alert_fast: alert.fast 

表27.快速报警配置 

5.2.3.alert_full 

把全部的数据包头都输出到snort报警信息。这种报警机制一般较满,因为程序需要对整个数据包进行分析。报警信息可以输出到默认的日志目录/var/log/snort,也可以使用命令行指定日志目录。 

格式: 

alert_full:<输出文件> 

例子: 

output alert_full:alert_full 

表28.full报警配置 

5.2.4.alert_smb 

snort使用这个插件把WinPopup报警信息输出到由NETBIOS命名的主机,主机名由参数指定的文件给出。注意我们不鼓励使用这种报警方式,因为samba客户程序smbclient以root权限运行。接收报警信息工作站的名字列表由保存在一个文件中,每行是一台主机的NETBIOS名字。 

格式: 

alert_smb:<文件> 

例子: 

output alert_smb:workstation.list 

表29.SMB报警配置 

5.2.5.alert_unixsock 

设置一个UNIX域套接字(UNIX domain socket),把报警信息发送到这个套接字。外部程序/进程可以在这个套接字上监听,实时接收snort报警信息和数据包数据。这个接口目前尚处于实验状态。 

格式: 

alert_unixsock 

示例: 

output alert_unixsock 

表30.UnixSock报警配置 

5.2.6.log_tcpdump 

log_tcpdump输出模块使用tcpdump格式的文件记录数据包日志。这种日志文件格式便于使用很多外部的工具对数据进行分析,只要这些工具软件支持tcpdump格式的文件。这个模块只有一个参数,就是输出文件的名字。 

格式: 

log_tcpdump:<输出文件名> 

示例: 

output log_tcpdump:snort.log 

表31.tcpdump输出模块的配置 

5.2.7.数据库输出模块 

snort的数据库输出模块是JedPickel开发的,用来将snort产生的数据送到各种SQL数据库系统。如果要获得安装和配置这个模块更为详尽的信息,可以参考ncident.org web page。这个插件使用的参数是记录snort日志的数据库名和参数表。参数表使用这种格式:parameter=argument。有如下参数可以使用: 

1).host: 数据库所在的主机。如果指定了一个非零字符串,snort就使用TCP/IP协议连接以此命名的主机。如果没有主机名,snort就使用一个本地UNIX-domain套接字连接本地主机。 

2).port: 数据库所在服务器的端口号,或者一个UNIX-domain套接字文件。 

3).dbname: 数据库名字。 

4).user: 数据库用户名。 

5).passwd: 密码。 

6).sensor_name: 指定这个snort触发器的名字,如果没有指定就自动产生。 

7).encoding: 因为数据包的负载和选项都是二进制数据,所以没有一种简单和可移植的方式将snort的数据保存在数据库。所以在snort数据库输出插件中提供了一些选项,让你自己决定使用那种编码。下面是这几种编码的优点和缺点: 
hex: 默认编码选项,使用16进制字符串代表二进制数据。 
存储空间: 两倍于二进制数据 
搜索性: 极好 
可读性: 极差 
base64: 使用base64字符串代表二进制数据。 
存储空间: 大约是直接存储二进制数据的1.3倍 
搜索性: 可能无须后续处理。 
可读性: 不可读需要后续处理。 
ascii:: 使用ASCII字符串代替二进制数据。非ASCII字符使用. 
代替。如果你选择这个选项,那么IP和TCP包头的选项会仍然使用hex 
表示。 
存储空间: 比直接存储二进制数据稍大。 
搜索性: 非常便于二进制数据中搜索文本字符串。 
可读性: 很好。 

8).detail: 设置你要保存多少细节数据,有如下选项: 
full: 保存引起报警的数据包的所有细节,包括IP/TCP包头和负载数据。 
fast: 只记录少量的数据。如果选择这种记录方式,不利于以后对 
数据的分析,但在某些情况下还有其用处。使用这种方式,将记录数据包的 
以下域:时间戳(timestamp)、签名(signature)、源地址、目的地址、 
源端口、目的端口、TCP标志和协议。 

还需要定义日志方法和数据库类型。有两种日志方法:log和alert。如果使用log,snort就会调用log输出,将日志数据记录到数据库;如果设置为alert,snort就会调用alert输出,在数据库中记录报警信息。 

当前版本中,snort可以使用四种数据库:MySQL、PostgreSQL、Oracle以及和unixODBC兼容的数据库。可以使用你喜欢的数据库。 

格式: 

database:<log|alert>,<数据库类型>,<参数表> 

例子: 

output database:log,mysql,dbname=snort user=snort host=localhost password=xyz 

表33.数据库输出插件配置 

6.如何建立好的snort规则 

在开发高效、高速的snort规则时,有几个概念要铭记于心。 

1.关键词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" 

第二条规则可以使snort捕获大多数使用root用户名的自动登录企图,而在数据包中从来就没有小写的user。 

2.提高snort对含有content规则选项的规则的检测速度 

snort检测引擎对各个规则选项的测试顺序与其在各条规则中所处的位置无关。在各个规则选项中,检测引擎最后测试的总是content规则选项。因此,在开发规则时,要尽量使用快速的选项筛选掉根本不必对其内容进行检查的包。例如,如果实现了一个TCP会话过程,那么在会话过程的大部分时间内,双方传输的数据包的TCP标志ACK、PSH都被置位。而测试包头的TCP标志比对数据包的内容进行模式匹配需要的计算量要小的多。所以,在开发相关的检测规则时,需要设置flags规则选项对PSH和ACK没有置位的数据包进行过滤。而这样做,增加的额外计算量微乎其微。例如: 

alert tcp any any -> 192.168.1.0/24 80 (content:"cgi-bin/phf";flagsA;msg:"CGI-PHF probe" ' 


B3层 发表时间: 03/22 12:29

回复: syshunter [syshunter]   版主   登录
大海,大海在吗?看到了吗?QQ上不是有那个广告,在规则里配置过滤含有那个URL的数据包就可以了

B4层 发表时间: 03/22 13:52

论坛: 菜鸟乐园

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号