一条简单的规则
alert tcp 202.110.8.1 any -> 122.111.90.8 80 (msg:”Web Access”; sid:1)
- alert:表示如果此条规则被触发则告警
- tcp:协议类型
- ip地址:源/目的IP地址
- any/80:端口号
- ->:方向操作符,还有<>双向。
- msg:在告警和包日志中打印消息
- sid:Snort规则id …
SNORT体系结构
- 数据包嗅探模块,主要负责监听网络数据包,并根据TCP/IP协议解析数据包。
- 预处理模块,1.包重组预处理器,它的作用是为了防止攻击信息被拆分到多个包中而 逃避了Snort的检测;2.协议编码预处理器,它的功能是把数据包协议解码成一个统一的格式,再传送给检测模块;3.协议异常检测预处器。
- 检测引擎模块,当预处理器把数据包送过来后,检测引擎将这些数据包与三维链表形式的检测规则进行匹配,一旦发现数据包中的内容和某条规则相匹配,就通知报警模块。
- 报警/日志模块,检测引擎将数据包传送给报警模块后,报警模块会根据规则定义(alert,log…)对其进行不同的处理(数据库,日志)。
下面分别详细介绍这四大模块。
解码模块与预处理模块
解码模块主要是将从监控网络当中抓取的原始网络数据包,按照各个网络协议栈从下至上进行解码,并将解码数据保存到各个对应的数据结构当中,最后交由预处理模块进行处理。
解码后的数据包经过预处理之后才能被主探测引擎进行规则匹配。
Snort主要包含以下三类预处理器(举例说明):
1)包重组预处理器:
- frag3:IP分片重组和攻击监测。
- stream:维持TCP流状态,进行会话重组。
2)协议规范化预处理器:
- http_inspect:规范HTTP流。
- rpcDecode:规范RPC调用。
3)异常检测预处理器:
- ARP spoof:检测ARP欺骗。
- sfPortscan:检测端口扫描。
检测引擎模块
1、规则头
(1)动作:在snort中有五种动作:alert、log、pass、activate和dynamic。
- Alert: 生成一个告警,然后记录(log)这个包。
- Log: 记录这个包。
- Pass: 丢弃这个包。
- Activate: alert并且激活另一条dynamic规则。
- Dynamic:保持空闲直到被一条activate规则激活,被激活后就作为一条log规则执行。
(2)协议:协议:Snort当前可分析的协议有四种:TCP,UDP,ICMP和IP。将来可能会更多,例如:ARP、IGRP、GRE、OSPF、RIP、IPX等。
(3)ip地址:
- 由直接的ip地址或一个CIDR块组成的。也可以指定ip地址列表,一个ip地址列表由逗号分割的ip地址和CIDR块组成,并且要放在方括号内 [,]。
- 否定操作符用!表示。
- 关键字“any”可以被用来定义任何地址。
(4)端口号: - 端口号可以用几种方法表示,包括any端口、静态端口定义、范围、以及通过否定操作符。
- 静态端口定义表示一个单个端口号,例如111表示portmapper,23表示telnet,80表示http等等。
- 端口范围用范围操作符“:”表示.比如,80: , :1024 ,80:1024
2、通用规则
(1)sid:用来识别snort规则的唯一性
- <100 保留做将来使用
- 100-1000,000 包含在snort发布包中
- 大于1000,000 作为本地规则使用
(2)msg:标示一个消息
(3)gid:generate id,作用是为了说明这条规则是snort的哪部分触发的。比如是由解码器、预处理器还是Snort自有规则等。
3、负载检测规则
(1)content:规定在数据包的负载中搜索指定的样式。它的选项数据可以包含混合的文本和二进制数据。二进制数据一般包含在管道符号中“|”,表示为字节码(bytecode),也就是将二进制数据的十六进制形式。
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”?