@chenyiliang
2020-03-02T15:32:06.000000Z
字数 8534
阅读 2149
snort
ids
网络安全
版权信息:
作者:陈诒亮
联系:875365197(QQ/微信)
邮箱:chenyiliangdevelop@163.com
Snort使用了一种简单、轻量级的规则描述语言,这种语言非常灵活和强大。在开发Snort规则时,需要记住一些简单的指导原则,这些规则有助于你保持清晰的思路。
大多数Snort规则都是用一行代码编写的。这在1.8(不知道包不包含)之前的版本中是必需的。在1.8之后的Snort版本中,规则可以通过在行尾添加反斜杠\来跨越多行。
Snort规则分为两个逻辑部分:规则头和规则选项。规则头包含规则的操作、协议、源和目标IP地址和网络掩码,以及源和目标端口信息。rule option部分包含警报消息和应检查数据包的哪些部分以确定是否应采取规则操作的信息。
第一个括号之前的文本是规则标题,括号中包含的部分包含规则选项。规则选项部分中冒号前的单词称为选项关键字。
Note:
请注意,规则选项部分并不是任何规则所特别需要的,它们只是为了对要收集或警告(或丢弃)的数据包进行更严格的定义。
构成规则的所有元素都必须为true,才能执行指定的规则操作。当这些元素组合在一起时,可以认为它们形成了一个逻辑“与”语句。同时,Snort规则库文件中的各种规则可以被视为形成一个大型逻辑“或”语句。
规则头包含定义数据包的人员、位置和内容的信息,以及在出现具有规则中指示的所有属性的数据包时应执行的操作。规则中的第一项是规则操作。rule操作告诉Snort在找到符合规则条件的数据包时要做什么。alert、log、pass中有3个可用的默认操作。此外,如果您在内联模式下运行Snort,则有其他选项,包括drop、reject和sdrop。
选项如下:
- 1、alert - 使用选定的警报方法生成警报,然后记录数据包
- 2、log - 记录数据包
- 3、pass - 忽略数据包
- 4、drop - 丢弃然后记录数据包
- 5、reject - 如果协议是TCP,则阻止该数据包并记录下来,然后发送TCP重置;如果协议是UDP,则发送ICMP端口不可访问消息。
- 6、sdrop - 丢弃数据包但不记录下来
您还可以定义自己的规则类型并将一个或多个输出插件与它们关联。然后可以在Snort规则中将规则类型用作操作。
下面的示例是创建一个只记录tcpdump的类型:
ruletype suspicious
{
type log
output log_tcpdump: suspicious.log
}
下面的示例是创建一个将记录到syslog和tcpdump:database的规则类型:
ruletype redalert
{
type alert
output alert_syslog: LOG_AUTH LOG_ALERT
output log_tcpdump: suspicious.log
}
规则中的下一个字段是协议。Snort目前分析了四种可疑行为的协议:TCP、UDP、ICMP和IP。未来可能会有更多,如ARP、IGRP、GRE、OSPF、RIP、IPX等。
规则头的下一部分是IP地址和端口信息。关键字any可用于定义任何地址。Snort没有为配置文件中的IP地址字段提供主机名查找的机制。这些地址由一个直接的数字IP地址和一个CIDR[3]块构成。CIDR块指示应应用于规则地址的网络掩码以及根据规则测试的任何传入数据包。CIDR块掩码/24表示C类网络,/16表示B类网络,/32表示特定的计算机地址。例如,地址/CIDR组合192.168.1.0/24表示地址块从192.168.1.1到192.168.1.255。任何使用这个名称的规则,比如说,目的地地址将匹配该范围内的任何地址。CIDR的名称给了我们一个很好的简捷的方法来指定一个大地址空间。
源IP地址设置为与任何计算机对话匹配,目标地址设置为与192.168.1.0 C类网络上的地址匹配。
您还可以指定IP地址列表。IP列表是通过将IP地址和CIDR块的逗号分隔列表括在方括号内来指定的。目前,IP列表不能包含地址之间的空格
端口号可以通过多种方式指定,包括:any、静态、范围、取反。any是通配符值,即任何端口。静态端口由单个端口号表示,例如:23代表telnet、80代表http,等等。端口范围用范围运算符":"。例如下面的这些:
使用否定运算符"!"表示端口否定。否定运算符可以应用于任何其他规则类型(任何规则类型除外,它们将转换为none、how Zen…)。例如,如果出于某种原因,您想要记录除X Windows端口之外的所有内容:
方向运算符->指示规则作用的方向。方向运算符左侧的IP地址和端口号被认为是源主机,而运算符右侧的地址和端口信息是目标主机。还有一个双向运算符,用<>符号表示。这是让Snort同时监测源方向和目标方向上的流量。这对于记录/分析会话的双方(如telnet或POP3会话)时是非常方便的。
图中显示了用于记录telnet会话两边的双向运算符的示例
Activate和Dynamic规则被逐步淘汰,取而代之的是tagging和flowbits的组合。
规则选项构成了Snort入侵检测引擎的核心,这种以选项实现的方式既方便使用、同时又不失强大和灵活。所有Snort规则选项都使用分号(;)字符彼此分隔。规则选项关键字与其参数之间用冒号(:)字符分隔。
目前有四大类规则选项。
- general
这些选项提供有关规则的信息,但在检测期间不会产生任何影响- payload
这些选项都在包有效负载中查找数据,并且可以相互关联- non-payload
这些选项查找非有效负载数据- post-detection
这些选项是规则“触发”后发生的特定于规则的触发器
msg rule选项告诉日志记录和警报引擎要打印的消息以及数据包转储或警报。它是一个简单的文本字符串,有些特殊字符需要通过\来转义,以免和sonrt使用的的一些字符产生冲突,从而使用snort出错。
格式
msg:"<message text>";
reference关键字允许规则包含对外部攻击识别系统的引用。该插件目前支持几个特定的系统以及唯一的url。输出插件将使用此插件提供有关生成的警报的附加信息的链接。
查看以确保获取基于sid为警报描述编制索引的系统。
Table: | Supported Systems |
---|---|
System | URL Prefix |
bugtraq | http://www.securityfocus.com/bid/ |
cve | http://cve.mitre.org/cgi-bin/cvename.cgi?name= |
nessus | http://cgi.nessus.org/plugins/dump.php3?id= |
arachnids | (currently down) http://www.whitehats.com/info/IDS |
mcafee | http://vil.nai.com/vil/content/v_ |
osvdb | http://osvdb.org/show/osvdb/ |
msb | http://technet.microsoft.com/en-us/security/bulletin/ |
url | http:// |
格式
reference:, ; [reference:, ;]
## example
alert tcp any any -> any 7070 (msg:"IDS411/dos-realaudio"; \
flags:AP; content:"|fff4 fffd 06|"; reference:arachnids,IDS411;)
alert tcp any any -> any 21 (msg:"IDS287/ftp-wuftp260-venglin-linux"; \
flags:AP; content:"|31c031db 31c9b046 cd80 31c031db|"; \
reference:arachnids,IDS287; reference:bugtraq,1387; \
reference:cve,CAN-2000-1574;)
gid关键字(生成器id)用于标识特定规则触发时生成的事件。例如,gid 1与规则子系统相关联,并且超过100的那些gid被指定用于特定的预处理器和解码器。 如果 要查看当前GID的一些相关信息,请参见etc/gen-msg.map, 里面包含有关预处理器和解码器gid的更多信息。请注意,gid关键字是可选的,如果在规则中没有指定它,它将默认为1,并且该规则将是常规规则子系统的一部分。为了避免与Snort中定义的gid发生潜在冲突,在指定gid时,建议使用从1000000开始。对于一般规则的编写,不建议使用gid关键字。此选项应与sid关键字一起使用。
格式
gid:<generator id>;
## example
alert tcp any any -> any 80 (content:"BOB"; gid:1000001; sid:1; rev:1;)
sid关键字用于唯一标识Snort规则。此信息允许输出插件轻松识别规则。此选项应与rev关键字一起使用。
- <100 保留以备将来使用
- 100-999 Snort发行版包含999条规则
- >1,000,000 用于本地规则
文件sid-msg.map包含警报消息到Snort规则id的映射。当后期处理警报以将ID映射到警报消息时,此信息非常有用。
格式
sid:<snort rules id>;
## example
alert tcp any any -> any 80 (content:"BOB"; sid:1000983; rev:1;)
rev关键字用于唯一标识Snort规则的修订版本。修订版以及Snort规则id允许对签名和描述进行优化,并用更新的信息替换。此选项应与sid关键字一起使用。
格式
sid:<snort rules id>;
## example
alert tcp any any -> any 80 (content:"BOB"; sid:1000983; rev:1;)
classtype关键字用于将规则进行分类,是为检测属于更一般攻击类型的一部分的攻击。Snort提供了一组默认的攻击类别,供其提供的默认规则集使用。将规则进行分类,就能够以一种更好的方式来组织Snort产生的事件数据。
格式
classtype:<class name>;
## example
alert tcp any any -> any 25 (msg:"SMTP expn root"; flags:A+; \
content:"expn root"; nocase; classtype:attempted-recon;)
Snort定义的攻击分类在classification.config文件中定义。 该文件使用以下语法:
config classification: <class name>,<class description>,<default priority>
这些攻击分类在下表中列出。 目前,它们以4个默认优先级排序。优先级1(high)是最严重的,优先级4(very low)是最不严重的。
Classtype | Description | Priority |
---|---|---|
attempted-admin | Attempted Administrator Privilege Gain | high |
attempted-user | Attempted User Privilege Gain | high |
inappropriate-content | Inappropriate Content was Detected | high |
policy-violation | Potential Corporate Privacy Violation | high |
shellcode-detect | Executable code was detected | high |
successful-admin | Successful Administrator Privilege Gain | high |
successful-user | Successful User Privilege Gain | high |
trojan-activity | A Network Trojan was detected | high |
unsuccessful-user | Unsuccessful User Privilege Gain | high |
web-application-attack | Web Application Attack | high |
attempted-dos | Attempted Denial of Service | medium |
attempted-recon | Attempted Information Leak | medium |
bad-unknown | Potentially Bad Traffic | medium |
default-login-attempt | Attempt to login by a default username and password | medium |
denial-of-service | Detection of a Denial of Service Attack | medium |
misc-attack | Misc Attack | medium |
non-standard-protocol | Detection of a non-standard protocol or event | medium |
rpc-portmap-decode | Decode of an RPC Query | medium |
successful-dos | Denial of Service | medium |
successful-recon-largescale | Large Scale Information Leak | medium |
successful-recon-limited | Information Leak | medium |
suspicious-filename-detect | A suspicious filename was detected | medium |
suspicious-login | An attempted login using a suspicious username was detected | medium |
system-call-detect | A system call was detected | medium |
unusual-client-port-connection | A client was using an unusual port | medium |
web-application-activity | Access to a potentially vulnerable web application | medium |
icmp-event | Generic ICMP event | low |
misc-activity | Misc activity | low |
network-scan | Detection of a Network Scan | low |
not-suspicious | Not Suspicious Traffic | low |
protocol-command-decode | Generic Protocol Command Decode | low |
string-detect | A suspicious string was detected | low |
unknown | Unknown Traffic | low |
tcp-connection | A TCP connection was detected | very low |
Note:
classtype选项只能使用通过config classification选项在snort.conf中定义的分类。 Snort在classification.config中提供了默认的一组分类,供其提供的规则使用。
优先级标记为规则分配严重性级别。类类型规则分配一个默认优先级(由配置分类选项定义),该优先级可以用优先级规则覆盖。每种情况的例子如下。
格式
priority:<priority integer>;
## examples
alert tcp any any -> any 80 (msg:"WEB-MISC phf attempt"; flags:A+; \
content:"/cgi-bin/phf"; priority:10;)
alert tcp any any -> any 80 (msg:"EXPLOIT ntpdx overflow"; \
dsize:>128; classtype:attempted-admin; priority:10 );
元数据标记允许规则编写器嵌入有关规则的附加信息,通常采用键值格式。某些元数据键和值具有Snort的含义。Snort会有效地忽略表中列出的键以外的键,并且键和值可以是自由形式的。多个键用逗号分隔,而键和值用空格分隔。
Key | Description | Value Format |
---|---|---|
engine | Indicate a Shared Library Rule | "shared" |
soid | Shared Library Rule Generator and SID | gid|sid |
service | Target-Based Service Identifier | "http" |
Note:
只有在提供主机属性表时,服务元数据键才有意义。
格式
metadata:key1 value1;
metadata:key1 value1, key2 value2;
alert tcp any any -> any 80 (msg:"Shared Library Rule Example"; \
metadata:engine shared; metadata:soid 3|12345;)
alert tcp any any -> any 80 (msg:"Shared Library Rule Example"; \
metadata:engine shared, soid 3|12345;)
alert tcp any any -> any 80 (msg:"HTTP Service Rule Example"; \
metadata:service http;)
Keyword | Description |
---|---|
msg | msg关键字告诉日志记录和警报引擎要用数据包转储或警报打印的消息。 |
reference | reference关键字允许规则包含对外部攻击识别系统的引用。 |
gid | gid关键字(生成器id)用于标识特定规则触发时Snort某个部分生成事件。 |
sid | sid关键字用于唯一标识Snort规则。 |
rev | rev关键字用于唯一标识Snort规则的修订。 |
classtype | classtype关键字用于将规则分类为检测属于更一般类型攻击类的攻击。 |
priority | priority关键字为规则分配严重性级别。 |
metadata | metadata关键字允许规则编写器嵌入有关规则的附加信息,通常采用键值格式。 |
内容关键字是Snort的一个重要特性。它允许用户设置规则来搜索包有效负载中的特定内容,并基于该数据触发响应。无论何时执行内容选项模式匹配,都会调用Boyer-Moore模式匹配函数,并对包内容执行(相当昂贵的计算代价)测试。如果与参数数据字符串完全匹配的数据包含在数据包有效负载中的任何位置,则测试成功,并执行规则选项测试的其余部分。请注意,此测试区分大小写。
content关键字的选项数据有些复杂;它可以包含混合文本和二进制数据。二进制数据通常包含在管道(|)字符中,并表示为字节码字节码将二进制数据表示为十六进制数,是描述复杂二进制数据的一种很好的速记方法。下面的示例显示了在Snort规则中混合使用文本和二进制数据。
请注意,可以在一个规则中指定多个内容规则。这样就可以为较少的误报量定制规则。
如果规则前面有!,将在不包含此内容的数据包上触发警报。这在编写规则时非常有用,这些规则希望在与特定模式不匹配的数据包上发出警报
Note:
还要注意,必须在内容规则中转义以下字符:
; \ "。
格式
content:[!]"<content string>";
## example
alert tcp any any -> any 139 (content:"|5c 00|P|00|I|00|P|00|E|00 5c|";)
alert tcp any any -> any 80 (content:!"GET";)
Note: 一个!修饰符否定整个内容搜索的结果,包括修饰符。例如,如果使用内容:!"A";在:50之内;并且只有5个字节的有效载荷,并且在这5个字节中没有“A”,结果将返回匹配。如果有效匹配必须有50个字节,请使用isdataat作为内容的前光标。 |
---|