Suricata引擎二次开发之命中规则定位

二开背景

suricata是一款高性能的开源网络入侵检测防御引擎,旨在检测、预防和应对网络中的恶意活动和攻击。suricata引擎使用多线程技术,能够快速、准确地分析网络流量并识别潜在的安全威胁,是众多IDS和IPS厂商的底层规则检测模块。

前段时间搭了个suricata引擎播包测试流量规则,发现原生的suricata引擎并不能获取规则匹配的位置、命中的字符串等信息。因suricata引擎并不会输出命中的信息,遂修改源码,改了命中详情(下文简称高亮)出来,今天想跟大家分享一下修改和使用的过程。

1、suricat编译安装

参考官方文档https://docs.suricata.io/en/suricata-6.0.0/install.html#install-advanced

先装库,装rust支持,装make

然后下载源码make

编译后的二进制程序在/src/.libs/suricata查看依赖库,然后补齐到默认so库目录中即可运行。

图片

2、vscode+gdb调试suricata环境搭建

然后就是装插件,除了必备的c语言插件全家桶之外还需要装GDB Debug这个插件。

接着任意新建一个运行配置。

图片

修改lauch.json为:

{    // Use IntelliSense to learn about possible attributes.    // Hover to view descriptions of existing attributes.    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387    "version": "0.2.0",    "configurations": [                {            "name": "(gdb) Launch",            "type": "cppdbg",            "request": "launch",            "program": "${fileDirname}/../src/.libs/suricata",
            //以下为监听网卡模式。            // "args": [            //     "-i", "ens33", "-c", "/home/lalala/Desktop/suricata/6/suricata.yaml", "-v", "-l","/home/lalala/Desktop/suricata/6/log6/","--runmode", "single"            // ],                        //以下为读包模式。            "args": [                "-r", "/home/lalala/Desktop/suricata/6/6-27/48040.pcap", "-c", "/home/lalala/Desktop/suricata/6/suricata.yaml", "-v", "-l","/home/lalala/Desktop/suricata/6/log6/","--runmode", "single"            ],            "stopAtEntry": true,            "cwd": "${fileDirname}",            "environment": [],            "externalConsole": false,            "MIMode": "gdb",            "setupCommands": [                {                    "description": "Enable pretty-printing for gdb",                    "text": "-enable-pretty-printing",                    "ignoreFailures": true                },                {                    "description": "Set Disassembly Flavor to Intel",                    "text": "-gdb-set disassembly-flavor intel",                    "ignoreFailures": true                }            ]        },            ]}

选择配置好的配置运行,看到断在入口,调试环境完成。

图片

3、suricata流程分析,寻找关键位置

图片

流程过于复杂,简单理解就是匹配和记录日志的地方是分在不同线程,但是又有结构体可以从匹配带到那里。

4、关键位置代码分析,获取高亮内容

根据流程,在初始化后慢慢摸索找到关键函数DetectEngineContentInspection

smd为传入规则,根据type的不同走不同的代码块儿匹配。本次加高亮重点关注CONTENT和PCRE这两个最常用的类型。

图片

CONTENT代码块里,重点在于这个found。分析得出最后两个else里都是命中。

图片

根据原字符串,偏移,长度即可组合出高亮字符串。

图片

f为flow结构体也就是会带到打印日志那边的结构体,在结构体中新加一个字符串,即可达成带数据到日志流程的目的。

图片

高亮函数代码:

static int Get_gaoliang(const char* data,u_int32_t end, u_int32_t len,char* res){    char tmp[1024] = "";        if (len<1024)    {        memcpy(tmp, data + end-len, len);    }else{        memcpy(tmp, data + end-len, 1024);    }    strncat(res, tmp,4096);    strncat(res, "\n\0",4096);    return 1;}

pcre同理,在命中流程中加入写高亮字符串即可。

图片

图片

5、高亮加到日志

高亮字符已经写入到了flow结构体。下一步就是在打印日志的时候读到,写出来。

最优先的当然是fastlog,因为fastlog本就是触发规则会进行输出的日志,且没有其他干扰。

从Packet结构体找到flow结构体找到其中的gaoliang字符串,打印即可。

图片

最终效果,fastlog会在正常展示命中的同时,讲高亮内容展示。

图片

6、修改汇总

汇总代码放在github 上链接https://github.com/webraybtl/suricata_gaoliang

修改文件详情:

> alert-fastlog.c

加打印

修改 AlertFastLogger

添加如下代码:

PrintBufferData(alert_buffer, &size, MAX_FASTLOG_ALERT_SIZE, "=========ruleid:%" PRIu32 "高亮字段展示=======:\n%s====================================\n",pa->s->id,p->flow->gaoliang);

> detect-engine-content-inspection.c

加Get_gaoliang函数

修改DetectEngineContentInspection函数 加入 写入高亮字符串逻辑。

static int Get_gaoliang(const char* data,u_int32_t end, u_int32_t len,char* res){     char tmp[1024] = "";          if (len<1024)     {         memcpy(tmp, data + end-len, len);     }else{         memcpy(tmp, data + end-len, 1024);     }     strncat(res, tmp,4096);     strncat(res, "\n\0",4096);     return 1; }    int DetectEngineContentInspection(DetectEngineCtx *de_ctx, DetectEngineThreadCtx *det_ctx,                                   const Signature *s, const SigMatchData *smd,                                   Packet *p, Flow *f,                                   const uint8_t *buffer, uint32_t buffer_len,                                   uint32_t stream_start_offset, uint8_t flags,                                   uint8_t inspection_mode) {     ...     ...     ...             if (found == NULL && !(cd->flags & DETECT_CONTENT_NEGATED)) {                 if ((cd->flags & (DETECT_CONTENT_DISTANCE|DETECT_CONTENT_WITHIN)) == 0) {                     /* independent match from previous matches, so failure is fatal */                     det_ctx->discontinue_matching = 1;                 }                  goto no_match;             } else if (found == NULL && (cd->flags & DETECT_CONTENT_NEGATED)) {                 goto match;             } else if (found != NULL && (cd->flags & DETECT_CONTENT_NEGATED)) {                 if(f){                 Get_gaoliang((char*)buffer,match_offset,cd->content_len,f->gaoliang);                  }                  SCLogInfo("content %"PRIu32" matched at offset %"PRIu32", but negated so no match", cd->id, match_offset);                 /* don't bother carrying recursive matches now, for preceding                  * relative keywords */                 if (DETECT_CONTENT_IS_SINGLE(cd))                     det_ctx->discontinue_matching = 1;                 goto no_match;             } else {                 match_offset = (uint32_t)((found - buffer) + cd->content_len);                 if(f){                     Get_gaoliang((char*)buffer,match_offset,cd->content_len,f->gaoliang);                     }      ...

> flow.h

flow结构体加一个gaoliang字符串成员。

typedef struct Flow_ {     ...     ...     ...          char gaoliang[4096];   } Flow; 

图片

遗留问题

1、因只开辟了4096字节存高亮字符,会有溢出。

2、直接按字符串打印展示出来的,对十六进制展示不理想,00会导致打印不全。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/792860.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

css实现每个小盒子占32%,超出就换行

代码 <div class"visitors"><visitor class"item" v-for"(user,index) in userArr" :key"user.id" :user"user" :index"index"></visitor></div><style lang"scss" scoped&…

openWrt(4) - uci

uci show 1) uci show - 查看所有配置文件列表 2)查看特定配置文件的详细信息&#xff1a; uci show network 我们以 network 为例 3&#xff09;查看特定配置项的详细信息&#xff1a; uci show network.wan 添加一个新的配置条目&#xff1a;uci add network interface …

STM32杂交版(HAL库、音乐盒、闹钟、点阵屏、温湿度)

一、设计描述 本设计精心构建了一个以STM32MP157A高性能单片机为核心控制单元的综合性嵌入式系统。该系统巧妙融合了蜂鸣器、数码管显示器、点阵屏、温湿度传感器、LED指示灯以及按键等多种外设模块&#xff0c;形成了一个功能丰富、操作便捷的杂交版智能设备。通过串口…

Android APT实战

Android开发中,注解平时我们用的比较多,也许我们会比较好奇,注解的背后是如何工作的,这篇文章帮大家一步步创建一个简单的注解处理器。 简介 APT(Annotation Processing Tool)即注解处理器,在编译的时候可以处理注解然后搞一些事情,也可以在编译时生成一些文件之类的。…

Linux 命令探秘:揭秘那些有趣的小命令

目录 1.发现隐藏在终端的惊喜小命令 2.小火车 1.安装EPEL 2.小火车出发准备 3.输入命令 3.linux_logo 1.安装linux_logo 2.输入命令 3.linux_logo介绍 4.牛讲话 1.安装命令 2.输入命令 5. figlet 1.安装命令 2.输入命令 “如果您在解决类似问题时也遇到了困…

stm32学习笔记---I2C通信协议(理论部分)

目录 串口通信协议和I2C通信协议的联系 同步和异步的区别 I2C通信 硬件电路 指定地址写的流程 当前地址读的流程 指定地址读的流程 声明&#xff1a;本专栏是本人跟着B站江科大的视频的学习过程中记录下来的笔记&#xff0c;我之所以记录下来是为了方便自己日后复习。如…

软航文档控件VUE示例运行及控件替换方法记录

目录 示例运行 步骤一、npm install 步骤二、npm run dev 软航文档控件替换 附 vue小白记录一下软航文档控件VUE示例的运行方法以及示例中控件的替换过程。 示例运行 在已经安装好VUE环境的电脑上&#xff0c;VUE环境部署可以参考另一篇&#xff1a;配置VUE环境过程中 …

数据结构复习计划之复杂度分析(时间、空间)

第二节&#xff1a;算法 时间复杂度和空间复杂度 算法(Algorithm)&#xff1a;是对特定问题求解方法(步骤)的一种描述&#xff0c;是指令的有限序列&#xff0c;其中每一条指令表示一个或多个操作。 算法可以有三种表示形式&#xff1a; 伪代码 自然语言 流程图 算法的五…

【正点原子i.MX93开发板试用连载体验】为什么模型不能运行在NPU上

本文最早发表于电子发烧友论坛&#xff1a;【新提醒】【正点原子i.MX93开发板试用连载体验】基于深度学习的语音本地控制 - 正点原子学习小组 - 电子技术论坛 - 广受欢迎的专业电子论坛! (elecfans.com) 昨天提到要使模型运行的NPU上&#xff0c;必须先将其量化。如果对没有量化…

编程零基础教程,从知道什么是前端开始

本文作者&#xff1a;程序员鱼皮 免费编程学习 - 编程导航网&#xff1a;https://www.code-nav.cn 鱼小皮&#xff1a;百哥&#xff0c;我想学编程&#xff0c;应该先学啥呢&#xff1f; 老百&#xff1a;小皮&#xff0c;怎么突然想学编程了&#xff0c;不会又是三分钟热度吧&…

vue学习day06-脚手架目录文件介绍与项目运行流程、组件化开发和根组件、普通组件的注册使用-局部注册、全局注册

16、脚手架目录文件介绍与项目运行流程 &#xff08;1&#xff09;脚手架目录文件介绍 &#xff08;2&#xff09;Index.html &#xff08;3&#xff09;Main.js 17、组件化开发和根组件 &#xff08;1&#xff09;组件化 1&#xff09;概念 一个页面可以拆分成一个个组件&am…

Spring源码二十二:Bean实例化流程五

上一篇Spring源码二十一&#xff1a;Bean实例化流程四&#xff0c;咱们主要分析里createBeanInstance方法Spring给我们提供给的FactoryMethod方法&#xff0c;举例说明了factoryMethod属性如何使用&#xff0c;同时简单讨论了具体实现逻辑。 这一篇咱们将进入反射实例化Bean&am…

MySQL的事务使用

文章目录 特点JDBC使用事务 特点 事务的基本属性ACID&#xff1a; 数据库事务的ACID特性是指保证数据库在执行事务操作时能够可靠和正确的四个基本属性。ACID是原子性&#xff08;Atomicity&#xff09;、一致性&#xff08;Consistency&#xff09;、隔离性&#xff08;Isol…

科研绘图之tSNE图

t-SNE&#xff08;t-Distributed Stochastic Neighbor Embedding&#xff0c;t分布随机邻域嵌入&#xff09;是一种用于数据降维和可视化的算法。它可以将高维数据映射到二维或三维空间&#xff0c;同时尽可能地保留数据点之间的局部关系。t-SNE特别适用于探索数据的内部结构和…

C语言 指针和数组——指针数组的应用:命令行参数

目录 命令行参数 演示命令行参数与main函数形参间的关系 命令行参数  什么是 命令行参数&#xff08; Command Line Arguments &#xff09;&#xff1f;  GUI 界面之前&#xff0c;计算机的操作界面都是字符式的命令行界面 &#xff08; DOS 、 UNIX 、 Linux &…

IEPE数据采集卡的作用说明

IEPE指的是一种自带电量放大器或电压放大器的加速度传感器。IEPE是压电集成电路的缩写。因为由加速度传感器产生的电量是很小的&#xff0c;因此传感器产生的电信号很容易受到噪声干扰&#xff0c;需要用灵敏的电子器件对其进行放大和信号调理。IEPE中集成了灵敏的电子器件使其…

连锁行业观察:一线门店设备如何运维?化“管理”为“服务”

连锁零售行业的数字化发展&#xff0c;离开不了大量智能设备的支撑&#xff0c;比如我们日常见到的各种门店互动终端、自助收银设备、无人值守售货机等等。 由于连锁行业的特性&#xff0c;这些设备往往位置分散&#xff0c;数量众多&#xff0c;难以集中管理。一旦这些设备遇…

ARM功耗管理之多核处理器启动

安全之安全(security)博客目录导读 思考&#xff1a;SecureBoot&#xff1f;多核处理器启动流程&#xff1f;PSCI启动方式&#xff1f; 一般嵌入式系统使用的都是对称多处理器&#xff08;Symmetric Multi-Processor, SMP&#xff09;系统&#xff0c;包含了多个cpu, 这几个cp…

YOLOv8改进 | 注意力机制| 对小目标友好的BiFormer【CVPR2023】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录 &#xff1a;《YOLOv8改进有效…

从零开始开发视频美颜SDK:实现直播美颜效果

因此&#xff0c;开发一款从零开始的视频美颜SDK&#xff0c;不仅可以节省成本&#xff0c;还能根据具体需求进行个性化调整。本文将介绍从零开始开发视频美颜SDK的关键步骤和实现思路。 一、需求分析与技术选型 在开发一款视频美颜SDK之前&#xff0c;首先需要进行详细的需求…