网络入侵检测系统之Snort(一)

What is Snort

Reference:https://snort.org/

Snort是世界最顶尖的开源入侵检测系统Snort IDS利用一系列的规则去定义恶意网络活动,against匹配到的报文并给用户告警Snort主要用法,第一种类似TCP dump,作为网络sniffer使用,调试网络流量,第二种用于特征识别的网络入侵检测线上Snort规则一种是免费的社区规则,一种是付费的订阅(Cisco Talos)Architecturesnor组织架构

解码器:将捕获的数据包解码后存放到snort定义的结构体中(./decode.h sturct Packet),目前支持的协议有IP,TCP,UDP等预处理器:基于插件形式,对数据包进行修改,包括分片重组,分段重组,端口扫描预处理器检测引擎:规则建立(多维链表)+规则匹配包括数据包相关各种特征的描述选项,比如:content、flags、dsize、ttl等;规则本身相关一些说明选项,比如:reference、sid、classtype、priority等;规则匹配后的动作选项,比如:msg、resp、react、session、logto、tag等;选项是对某些选项的修饰,比如从属于content的nocase、offset、depth、regex等规则相关报警输出:将检测引擎处理后的数据包送到系统日志文件或产生告警。日志文件可以是ascii格式或者tcpdump的二进制格式或到数据库中,当然有输出模块也是以插件形式,用户可定制按需定制Rule Config

snort的规则是采用多维链表的形式进行存储,各个维度包括action,protocol,五元组,option:

snort规则组织的数据结构

检测到采取的动作分类

代码语言:javascript复制//5种动作分类

typedef struct _RuleListNode

{

ListHead *RuleList; /* 指向ListHead结点*/

int mode; /* 规则链结点类型*/

int rval; /*标记位*/

int evalIndex; /* 规则编号*/

char *name; /* 规则链名*/

struct _RuleListNode *next; /*下一个规则链结点*/

} RuleListNode; 协议

代码语言:javascript复制//4种协议

typedef struct _ListHead

{

RuleTreeNode *IpList; /*指向IP规则树结点*/

RuleTreeNode *TcpList; /*指向IP规则树结点*/

RuleTreeNode *UdpList; /*指向IP规则树结点*/

RuleTreeNode *IcmpList; /*指向IP规则树结点*/

} ListHead;五元组+上下行

代码语言:javascript复制image-20201027163842233

//五元组+上下行

typedef struct_RuleTreeNode/*攻击特证树结点*/

{

int head_node_number;

int type;

u_long sip;/*源IP地址*/

u_long smask;/*源子网掩码*/

u_long dip;/*目的IP地址*/

u_long dmask;/*目的子网掩码*/

u_short hsp;/*源端口号结束值*/

u_short lsp;/*源端口号起始值*/

u_short hdp;/*目的端口号结束值*/

u_short ldp;/*目的端口号起始值*/

u_int32_t flags; /*流向记录*/

struct_RuleTreeNode*right;/*指向下一攻击特征*/

OptTreeNode*down;/*指向描述这条攻击特征的选项链*/

}RuleTreeNode;额外的一些选项

代码语言:javascript复制typedef struct_OptTreeNode /*特征选项结点*/

{

OptFpList opt_func;/*检测函数*/

Void*ds_list;/*在系统中增加插件时需增加的各类数据指针*/

int chain_node_number;/*选项结点个数*/

int type;/*告警类型,alert,log,or pass*/

…;

char*message;/*告警信息*/

struct_OptTreeNode*next;/*指向下一选项结点*/

struct_RuleTreeNode*rtn ;/*指向规则头结点RTN*/

}OptTreeNode;Rule Match

snort2.9版本中用到了单模算法和多模算法,其中一个典型的接口如下:int mSearch(const char *, int, const char *, int, int *, int *),用以匹配特定字段;

代码语言:javascript复制/*

* Pattern Matching Methods

*/

//#define MPSE_MWM 1

#define MPSE_AC 2

//#define MPSE_KTBM 3

#define MPSE_LOWMEM 4 //---------- 利用Trie树

//#define MPSE_AUTO 5

#define MPSE_ACF 6

#define MPSE_ACS 7

#define MPSE_ACB 8

#define MPSE_ACSB 9

#define MPSE_AC_BNFA 10 //----------- 基于NFA状态机的AC算法

#define MPSE_AC_BNFA_Q 11 //----------- 基于NFA状态机的AC算法

#define MPSE_ACF_Q 12

#define MPSE_LOWMEM_Q 13 //----------- 利用Trie树

#ifdef INTEL_SOFT_CPM

#define MPSE_INTEL_CPM 14 //----------- intel硬件加速

#endif /* INTEL_SOFT_CPM */报警输出Code Structure

序号

模块名称

源文件名称

备注

1

主控模块

snort.c/plugbase.c

snort.c为主控模块,plugbase.c完成插件的管理和服务功能

2

解码模块

decode.c

完成解码过程,将网络数据包解码成snort定义的Packet结构体,用于后续分析

3

规则模块

rules.c/parser.c

rules.c完成与规则相关工作,parser.c完成相关辅助工作

4

预处理模块

spp_xxx.c/...

预处理模块均以spp开头,template/spptemplate.c与spptemplate.h定义了具体处理模块的模板

5

处理插件模块

sp_xxx.c/...

处理模块均以sp开头,template/sptemplate.c与spptemplate.h定义了具体处理模块的模板

6

输出插件模板

spo_xxx.c/...

输出模块均以spo开头,模板参照预处理模板

7

日志模块

log.c

与日志有关的功能

8

辅助模块

ubi_BinTree.c

完成一些辅助功能,例如ubi_BinTree.c实现了一个简单二叉树

(1)规则处理模块

代码语言:javascript复制rules.h定义了生成二维规则链表的各种类型变量的数据结构。

parser.c(h)规则解析。

detect.c(h)处理规则部信息,构造规则链表。

pcrm.c(h)构造快速匹配的规则链表的辅助函数。

fpcreate.c(h)构造快速匹配的规则链表。

fpdetect.c(h)用于快速规则匹配检测。(2)预处理插件模块

代码语言:javascript复制保存在\preprocessors子目录中的文件。实现http解码、数据包分片检查和端口扫描检测等。(3)处理插件模块

代码语言:javascript复制保存在\detection-plugins子目录中的文件。实现不同类型的检测规则。

可以很容易的从文件名得知所实现的规则,例如:spdsizecheck.c针对的是包的数据大小,

sp_icmp_type_check.c针对的是ICMP包的类型,sp_tcp_flag_check.c针对的是TCP包的标志位,

还有规则选项的模式匹配文件spalem_match.c等等。(4)输出插件模块

代码语言:javascript复制保存在\output-plugins子目录中的文件。实现输出规则,以不同的方式记录事件。

例如:yslog,tcpdump等(5)日志模块

代码语言:javascript复制log.c(h)实现日志和报警功能。(6)辅助模块

代码语言:javascript复制ubiBinTree.c(h)实现一个简单的二叉树。 ubi_SplayTree.c(h)实现了一个伸展的二叉树和相关的功能。

tag.c(h)实现与tag有关的高级日志操作。 vmstring.c(h)实现字符串匹配Boyer-Moore算法。

strlcatu.c(h)文件只有一个函数strlcat(dst,src,siz),实现把src字符串追加到dst的后面,

siz用来限定dst的最终长度。 strlcpyu.c(h)文件只有一个函数strlcpy(dst,src,siz),

实现把src字符串拷贝到dst,siz用来限定复制的长度。 snprintf.c(h)定义了一些增强的输出函数,

由configure决定是否使用。 codes.c(h)定义了unicode_entry结构以及unicode_entry类型的数组。

unicode_data,该数组包含了建立unicode与ASCII码之间的映射所需的数据。

debug.c(h)定义了debug的级别和GetDebugLevel函数获取相应得Debug级别,

DebugMessageFunc函数确认Debug参数变量的格式化输出Reference

Network Intrusion Detection & Prevention System

snort源码分析之一:规则模块_wenze123的博客-CSDN博客

[1]刘红阳. 基于Snort的工业控制系统入侵检测系统设计[D].北方工业大学,2019.

Copyright © 2022 ZGC网游最新活动_热门游戏资讯_玩家互动社区 All Rights Reserved.