What is Snort
snor组织架构
Rule Config
snort的规则是采用多维链表的形式进行存储,各个维度包括action,protocol,五元组,option:
snort规则组织的数据结构
检测到采取的动作分类
//5种动作分类
typedef struct _RuleListNode
{
ListHead *RuleList; /* 指向ListHead结点*/
int mode; /* 规则链结点类型*/
int rval; /*标记位*/
int evalIndex; /* 规则编号*/
char *name; /* 规则链名*/
struct _RuleListNode *next; /*下一个规则链结点*/
} RuleListNode;
协议
//4种协议
typedef struct _ListHead
{
RuleTreeNode *IpList; /*指向IP规则树结点*/
RuleTreeNode *TcpList; /*指向IP规则树结点*/
RuleTreeNode *UdpList; /*指向IP规则树结点*/
RuleTreeNode *IcmpList; /*指向IP规则树结点*/
} ListHead;
五元组+上下行
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;
额外的一些选项
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 *),用以匹配特定字段;
/*
* 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)规则处理模块
rules.h定义了生成二维规则链表的各种类型变量的数据结构。
parser.c(h)规则解析。
detect.c(h)处理规则部信息,构造规则链表。
pcrm.c(h)构造快速匹配的规则链表的辅助函数。
fpcreate.c(h)构造快速匹配的规则链表。
fpdetect.c(h)用于快速规则匹配检测。
(2)预处理插件模块
保存在\preprocessors子目录中的文件。实现http解码、数据包分片检查和端口扫描检测等。
(3)处理插件模块
保存在\detection-plugins子目录中的文件。实现不同类型的检测规则。
可以很容易的从文件名得知所实现的规则,例如:spdsizecheck.c针对的是包的数据大小,
sp_icmp_type_check.c针对的是ICMP包的类型,sp_tcp_flag_check.c针对的是TCP包的标志位,
还有规则选项的模式匹配文件spalem_match.c等等。
(4)输出插件模块
保存在\output-plugins子目录中的文件。实现输出规则,以不同的方式记录事件。
例如:yslog,tcpdump等
(5)日志模块
log.c(h)实现日志和报警功能。
(6)辅助模块
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.
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。