百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

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

yuyutoo 2025-03-19 03:58 4 浏览 0 评论

二开背景

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) memcpytmp data end-len len else memcpytmp data end-len 1024 strncatres tmp4096 strncatres \n\04096 return 1 int detectenginecontentinspectiondetectenginectx 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会导致打印不全。

相关推荐

ETCD 故障恢复(etc常见故障)

概述Kubernetes集群外部ETCD节点故障,导致kube-apiserver无法启动。...

在Ubuntu 16.04 LTS服务器上安装FreeRADIUS和Daloradius的方法

FreeRADIUS为AAARadiusLinux下开源解决方案,DaloRadius为图形化web管理工具。...

如何排查服务器被黑客入侵的迹象(黑客 抓取服务器数据)

---排查服务器是否被黑客入侵需要系统性地检查多个关键点,以下是一份详细的排查指南,包含具体命令、工具和应对策略:---###**一、快速初步检查**####1.**检查异常登录记录**...

使用 Fail Ban 日志分析 SSH 攻击行为

通过分析`fail2ban`日志可以识别和应对SSH暴力破解等攻击行为。以下是详细的操作流程和关键分析方法:---###**一、Fail2ban日志位置**Fail2ban的日志路径因系统配置...

《5 个实用技巧,提升你的服务器安全性,避免被黑客盯上!》

服务器的安全性至关重要,特别是在如今网络攻击频繁的情况下。如果你的服务器存在漏洞,黑客可能会利用这些漏洞进行攻击,甚至窃取数据。今天我们就来聊聊5个实用技巧,帮助你提升服务器的安全性,让你的系统更...

聊聊Spring AI Alibaba的YuQueDocumentReader

序本文主要研究一下SpringAIAlibaba的YuQueDocumentReaderYuQueDocumentReader...

Mac Docker环境,利用Canal实现MySQL同步ES

Canal的使用使用docker环境安装mysql、canal、elasticsearch,基于binlog利用canal实现mysql的数据同步到elasticsearch中,并在springboo...

RustDesk:开源远程控制工具的技术架构与全场景部署实战

一、开源远程控制领域的革新者1.1行业痛点与解决方案...

长安汽车一代CS75Plus2020款安装高德地图7.5

不用破解原车机,一代CS75Plus2020款,安装车机版高德地图7.5,有红绿灯读秒!废话不多讲,安装步骤如下:一、在拨号状态输入:在电话拨号界面,输入:*#518200#*(进入安卓设置界面,...

Zookeeper使用详解之常见操作篇(zookeeper ui)

一、Zookeeper的数据结构对于ZooKeeper而言,其存储结构类似于文件系统,也是一个树形目录服务,并通过Key-Value键值对的形式进行数据存储。其中,Key由斜线间隔的路径元素构成。对...

zk源码—4.会话的实现原理一(会话层的基本功能是什么)

大纲1.创建会话...

Zookeeper 可观测性最佳实践(zookeeper能够确保)

Zookeeper介绍ZooKeeper是一个开源的分布式协调服务,用于管理和协调分布式系统中的节点。它提供了一种高效、可靠的方式来解决分布式系统中的常见问题,如数据同步、配置管理、命名服务和集群...

服务器密码错误被锁定怎么解决(服务器密码错几次锁)

#服务器密码错误被锁定解决方案当服务器因多次密码错误导致账户被锁定时,可以按照以下步骤进行排查和解决:##一、确认锁定状态###1.检查账户锁定状态(Linux)```bash#查看账户锁定...

zk基础—4.zk实现分布式功能(分布式zk的使用)

大纲1.zk实现数据发布订阅...

《死神魂魄觉醒》卡死问题终极解决方案:从原理到实战的深度解析

在《死神魂魄觉醒》的斩魄刀交锋中,游戏卡死犹如突现的虚圈屏障,阻断玩家与尸魂界的连接。本文将从技术架构、解决方案、预防策略三个维度,深度剖析卡死问题的成因与应对之策,助力玩家突破次元壁障,畅享灵魂共鸣...

取消回复欢迎 发表评论: