Snort分析
Snort的程序架构
Snort 由几大软件模块组成,这些软件模块采用插件方式与Snort 结合,扩展起来非常方便,例如有预处理器和检测插件,报警输出插件等。Snort程序的基本框架如下图所示:
图1 Snort程序的框架图
Snort的源代码结构:
snort 源代码主要由以下几个主要部分构成:
snort. c snort 主函数
decode. c 包解码器
rules. c 规则引擎
detect. c 检测引擎
log. c 记录引擎
以spp-开头预处理器插件
以sp-开头处理插件
以sop-开头输出插件
Snort.c 分析
Snort.c是Snort的主函数所在,主要作用是控制程序的工作流程和初始话所需的插件。其中,程序从.SnortMain()函数开始,基本流程如下:
图2 SnortMain的流程图
图3 Snort的数据包处理流程
Snort的预处理程序
对于Snort来讲,提供超越规则检验的功能还是必要的,比如协议的异常检测和正确性检测,仅仅通过规则匹配是不能完成这样的任务的,这些额外的规则通过预处理器实现。
预处理程序是Snort的一个可通过插件配置的组成部分。主要包括:①模拟TCP/IP堆栈功能的插件,如IP碎片重组、TCP流重组插件;②各种解码插件:http解码插件、unicode解码插件、rpc解码插件、tel-net解码插件等;③规则匹配无法进行攻击检测时所用的插件:端口扫描插件、spade异常入侵检测插件、bo检测插件、arp欺骗检测插件等。
Snort规则的格式
Snort采用简单的规则描述格式,举例说明如下:
Alert TCP !$HOME_NET any ->!$HOME_NET (meg : “CAN-1999-0736-IIS-showcode”, flsgs:A:content:”/selector/showcode.asp”: nocase)
前面的alert TCP 代表对应于检测引擎的表头,括号内部的规则选项,其中冒号“:” 的是关键字,引号内部的是规则。当且仅当所有的规则均为真的时候才会触发事件。
Snort的检测引擎
Snort的检测引擎通过一个三维链表维护其检测规则,,首先按规则类型( Log、Pass、Alert、Dynamic、Activation)分类,分成了五个单独的规则链;然后针对这五个规则链的每一个按协议类型(TCP、UDP、ICMP、IP)分成相应的节点链表;最后又按照源IP、目的IP、源端口号及目的端口号分为多个规则树节点(RTN);每个规则树节点下又有规则选项,称为选项树节点(OTN);这样每个OTN 节点就对应了一条规则,Snort 规则树结构如图4:
图4 Snort 规则树结构
当数据包到达检测引擎时,Snort 将首先匹配规则链,然后根据数据包协议匹配相应的节点链表,于是从左至右遍历RTN,参看源、目的IP 及端口号是否匹配,找到一个匹配后,算法向下进行,在每个OTN 中寻找匹配;当找到一个匹配后,退出树结构返回相应规则链的头部,通过指定格式输出。
在字符串比较方面,Snort主要采用Boyer—Moore算法,同时在2.0以后的版本中有Wu-manber和Aho—Croshik可供选择。
总结
作为IDS而言,Snort的结构使得其可以方便的扩展和部署。但是,遍历的检测引擎和基于lipcap的数据包捕获机制决定了它只能作为中小型企业的入侵检测系统。
。。。。。
还不能上图