suricata提供了组件式的开发方式,在SigTableSetup注册所有规则关键字。
通过接口可以看出,sigmatch_table变量为所有规则关键字的实例(可以作为gdb的调试参数)
文件
规则关键字的编译文件命名格式detect-xx.c detect-xx.h
生成文件
下载对应suricata主干版本的工具,本教程使用4.1.x版本,github地址: https://github.com/OISF/suricata/tree/master-4.1.x
解压完成后的路径结构
scripts目录里就有生成关键字和协议的脚本,我们执行工具+关键字(自己diy)名称
/bin/bash scripts/setup-simple-detect.sh test |
结果是这样的代表成功,让我们编译即可。
我们把生成的文件拿到编译环境中(这里生成后,也可以在script版本中使用,因为他是裁剪的所以我还是用主干)
这是生成的文件
复制进我们自己编译环境的src目录中。
编译
如何生效模板(成功编译)
- Makefile编译:src/Makefile 向am_suricata_OBJECTS成员中加入生成的文件
- 新增规则ID:每个规则拥有自己的index存在于sigmatch_table这个线性表里面。坐标声明在detect-engine-register.h文件中。加入DETECT_TEST宏
- 注册接口:在detect-engine-register.c中加入生成文件关键字的注册接口
在这里还要添加对应头文件
编译
在src目录执行make即可
开发
注册接口
/** /* set up the PCRE for keyword parsing */ |
接口实现对关键字基本信息的注册,在上面存在:
关键字 |
test |
功能描述 |
desc |
使用教程 |
url |
数据包匹配 |
Match |
初始化 |
Setup |
回收 |
Free |
测试内容() |
RegisterTests |
正则模块适配() |
DetectSetupParseRegexes(PARSE_REGEX, &parse_regex, &parse_regex_study); |
对于SigTableElmt结构还存在其他的功能,将在本篇文章中一同介绍
应用数据匹配 |
AppLayerTxMatch |
文件匹配 |
FileMatch |
??? |
Transform |
从上得出结论,每个检测关键字提供了三个检测功能,分别为数据包匹配,协议流匹配,和文件匹配
- 数据包匹配:每个数据包都会被规则提供的Match回调接口处理。
数据包匹配
这个匹配接口实现,数据包负载部分首尾值匹配,匹配条件取决于规则中给出的首尾10进制内容。
static int DetectTestMatch (ThreadVars *t, DetectEngineThreadCtx *det_ctx, Packet *p, if (PKT_IS_IPV4(p)) { return ret; |
测试
查看默认规则位置,打开suricata.yaml文件,找到rules部分,追加test.rules
在对应位置创建test.rules文件并编辑规则内容
alert tcp any any -> any any (msg:"Detect www in payload"; content:"http"; test:104,110; sid:1000001;) |
这个规则的含义,数据包中存在连续ascll值http内容,且tcp首尾值10进制为104,110
准备pcap文件且存在首尾值 内容都符合规则的包
运行
以af-packet模式运行suricata
suricata -c suricata.yaml --af-packet |
验证
监视fast.log文件,查看告警状态
数据流匹配
以后更新
文件匹配
以后更新