介绍
suricata所有的协议都是通过向框架(AppLayerParserRegisterProtocolParsers)提供注册回调完成的。
开发一个新的协议,按照相同结构格式完成即可。
一、编写协议解析文件
suricata可以通过工具脚本执行直接生成协议解析文件,文章使用的suricata 4.1.3版本。那么下载同版本工具,工具我已经clone一份到我的git了,default 分支为4.1x版本
git clone https://github.com/Liuchunhui0526/suricata-1.git
下载完成放在系统路径下并完成解压,解压后的内容是
1、生成协议解析文件
在工具路径执行
python scripts/setup-app-layer.py Liu |
成功生成对应协议文件
两个文件生成在工具文件下的src目录,手动把文件提出来放在suricata4.1.3编译环境即可
scp ../../suricata-1-master-4.1.x/src/app-layer-liu.* . |
2、分析生成的文件内容
生成的c文件,RegisterxxxParsers接口就是用来提供给框架的注册接口。
2.1、suricata.yaml配置文件中是否存在协议且enable
suricata.yaml配置文件app-layer部分存在对应使能配置
2.2、协议注册
suricata协议解析存在PM、PP、PE三种模式,其中PM为数据报关键特征匹配,即匹配报文字段(类似规则中的content字段),PP为端口匹配,即服务器目的端口值匹配命中即确定为协议,最后一个PE为字节流匹配,目前常规只有FTP-DATA协议,其协议会根据FTP commend计算并创建紧跟的子协议。
本篇文章以工具生成内容介绍,默认为PP模式注册;
RunmodeIsUnittests这个不重要,判断系统以什么模式启动,这里判断是否为测试状态。
AppLayerProtoDetectPPParseConfPorts这个接口作用是判断yaml配置文件中“liu”这个协议是否存在默认端口号,如果类似存在443,则以配置文件设置的端口为准,不通过AppLayerProtoDetectPPRegister注册。(AppLayerProtoDetectPPRegister这个接口的作用是注册了一个服务器方向匹配LIU_DEFAULT_PORT端口的规则,还附加了最小有效长度为LIU_MIN_FRAME_LEN:即小于LIU_MIN_FRAME_LEN长度就默认不是这个协议)
2.3、协议处理接口注册
当一条流量被解析成对应的协议,在双边流量经过设备时,需要通过每方向的处理逻辑进行检测或信息搜集。
可以看到这里注册了很多的回调,用于框架不同功能和阶段。本篇文章,只简单使用双边处理接口,其他接口在协议开发后续章节提供。
2.4、双边数据包接口
请求处理接口实现的是将数据包payload部分,放进一块申请的空间中;如果遇到长度大于0且首位值为0的数据包,就产生事件
static int LiuParseRequest(Flow *f, void |