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會導致打印不全。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/44992.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/44992.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/44992.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

強制升級最新系統,微軟全面淘汰Win10和部分11用戶

說出來可能不信&#xff0c;距離 Windows 11 正式發布已過去整整三年時間&#xff0c;按理說現在怎么也得人均 Win 11 水平了吧&#xff1f; 然而事實卻是&#xff0c;三年時間過去 Win 11 占有率僅僅突破到 29%&#xff0c;也就跳起來摸 Win 10 屁股的程度。 2024 年 6 月 Wi…

【Linux】磁盤性能壓測-FIO工具

一、FIO工具介紹 fio&#xff08;Flexible I/O Tester&#xff09;是一個用于評估計算機系統中 I/O 性能的強大工具。 官網&#xff1a;fio - fio - Flexible IO Tester 注意事項&#xff01; 1、不要指定文件系統名稱&#xff08;如/dev/mapper/centos-root)&#xff0c;避…

react啟用mobx @decorators裝飾器語法

react如果沒有經過配置&#xff0c;直接使用decorators裝飾器語法會報錯&#xff1a; Support for the experimental syntax ‘decorators’ isn’t currently enabled 因為react默認是不支持裝飾器語法&#xff0c;需要做一些配置來啟用裝飾器語法。 step1: 在 tsconfig.js…

【學術會議征稿】第三屆能源互聯網及電力系統國際學術會議(ICEIPS 2024)

第三屆能源互聯網及電力系統國際學術會議&#xff08;ICEIPS 2024&#xff09; 2024 3rd International Conference on Energy Internet and Power Systems 能源互聯網是實現新一代電力系統智能互動、開放共享的重要支撐技術之一&#xff0c;也是提升能源調度效率&#xff0…

SQL 存儲過程

SQL&#xff08;Structured Query Language&#xff09;的存儲過程&#xff08;Stored Procedure&#xff09;是一組為了完成特定功能的SQL語句集&#xff0c;它經編譯后存儲在數據庫中&#xff0c;用戶通過指定存儲過程的名字并給它傳遞參數&#xff08;如果有的話&#xff09…

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…

【代碼隨想錄算法訓練Day65】卡碼網47.參加科學大會、卡碼網94. 城市間貨物運輸 I

Day65 圖論第九天 卡碼網47.參加科學大會 #include <iostream> #include <vector> #include <list> #include <queue> #include <climits> using namespace std; // 小頂堆 class mycomparison { public:bool operator()(const pair<int, …

Android Studio gradle下載失敗?!

Android Studio安裝后第一個工程&#xff0c;往往要下載gradle&#xff0c;而gradle的下載有的時候很慢&#xff0c;可以將下載好的gradle-x.x.x-all.zip放到指定目錄下&#xff1a; Windows下路徑&#xff1a; C:\Users\你的用戶名\.gradle\wrapper\dist\gradle-x.x.x-all\**…

python+pygame實現五子棋人機對戰之三

上回講過&#xff1a; pythonpygame實現五子棋人機對戰之一 pythonpygame實現五子棋人機對戰之二 界面已經有了&#xff0c;并且可以支持鼠標操作選擇菜單和人機對戰開始下棋了&#xff0c;那電腦是如何應手落子呢&#xff1f;以下內容是通用的類&#xff0c;全部放在utils.…

LiteOS 多線程編程

? 鴻蒙系統的多線程編程步驟&#xff1a; 1. 描述要創建的線程的屬性配置. attr: attributeosThreadAttr_t attr;//聲明一個線程屬性變量memset(&attr, 0, sizeof(attr));//memset改變一個內存單元上存的值為0//以下三個為必須設置的線程屬性attr.name "ledThread&q…

全球高端銷量第一 凱迪仕智能鎖建博會獲重磅大獎再次遙遙領先

2024年7月11日&#xff0c;第26屆中國廣州建博會圓滿落幕。Kaadas凱迪仕第11年受邀參展&#xff0c;憑借超吸睛的賽博風展館和重磅旗艦傳奇大師K70系列智能鎖震撼亮相&#xff0c;吸引抖音網紅云集打卡直播以及眾多主流及行業媒體聚集報道。在大家居建裝行業全球第一展的舞臺上…

問題清除指南|Dell OptiPlex 7070 升級 win11 開啟 TPM 2.0 教程

前言&#xff1a;最近想把實驗室臺式機的系統從 Windows 10 升級到 Windows 11&#xff0c;遇到一點小問題&#xff0c;在此記錄一下解決辦法。 ?? 注&#xff1a;本教程僅在 Dell OptiPlex 7070 臺式機系統中測試有效&#xff0c;并不保證其余型號機器適用此教程。 參考鏈接…

中國科學院地理所牛書麗團隊《Global Change Biology 》最新成果!

本文首發于“生態學者”微信公眾號&#xff01; 在全球氣候變化的背景下&#xff0c;干旱地區的擴張對生態系統的氮循環產生了深遠影響。氮同位素&#xff08;δ15N&#xff09;的天然豐度&#xff0c;尤其是土壤中的δ15N&#xff0c;是評估陸地生態系統氮循環動態和氮限制的關…

【ARMv8/v9 GIC 系列 1.7 -- GIC PPI | SPI | SGI | LPI 中斷使能配置概述】

請閱讀【ARM GICv3/v4 實戰學習 】 文章目錄 GIC 各種中斷使能配置PPIs(每個處理器私有中斷)SPIs(共享外設中斷)SGIs(軟件生成的中斷)LPIs(局部中斷)GIC 各種中斷使能配置 在ARM GICv3和GICv4架構中,不同類型的中斷(如PPIs、SPIs、SGIs和LPIs)可以通過不同的方式進…

分享:2024好的ai文章生成器下載資源 tzqsbic

在當今數字化的時代&#xff0c;ai技術的發展日新月異&#xff0c;為我們的生活和工作帶來了諸多便利。其中&#xff0c;ai文章生成器作為一項創新的工具&#xff0c;給當代人們帶來了很多好處&#xff0c;尤其是對于很多創作者&#xff0c;不僅能解決創作困難&#xff0c;而且…

【開發工具】webStrom2024版-永久使用

1、解壓文件 2、安裝步驟 先執行unistall-current-user.vbs&#xff0c;確保當前環境變量下沒有歷史使用記錄。再執行install-current-user.vbs。運行的時候&#xff0c;會有第一個彈窗&#xff0c;點擊確定&#xff0c;稍微等待一會&#xff0c;會出現 Done 的彈窗&#xff0…

【Linux】進程間通信之System V共享內存

&#x1f466;個人主頁&#xff1a;Weraphael ?&#x1f3fb;作者簡介&#xff1a;目前正在學習c和算法 ??專欄&#xff1a;Linux &#x1f40b; 希望大家多多支持&#xff0c;咱一起進步&#xff01;&#x1f601; 如果文章有啥瑕疵&#xff0c;希望大佬指點一二 如果文章對…

Prometheus+Grafana監控Linux主機

1、安裝Prometheus 1.1 、下載Prometheus 下載網址 https://github.com/prometheus/prometheus/releases選擇需要的版本 wget https://github.com/prometheus/prometheus/releases/download/v2.53.0/prometheus-2.53.0.linux-amd64.tar.gz1.2、安裝Prometheus軟件 1.2.1、…

解決鴻蒙開發中克隆項目無法簽名問題

文章目錄 問題描述問題分析解決方案 問題描述 在一個風和日麗的早晨&#xff0c;這是我學習鴻蒙開發的第四天&#xff0c;把文檔過了一遍的我準備看看別人的項目學習一下&#xff0c;于是就用git去clone了一個大佬的開源項目&#xff0c;在簽名的時候遇到了問題&#xff1a; h…

在攻防演練中遇到的一個“有馬蜂的蜜罐”

在攻防演練中遇到的一個“有馬蜂的蜜罐” 有趣的結論&#xff0c;請一路看到文章結尾 在前幾天的攻防演練中&#xff0c;我跟隊友的氣氛氛圍都很好&#xff0c;有說有笑&#xff0c;恐怕也是全場話最多、笑最多的隊伍了。 也是因為我們遇到了許多相當有趣的事情&#xff0c;其…