Snort3规则编写简介
本指南介绍了Snort3规则语言的一些新变化,目标是促进规则编写语法从Snort2到Snort3的转变。
规则头
规则头格式遵循以下格式:
Action Protocol Networks Ports Direction Operator Networks Ports
示例:
alert tcp $HOME_NET any -> $EXTERNAL_NETE $HTTP_PORTS (RULE_OPTIONS)
alert udp $EXTERNAL_NET $FILE_DATA_PORTS -> $HOME_NET any (RULE_OPTIONS)
在Snort3中,选项Protocol、Networks、Ports和Direction Operator是可选的,可以省略,表示匹配任意;类似于用关键字any替换网络和端口。
示例:
alert tcp (RULES_OPTIONS)
这个允许创建更快和更少冗余的规则。实际上省略选项应该是有选择性的,以避免在读取规则时产生歧义。一个典型的场景是编写规则来检测内容,无论其方向(入站/出站)和协议(tcp、udp 或 icmp)如何。
Alert “http”服务关键字
在Snort2中,编写规则以检测HTTP URI、Header或Body中的内容时使用的协议定义为tcp。在Snort3中,一个新的协议关键字 http可用于HTTP内容检测。这提供了以下好处:
- Snort可以检测和对HTTP内容告警,无论端口如何(非标准端口上的HTTP)。因此,规则编写者不必担心某些恶意软件正在通信的端口是否标准端口。
- 不再需要Snort2中metadata选项中定义的服务映射(例如:service http)。因此,免除了规则编写者必须在规则元数据选项中定义服务映射的负担。本指南将进一步讨论元数据选项。
- 使用Snort3中可用的新的粘性和动态缓冲区的能力允许对Snort3规则进行简化和潜在的性能改进,具体如以下部分所述。
新的粘性缓冲区和动态缓冲区选择器
粘性缓冲区(例如file_data
和sip_header
)允许规则编写者在包含HTTP响应正文或SIP标头等内容的特定缓冲区中定义检测光标。粘性缓冲区必须先于被检测的内容,并且在更改之前一直有效。Snort3引入了新的粘性缓冲区和选择器专门用于HTTP内容检测,例如http_uri
和http_header
。此外,Snort3在某些粘性缓冲区下添加了动态缓冲区选择器作为子类别,例如http_header粘性缓冲区下的字段选择器。使用字段选择器,规则作者可以限制针对特定HTTP标头的内容匹配,其中标头名称不区分大小写。
“http_uri”粘性缓冲区示例
在这个示例中,在Snort3中使用http_uri粘性缓冲区消除了使用 每个内容匹配后的http_uri内容选项。
“http_header”粘性缓冲区和“字段”动态缓冲区选择器示例
在此示例中,使用http_header和字段选择器允许规则编写器将内容匹配定位到HTTP请求标头中的特定字段(不区分大小写)。
粘性缓冲区和已删除的PCRE选项示例
在Snort2中,post-re修饰符(B、U、P、H、M、C、I、D、K、S、Y)为正则表达式设置编译时间标志。例如,pcre U的Snort特定修饰符用于匹配解码的URI缓冲区。 在Snort3中,一些post-re修饰符(B、U、P、H、M、C、I、D、K、S、Y)已被删除,以支持粘性缓冲区。
带有“bufferlen”选项的粘性缓冲区和URL长度示例
在Snort2中,检查URI长度是通过urilen选项实现的。 在Snort3中,选项urilen被删除并被通用缓冲区bufferlen替换,该缓冲区适用于指定的粘性缓冲区。
带有“bufferlen”选项的粘性缓冲区和用户代理长度示例
Snort3中通用缓冲区bufferlen的引入创造了新的检测能力。例如,检测HTTP请求头中User-Agent的长度。
Alert “file”关键字
规则中action后的file关键字适用于任何可以出现文件的地方,而不管协议或编码如何。这使规则编写者免于以下负担:
- 维护多个规则以检测不同协议上的相同文件或内容。
- 维护多个规则以检测相同或不同方向的内容遍历。
- 添加新协议时创建或修改规则。
- 无需担心并可能替换规则中的flowbits选项。
无论协议或方向如何,都可以检测特定内容示例
此示例尝试检测通过HTTP(下载)和SMTP(上传)在网络中传输的恶意内容。
在Snort规则中使用file关键字也应该可以提高性能。以下示例展示了 Snort2和Snort3之间的规则语法差异,尽管它们很微妙。
检测单个文件类型示例
检测单个文件类型和版本示例
检测单个文件类型和多个版本示例
检测多个文件类型示例
检测多个文件类型和版本示例
使用OpenAppID进行应用检测
Metadata规则选项
在Snort2中,元数据选项中的某些关键字(如engine、soid和service键)会影响Snort检测行为,例如在提供主机属性表时使用基于目标的服务标识符的键。 在Snort3中,元数据现在是真正的元数据,对检测没有影响。Snort不关心元数据的内部结构/语法。
用元数据中的“服务”键替换元数据中的服务示例
Remarks规则选项
备注rem选项是一个新选项,允许在规则正文中包含任意注释。
rem选项示例