Snort规则编写
今天主要来讲一下Snort中的规则编写规则,还有些绕口,就是编写他们的rules的方法,可以帮助我们理解他们提供的rules和定义我们自己的rules。
首先我们来看一条规则
alert tcp 192.168.32.202/32 any -> 192.168.32.1/32 443 (logto:"task1"; msg:"this is task 1"; sid:1000001)
其中括号之前的部分,我们称之为规则头,括号里面的内容,我们称之为规则选项。
规则头
拿上一条规则举例
然后我们分别解释一下
规则操作
规则头包含定义数据包的人员、位置和内容的信息,以及在出现具有规则中指示的所有属性的数据包时应执行的操作。规则中的第一项是规则操作。rule操作告诉Snort在找到符合规则条件的数据包时要做什么。
Snort中有alert、log、pass3个可用的默认操作。
此外,如果您在内联模式下运行Snort,则有其他选项,包括drop、reject和sdrop。
关键字 | 含义 |
---|---|
alert | 使用选定的警报方法生成警报,然后记录数据包 |
log | 记录数据包 |
pass | 忽略数据包 |
drop | 丢弃并记录数据包 |
reject | 阻止数据包,记录它,然后发送TCP重置(如果协议是TCP)或ICMP端口不可访问消息(如果协议是UDP) |
sdrop | 阻止数据包,但不记录它 |
协议
规则中的下一个字段是协议。Snort目前分析了四种可疑行为的协议,未来可能会有更多,如ARP、IGRP、GRE、OSPF、RIP、IPX等。
协议 |
---|
TCP |
UDP |
ICMP |
IP |
IP地址
规则头的下一部分处理给定规则的IP地址和端口信息。。Snort没有为配置文件中的IP地址字段提供主机名查找的机制。
常见种类如下
关键字 | 含义 |
---|---|
关键字any | 可用于定义任何地址 |
ipvar EXAMPLE | 在配置文件中定义的变量组合,EXAMPLE可以是后面集中的组合 |
IP地址/24 | 表示C类网络 |
IP地址/16 | 表示B类网络 |
IP地址/32 | 表示特定的计算机地址 |
[IP地址1/掩码,IP地址2/掩码,IP地址3] | IP地址组合,可不带掩码 |
!IP地址/掩码 | 非此IP地址 |
端口号
常见种类如下
关键字 | 含义 |
---|---|
关键字any | 可用于定义合法端口 |
单一数字 | 静态端口,例如23代表telnet |
单一数字: | 大于等于该端口 |
:单一数字 | 表示小于端口号 |
单一数字:单一数字 | 端口范围 |
! | 表示非该范围端口 |
方向操作
关键字 | 含义 |
---|---|
-> | 单向发送 |
<> | 双向交互 |
注意,没有回来的哦
另外规则的开启和关闭可以通过在前面加#来控制。
规则选项
规则选项构成了Snort入侵检测引擎的核心,将易用性与强大的功能和灵活性结合起来。所有Snort规则选项都使用分号(;)字符彼此分隔。规则选项关键字与参数之间用冒号(:)分隔。
这里的部分内容相当庞大,因为规则甚至可以详细到你去监听报文某些位置上的数字是多少。
选项可以分为四种类型
关键字 | 含义 |
---|---|
general | 基本信息,并不对流量产生任何行为 |
payload | 对数据流的有效载荷进行查找,可进行多数据关联查找 |
non-payload | 非数据载荷查找 |
post-detection | 对检测出的特定的规则进行关联触发 |
general类型
关键字 | 含义 |
---|---|
msg | 向日志和警报引擎告知要打印的消息以及数据包转储或警报,它是一个简单的文本字符串,利用\作为转义字符来表示离散的字符,否则这些字符可能会使Snort的规则解析器感到困惑(例如分号; 字符) |
reference | 允许规则引用外部攻击识别系统,简单来说就是允许带一些参数,这个参数能够被其他攻击检测系统识别调用,方便了消息联动 |
gid | 用来表示是Snort的哪个子系统产生了这次触发,建议使用从1000000开始的值。对于一般规则的编写,不建议使用gid关键字。此选项应与sid关键字一起使用 |
sid | 用于唯一标识Snort规则此信息允许输出插件识别规则,常与rev关键字一起使用,文件sid-msg.map包含警报消息到Snort规则ID的映射。在对警报进行后期处理以将ID映射到警报消息时,此信息非常有用。 |
•<100保留供将来使用 | |
•Snort发行版中包含100-999999条规则 | |
•>=1000000用于当地规则 | |
rev | 用来唯一标识规则版本,和sid一起用 |
classtype | snort根据其默认的规则文件,将攻击进行相应分类,并具有不同的优先级,1-4,1最高,规则分类被定义在classification.config文件中。(优先级1(高)是最严重的,优先级4(非常低)是最不严重的。) |
priority | 规则指定严重性级别 |
metadata | 元数据标记允许规则编写器嵌入有关规则的附加信息,通常采用键值格式 |
下付英文原版定义
payload类型
关键字 | 含义 |
---|---|
content | 允许用户设置规则,搜索数据包负载中的特定内容,并基于该数据触发响应 |
rawbytes | 允许规则查看原始数据包数据,忽略预处理器执行的任何解码。 |
depth | 允许规则编写器指定数据包Snort的深度 |
offset | 允许规则编写器指定从何处开始搜索数据包中的模式。 |
distance | 允许规则编写器指定Snort在开始搜索相对于上一个模式匹配结束的指定模式之前应忽略的数据包距离。 |
within | 内容修饰符,它确保使用content关键字的模式匹配之间最多有N个字节。 |
uricontent | 搜索规范化请求URI字段。 |
isdataat | 验证有效负载在指定位置是否有数据。 |
pcre | 允许使用与perl兼容的正则表达式编写规则。 |
byte_test | 根据特定值(使用运算符)测试字节字段。 |
byte_jump | 允许规则读取部分数据的长度,然后在数据包中向前跳过该长度。 |
ftpbound | 检测FTP反弹攻击。 |
asn1 | 检测插件对数据包或数据包的一部分进行解码,并查找各种恶意编码。 |
cvs | 检测到无效的条目字符串。 |
英文原版定义表
non-payload类型
关键字 | 含义 |
---|---|
fragoffset | 允许将IP片段偏移量字段与十进制值进行比较 |
ttl | 用于检查IP生存时间值 |
tos | 用于检查IP tos字段中的特定值 |
id | 用于检查IP id字段中的特定值 |
ipopts | 用于检查是否存在特定的IP选项 |
fragbits | 用于检查IP标头中是否设置了碎片和保留位 |
dsize | 用于测试数据包有效负载大小 |
flags | 用于检查是否存在特定的TCP标志位 |
flow | 允许规则仅应用于交通流的特定方向 |
flowbits | 允许规则在传输协议会话期间跟踪状态 |
seq | 用于检查特定的TCP序列号 |
ack | 用于检查特定的TCP确认号 |
window | 用于检查特定的TCP窗口大小 |
itype | 用于检查特定ICMP类型值 |
icode | 用于检查特定ICMP代码值 |
icmp_id | 用于检查特定的icmp id值 |
icmp_seq | 用于检查特定icmp序列值 |
rpc | 用于检查SUNRPC调用请求中的rpc应用程序、版本和过程号 |
ip_proto | 允许对ip协议头进行检查 |
sameip | 允许规则检查源ip是否与目标ip相同 |
下付英文原版
post-detection类型
关键字 | 含义 |
---|---|
logto | 告诉Snort将触发此规则的所有数据包记录到一个特殊的输出日志文件中。 |
session | 用于从TCP会话中提取用户数据。 |
resp | 用于在触发警报时尝试关闭会话。 |
react | 通过关闭连接并发送通知来实现用户对符合Snort规则的流量作出反应的功能。 |
tag | 允许规则不仅仅记录触发规则的单个数据包。 |
replace | 用相同长度的给定字符串替换先前匹配的内容。仅在内联模式下可用。 |
detection_filter | 按源或目标IP地址筛选跟踪,如果规则匹配的速率超过配置的速率,则将触发该规则。 |
下付英文原版
其实只是翻译了一下规则有哪几类,哪些关键词,每个关键词是什么含义,有一些翻译的不准确。另外要开始真正使用的话,必须掌握每个关键词的格式,那就需要下载一下使用 用户手册。地址在https://www.snort.org/documents#OfficialDocumentation
官方提供的rules已经有很多了,但是大部分规则是不容易测试的,因为这些都是些异常,风险,攻击行为,不是很容易模拟出来的,所以还是要学习怎么使用为主。
这里还有一篇博客,翻译的也很到位,例子举的也很清楚:
Snort规则
大家可以多多参考学习。
昨天看到了一篇清华大学学生的《在树洞里》,很详细的介绍了他大学期间如何安排使用他的助学基金,让他足以完成他的学业,并且到后来他在研一之后开始资助一些贫困学生。
我是当年的省前十名,所以入学的时候有5000元的新生二等奖学金,同时我也有5000元的助学金,最后,我一般每一年会从学院不同名义的企业类型的奖学金中获得一种,大约是3000元。
这就是我一年的全部,扣掉6500的学杂费,我恰好还剩下一半的钱,也就是6500元。我给自己的任务就是花一半的钱,留下一半的钱买电脑,买必须要用的电子设备。3200元分到8个月,一个月就是400元——我在大一入学的时候给自己算了这样一笔账,我知道,我每个月只能花400元。
整篇文章虽然看上去描写的很艰苦,但是他表达出来的并不是一种自卑或者痛苦,而是一种感恩并且积极乐观。
有一道菜我特别爱吃:糖醋肉,黄黄的,黏黏的,里面也有胡萝卜,有肉有菜,关键1份只要4元钱。我最后都是拿米饭把盘子沾干净吃掉,每次吃完都特别满足,感觉好好吃啊。现在那道菜也还有,你们可以去尝尝,真的很好吃。
乃至于后来他开始资助贫困学生,也是表达出一种发自内心的对于别人帮助的感恩。
我们学校的校训是:自强不息,厚德载物。我不知道大家如何理解这句话。我认为,厚德载物就是说,我们所得到的一切, 应该有相应的德行去支撑。
直到今天我也认为上天是眷顾我的,我的家里人都身体健康,不需要我去照顾,我遇到了很多优秀的同学和老师。是所有人一起的努力才帮助我找到如今的工作,开始未来的生活。
我接受了这一切,那么我就该做出相应的回报,匹配我的德行,去资助像我一样的孩子,我想这就是未来我要做的。
我在读这篇文章的时候,正好是在11.10的晚上,各大电商在冲击双十一销售额过亿,大家都在算计满减优惠秒杀,有人会说:有点像朱门酒肉臭,路有冻死骨的感觉。
不过我觉得有些相反。
那些半夜抢购的女人,都是在给男人省钱。
略表心意,让那些孩子能多读些书,虽然无法体会外边的世界,但是也要知道外边的世界,充满了希望。