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

作者:于顾而言
版权:本文版权归作者所有
转载:欢迎转载,但未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任

What is Snort

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

Architecture

在这里插入图片描述

  • 解码器:将捕获的数据包解码后存放到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等

在这里插入图片描述
在这里插入图片描述

//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;


在这里插入图片描述

//五元组+上下行
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;

规则匹配:2.9版本中用到了单模算法和多模算法

单模算法即BM算法,在mstring.c和mstring.h里,其中一个典型的接口如下: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 */报警输出
  • 报警输出:将检测引擎处理后的数据包送到系统日志文件或产生告警。日志文件可以是ascii格式或者tcpdump的二进制格式或到数据库中,当然有输出模块也是以插件形式,用户可定制按需定制

Code Structure

序号模块名称源文件名称备注
1主控模块snort.c/plugbase.csnort.c为主控模块,plugbase.c完成插件的管理和服务功能
2解码模块decode.c完成解码过程,将网络数据包解码成snort定义的Packet结构体,用于后续分析
3规则模块rules.c/parser.crules.c完成与规则相关工作,parser.c完成相关辅助工作
4预处理模块spp_xxx.c/…预处理模块均以spp开头,template/spp_template.c与spp_template.h定义了具体处理模块的模板
5处理插件模块sp_xxx.c/…处理模块均以sp开头,template/sp_template.c与spp_template.h定义了具体处理模块的模板
6输出插件模板spo_xxx.c/…输出模块均以spo开头,模板参照预处理模板
7日志模块log.c与日志有关的功能
8辅助模块ubi_BinTree.c完成一些辅助功能,例如ubi_BinTree.c实现了一个简单二叉树
  • 规则处理模块

    rules.h定义了生成二维规则链表的各种类型变量的数据结构。
    parser.c(h)规则解析。
    detect.c(h)处理规则部信息,构造规则链表。
    pcrm.c(h)构造快速匹配的规则链表的辅助函数。
    fpcreate.c(h)构造快速匹配的规则链表。
    fpdetect.c(h)用于快速规则匹配检测。
    
  • 预处理插件模块

    保存在\preprocessors子目录中的文件。实现http解码、数据包分片检查和端口扫描检测等。
    
  • 处理插件模块

    保存在\detection-plugins子目录中的文件。实现不同类型的检测规则。可以很容易的从文件名得知所实现的规则,例如:spdsizecheck.c针对的是包的数据大小,sp_icmp_type_check.c针对的是ICMP包的类型,sp_tcp_flag_check.c针对的是TCP包的标志位,还有规则选项的模式匹配文件spalem_match.c等等。
    
  • 输出插件模块

    保存在\output-plugins子目录中的文件。实现输出规则,以不同的方式记录事件。例如:yslog,tcpdump等。
    
  • 日志模块

    log.c(h)实现日志和报警功能。
    
  • 辅助模块

    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

  • 28
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

于顾而言

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值