suricata规则 关键字开发应用

suricata提供了组件式的开发方式,在SigTableSetup注册所有规则关键字。

通过接口可以看出,sigmatch_table变量为所有规则关键字的实例(可以作为gdb的调试参数)

文件

规则关键字的编译文件命名格式detect-xx.c detect-xx.h

生成文件

下载对应suricata主干版本的工具,本教程使用4.1.x版本,github地址: https://github.com/OISF/suricata/tree/master-4.1.x

解压完成后的路径结构

scripts目录里就有生成关键字和协议的脚本,我们执行工具+关键字(自己diy)名称

/bin/bash scripts/setup-simple-detect.sh test

结果是这样的代表成功,让我们编译即可。

我们把生成的文件拿到编译环境中(这里生成后,也可以在script版本中使用,因为他是裁剪的所以我还是用主干)

这是生成的文件

复制进我们自己编译环境的src目录中。

编译

如何生效模板(成功编译)

  • Makefile编译:src/Makefile 向am_suricata_OBJECTS成员中加入生成的文件
  • 新增规则ID:每个规则拥有自己的index存在于sigmatch_table这个线性表里面。坐标声明在detect-engine-register.h文件中。加入DETECT_TEST宏
  • 注册接口:在detect-engine-register.c中加入生成文件关键字的注册接口

在这里还要添加对应头文件

        

编译

在src目录执行make即可

开发

注册接口

/**
 * rief Registration function for test: keyword
 *
 * This function is called once in the 'lifetime' of the engine.
 */
void DetectTestRegister(void) {
    /* keyword name: this is how the keyword is used in a rule */
    sigmatch_table[DETECT_TEST].name = "test";
    /* description: listed in "suricata --list-keywords=all" */
    sigmatch_table[DETECT_TEST].desc = "give an introduction into how a detection module works";
    /* link to further documentation of the keyword. Normally on the Suricata redmine/wiki */
    sigmatch_table[DETECT_TEST].url = "Suricata Developers Guide - Suricata - Open Information Security Foundation";
    /* match function is called when the signature is inspected on a packet */
    sigmatch_table[DETECT_TEST].Match = DetectTestMatch;
    /* setup function is called during signature parsing, when the test
     * keyword is encountered in the rule */
    sigmatch_table[DETECT_TEST].Setup = DetectTestSetup;
    /* free function is called when the detect engine is freed. Normally at
     * shutdown, but also during rule reloads. */
    sigmatch_table[DETECT_TEST].Free = DetectTestFree;
    /* registers unittests into the system */
    sigmatch_table[DETECT_TEST].RegisterTests = DetectTestRegisterTests;

/* set up the PCRE for keyword parsing */
    DetectSetupParseRegexes(PARSE_REGEX, &parse_regex, &parse_regex_study);
}

接口实现对关键字基本信息的注册,在上面存在:

关键字

test

功能描述

desc

使用教程

url

数据包匹配

Match

初始化

Setup

回收

Free

测试内容()

RegisterTests

正则模块适配()

DetectSetupParseRegexes(PARSE_REGEX, &parse_regex, &parse_regex_study);

对于SigTableElmt结构还存在其他的功能,将在本篇文章中一同介绍

应用数据匹配

AppLayerTxMatch

文件匹配

FileMatch

???

Transform

从上得出结论,每个检测关键字提供了三个检测功能,分别为数据包匹配,协议流匹配,和文件匹配

  • 数据包匹配:每个数据包都会被规则提供的Match回调接口处理。

数据包匹配

这个匹配接口实现,数据包负载部分首尾值匹配,匹配条件取决于规则中给出的首尾10进制内容。

static int DetectTestMatch (ThreadVars *t, DetectEngineThreadCtx *det_ctx, Packet *p,
                                const Signature *s, const SigMatchCtx *ctx)
{
    int ret = 0;
    const DetectTestData *testd = (const DetectTestData *) ctx;
#if 0
    if (PKT_IS_PSEUDOPKT(p)) {
        /* fake pkt */
    }

if (PKT_IS_IPV4(p)) {
        /* ipv4 pkt */
    } else if (PKT_IS_IPV6(p)) {
        /* ipv6 pkt */
    } else {
        SCLogDebug("packet is of not IPv4 or IPv6");
        return ret;
    }
#endif
    /* packet payload access */
    if (p->payload != NULL && p->payload_len > 0) {
        if (testd->arg1 == p->payload[0] &&
            testd->arg2 == p->payload[p->payload_len - 1])
        {
            ret = 1;
        }
    }

return ret;
}

测试

查看默认规则位置,打开suricata.yaml文件,找到rules部分,追加test.rules

在对应位置创建test.rules文件并编辑规则内容

alert tcp any any -> any any (msg:"Detect www in payload"; content:"http"; test:104,110; sid:1000001;)

这个规则的含义,数据包中存在连续ascll值http内容,且tcp首尾值10进制为104,110

准备pcap文件且存在首尾值  内容都符合规则的包

运行

以af-packet模式运行suricata

suricata -c suricata.yaml --af-packet

验证

监视fast.log文件,查看告警状态

数据流匹配

以后更新

文件匹配

以后更新