Suricata规则编写——常用关键字
来源:互联网 发布:长沙网络工程学院 编辑:程序博客网 时间:2024/06/17 15:31
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的格式为:
<code class="hljs avrasm has-numbering"><span class="hljs-label">msg:</span><span class="hljs-string">"......"</span><span class="hljs-comment">;</span></code><ul class="pre-numbering" style="display: block;"><li>1</li></ul>
比如在上述规则中msg字段为,表明这是一条针对glibc的ghost缓冲区溢出漏洞的EHLO包的攻击:
<code class="hljs avrasm has-numbering"><span class="hljs-label">msg:</span><span class="hljs-string">"Glibc Ghost Attack - Buffer Overflow Attempt(EHLO)"</span><span class="hljs-comment">;</span></code><ul class="pre-numbering" style="display: block;"><li>1</li></ul>
在检测结果中如下红色部分:
2.2 sid (signature id)
sid字段表示这条规则的id,值为一个数字,格式为:
<code class="hljs css has-numbering"><span class="hljs-tag">sid</span><span class="hljs-pseudo">:number</span>;</code><ul class="pre-numbering" style="display: block;"><li>1</li></ul>
在上述规则的表现为:
2.3 rev (Revision)
rev字段往往和sid字段一起使用,用于标注针对这条规则的版本,每修改一次rev数值加1,格式为:
<code class="hljs css has-numbering"><span class="hljs-tag">rev</span><span class="hljs-pseudo">:number</span>;</code><ul class="pre-numbering" style="display: block;"><li>1</li></ul>
在上述规则中的表现为:
2.4 gid (Group id)
gid表示这条规则所属的组,如果不指定默认为1,上述规则中格式表示所属组的id号为3:
<code class="hljs css has-numbering"><span class="hljs-tag">gid</span><span class="hljs-pseudo">:3</span>;</code><ul class="pre-numbering" style="display: block;"><li>1</li></ul>
在上述规则中表现为:
2.5 classtype
classtype用于对规则进行分类及匹配的优先级进行指定。这个定义一般是在classification.conf文件中指定,定义格式依次是短类型名,简短描述,匹配优先级:
<code class="hljs cs has-numbering">config classification:shortname,<span class="hljs-keyword">short</span> description,priority</code><ul class="pre-numbering" style="display: block;"><li>1</li></ul>
上述规则中的类型为cuurent-event,这个类型的定义如下,而最终显示在匹配日志中的是中间的short description字段,而在规则中写的是shortname字段:
<code class="hljs cs has-numbering">config classification: current-<span class="hljs-keyword">event</span>,Current_event, <span class="hljs-number">9</span></code><ul class="pre-numbering" style="display: block;"><li>1</li></ul>
在上述规则中的表现为:
2.6 reference
reference字段表明这条规则相关信息所在url,一条规则可以使用多次reference,格式为:
<code class="hljs avrasm has-numbering"><span class="hljs-label">reference:</span> url, www<span class="hljs-preprocessor">.info</span><span class="hljs-preprocessor">.nl</span></code><ul class="pre-numbering" style="display: block;"><li>1</li></ul>
定义引用的地方则是在reference.config配置文件中,红框中表示的就是有cve编号的引用格式:
所以只要在规则中写上如下字段,引用的url就是http://cve.mitre.org/cgi-bin/cvename.cgi?name=2015-0235:
<code class="hljs css has-numbering"><span class="hljs-tag">reference</span><span class="hljs-pseudo">:cve</span>,2015<span class="hljs-tag">-0235</span>;</code><ul class="pre-numbering" style="display: block;"><li>1</li></ul>
2.7 priority
priority字段表示此条规则或class的匹配优先级,即使在classification.config文件中指定了每个class的priority,还是可以在规则中重新制定priority字段进行覆盖,格式如下:
<code class="hljs css has-numbering"><span class="hljs-tag">priority</span><span class="hljs-pseudo">:1</span>;</code><ul class="pre-numbering" style="display: block;"><li>1</li></ul>
该字段的值范围从1-255,在suricata中数字越小表示优先级越高,也就是说如果两条规则都能匹配,则优先匹配priority字段小的规则。
2.8 metadata
metadata字段没有在上述规则中出现,主要原因是当suricata遇到metadata字段便会忽略这个字段的值,还能在规则中使用是为了兼容之前的snort规则。
3.有效字段匹配关键字(Payload)
所谓的有效字段关键字在英文中就是payload,因为不想翻译成难懂的载荷所以姑且暂时这个么说。说白了就是对流量数据包中的实际需要传输的内容进行检测,比如你打开网页,数据包中的payload便是网页中看到的内容的代码。
3.1 content
content关键字在suricata规则中非常重要,大部分规则都要使用这个关键字来匹配数据包中的内容,其格式如下:
<code class="hljs scss has-numbering"><span class="hljs-attribute">content</span><span class="hljs-value">:<span class="hljs-string">"......."</span>;</span></code><ul class="pre-numbering" style="display: block;"><li>1</li></ul>
content中的内容是按字节匹配的,能匹配ASCII码从0-255的字节,可打印字符比如a-z可以直接写,而某些特殊符号或是不可打印的字符则需要使用十六进制来表示。如下:
<code class="hljs 1c has-numbering"><span class="hljs-string">|0a|和|0A| 表示空格,十六进制表示时不区分大小写</span><span class="hljs-string">|61| 表示字母a</span><span class="hljs-string">|21| 表示!</span>b 表示字母bB 表示字母B(直接写a-z的字符则区分大小写)<span class="hljs-string">|61|b 表示字母ab,十六进制描述可以和字符混着写</span></code><ul class="pre-numbering" style="display: block;"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li></ul>
如果没有在content后面指定其他相关的关键字,那么suricata便会在整个payload字段中搜索content的内容。比如content:"abC";
会在整个payload中搜索abC字符,而如果是像下面这么写,则表示payload字段中前三个字符为abC,前第四个字符并不是abCD,也就是第四个字符不为D:
<code class="hljs scss has-numbering"><span class="hljs-attribute">content</span><span class="hljs-value">:<span class="hljs-string">"abC"</span>;</span> <span class="hljs-attribute">content</span><span class="hljs-value">:!<span class="hljs-string">"abCD"</span>;</span></code><ul class="pre-numbering" style="display: block;"><li>1</li></ul>
因为现成写例子不是很方便也不具有代表性,因此在后面的例子展示中将会直接引用suricata文档中的图片和内容进行更为清晰的描述,图例为,从上到下依次为规则匹配、规则不匹配、在payload中匹配的部分,在payload中不匹配的部分:
3.2 nocase
nocase关键字是用来修饰content字段的,在content字段后加上nocase表示content中的内容不区分大小写,比如下面这个例子:
<code class="hljs http has-numbering"><span class="hljs-attribute">content</span>: <span class="hljs-string">“abc”; nocase;</span></code><ul class="pre-numbering" style="display: block;"><li>1</li></ul>
3.3 depth
depth也是修饰content的关键字,表示从payload开始多少个字节与content中的内容进行匹配,格式如下表示的是匹配’abc’:
<code class="hljs rsl has-numbering"><span class="hljs-built_in">depth</span>:<span class="hljs-number">3</span>;</code><ul class="pre-numbering" style="display: block;"><li>1</li></ul>
3.4 offset
与depth不同的是offset是从payload开头先偏移指定字节再对content进行匹配,下图表示的是从开头偏移3字节,从第四字节开始匹配字符串”def”:
offset也可以和depth一起使用,如下表示匹配第4-6三个字节是否为”def”:
<code class="hljs scss has-numbering"><span class="hljs-attribute">content</span>; "def"; offset<span class="hljs-value">:<span class="hljs-number">3</span>;</span> depth<span class="hljs-value">:<span class="hljs-number">3</span>;</span></code><ul class="pre-numbering" style="display: block;"><li>1</li></ul>
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字节的地方是否为数据:
<code class="hljs css has-numbering"><span class="hljs-tag">isdataat</span><span class="hljs-pseudo">:512</span>;<span class="hljs-tag">isdataat</span><span class="hljs-pseudo">:50</span>, <span class="hljs-tag">relative</span>;</code><ul class="pre-numbering" style="display: block;"><li>1</li><li>2</li></ul>
在官方文档中还指出在isdataat关键字前也可以使用否定量词定义的content,比如content:!'abc';isdataat:8, relative;
,只不过目前的版本尚未对其支持,作者表示在今后的版本中会加入。
3.8 dsize
dsize是用来检测数据包中的payload长度是否在符合要求的范围内,这样可以有效的组织一些缓冲区溢出的攻击。格式如下:
<code class="hljs xml has-numbering">dsize:min<span class="hljs-tag"><></span>max;dsize:[<span class="hljs-tag"><<span class="hljs-title">|</span>></span>]<span class="hljs-tag"><<span class="hljs-title">number</span>></span>;</code><ul class="pre-numbering" style="display: block;"><li>1</li><li>2</li></ul>
来看两个例子,第一个表示payload的长度在200-400字节之间,第二个表示不能超过300字节:
<code class="hljs avrasm has-numbering"><span class="hljs-label">dsize:</span><span class="hljs-number">200</span><><span class="hljs-number">400</span><span class="hljs-comment">;</span><span class="hljs-label">dsize:</span><<span class="hljs-number">300</span><span class="hljs-comment">;</span></code><ul class="pre-numbering" style="display: block;"><li>1</li><li>2</li></ul>
而dsize关键字并不是所有场景下都能使用,当使用基于tcp的协议比如http的时候,经常会把超长的数据包分割成多个符合长度的数据包,这样一来dsize只能在开启了PAF(protocol aware flushing)之后才有作用。
3.9 replace
replace关键字是用来替换匹配到的content中的字符,下面这个表示将匹配到的”abc”替换成”def”:
3.10 pcre
pcre关键字使用PCRE来匹配payload中的内容,用法一般是首先使用content匹配到指定字符串,然后根据pcre对相应的payload进行正则匹配,格式为:
<code class="hljs avrasm has-numbering"><span class="hljs-label">pcre:</span><span class="hljs-string">"/<regex>/opts"</span><span class="hljs-comment">;</span></code><ul class="pre-numbering" style="display: block;"><li>1</li></ul>
详细的应用参考:
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之后便大大提高了匹配的效率:
<code class="hljs scss has-numbering"><span class="hljs-attribute">content</span><span class="hljs-value">:”User-Agent|<span class="hljs-number">3</span>A|”;</span><span class="hljs-attribute">content</span><span class="hljs-value">:”Badness”;</span> distance<span class="hljs-value">:<span class="hljs-number">0</span>;</span> fast_pattern;</code><ul class="pre-numbering" style="display: block;"><li>1</li><li>2</li></ul>
不仅如此,fast_parttern还支持部分content多模匹配,比如下面这个例子,表示从content的第8字节开始之后的4字节进行多摸匹配以提高效率:
<code class="hljs scss has-numbering"><span class="hljs-attribute">content</span><span class="hljs-value">: “aaaaaaaaabc”;</span> fast_pattern<span class="hljs-value">:<span class="hljs-number">8</span>,<span class="hljs-number">4</span>;</span></code><ul class="pre-numbering" style="display: block;"><li>1</li></ul>
4.小结
本文的内容比较基础,主要是两部分:1.与匹配无关但与显示匹配结果紧密相关的基础关键字;2.content关键字以及各种修饰content的关键字的用法,content配合这些关键字可以更加快速有效地对流量进行匹配。
参考链接
https://redmine.openinfosecfoundation.org/projects/suricata/wiki/Suricata_Rules
https://redmine.openinfosecfoundation.org/projects/suricata/wiki/Meta-settings
https://redmine.openinfosecfoundation.org/projects/suricata/wiki/Payload_keywords
http://blog.snort.org/2011/09/what-is-paf.html
http://en.wikipedia.org/wiki/Remote_procedure_call
https://redmine.openinfosecfoundation.org/projects/suricata/wiki/Pcre_(Perl_Compatible_Regular_Expressions)
- Suricata规则编写——常用关键字
- Suricata规则编写——常用关键字
- Suricata规则编写——常用关键字
- Suricata规则编写——HTTP关键字
- Suricata规则编写——HTTP关键字
- Suricata规则编写——数据包头部关键字
- Suricata规则编写——数据包头部关键字
- suricata规则分类存储
- 【规则引擎连载4】 WebSphere ILOG JRules 开发——编写规则、决策表、规则流
- java复习——关键字&标识符&命名规则
- AltiumDesigner96——PCB常用规则
- Mycat系列—常用的分片规则
- Gnu make手册学习【4】——编写规则
- JAVA_SE基础——编码规范&代码编写规则
- Makefile构建工程设计——工程构建与编写规则
- 嵌入式C常用关键字——static
- 黑马程序员——Java基础——命名规则、标识符、关键字和运算符
- 【Java SE】————标识符及命名规则和关键字
- RabbitMQ基础概念详细介绍
- Woosim BluetoothPrint 蓝牙打印机Android实现
- Swift语言 1小时速学教程
- java后台程序的应用配置管理
- 修改UINavigationController、UITabBarController、UITabBar、UIToolBar颜色
- Suricata规则编写——常用关键字
- HTTP长链接与短连接
- CentOS7查看无线网络
- Android 颜色渲染(七) RadialGradient 环形渲染实现水波纹效果
- java布局 BoxLayout布局
- Android apk动态加载机制的研究
- ubuntu64位下安装的eclipse 出现双击代码闪退
- singleLine=”true” 和 maxLines=”1″的区别
- Qt窗口居中显示