在 Snort 的1.5版本中引入了预处理程序。
它们允许用户和程序员相当容易地将模块化插件放到 Snort 中,从而扩展 Snort 的功能。预处理器代码在调用检测引擎之前运行,但在数据包被解码之后运行。可以使用这种机制以带外的方式修改或分析数据包。
使用 preprocessor 关键字加载和配置预处理程序。Snort 配置文件中的预处理器指令的格式为:
preprocessor <name>: <options>
frag3 预处理器是用于 Snort 的基于目标的 IP 碎片整理模块。Frag3 的设计目标如下:
Frag3 在内部使用 sfxhash 数据结构和链表进行数据处理,这使得它在任何环境中都具有更可预测和更确定的性能,这有助于我们管理严重碎片化的环境。
基于目标的分析是基于网络的入侵检测中一个相对较新的概念。基于目标的系统的思想是对网络上的实际目标进行建模,而不仅仅是对协议进行建模并在其中寻找攻击。当为不同的操作系统编写IP堆栈时,通常是由阅读 RFC 然后将对 RFC 概述的解释写到代码中的人员实现的。不幸的是,RFC 定义了可能出现的某些边缘条件的方式存在歧义,并且当这种情况发生时,不同的人会以不同的方式实现其IP堆栈的某些方面。对于 IDS 来说,这是一个大问题。
在攻击者可以确定在特定目标上使用哪种样式的IP碎片整理的环境中,攻击者可以尝试对数据包进行分段,以便目标以特定方式将它们重新组合在一起,当任何被动系统试图模拟主机流量时,必须猜测目标操作系统将以何种方式处理重叠并重传。就像我要说的,如果攻击者比 IDS 具有更多有关网络目标的信息,则有可能逃避IDS。这就是基于目标的IDS的思想来源。有关此问题及其对IDS的影响的更多详细信息,请访问 http://www.snort.org/docs/idspaper/ 上的著名 Ptacek&Newsham 论文。
基于目标的 IDS 背后的基本思想是,我们将有关网络上主机的信息告诉给 IDS,以便它可以根据有关单个目标 IP 堆栈操作方式的信息来避免 Ptacek&Newsham 风格的逃逸攻击。 Vern Paxson 和 Umesh Shankar 在2003年就此主题发表了一篇出色的论文,详细介绍了网络上的主机映射,并确定了其各种IP堆栈实现如何处理IP碎片整理和 TCP 流重组中出现的问题类型。可以在 http://www.icir.org/vern/papers/activemap-oak03.pdf 上进行查看。
我们还可以向 IDS 提供拓扑信息,以避免基于 TTL 的逃逸和其他各种问题,但这是另一天的话题。一旦获得了这些信息,我们就可以开始针对这些复杂的建模问题真正改变游戏规则。
Frag3 的实现是为了展示和原型化 Snort 中基于目标的模块,以测试这一想法。
激活 frag3 至少需要两个预处理器指令,一个全局配置指令和一个引擎实例化指令。可以在 Snort 启动时定义任意数量的引擎,它们有各自不同的配置,但只有一个全局配置。
格式:
Preprocessor name: frag3_global
可用选项:
max_frags <number>
:同时跟踪的最大碎片数量,默认是8192memcap <bytes>
:自保留的内存容量,默认是4MBprealloc_memcap <bytes>
:备用内存管理模式,使用基于内存上限的预分配片段节点(在某些情况下更快)prealloc_frags <number>
:备用内存管理模式,使用基于静态数的预分配片段节点(在某些情况下更快)disabled
:任何策略都允许使用此可选关键字,以避免数据包处理。此选项禁用此配置的预处理器,但不禁用多个配置的其他实例。在基本配置中使用 disable 关键字可为选项 memcap,prealloc_memcap 和 prealloc_frags 指定值,而无需预处理器检查用于基本配置的流量。其他选项已解析但未使用。任何有效的配置都可能添加了“disabled”。格式:
Preprocessor name: frag3_engine
可用选项:
timeout <seconds>
:对于片段超时,引擎中超过这个时间段的片段将被自动删除。默认值是60秒。min_ttl <value>
:片段包的最小可接受的TTL值。默认值为1。此选项的可接受范围为1 - 255。detect_anomalies
:支持检测片段异常。bind_to <ip_list>
:指定此引擎绑定的IP列表。此引擎将仅对IP列表中包含的目标地址的数据包运行。默认值为“all”。overlap_limit <number>
:限制每个数据包的重叠片段的数量。默认值为“0”(无限制)。这个配置选项接受等于或大于零的值。这是一个可选参数。detect_anomalies 选项必须配置,这个选项才能生效。min_fragment_length <number>
:定义有效的最小碎片大小(有效负载大小)。小于或等于此限制的片段被认为是恶意的,如果还配置了 detect_anomalies,则会引发事件。默认值为“0”(禁用检查)。这个配置选项接受等于或大于零的值。这是一个可选参数。detect_anomalies 选项必须配置,这个选项才能生效。policy <type>
:选择基于目标的碎片整理模式。可用的类型有first、last、bsd、bsd-right、linux、windows和solaris。默认类型是bsd。Paxson Active Mapping 论文介绍了术语 frag3 用于描述策略类型。它已扩展为解决真正的 “first” 策略与 Windows 和 Solaris 平台如何处理碎片流量之间的差异。
任何开发更多映射并想添加到这个列表的人请随时给我们发送电子邮件。
已知的映射如下:
Platform | Type |
---|---|
AIX 2 | BSD |
AIX 4.3 8.9.3 | BSD |
Cisco IOS | Last |
FreeBSD | BSD |
HP JetDirect (printer) | BSD-right |
HP-UX B.10.20 | BSD |
HP-UX 11.00 | First |
IRIX 4.0.5F | BSD |
IRIX 6.2 | BSD |
IRIX 6.3 | BSD |
IRIX64 6.4 | BSD |
Linux 2.2.10 | linux |
Linux 2.2.14-5.0 | linux |
Linux 2.2.16-3 | linux |
Linux 2.2.19-6.2.10smp | linux |
Linux 2.4.7-10 | linux |
Linux 2.4.9-31SGI 1.0.2smp | linux |
Linux 2.4 (RedHat 7.1-7.3) | linux |
MacOS (version unknown) | First |
NCD Thin Clients | BSD |
OpenBSD (version unknown) | linux |
OpenBSD (version unknown) | linux |
OpenVMS 7.1 | BSD |
OS/2 (version unknown) | BSD |
OSF1 V3.0 | BSD |
OSF1 V3.2 | BSD |
OSF1 V4.0,5.0,5.1 | BSD |
SunOS 4.1.4 | BSD |
SunOS 5.5.1,5.6,5.7,5.8 | First |
Solaris 9, Solaris 10 | Solaris |
Tru64 Unix V5.0A,V5.1 | BSD |
Vax/VMS | BSD |
Windows (95/98/NT4/W2K/XP) | Windows |
举例:
Example configuration (Basic)
preprocessor frag3_global
preprocessor frag3_engine
Example configuration (Advanced)
preprocessor frag3_global: prealloc_frags 8192
preprocessor frag3_engine: policy linux bind_to 192.168.1.0/24
preprocessor frag3_engine: policy first bind_to [10.1.47.0/24,172.16.8.0/24]
preprocessor frag3_engine: policy last detect_anomalies
注意,在高级示例中,三个引擎指定在 linux 上运行,分别分配了 first 和 last 策略。前两个引擎绑定到特定的IP地址范围,最后一个应用到所有其他流量,不属于前两个引擎地址要求的包自动落入第三个引擎。
Frag3 能够检测八种不同类型的异常。它的事件输出是基于包的,因此可以使用 Snort的 所有输出模式。在 doc/signatures 目录中读取文件名以123开头的文档—以获取关于不同事件类型的信息。
Frag3 使用 GID 123 生成以下警报:
SID | Description |
---|---|
1 | 分段数据包上的IP选项(IP Options on fragmented packet) |
2 | Teardrop attack |
3 | 短分片,可能的DoS攻击(Short fragment, possible DoS attempt) |
4 | Fragment packet ends after defragmented packet |
5 | 零字节碎片(Zero-byte fragment) |
6 | 坏的分片大小,包大小是负的(Bad fragment size, packet size is negative) |
7 | 坏的片段大小,包大小超过65536(Bad fragment size, packet size is greater than 65536) |
8 | 分片重叠(Fragmentation overlap) |
9 | IPv6 BSD mbufs remote kernel buffer overflow |
10 | Bogus fragmentation packet. Possible BSD attack |
11 | TTL值小于 snort.conf 中配置的最小值,不用于重新组装(TTL value less than configured minimum, not using for reassembly) |
12 | 重叠分片的数量超过了配置的限制(Number of overlapping fragments exceed configured limit) |
13 | 分片小于 snort.conf 中配置的最小分片大小 min_fragment_length(Fragments smaller than configured min_fragment_length) |