当前位置:首页 >> 建筑/土木 >>

块是Snort体系中两个重要的部分,预处理器在Snort应用规则前处理


与处理器和输出模块是 Snort 体系中两个重要的部分,预处理器在 Snort 应用规则前处理接 收到的数据。输出模块输出 Snort 探测机制所产生的数据。数据包通过 Snort 的流程图如图 4-1 所示。被捕获的数据包首先经过预处理器,然后,经过探测引擎根据规则处理。根据规 则处理的结果,输出处理器处理日志或者告警。 Snort 允许你对预处理器和输出模块进行配置,这些工作

可以通过修改 snort.conf 来完成。 在 本书中,输入插件和预处理器是同一概念,输出插件和输出模块也是同一概念。本章将对这 些组件进行讨论。 4.1 预处理器 当 Snort 接收到数据包的时候,主探测引擎并不能对它们进行处理和应用规则,比如,数据 包有可能是分片的,需要重新组装,预处理器就是做这样的工作,使数据能够被探测引擎处 理,另外,一些预处理器还可以做一些其它工作,比如探测包中的一些明显错误。下面给你 介绍预处理器如何工作。 在安装过程中, 你可以在编译的时候选择对各种预处理器的支持。 各种预处理器的配置参数 在 snort.conf 中调整,你可以在通过这个文件打开或者关闭某个预处理器。 捕获的包要经过所有已经打开的预处理器, 不能跳过, 因此如果你如果打开了大量的预处理 器,就会降低 Snort 的运行速度。 在 snort.conf 中,你可以用 preprocessor 关键字打开预处理器,格式如下: preprocessor <name of preprocessor>[: parameters] 后面的参数通常是可选项。 你也可以编写自己的预处理器,察看 Snort 源代码 doc 目录中的 README.PLUGIN 文件, 你可以获得相关的资料,也可以在 templates 目录中查看源代码示例。

4.1.1HTTP 解码 Snort 可以对 HTTP 协议各种形式的编码进行解码,并从中找出已知的攻击特征。你可以将 HTTP 服务器的端口列表作为 HTTP 解码预处理器的参数。 例如下面的命令可以对在 80, 8080 和 443 端口的 HTTP 相关数据包进行解码,以便探测引擎处理: preprocessor http_decode: 80 8080 443 尤其重要的是, 如我们前面所提到的, 关于HTTP的攻击也常用各种变换形式, 如果应用HTTP 解码预处理器,就可以更有效的探测到这些企图。 4.1.2 端口扫描 端口扫描是用来发现网络上主机开放的端口的方法。 任何入侵者的第一个行动通常都是找出 网络上在运行一些什么样的服务。 一旦入侵者找到了这样的信息, 就可以尝试针对相关服务 弱点的攻击了。 端口扫描预处理器的作用是监测端口扫描的活动, 这种预处理器可以将端口 扫描行为记录到指定的位置或者标准的日志。黑客们使用很多种扫描方式,你也可以查看 nmap 的文档来获得更多的信息。 下面是在 snort.conf 中应用端口扫描预处理器的大体格式: preprocessor portscan: <address> <ports> <time period> <file> 这个预处理器有 4 个相关的参数 所监控的地址范围,采用 CIDR 规格。 在一个时间段内访问的端口数目, 例如这个参数取 5 表示在一个时间段内, 如果超过 5 个端 口被扫描,则产生告警。 时间段,用来配合上个参数的门限时间范围,用秒表示。

记录日志的文件路径。

下面是个配置实例,用来监测针对网络192.168.1.0/24的端口扫描,并将日志记录到 /var/log/snort/portscan.log文件中。 preprocessor portscan: 192.168.1.0/24 5 10 \ /var/log/snort/portscan.log 端口扫描活动是针对 TCP 和 UDP 端口的。 端口扫描预处理器可以监测正常端口和隐秘端口 的扫描。针对隐秘端口的扫描,可以查看 nmap 的相关文档或网站。端口扫描的主要方法如 下: TCP 端口连接扫描。这种方式试图对某个端口进行标准的 TCP 连接,如果连接建立,则表 示这个端口是打开的。 SYN 扫描。入侵者发送一个带有 SYN 标志的 TCP 包到某个端口,如果收到了带有 SYN 和 ACK 标志的回应,那么这个端口是打开的,如果收到了带有 RST 标志的包,这个端口就是 关闭的。 NULL 端口扫描,FIN 端口扫描,XMAS 端口扫描,这是几个比较类似的扫描方式。入侵者 发送一个 TCP 包出去,如果收到带有 RST 标志的包,表示端口是关闭的,如果什么包也没 有收到,就有端口打开的可能性。

还有一种预处理器,可以和这种预处理器一同工作,它叫做端口扫描忽略预处理器,用来忽 略针对某些主机的扫描行为,用法如下例所示: preprocessor portscan-ignorehosts: 192.168.1.10/32 \ 192.168.1.13/32 4.1.3 frag2 模块 这个预处理器用来组装包的分片,老版本的 Snort 用 defrag。 应用 frag2 的时候,你可以配置组装分片的超时和内存上限。默认情况下是 4M 的内存和 60 秒的超时界限。如果在这个时间段内没有完成,就把包丢弃。下面的命令用默认参数打开 frag2: preprocessor frag2 下面的命令将 frag2 配置为 2M 的内存上限和 30 秒的超时。 在一个高速的网络中,你应该用更多的内存上限。 4.1.4 stream4 模块 这个模块用来代替老版本的 Stream 模块,它有两个基本功能: Tcp 数据流的组装 状态监测 为了使 Stream4 正常工作,你必须在 snort.conf 中配置两个预处理器,分别是“stream4”和

“stream4_reassemble.”它们都有很多的参数,如果你不配置这些参数,系统就会采用默认 值。Stream4 预处理器的大体格式如下: preprocessor stream4: [noinspect], [keepstats], \ [timeout <seconds>], [memcap <bytes>], [detect_scan], \ [detect_state]

下面是关于各个参数的描述和默认值 参数 Noinspect Keepstats Timeout Memcap Detect_scan Detect_state_problems 表述 关闭状态监测 将 会 话 概 要 记 录 到 session.log 文件中 保持一个活动会话的超时 这个模块利用的最大内存 监测端口扫描活动 监测 TCP 流相关的各种问题 默认值 ACTIVE INACTIVE 30 秒 8MB INACTIVE INACTIVE

下面是 stream4_reassemble 预处理器的主要格式: preprocessor stream4_reassemble: [clientonly], [serveronly],[noalerts],[ports<portlist>] 下面是这个预处理器的主要参数的描述 参数 Clientonly Severonly Noalerts Ports 表述 仅仅组装客户端的数据流 仅仅组装服务器端的数据流 在遇到逃避和嵌入式攻击时不告警 组装关于特定端口的数据流的端口列表,用 空格分隔,all 表示端口 21,23,25,53,80, 110,111,143 和 513。指定少数的端口可以 节省 CPU 时间。

4.1.5 spade 模块 SPADE是统计包异常探测引擎的缩写,你可以在 http://www.silicondefense.com/software/spice/index.htm看到相关信息。 它被用来在IP包中探测 异常情况。这个预处理器有很多相关的关键字,在snort.conf模板中可以找到相关的描述。 SPADE保存历史数据的记录,并用门限值来报告异常情况。 要记住SPADE对系统的要求比较高,尤其是在高负荷的网络上,因此要小心使用。 4.1.6 ARP欺骗 ARP用来获得某个IP地址相关的MAC地址。 ARP协议也被很多人用来攻击,探测和欺骗。ARP欺骗可以将到某个主机的通信重定向到别 的地方。 Arpspoof预处理器用来探测ARP包中的异常,它可以做以下的事情: 对于所有的ARP请求,如果源MAC地址与发送者的MAC地址不同,就产生告警。 对于APR回应包,如果源MAC地址与发送者的MAC地址不同,或目的MAC地址与接收者的

MAC地址不同,就会产生告警。 对于单播ARP请求,若目的MAC不是广播地址(FF:FF:FF:FF:FF:FF),就产生告警。为了实现 这个功能,你需要在snort.conf中加入这样一行:as “preprocessor arpspoof: -unicast”。 你可以在Snort内部缓存中预先存放MAC-IP映射对,如果遇到不匹配,系统就会产生告警。 下面的一行添加一个IP-MAC对,可以用来探测ARP欺骗的企图。 preprocessor arpspoof_detect_host: 192.168.1.13 \ 34:45:fd:3e:a2:01 4.2输出模块

输出模块用来控制Snort探测引擎的输出,你可以将输出的信息送到各种目标。比如: 数据库 SMB弹出窗口 系统日志 XML或者CSV文件。

在snort.conf中配置输出模块的命令大体如下所示: output <module_name>[: arguments] 比如你希望将信息记录到名为snort的MySQL数据库,可以采用如下的配置: output database: log, mysql, user=rr password=rr \ dbname=snort host=localhost 一旦你在配置输出模块加入上面着一行,所有的告警都送到MySQL数据库中,在日志文件 中就不会出现了,也有一些方法可以将告警送到不同的目标。

下面的例子是将SMB弹出窗口送到workstation.list文件中列举的主机上:
output alert_smb: workstation.list

有时候你可能需要将告警发到多种目标,那么用 ruletype 关键字自定义动作时一个好主意。 例如,下面豫剧定义了一个动作,将告警同时发送到数据库和 SMB 弹出窗口。
ruletype smb_db_alert { type alert output alert_smb: workstation.list output database: log, mysql, user=rr password=rr \ dbname=snort host=localhost }

下面的规则应用了上面的自定义动作。
smb_db_alert icmp any any -> 192.168.1.0/24 any \ (fragbits: D; msg: "Dont Fragment bit set";)

4.2.1 alert_syslog 输出模块 几乎所有的 UNIX 系统中都有系统日志守护进程 syslog,它的配置文件是/etc/syslog.conf。你 可以查看 syslogd 和 syslog.conf 的手册来获得更多信息。 Alert_syslog 模块使你能够将告警发送到系统日志钟。如果你需要的话,系统日志守护进程

也可以将告警发送到其他的主机。下面是这个模块的配置格式:
output alert_syslog: <facility> <priority> <options>

其中,facility 可以取得值包括: ? LOG_AUTH ? LOG_AUTHPRIV ? LOG_DAEMON ? LOG_LOCAL0 ? LOG_LOCAL1 ? LOG_LOCAL2 ? LOG_LOCAL3 ? LOG_LOCAL4 ? LOG_LOCAL5 ? LOG_LOCAL6 ? LOG_LOCAL7 ? LOG_USER priority 的取值包括: ? LOG_EMERG ? LOG_ALERT ? LOG_CRIT ? LOG_ERR ? LOG_WARNING ? LOG_NOTICE ? LOG_INFO ? LOG_DEBUG 这里 LOG_EMERG 是最高优先级的,而 LOG_DEBUG 是最低优先级的。 Options 的取值可以是: ? LOG_CONS ? LOG_NDELAY ? LOG_PERROR ? LOG_PID 4.2.2 alert_full 输出模块 这个模块用来想文件记录详尽的告警信息。下面的配置让系统把日志记录到 Snort 日志目录 的 alert_detailed 文件中:
output alert_full: alert_detailed

尽管这个模块可以使你得到详细的信息, 但是也会导致系统资源的大量消耗, 在一个高负载 的网络环境中,可能导致系统来不及响应而使探测引擎忽略一些数据包。 4.2.3 alert_fast 输出模块 如前面所提到的,记录详细的信息可能导致系统资源的过度消耗,因此 Snort 提供快速记录 简要信息的输出模块,每个信息只有一行,这个模块的配置如下所示:
output alert_fast: alert_quick

4.2.4 alert_smb 模块 这个模块用 linux 的 SAMBA 客户端 smbclient 程序向 Windows 工作站发送 SMB 告警, 使用 之前确定 smbclient 程序的路程在 PATH 环境变量中。 下面是一个示例:

output alert_smb: workstation.list

每个工作站的 SMB 名称都要分行列在 workstation.list 文件中。 SMB 名称就是 Windows 机器 的计算机名称。客户端程序会自己解析这个名称。 4.2.5 log_tcpdump 模块 这个模块用来将告警数据存放为 tcpdump 格式, 这种方法便于高负荷网络中提高分析数据的 速度。下面是配置格式:
output log_tcpdump: <filename>

下面是一个示例:
output log_tcpdump: /var/log/snort/snort_tcpdump.log

4.2.6 XML 输出模块 Snort可以用SNML(Simple Network Modeling Language)来输出告警以便基于XML的解 释器或浏览器阅读。 通过这个插件, 你可以将XML数据存放在本地机器上或者通过HTTP及HTTP协议传送到 Web服务器上。 XML输出模块的基本用法如下:
output xml: [log | alert], [parameter list]

你可以选择用XML记录告警或者日志,其他的参数如下表所示: 参数 File Protocol Host Port Cert Key Ca Server 描述 将数据储存到XML文件中 将信息记录到其他机器上用的协议如HTTP, HTTPS。 记录信息的远程主机 记录信息的远程主机的端口 Https用到的证书 客户端私钥 认证证书的服务器 X.509证书的CN

4.2.6.1 例子 将日志记录到本地主机上的文件“xmlout” :
output xml: log, file=xmlout

文件名字会添加时间和日期作为后缀,这样的目的是为多个 Snort 进程服务。 将日志记录用 HTTP 协议到 snort.conformix.com 的 xmlout 文件上:
output xml: alert, protocol=http \ host=snort.conformix.com file=xmlout

将日志记录用 HTTPS 协议到 snort.conformix.com 的 xmlout 文件上:
output xml: alert, protocol=https \ host=snort.conformix.com file=xmlout cert=conformix.crt \ key=conformix.pem ca=ca.crt server=Conformix_server

将日志记录到监听5555端口的TCP服务器snort.conformix.com上:
output xml: alert, protocol=tcp \ host=snort.conformix.com port=5555

典型的输出XML文件如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE snort-message-version-0.2> <file> <event version="1.0"> <sensor encoding="hex" detail="full"> <interface>eth0</interface> <ipaddr version="4">192.168.1.2</ipaddr> <hostname>conformix.conformix.net</hostname> </sensor> <signature>ICMP Packet with TTL=100</signature> <timestamp>2002-07-23 17:48:31-04</timestamp> <packet> <iphdr saddr="192.168.1.100" daddr="192.168.1.2" proto="1" ver="4" hlen="5" len="60" id="37123" ttl="100" csum="519"> <icmphdr type="8" code="0" csum="23612"> <data>6162636465666768696A6B6C6D6E6F7071727374757677616263646566676869</data> </icmphdr> </iphdr> </packet> </event> </file>

4.2.7记录到数据库 Snort可以用数据库来记录日志和告警,你可以用Oracle或MySQL等多种类型的数据库,如 下面的例子:
output database: log, mysql, user=rr password=rr \ dbname=snort host=localhost

下一章将详细讨论如何应用数据库,下面是数据库数据模块的格式:
output database: <log | alert>, <database_type>, \ <parameter_list>

这里database_type指的是数据库类型, 如mysql, parameter_list是一些相关参数, 用空格分隔。 其中很多参数是可选的。 下面是参数的列表: 参数 Host Port Dbname User Password Sensor_name Detail 描述 运行数据库服务器的主机 数据库服务器的端口号 数据库的名称 数据库的用户名 用户口令 Snort探测器的名称 Full或者fast模式,默认是full

Encoding

记录数据的ASCII,hex或者base64的编码

4.2.8CSV数据模块 利用CSV模块, 可以将输出数据保存为CSV文件, 可以将数据导入到其他的软件中, 如Excel 等等。启动CSV模块的语句模式如下:
output csv: <filename> <formatting_options>

文件默认被创建到/var/log/snort路径下面,选项用来定义文件中储存什么样的信息以及以什 么样的顺序储存。 例如,你用default作为格式选想那么告警的所有参数将被存储在文件中:
output csv: csv_log default

输出文件的格式如下:
07/23-18:24:03.388106 ,ICMP Packet with TTL=100,ICMP,192.168.1.100,,192.168.1.2,,0:2:3F:33:C6:98,0:E0:29:89: 28:59,0x4A,,,,,,100,0,51367,60,20,8,0,, 07/23-18:25:51.608106 ,GET matched,TCP,192.168.1.2,1060,192.168.10.193,,0:E0:29:89:28:59,0:6:25 :5B:29:ED,0x189,***AP***,0x55BCF404,0x8CBF42DD,,0x16D0,64,0,35580,37 9,20,,,, 07/23-18:25:52.008106 ,GET matched,TCP,192.168.1.2,1061,192.168.10.193,,0:E0:29:89:28:59,0:6:25 :5B:29:ED,0x1D0,***AP***,0x55628967,0x8D33FB74,,0x16D0,64,0,63049,45 0,20,,,, 07/23-18:25:52.478106 ,GET matched,TCP,192.168.1.2,1061,192.168.10.193,,0:E0:29:89:28:59,0:6:25 :5B:29:ED,0x1D0,***AP***,0x55628B01,0x8D33FC1B,,0x1920,64,0,63051,45 0,20,,,, 07/23-18:25:52.708106 ,GET matched,TCP,192.168.1.2,1061,192.168.10.193,,0:E0:29:89:28:59,0:6:25 :5B:29:ED,0x1EF,***AP***,0x55628C9B,0x8D33FCC1,,0x1D50,64,0,63053,48 1,20,,,,

每一行包括下面的字段: 名称 Timestamp Msg Porto Src Dst Dstport Ethsrc Ethdst Ethlen Tcpflags Tcpseq 描述 时间戳包含时间和日期 规则中msg字段中的信息 协议 源IP地址 目的IP地址 目的端口 源MAC地址 目的MAC地址 以太网帧长度 如果协议为TCP的话,这里就记录标志位 Tcp包的序列号

Tcpack Tcplen Tcpwindow Ttl Tos Id Dgmlen Iplen Icmptype Icmpid Icmpseq

Tcp的应答号 TCP包的长度 TCP窗口的大小 IP头部的TTL值 IP头部的服务类型值 包的ID值 数据报的长度 IP头部长度 ICMP头部的类型段 ICMP头部的ID ICMP序列号

你可以用少量的选项,例如:
output csv: csv_log timestamp,msg,src,dst

纪录的日志如下:
07/23-19:31:27.128106 ,GET matched,192.168.1.2,192.168.10.193 07/23-19:31:27.278106 ,GET matched,192.168.1.2,192.168.10.193

4.2.9统一纪录输出模块 同意输出适合告诉纪录,你可以将日志和告警存放不同的文件中,下面是配置格式:
output alert_unified: filename <alert_file>, \ limit <max_size> output log_unified: filename <log_file>, \ limit <max_size>

文件的大小用M字节表示,你可以同时记录日志和告警,因为告警文件并不包含包的详细信 息。下面是个例子:
output alert_unified: filename unified_alert, limit 50 output log_unified: filename unified_log, limit 200

如果不指定路径,那么文件将被创建在/var/log/snort中。在上面的例子中,告警文件的大小 被限制在50M字节,日志文件是200M字节。 统一日志用二进制记录问津,你可以用一些工具开查看,比如Barnyard。 4.2.10SNMP Trap输出模块 这个模块可以向网络管理中心输出SNMP trap形式的告警,它可以产生SNMP 第二版和第三 版的trap信息。格式如下:
output trap_snmp: alert, <sensor_ID>, {trap|inform} \ -v <snmp_version> -p <port_number> <hostname> <community>

下面一行的作用是将SNMP 2C版的trap信息发到192.168.1.3的162端口, 共同体名称为public:
output trap_snmp: alert, 8, trap -v 2c -p 162 \ 192.168.1.3 public

如果需要用SNMP,那么openssl的支持必须也在编译Snort的时候选择。 4.2.11 空记录数据模块 这个模块可以导致不记录告警,一般情况下不推荐使用。

4.3 BPF过滤器 BPF是在数据链路层过滤数据包的一种机制。基于BPF的过滤器通常用tcpdump这样的程序 来过滤你想捕获的数据包。你可以同时使用BPF和Snort。如果你使用BPF过滤器,那么Snort 只能看到通过BPF过滤器的包。这样可以过滤掉没有意义的数据包,节省CPU时间。 你可以将BPF过滤表放在一个文件中,在启动Snort的时候引用这个文件。假设你想让Snort 仅仅探测IP头部的TOS不等于0的包,你可以创建一个文件bpf.txt,包含如下的一行:
ip[1] != 0

数字1表示的IP头部开始计算的偏移量,1就是TOS位。 然后,用下面的命令启动Snort:
snort -F bpf.txt -c /opt/snort/etc/snort.conf


相关文章:
块是Snort体系中两个重要的部分,预处理器在Snort应用规则前处理
块是Snort体系中两个重要的部分,预处理器在Snort应用规则前处理_建筑/土木_工程科技_专业资料。块是Snort体系中两个重要的部分,预处理器在Snort应用规则前处理与...
Snort预处理器介绍(详细)
往往由于攻击报文被分成多个部分而使各个分片失去攻击特征,以致 Snort 的规则匹配引 擎不能检测。 所以, Snort预处理器里, 先将分片的 RPC 报文拼成一个...
snort入侵检测技术
的部分功能, Snort 的特点就是其入侵检测功能—根据入侵规则匹配数据包的内容...体系结构 Snort 有 5 个主要部件:捕包程序库 libpcap、包解码器、预处理程序...
Snort研究与应用
入侵检测系统是网络纵深防御体系中的重要组成部分, ...Snort.直至今天,Snort 已发展成为一个多平台(Multi-...例如,预处理插件 的功能就是在规则匹配误用检测之前...
snort源代码分析帮助手册(概要版本)V1.0版本
他有两个功能:规则分析和特征监测。检测引擎通过分析 Snort 规则来建立攻击特征。 Snort 规则按行读取并被载入内部数据结构。规则只有在 Snort 服务启动时才载入,这...
Snort每一项的具体含义
Snort规则选项详解 Snort规则被分成两个逻辑部分:规则...1. 规则头:规则动作: 在snort中有五种动作:alert...这将允许规则应用到客户端或者服务器端。这将能...
snort
snort 的处理速度,从而在向显示器输出的过程中丢弃...Snort 规则被分成两个逻辑部分:规则头和规则选项。...参见变量(Variables)一节以获取关于在 SNORT 规则...
入侵实验三snort的安装配置
入侵实验三snort的安装配置_计算机软件及应用_IT/...的远程捕获功能,那么在预处理定义中加入 HAVE_REMOTE...主要是两个算法,BF 匹配算法和 KMP 匹配算法,还有...
实验五:入侵检测技术
该模块是 Snort 的核心模块。当数据包从预处理器送...包中的内容和某条规则相匹配, 就通知报警模 块。...9. 在 Snort.conf 文件中, 修改配置文件 ...
如何编写snort的检测规则
snort 的每条规则都可以分成逻辑上的两个部分:规则...1.2 varriables ??在 snort 规则文件中可以定义...预处理器在调用检测引擎之前,在数据包被解 码之后...
更多相关标签:
snort规则 | snort规则库下载 | snort规则编写 | snort规则库 | snort2.9规则库下载 | snort 规则匹配 | snort添加规则 | snort规则解析 |