本篇转载自:http://blog.csdn.net/wuyangbotianshi/article/details/44775181

1.简介

现在的NIDS领域snort一枝独秀,而suricata是完全兼容snort规则的多线程IDS,无论在效率还是性能上都超过原有的snort,这个系列主要针对suricata的规则中的一些关键字进行了解和学习,参考suricata的文档,链接为为:https://redmine.openinfosecfoundation.org/projects/suricata/wiki/Suricata_Rules

2.基本关键字

所谓的基本关键字是指不对检测结果造成影响的关键字,也就是常说的Meta-Settings,虽然对匹配结果没影响,但是这些关键字往往对于检测结果的显示、规则的解释、版本等有着重要的作用。

首先来看一条用来检测CVE-2015-0235的规则,这条规则包含了msg、sid、reference、classtype、rev、gid这些基本关键字,这些关键字对于规则的匹配并没有任何影响:

2.1 msg (message)

msg关键字是通过这条规则检测出问题,然后显示在日志中的内容,作为这条规则最主要的解释。msg的格式为:

sid:number;

在上述规则的表现为:

2.3 rev (Revision)

rev字段往往和sid字段一起使用,用于标注针对这条规则的版本,每修改一次rev数值加1,格式为:

rev:number;

在上述规则中的表现为:

2.4 gid (Group id)

gid表示这条规则所属的组,如果不指定默认为1,上述规则中格式表示所属组的id号为3:

gid:3;

在上述规则中表现为:

2.5 classtype

classtype用于对规则进行分类及匹配的优先级进行指定。这个定义一般是在classification.conf文件中指定,定义格式依次是短类型名,简短描述,匹配优先级:

config classification:shortname,short description,priority

上述规则中的类型为cuurent-event,这个类型的定义如下,而最终显示在匹配日志中的是中间的short description字段,而在规则中写的是shortname字段:

config classification: current-event,Current_event, 9

在上述规则中的表现为:

2.6 reference

reference字段表明这条规则相关信息所在url,一条规则可以使用多次reference,格式为:

reference: url, www.info.nl

定义引用的地方则是在reference.config配置文件中,红框中表示的就是有cve编号的引用格式:

所以只要在规则中写上如下字段,引用的url就是http://cve.mitre.org/cgi-bin/cvename.cgi?name=2015-0235

reference:cve,2015-0235;

2.7 priority

priority字段表示此条规则或class的匹配优先级,即使在classification.config文件中指定了每个class的priority,还是可以在规则中重新制定priority字段进行覆盖,格式如下:

priority:1;

该字段的值范围从1-255,在suricata中数字越小表示优先级越高,也就是说如果两条规则都能匹配,则优先匹配priority字段小的规则。

2.8 metadata

metadata字段没有在上述规则中出现,主要原因是当suricata遇到metadata字段便会忽略这个字段的值,还能在规则中使用是为了兼容之前的snort规则。

3.有效字段匹配关键字(Payload)

所谓的有效字段关键字在英文中就是payload,因为不想翻译成难懂的载荷所以姑且暂时这个么说。说白了就是对流量数据包中的实际需要传输的内容进行检测,比如你打开网页,数据包中的payload便是网页中看到的内容的代码。

3.1 content

content关键字在suricata规则中非常重要,大部分规则都要使用这个关键字来匹配数据包中的内容,其格式如下:

content:".......";

content中的内容是按字节匹配的,能匹配ASCII码从0-255的字节,可打印字符比如a-z可以直接写,而某些特殊符号或是不可打印的字符则需要使用十六进制来表示。如下:

|0a|和|0A| 表示空格,十六进制表示时不区分大小写
|61| 表示字母a
|21| 表示!
b 表示字母b
B 表示字母B(直接写a-z的字符则区分大小写)
|61|b 表示字母ab,十六进制描述可以和字符混着写

如果没有在content后面指定其他相关的关键字,那么suricata便会在整个payload字段中搜索content的内容。比如content:"abC";会在整个payload中搜索abC字符,而如果是像下面这么写,则表示payload字段中前三个字符为abC,前第四个字符并不是abCD,也就是第四个字符不为D:

content:"abC"; content:!"abCD";

因为现成写例子不是很方便也不具有代表性,因此在后面的例子展示中将会直接引用suricata文档中的图片和内容进行更为清晰的描述,图例为,从上到下依次为规则匹配、规则不匹配、在payload中匹配的部分,在payload中不匹配的部分:

3.2 nocase

nocase关键字是用来修饰content字段的,在content字段后加上nocase表示content中的内容不区分大小写,比如下面这个例子:

content: “abc”; nocase;

3.3 depth

depth也是修饰content的关键字,表示从payload开始多少个字节与content中的内容进行匹配,格式如下表示的是匹配’abc’:

depth:3;

3.4 offset

与depth不同的是offset是从payload开头先偏移指定字节再对content进行匹配,下图表示的是从开头偏移3字节,从第四字节开始匹配字符串”def”:

offset也可以和depth一起使用,如下表示匹配第4-6三个字节是否为”def”:

content; "def"; offset:3; depth:3;

3.5 distance

distance表示从上一个content匹配的末尾偏移指定数量字符再进行本次的content匹配。如下所示,第一次匹配”abc”之后的位置在字符’d’处,distance为0表示不偏移,直接从’d’开始匹配’def’:

不仅如此,有时不同的distance值结果可能相同,比如下面这个例子,无论是在”abc”之后偏移0还是4或是中间的任意一个整数,都能匹配到后面的”def”,因为distance并没有对后面的匹配长度做任何限制:

除此之外distance由于是相对于上一次的匹配结果的位置偏移,所以他的值可以是负数:

3.6 within

within也是一个修饰content的关键字,他表示从上一个content匹配位置之后的指定字节内对当前的content进行匹配,within的值不能为0。下面这个例子比较清楚的描述了within的用法,匹配完”abc”之后位置在’d’处,从’d’开始的3字节内对”def”进行匹配,而”fgh”明显已经超出了3字节的偏移:

同样,within也可以和distance一起使用,如下所示匹配完”abc”,distance:1向后移动1字节从’d’开始的4个字节以内匹配’def’:

3.7 isdataat

isdataat关键字是用来判断指定偏移处的字符是否是数据。下面是两个例子,第一个表示从payload开头偏移512个字节的地方是否为数据,第二个则表示从上一次匹配完成之后偏移50字节的地方是否为数据:

isdataat:512;
isdataat:50, relative;

在官方文档中还指出在isdataat关键字前也可以使用否定量词定义的content,比如content:!'abc';isdataat:8, relative;,只不过目前的版本尚未对其支持,作者表示在今后的版本中会加入。

3.8 dsize

dsize是用来检测数据包中的payload长度是否在符合要求的范围内,这样可以有效的组织一些缓冲区溢出的攻击。格式如下:

dsize:min<>max;
dsize:[<|>]<number>;

来看两个例子,第一个表示payload的长度在200-400字节之间,第二个表示不能超过300字节:

dsize:200<>400;
dsize:<300;

而dsize关键字并不是所有场景下都能使用,当使用基于tcp的协议比如http的时候,经常会把超长的数据包分割成多个符合长度的数据包,这样一来dsize只能在开启了PAF(protocol aware flushing)之后才有作用。

3.9 replace

replace关键字是用来替换匹配到的content中的字符,下面这个表示将匹配到的”abc”替换成”def”:

 

3.10 pcre

pcre关键字使用PCRE来匹配payload中的内容,用法一般是首先使用content匹配到指定字符串,然后根据pcre对相应的payload进行正则匹配,格式为:

pcre:"/<regex>/opts";

详细的应用参考: 
https://redmine.openinfosecfoundation.org/projects/suricata/wiki/Pcre_(Perl_Compatible_Regular_Expressions)

3.11 fast_pattern

suricata对只有一个content关键字的规则使用多模匹配,而对于多个content的规则就对最长对复杂的一个进行多模匹配,而fast_pattern则可以改变这个状况,如果在较短较简单的content字段后加上fast_pattern关键字则会优先匹配这个content,有时这种方法可以有效提升效率。

下面这个例子就是这种情况,如果第二个content没有fast_parttern关键字的话便会先去匹配”User-Agent:”,而这个在数据包中的出现频率是远远高于”Badness”的,这样就会导致大量的多余时间浪费到无用的匹配上,使用了fast_pattern之后便大大提高了匹配的效率:

content:”User-Agent|3A|”;
content:”Badness”; distance:0; fast_pattern;

不仅如此,fast_parttern还支持部分content多模匹配,比如下面这个例子,表示从content的第8字节开始之后的4字节进行多摸匹配以提高效率:

content: “aaaaaaaaabc”; fast_pattern:8,4;

4.小结

本文的内容比较基础,主要是两部分:1.与匹配无关但与显示匹配结果紧密相关的基础关键字;2.content关键字以及各种修饰content的关键字的用法,content配合这些关键字可以更加快速有效地对流量进行匹配。

Suricata规则编写——常用关键字的更多相关文章

  1. Suricata规则配置

    Suricata 规则配置 IDS/IPS/WAF IPS.IDS和WAF分别是入侵防御系统和入侵检测系统以及WEB应用防火墙的简称,很多人说这些玩意不就是盒子吗已经过时了,其实不是,SIEM其实是有 ...

  2. CDN 边缘规则,三秒部署、支持定制、即时生效,多种规则覆盖常用业务场景

    2017年的最后一周,又拍云进行了一次重要升级,将自定义 Rewrite 升级为"边缘规则".互联网应用场景的日益多样化,简单.方便.快速的根据不同应用场景实现不同的功能变得越来越 ...

  3. CCleaner 垃圾文件清理规则 编写指南

    以下内容的英文版本来源于 CCleaner 官方论坛,仅供参考.欢迎大家编写并分享针对常用国产软件的垃圾文件清理规则!需要说明的是规则文件(Winapp2.ini)需和程序文件放于同一文件夹下,才能被 ...

  4. Robot Framework常用关键字介绍

    常用关键字介绍 在学习一门编程语言的时候,大多教材都是从打印“hello world”开始.我们可以像编程语言一样来学习 Robot Framework.虽然通过 RIDE 提供“填表”一样的写测试用 ...

  5. robotframework常用关键字

    robotframework关键字 可以将关键字看作是处理数据的方法.robotframework的关键字和测试数据组成了测试用例. robotframework关键字包括系统关键字和用户关键字.用户 ...

  6. robot_framewok自动化测试--(4)常用关键字介绍

    常用关键字介绍 在学习一门编程语言的时候,大多教材都是从打印"hello world"开始.我们可以像编程语言一样来学习 Robot Framework.虽然通过 RIDE 提供& ...

  7. Java SE 基础:常用关键字

    Java SE 基础:常用关键字 常用关键字表

  8. 实验 snort安装配置与规则编写

    1 实验目的 在linux或windows任意一个平台下完成snort的安装,使snort工作在NIDS模式下,并编写符合相关情景要求的snort规则. 2 实验环境 物理机:windows 8.1 ...

  9. JAVA常用关键字

    Java 中常用关键字: 一一解释(先以印象注明含义,若有错误或未填写的待用到后补充.更新):(蓝色为不确定部分) abstract : 虚类 boolean : 类型定义——布尔型 break : ...

随机推荐

  1. 从PMP培训归来,跟大家聊聊做项目的套路

    管理也是一些套路的传承,很多人说不去学专门的管理,照样把工作做得很好.是的,不是散打乱打就不能赢,只是会吃点亏而已.如果你有了套路在心中,那么必定会让自己车到山前开路,让事情更好办. 所以,我去学了几 ...

  2. DFA算法实现关键字查找(正则原理入门)

    前言:一直都这样认为“正则表达式是一个很有用的技能”,从一开始的磕磕绊绊的使用和摸索,到后来可以得心应手,这个过程离不来平时的不断学习和思考

  3. No principal was found in the response from the CAS server

    按网上的配置了 public String casServerUrlPrefix = "http://cas-server.com:8080/cas"; public String ...

  4. wamp解决ajax跨域问题

    若使用ajax测试本地数据时,遇到的跨域问题,如 因为ajax只能用于请求服务器的数据,而在本地测试,打开的文件是以 file:// 的形式, 所以报错 可以通过 nginx 建立反向代理,处理静态文 ...

  5. 从零开始学 Web 系列教程

    大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新…… github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:http:/ ...

  6. 【转】vmware 安装 osx 无法登录 appstore 的解决办法 (伪造smbios设备信息)

    伪造smbios设备信息 原文网址:http://www.insanelymac.com/forum/topic/292170-how-to-spoof-real-mac-in-vmware/page ...

  7. 在linux上安装svn

    1. 安装svn 输入命令:yum -y install subversion 检查是否安装成功: 输入命令:svn –version 2. 创建代码仓库 输入命令:mkdir -p /usr/loc ...

  8. JS中如何理解浮点数?

    本文由云+社区发表 相信大家在平常的 JavaScript 开发中,都有遇到过浮点数运算精度误差的问题,比如 console.log(0.1+0.2===0.3)// false.在 JavaScri ...

  9. JavaSSM框架整合

    SSM整合 ssm框架 框架整合  在博客的前面介绍了mybatis,spring,springmvc的使用,那么这篇博客将介绍将mybatis和spring,springmvc的整合. 整合之前,我 ...

  10. JAVA课程设计——一个简单的教务人事管理系统

    大三上学期期末总结,没错,上学期,写在下学期新学期开始,哈哈哈. 上学期学习了面向对象程序设计,课程设计的题目使用JAVA语言完成一个简单的教务人事管理系统,能够实现访问数据库的登录验证,分别按部门和 ...