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

news2024/10/8 17:15:34

二开背景

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会导致打印不全。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python精神病算法和自我认知异类数学模型

&#x1f3af;要点 &#x1f3af;空间不确定性和动态相互作用自我认知异类模型 | &#x1f3af;精神病神经元算法推理 | &#x1f3af;集体信念催化个人行动力数学模型 | &#x1f3af;物种基因进化关系网络算法 | &#x1f3af;电路噪声低功耗容错解码算法 &#x1f4dc;和-…

下载设计免抠元素,就上这6个网站,免费下载!

寻找免费PNG免抠素材网站是创意设计者们探索的重要一环。这些网站提供了丰富的PNG格式素材&#xff0c;去除了背景&#xff0c;方便在不同项目中使用。精心挑选了6个免费PNG免抠素材网站&#xff0c;它们提供了高品质的素材资源&#xff0c;无论是个人设计还是商业项目&#xf…

Jetson-AGX-Orin 非docker环境源码编译安装CyberRT

Jetson-AGX-Orin 非docker环境源码编译安装CyberRT 1、安装依赖 sudo apt update sudo apt-get install g gdb gcc cmake sudo apt install libpoco-dev uuid-dev libncurses5-dev python3-dev python3-pip python3 -m pip install protobuf3.14.02、下载CyberRT源码 git cl…

从0开始的STM32HAL库学习4

对射式红外传感器计数复现 配置工程 我们直接复制oled的工程&#xff0c;但是要重命名。 将PB14设置为中断引脚 自定义命名为sensorcount 设置为上升沿触发 打开中断 配置NVCI 都为默认就可以了 修改代码 修改stm32f1xx_it.c 文件 找到中断函数并修改 void EXTI15_10_I…

mp3文件导入音乐乱码

在网上下载了beyond的mp3文件&#xff0c;发现看起来没问题&#xff0c;一旦加入到音乐软件就会乱码&#xff0c;看起来说因为音乐文件加载到元数据 思路参考了这个文章 解决Mac电脑音乐显示歌名的乱码问题_音频文件乱码-CSDN博客 不过这个只能解决名称乱码&#xff0c;我发…

Kodcloud可道云安装与一键发布上线实现远程访问详细教程

文章目录 1.前言2. Kodcloud网站搭建2.1. Kodcloud下载和安装2.2 Kodcloud网页测试 3. cpolar内网穿透的安装和注册4. 本地网页发布4.1 Cpolar云端设置4.2 Cpolar本地设置 5. 公网访问测试6.结语 1.前言 本文主要为大家介绍一款国人自研的在线Web文件管理器可道云&#xff0c;…

前端新手小白的React入坑指南

有个小伙伴跟我说&#xff0c;已经毕业了&#xff0c;开始实习了。但公司现在用的还是Vue&#xff0c;领导说是过段时间让他用React做项目&#xff0c;先自己学习起来。 我给他找了一些文档&#xff0c;顺便着呢&#xff0c;反正自己也写博客&#xff0c;自己也写一份吧&#x…

共集电极放大器+共基极放大器+放大器参数总结+单片机(全局/静态/动态变量+LED点阵初识+点亮LED并显示图形)

2024-7-11&#xff0c;星期四&#xff0c;18:38&#xff0c;天气&#xff1a;雨&#xff0c;心情&#xff1a;晴。终于下雨了&#xff0c;感受到了久违的凉爽&#xff0c;没有什么特殊的事情发生&#xff0c;继续学习啦&#xff0c;加油加油&#xff01;&#xff01;&#xff0…

君子签电子合同推动企业人事管理变革,降本提效

在日益复杂的人力资源管理领域&#xff0c;合同签署与管理成为HR面临的一大挑战。面对庞大的合同量、繁琐的审批流程、频繁的岗位变动以及离职时的合同管理难题&#xff0c;传统方式已难以满足高效、安全、合规的需求。 君子签针对HR面临的挑战和需求&#xff0c;打造智能合同…

如何定量选择孔销基准?-DTAS来帮你!

在当今快速发展的工程领域&#xff0c;公差仿真的作用日渐重要&#xff0c;在公差仿真中&#xff0c;基准体系的选择对于最终结果更是至关重要。基准体系不同可能导致仿真过程中的参数计算、误差分析以及最终的工程设计都有所不同。基准体系作为评估和比较的参照&#xff0c;直…

专业模板,轻松打造个性化产品册

​在当今竞争激烈的市场环境中&#xff0c;如何让你的产品在众多竞品中脱颖而出&#xff0c;吸引消费者的目光&#xff1f;专业模板为您提供了解决方案。通过轻松打造个性化产品册&#xff0c;让您的产品焕发出独特的魅力&#xff0c;赢得消费者的青睐。本文将结合实际案例和数…

C++中的虚函数:深入探究多态性

目录 ​编辑 引言 虚函数基础 纯虚函数与抽象类 虚函数与多态 虚析构函数 结论 引言 在C中&#xff0c;虚函数是实现多态性的关键机制&#xff0c;它允许我们编写更为灵活和可扩展的代码。通过虚函数&#xff0c;派生类可以提供不同的实现&#xff0c;而基类指针或引用…

面对频繁紧急修复,测试人员5大应对技巧!

频繁的紧急修复问题&#xff0c;经常会过多占用测试时间&#xff0c;影响正常测试周期和回归测试的完整性&#xff0c;不利于测试效率和质量的提高。因此为了更高效地处理此问题&#xff0c;测试人员可以采取以下5大策略来应对&#xff0c;以减少此类问题的发生并提高工作效率。…

王老师 linux c++ 通信架构 笔记(二)配置服务器为固定的 ip 地址、远程登录、安装 gcc g++ 与虚拟机文件夹共享

&#xff08;7&#xff09;本条目开始配置 linux 的固定 ip 地址&#xff0c;以作为服务器使用&#xff1a; 首先解释 linux 的网口编号&#xff1a; linux 命令 cd &#xff1a; change directory 改变目录。 ls &#xff1a; list 列出某目录下的文件 根目录文件名 / etc &a…

链接服务器“XX”的OLEDB访问接口“MSOLEDBSQL”返回了消息“登录超时已过期” 解决方法

目录 1. 问题所示2. 原理分析3. 解决方法1. 问题所示 出现如下问题: 与链接服务器的测试连接失败。执行Transact-SQL 语句或批处理时发生了异常。命名管道提供程序:无法打开与SQL SERVER的链接[53]链接服务器“XX”的OLEDB访问接口“MSOLEDBSQL”返回了消息“登录超时已过期…

CV06_Canny边缘检测算法和python实现

1.1简介 Canny边缘检测算法是计算机视觉和图像处理领域中一种广泛应用的边缘检测技术&#xff0c;由约翰F坎尼&#xff08;John F. Canny&#xff09;于1986年提出。它是基于多级处理的边缘检测方法&#xff0c;旨在实现以下三个优化目标&#xff1a; 好的检测&#xff1a;尽…

如何录制屏幕视频?4款软件,轻松录屏

在数字化飞速发展的时代&#xff0c;如何录制屏幕视频已经成为我们工作、学习和娱乐中不可省略的一个重要问题。无论是制作教学教程还是录制游戏视频等&#xff0c;屏幕视频录制都为我们提供了极大的便利。今天&#xff0c;就让我们一起探索如何录制屏幕视频的精彩方式&#xf…

记录文字视差背景学习

效果图 文字背景会随鼠标上下移动变成红色或透明 html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><titl…

Hydra

Intro Hydra是一个用来动态创建配置的python开源框架&#xff0c;使做研究和复杂的应用更便利&#xff0c;配置信息可以通过配置文件或者运行参数来覆盖。Hydra的名字来源于其可以运行多个相似任务&#xff0c;就像Hydra&#xff08;九头蛇&#xff09;有多个头一样。 Run 安…

初学51单片机之UART串口通信

CSDN其他博主的博文&#xff08;自用&#xff09;嵌入式学习笔记9-51单片机UART串口通信_51uart串口通讯-CSDN博客 CSDN其他博主的博文写的蛮好&#xff0c;如果你想了解51单片机UART串口可以点进去看看&#xff1a; UART全称Universal Asynchronous Receiver/Transmitter即通…