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内容检测。这提供了以下好处:

  1. Snort可以检测和对HTTP内容告警,无论端口如何(非标准端口上的HTTP)。因此,规则编写者不必担心某些恶意软件正在通信的端口是否标准端口。
  2. 不再需要Snort2中metadata选项中定义的服务映射(例如:service http)。因此,免除了规则编写者必须在规则元数据选项中定义服务映射的负担。本指南将进一步讨论元数据选项。
  3. 使用Snort3中可用的新的粘性和动态缓冲区的能力允许对Snort3规则进行简化和潜在的性能改进,具体如以下部分所述。

新的粘性缓冲区和动态缓冲区选择器

粘性缓冲区(例如file_datasip_header)允许规则编写者在包含HTTP响应正文或SIP标头等内容的特定缓冲区中定义检测光标。粘性缓冲区必须先于被检测的内容,并且在更改之前一直有效。Snort3引入了新的粘性缓冲区和选择器专门用于HTTP内容检测,例如http_urihttp_header。此外,Snort3在某些粘性缓冲区下添加了动态缓冲区选择器作为子类别,例如http_header粘性缓冲区下的字段选择器。使用字段选择器,规则作者可以限制针对特定HTTP标头的内容匹配,其中标头名称不区分大小写。

“http_uri”粘性缓冲区示例

在这个示例中,在Snort3中使用http_uri粘性缓冲区消除了使用 每个内容匹配后的http_uri内容选项。

snort3_1.jpg

“http_header”粘性缓冲区和“字段”动态缓冲区选择器示例

在此示例中,使用http_header和字段选择器允许规则编写器将内容匹配定位到HTTP请求标头中的特定字段(不区分大小写)。

snort3_2.jpg

粘性缓冲区和已删除的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)已被删除,以支持粘性缓冲区。

snort3_3.jpg

带有“bufferlen”选项的粘性缓冲区和URL长度示例

在Snort2中,检查URI长度是通过urilen选项实现的。 在Snort3中,选项urilen被删除并被通用缓冲区bufferlen替换,该缓冲区适用于指定的粘性缓冲区。

snort3_4.jpg

带有“bufferlen”选项的粘性缓冲区和用户代理长度示例

Snort3中通用缓冲区bufferlen的引入创造了新的检测能力。例如,检测HTTP请求头中User-Agent的长度。

snort3_5.jpg

Alert “file”关键字

规则中action后的file关键字适用于任何可以出现文件的地方,而不管协议或编码如何。这使规则编写者免于以下负担:

  1. 维护多个规则以检测不同协议上的相同文件或内容。
  2. 维护多个规则以检测相同或不同方向的内容遍历。
  3. 添加新协议时创建或修改规则。
  4. 无需担心并可能替换规则中的flowbits选项。

无论协议或方向如何,都可以检测特定内容示例

此示例尝试检测通过HTTP(下载)和SMTP(上传)在网络中传输的恶意内容。

snort3_6.jpg

在Snort规则中使用file关键字也应该可以提高性能。以下示例展示了 Snort2和Snort3之间的规则语法差异,尽管它们很微妙。

检测单个文件类型示例

snort3_7.jpg

检测单个文件类型和版本示例

snort3_8.jpg

检测单个文件类型和多个版本示例

snort3_9.jpg

检测多个文件类型示例

snort3_10.jpg

检测多个文件类型和版本示例

snort3_11.jpg

使用OpenAppID进行应用检测

snort3_12.jpg

Metadata规则选项

在Snort2中,元数据选项中的某些关键字(如engine、soid和service键)会影响Snort检测行为,例如在提供主机属性表时使用基于目标的服务标识符的键。 在Snort3中,元数据现在是真正的元数据,对检测没有影响。Snort不关心元数据的内部结构/语法。

用元数据中的“服务”键替换元数据中的服务示例

snort3_13.jpg

Remarks规则选项

备注rem选项是一个新选项,允许在规则正文中包含任意注释。

rem选项示例

snort3_14.jpg