suricata 规则及部分关键字

规则格式

特征/签名在suricata中起着非常重要的作用。在大多数情况下,人们使用现有的规则集。

Suricata-Update规则管理中描述了安装规则集的正式方法。

Suricata规则文档解释了所有关于特征/签名的内容。

规则/签名由以下内容组成:

action:确定特征/签名匹配时会发生什么(图1红色字体)

header:定义协议、IP地址、端口和规则的方向(图1绿色字体)

rule options:定义规则的细节(图1蓝色字体)

图1

(备注:红色字体是Action,绿色字体是header,蓝色字体是rule options.)

在这篇文章中,我们将使用上面的签名/规则作为示例,突出显示签名的不同部分。它是从新兴威胁数据库(EmergingThreats)中提取的签名,这是一个开放的数据库,具有许多规则,您可以免费下载并在Suricata实例中使用。

1.Action

动作顺序,默认顺序为:pass,drop,reject,alert

所有签名/规则都有不同的属性。其中之一是Action属性。它决定了签名/规则匹配时会发生什么。有四种类型的动作,当签名匹配并包含其中一个操作时将发生什么动作。

(1.1)pass

如果签名匹配并包含pass, Suricata将停止扫描数据包并跳到所有规则的末尾(仅针对当前数据包)。

(1.2)Drop

这只涉及IPS/内联模式。如果程序发现匹配的签名(包含drop),它将立即停止。这个数据包不会再发送出去了。缺点:接收方没有接收到有关正在进行的操作的消息,从而导致时间延迟(使用TCP)。Suricata会为此数据包生成警报。

(1.3)Reject

这是对数据包的主动拒绝。接收方和发送方都接收到一个拒绝包。当匹配该规则时,自动选择两种类型的拒绝包:

(1.3.1)如果匹配规则并包含reject的数据包与TCP有关,它将是一个重置包(Reset-packet)。

(1.3.2)对于所有其他协议,它将是ICMP错误数据包。

Suricata还会生成警报。在Inline / IPS模式下,违规数据包也会像“drop”操作一样被丢弃。

(1.5)Alert

如果签名匹配并包含警报,则包将被视为与任何其他非威胁包一样,除此之外,Suricata将生成一个警报。只有系统管理员才能注意到此警告alert。

Inline / IPS可以通过两种方式阻止网络流量。一种方法是drop ,另一种方式是reject。

规则将按照它们在文件中出现的顺序加载。但它们将以不同的顺序处理。签名有不同的优先级,最重要的签名首先被扫描。优先次序可以改变。默认顺序是: pass、drop、reject、alert。这意味着在丢弃(drop)规则之前考虑传递(pass )规则,在拒绝(reject)规则之前考虑丢弃(drop)规则等等。

2.header

(2.1)协议

签名/规则中的这个关键字告诉Suricata它所关注的协议是什么。可以在四种基本协议中进行选择

tcp (for tcp-traffic)

udp

icmp

ip (ip stands for ‘all’ or ‘any’)

同时也支持应用层协议,可以从中选择的第7层协议。如下:

http、ftp、tls (包括ssl)、smb、dns、dcerpc、ssh、smtp、imap、msn、modbus (默认禁用)、dnp3 (默认禁用)、enip (默认禁用)、nfs (depends on rust availability)、ikev2 depends on rust availability)、krb5 (depends on rust availability)、ntp (depends on rust availability)、dhcp (depends on rust availability)。

这些协议的可用性取决于是否在配置文件suricata.yaml中启用了该协议。如果您有一个签名,例如一个http协议,Suricata确保签名只有在涉及http通信时才能匹配。

(2.2)源和目标地址(IP)

使用源和目标,分别指定流量的来源和流量的目标。您可以分配IP地址(支持IPv4和IPv6)和IP范围。这些可以与运营商结合。如图1所示:第一个强调部分是源,第二个是目的地(注意方向箭头的方向)。

drop tcp $HOME_NET any -> $EXTERNAL_NET any (msg:”ET TROJAN Likely Bot Nick in IRC (USA +..)”; flow:established,to_server; flowbits:isset,is_proto_irc; content:”NICK “; pcre:”/NICK .*USA.*[0-9]{3,}/i”; reference:url,doc.emergingthreats.net/2008124; classtype:trojan-activity; sid:2008124; rev:2;)

图2

通常,可以使用变量,例如$HOME_NET和 $EXTERNAL_NET。配置文件指定了这些关注的IP地址,这些设置将用于代替规则中的变量。

示例:

图3

(2.3)源和目标端口

流量通过端口流入和流出。不同的端口具有不同的端口号。例如,HTTP的默认端口是80,而443通常是HTTPS的端口。但请注意,端口不指示通信中使用的协议。相反,它确定哪个应用程序正在接收数据。

上面提到的端口通常是目标端口。源端口,即发送数据包的应用程序,通常由操作系统分配一个随机端口。在为自己的HTTP服务编写规则时,通常会编写any -> 80,这意味着从任何源端口到HTTP应用程序(在端口80上运行)的任何数据包都是匹配的。在设置端口时,您也可以使用特殊操作符,如下:

图4

示例:

图5

(2.4)方向

方向告诉签名/规则必须匹配的方式。几乎每个签名都有一个向右箭头(->),意味着只有具有相同方向的数据包才能匹配。但是,也可以使规则匹配两个方式(<>):

source->destination

source<>destination(both  directions)

但是没有<-这种风格。

以下示例说明了这一点。比如,有一个IP地址为1.2.3.4和端口1024的客户端,以及一个IP地址为5.6.7.8的服务器,监听端口80(通常是HTTP)。客户端向服务器发送消息,服务器回复其答案。

图5

使用规则:alert tcp 1.2.3.4 1024 -> 5.6.7.8  80。此规则仅仅匹配第一个数据包,因为方向指定在响应包上不匹配。

3.规则选项

规则的其余部分包括规则选项。它们用括号括起来并用分号分隔。某些选项具有设置功能(例如msg),这些设置功能的选项由关键字指定,关键字后面跟冒号,冒号后跟设置的内容。其他选项没有设置功能,只有简单的关键字(例如nocase):

: ;

;

规则选项具有特定的顺序,更改其顺序将改变规则的含义。

注意:字符 ; 和 " 在Suricata规则语言具有特殊含义,在规则选项值使用时必须转义。使用转义反斜杠,因为它充当转义字符例如:msg:" Message with semicolon\; " ;

接下来在文档中介绍各种关键字的使用,一些关键字详情如下:

3.1)修饰符关键字

一些关键字函数充当修饰符。有两种类型的修饰符。

(3.1.1)旧式“content modifiers”风格:

alert http any any->any any(content:"index.php";http_uri;sid:1;)

在上面的示例中,修改了模式'index.php'以检查HTTP uri缓冲区。

(3.1.2)最近的类型称为sticky buffe。它首先放置缓冲区名称,然后将其后面的所有关键字应用于该缓冲区,例如:

alert http any any->any any(http_response_line;content:"403 Forbidden";sid:1;)

在上面的示例中,针对HTTP响应行检查模式“403 Forbidden”,因为它遵循http_response_line关键字

(3.2)标准化缓冲区

一个数据包由原始数据组成。HTTP和重组会复制这些类型的数据包。它们擦除异常内容,组合数据包等。剩下的是一个叫做“标准化缓冲区”:

图5

因为数据正在规范化,所以它不像过去那样; 这是一种解释.标准化缓冲区包括:所有HTTP关键字,重组流,TLS-,SSL-,SSH-,FTP-和dcerpc-缓冲区。

4.Meta 关键字

Meta 设置对Suricata的规则检查没有影响; 他们是Suricata上报的事件信息,对上报内容有影响。

(4.1)msg (message)

关键字msg提供对触发警报的有关签名/规则相关文本提示信息。格式如下:

msg:"some description";

实例:

msg: "ET EXPLOIT SMB-DS DCERPC PnP bind attempt ";

约定:(1)通常将签名第一部分设为大写显示签名的类。(2)通常在签名中的第一个关键字为msg。

(4.2)SID(规则ID)

关键字sid为每个签名提供自己的ID。这个id用数字表示。sid的格式是:

sid:123;

通常,签名sid是作为签名的最后一个关键字(或者如果有rev的话,则倒数第二个)提供的。

(4.3)rev(修订版)

sid关键字几乎每次都伴随着rev。Rev代表签名的版本。如果修改了签名,则签名编写者将增加rev的数量。rev的格式是:

rev:123;:

sid写在rev之前,这是一个惯例,两者都是最后一个关键字。

(4.4)gid(组ID)

gid关键字可用于为不同的签名组提供另一个id值(如sid中)。Suricata默认使用gid 1.可以修改它。它通常不会被改变,改变它没有技术含义。您只能在警报中注意到它。

示例: 在一个 fast.log文件中:

10/15/09-03:30:10.219671 [**] [1:2008124:2] ET TROJAN Likely Bot Nick in IRC (USA +..) [**] [Classification: A Network Trojan was Detected] [Priority: 3] {TCP} 192.168.1.42:1028 -> 72.184.196.31:6667

[1:2008124:2]部分,1代表gid,2008124代表sid;2代表rev

(4.5)分类

classtype关键字提供有关规则和警报分类的信息。它由短名称,长名称和优先级组成。例如,它可以告诉规则是仅仅是信息性的还是关于黑客等。对于每个classtype,这个classification.config具有将在规则中使用的优先级classtype定义如下:

config classification: web-application-attack,Web Application Attack,1

config classification: not-suspicious,NotSuspiciousTraffic,3

现在,当我们在配置中定义了这个时,我们可以在规则中使用classtypes。具有classtype web-application-attack的规则将被赋予优先级1,并且警报将包含“Web Application Attack”:

图六

(4.6)reference (参考)

可以找到参考关键字指向有关签名的信息以及签名试图解决的问题的位置。参考关键字可以在签名中多次出现。此关键字适用于签名编写者和分析师,他们会调查签名匹配的原因。它具有以下格式:

reference:type,reference

示例:reference: url,www.info.com     、reference: cve,CVE-2014-1234

(4.7)priority(优先级)

priority关键字带有一个强制数字值,范围从1到255.最常使用数字1到4。将首先检查具有更高优先级的签名。最高优先级是1.通常,签名已经通过classtype具有优先级。这可以用关键字优先级否决。优先格式为:

priority:1;

(4.8)metadata(元数据)

metadata关键字允许将额外的非功能信息添加到签名中。虽然格式是自由格式,但建议坚持使用键值对,因为Suricata可以在前夕警报中包含这些值。格式为:

metadata:keyvalue;

metadata:keyvalue,keyvalue;

(4.9)target(目标)

target关键字允许规则编写者指定警报的哪一侧是攻击的目标。如果指定,则会增强警报事件以包含有关源和目标的信息。

格式为:

target:[src_ip|dest_ip]

如果值为src_ip,则生成的事件中的源IP(JSON中的src_ip字段)是攻击的目标。如果target设置为dest_ip,则目标是生成的事件中的目标IP。

5.IP 关键字

5.1 ttl

ttl关键字用于检查数据包标头中的特定IP生存时间值。

格式为:ttl:.

在ttl关键字的末尾,您可以输入要匹配的值。生存时间值确定数据包在Internet系统中的最长时间。如果此字段设置为0,则必须销毁数据包。生存时间基于跳数。数据包通过的每个跳/路由器减去一个数据包TTL计数器。此机制的目的是限制数据包的存在,以便数据包不会在无限路由循环中结束。

5.2 ipopts 

使用ipopts关键字,您可以检查是否设置了特定的IP选项。Ipopts必须在规则的开头使用。每条规则只能匹配一个选项。有几个选项可以匹配。这些是:

图七

5.3  sameip 

每个数据包都有一个源IP地址和一个目标IP地址。源IP可以与目标IP相同。使用sameip关键字,您可以检查源的IP地址是否与目标的IP地址相同。sameip关键字的格式为:sameip;

5.4 ip_proto 

使用ip_proto关键字,您可以匹配数据包标头中的IP协议。您可以使用协议的名称或编号。例如,您可以匹配以下协议:

图八

5.5 ID 

使用id关键字,您可以匹配特定的IP ID值。ID标识主机发送的每个数据包,并且通常与正在发送的每个数据包一起递增。IP ID用作片段标识号。每个数据包都有一个IP ID,当数据包被分段时,该数据包的所有片段都具有相同的ID。以这种方式,分组的接收器知道哪些片段属于同一分组。(IP ID不处理顺序,在这种情况下使用偏移。它阐明了片段的顺序。)

id:;

5.6 geoip

geoip关键字使您(您)能够匹配网络流量的源,目标或源和目标IP地址,并查看它所属的国家/地区。为了能够做到这一点,Suricata使用Maxmind的GeoIP API。

geoip的语法:

图九

因此,您可以看到您可以使用以下内容来明确您希望匹配的方向:

图十

该关键字仅支持IPv4。因为它使用Maxmind的GeoIP API,所以必须编译libgeoip。

5.7 fragbits (IP碎片)

使用fragbits关键字,可以检查IP头中是否设置了分段和保留位。fragbits关键字应放在规则的开头。Fragbits用于修改碎片机制。在将消息从一个Internet模块路由到另一个Internet模块期间,可能发生分组大于网络可以处理的最大分组大小。在这种情况下,可以分段发送数据包。数据包大小的最大值称为最大传输单位(MTU)。您可以匹配以下位:

图11

可以使用以下修饰符更多地指定匹配此位:

图12

格式:fragbits:[*+!]<[MDR]>;

5.8 fragoffset 

使用fragoffset关键字,您可以匹配IP片段偏移字段的特定十进制值。如果要检查会话的第一个片段,则必须将fragoffset 0与More Fragment选项组合在一起。碎片偏移字段便于重组。id用于确定哪些片段属于哪个分组,并且片段偏移字段阐明片段的顺序。您可以使用以下修饰符:

图13

fragoffset的格式:

                fragoffset:[!|<|>];

5.9 TOS 

tos关键字可以匹配IP头TOS字段的特定十进制值。tos关键字的值可以是0到255,IP头的这个字段已由rfc2474更新, 以包含差异化服务的功能 。格式:

tos:[!];

6.TCP 关键字

6.1 SEQ 

可以在签名中使用seq关键字来检查特定的TCP序列号。序列号是TCP连接的两个端点实际上随机生成的数字。客户端和服务器都创建一个序列号,它随着它们发送的每个字节的增加而增加。所以这个序列号对于双方都是不同的。该序列号必须由连接的双方确认。通过序列号,TCP处理确认,命令和重传。它的数量随着发送方发送的每个数据字节而增加。seq有助于跟踪字节所属的数据流中的位置。如果SYN标志设置为1,则数据的第一个字节的序列号是该数字加1(因此,2)。

6.2 ACK

ack是对TCP连接另一端发送的所有先前(数据)字节的接收的确认。在大多数情况下,TCP连接的每个数据包在第一个SYN之后都有一个ACK标志,而ack-number随着每个新数据字节的接收而增加。可以在签名中使用ack关键字来检查特定的TCP确认号。

6.3 window(窗口)

window关键字用于检查特定的TCP窗口大小。TCP窗口大小是一种控制数据流的机制。窗口由接收器设置(接收器通告的窗口大小),并指示可以接收的字节数。在发送方可以发送相同数量的新数据之前,接收方必须首先确认此数据量。该机制用于防止接收器被数据溢出。窗口大小的值是有限的,可以是2到65.535字节。要更多地利用带宽,您可以使用更大的TCP窗口。window关键字的格式:

window:[!];

7.ICMP 关键字

ICMP(Internet控制消息协议)是IP的一部分。在提供数据(数据报)方面,IP本身并不可靠。ICMP在出现问题时提供反馈。它不会阻止问题的发生,但有助于理解出错的地方和地点。如果需要可靠性,使用IP的协议必须自己处理可靠性。在不同的情况下,将发送ICMP消息。例如,当目的地不可达时,如果没有足够的缓冲容量来转发数据,或者当数据报不应该被分段时,等等。可以在包含消息类型的列表中找到更多内容。ICMP消息有四个重要内容,可以与相应的ICMP关键字匹配。它们是:消息的类型,代码,id和序列。

7.1  ITYPE 

itype关键字用于匹配特定的ICMP类型(数字)。ICMP有几种消息,并使用代码来澄清这些消息。不同的消息由不同的名称区分,但更重要的是数值。有关更多信息,请参阅包含消息类型和代码的表。

itype关键字的格式:

        itype:min<>max;

        itype:[<|>];

如查找大于10的ICMP类型:

itype:>10

以下列出了ICMP类型

图14

7.2 ICODE

使用icode关键字,您可以匹配特定的ICMP代码。ICMP消息的代码阐明了该消息。与ICMP类型一起,它表明您正在处理什么样的问题。代码与每种ICMP类型具有不同的用途。icode关键字的格式:

icode:min<>max;

icode:[<|>];

示例:此示例查找大于5的ICMP代码:icode:>5;

以下列出了所有ICMP类型的含义。如果未列出代码,则仅在上表中定义类型0并具有ICMP代码的含义。最新的表格可以在IANA的网站上找到

图15

7.3 icmp_id

使用icmp_id关键字,您可以匹配特定的ICMP id值。每个ICMP数据包在发送时都会获得一个id。在接收方收到数据包时,它将使用相同的ID发送回复,以便发送方识别它并将其与正确的ICMP请求连接。icmp_id关键字的格式:

        icmp_id:

7.4 icmp_seq 

您可以使用icmp_seq关键字检查ICMP序列号。ICMP消息都有序列号。这可以用于(与id一起)用于检查哪个回复消息属于哪个请求消息.icmp_seq关键字的格式:

icmp_seq:;

8.Payload关键字

Payload关键字检查数据包或流的有效负载的内容。

8.1 content(内容)

content关键字在签名中非常重要。在引号之间,您可以写下您希望签名匹配的内容。最简单的内容格式是:

content: ”............”;

可以在签名中使用多个内容。内容匹配字节。一个字节有256个不同的值(0-255)。你可以匹配所有角色; 从a到z,大写和小写以及所有特殊标志。但并非所有字节都是可打印字符。对于这些字节,使用十六进制表示法。许多编程语言使用0x00作为表示法,其中0x表示它涉及二进制值,但规则语言 |00|用作表示法。这种表示法也可用于可打印字符。如:

图16

您无法在内容中使用的字符因为它们在签名中已经很重要。要匹配这些字符,您应该使用十六进制表示法。这些是:

图17

将大写符号写成大写字符是一种惯例

要http://在签名的内容中编写,您应该这样写:如果在签名中使用十六进制表示法,请确保始终将其放在管道之间。否则,表示法将作为内容的一部分。content: “http|3A|//”;几个例子:

图18

可以让签名检查整个有效载荷以与内容匹配,或者让它检查有效载荷的特定部分。如果您没有为签名添加任何特殊内容,它将尝试在有效内容的所有字节中找到匹配项。默认情况下,模式匹配区分大小写。内容必须准确,否则不会匹配。

举例:

图19

content:!”Firefox/3.6.13”;。这意味着如果使用的Firefox版本不是3.6.13,则会生成警报。

8.2 nocase(不关心大小写)

如果您不想区分大写和小写字符,可以使用nocase。关键字nocase是内容修饰符.此关键字的格式为:nocase;您必须将其放在要修改的内容之后,例如:

content: “abc”; nocase;它对签名中的其他内容没有影响。

8.3 depth(深度)

depth关键字是绝对内容修饰符。它来自内容。深度内容修饰符带有必需的数值,如:depth:12;深度后的数字表示将检查有效负载开头的字节数。

8.4 startswith

该startswith关键字类似depth。它不需要参数,必须遵循content关键字。它修改了content在缓冲区的开头准确匹配。如:content:"GET|20|";startswith;

startswith 是一个简写符号:

content:"GET|20|";depth:4;offset:0;

startswith不能与被混合depth,offset,within或 distance为相同的图案。

8.5 offset (偏移)

offset关键字指定将检查有效负载中的哪个字节以查找匹配。例如offset:3; 检查第四个字节并进一步。关键字偏移和深度可以组合并且通常一起使用。

如: content:“def”; offset:3; depth:3;

它将检查从第三个字节到第六个字节的有效载荷。

8.6 (distance )距离

关键字distance是相对内容修饰符。这意味着它表示此content 关键字与其前面的内容之间的关系。距离在前一次匹配后有影响。关键字distance带有必填数值。给出距离的值确定有效载荷中的字节,从中检查相对于前一个匹配的匹配项。距离仅确定Suricata将开始寻找模式的位置。所以,distance:5; 表示模式可以是前一个匹配后的任何位置+5个字节。要限制Suricata最后一次匹配后的距离,请使用“within”。

如:

图20

距离也可以是负数。它可用于检查部分相同内容(参见示例)的匹配项,或者甚至完全位于其之前的内容。但这并不经常使用。与其他关键字可以获得相同的结果。

8.7 within

关键字within 是相对于前一个匹配。其中的关键字带有必填数值。使用within确保只有当内容与设置的字节数内的有效负载匹配时才会有匹配。within 不能为0(零).

图21

如前所述,距离和内部可以很好地组合在一个签名中。如果您希望Suricata检查有效负载的特定部分以进行匹配,请在内部使用。

图22

8.8 isdataat

isdataat关键字的目的是查看有效负载的特定部分是否仍有数据。关键字以数字(位置)开头,然后是可选的,后跟“relative”,用逗号和选项rawbytes分隔。您可以使用“relative”一词来了解有效负载的特定部分是否仍有相对于上一次匹配的数据。

如:

isdataat:512;

isdataat:50,relative;

第一个例子说明了一个签名,它搜索有效载荷的字节512。第二个例子说明了在最后一次匹配之后搜索字节50的签名。

您也可以在isdataat之前使用否定(!)

图23

8.9 dsize

使用dsize关键字,您可以匹配数据包有效负载的大小。例如,您可以使用关键字来查找有效负载的异常大小。这在检测缓冲区溢出时可能很方便。格式:

dsize:;

8.10 rpc

rpc关键字可用于在RPC过程编号和RPC版本的SUNRPC CALL中进行匹配。您可以使用通过*定义的通配符修改关键字。使用此通配符,您可以匹配所有版本和/或程序编号。RPC(远程过程调用)是一种允许计算机程序在另一台计算机(或地址空间)上执行过程的应用程序。它用于进程间通信。请参见 http://en.wikipedia.org/wiki/Inter-process_communication

格式:

    rpc:,[|*],[|*]>;

8.11 replace(IPS模式)

替换内容修饰符只能在ips中使用。它调整网络流量。它将其后面的内容('abc')更改为另一个('def'),参见示例:

图24

替换修饰符必须包含与其替换的内容一样多的字符。它只能用于单个数据包。它不适用于HTTP uri等规范化缓冲区或重组流中的内容匹配。

校验和将由Suricata重新计算,并在使用replace关键字后更改。

8.12pcre(Perl兼容正则表达式)

关键字pcre与正则表达式上的特定匹配。有关正则表达式的更多信息,请访问http://en.wikipedia.org/wiki/Regular_expression。

pcre的复杂性虽然价格很高,但它对性能有负面影响。因此,为了减轻Suricata不得不经常检查pcre,pcre主要与'content'相结合。在这种情况下,在检查pcre之前,内容必须先匹配。pcre的格式:pcre:"//opts";

有一些pcre的特性可以修改:

默认情况下,pcre区分大小写。

.(点)是正则表达式的一部分。它匹配除换行符之外的每个字节。

默认情况下,有效负载将被检查为一行。

可以使用以下字符修改这些质量:

图25

这些选项是perl兼容修饰符。要使用这些修饰符,您应该将它们添加到正则表达式后面的pcre。像这样:

    pcre: “//i”;

有一些pcre兼容的改性剂也可以改变pcre的质量。这些是:

A:模式必须在缓冲区的开头匹配。(在pcre ^中类似于A.)

E:忽略缓冲区/有效负载末尾的换行符。

G:颠倒贪婪。

8.12.1 Suricata的修饰符

Suricata有自己特定的pcre修饰符。这些是:

R:匹配相对于最后一个模式匹配。它类似于距离:0;

U:使标准化的uri上的pcre匹配。它与uri_buffer匹配就像uricontent一样,内容与http_uri.U结合可以与/ R结合使用。请注意,R是相对于前一个匹配的,因此两个匹配必须位于HTTP-uri缓冲区中。阅读有关HTTP URI规范化的更多信息。

图26

I:在HTTP-raw-uri上进行pcre匹配。它与http_raw_uri匹配在同一个缓冲区中。我可以和/ R结合使用。请注意,R是相对于前一个匹配的,因此两个匹配必须位于HTTP-raw-uri缓冲区中。阅读有关HTTP URI规范化的更多信息。

P:在HTTP-request-body上进行pcre匹配。因此,它在与http_client_body相同的缓冲区上匹配。P可以与/ R组合。请注意,R是相对于前一个匹配的,因此两个匹配必须位于HTTP请求主体中。

Q:在HTTP响应主体上进行pcre匹配。因此,它在与http_server_body相同的缓冲区上匹配。Q可与/ R组合使用。请注意,R是相对于前一个匹配的,因此两个匹配必须位于HTTP响应主体中。

H:在HTTP标头上进行pcre匹配。H可以与/ R组合。请注意,R是相对于前一个匹配的,因此两个匹配必须位于HTTP标头正文中。

D:使非标准化标题上的pcre匹配。因此,它在与http_raw_header相同的缓冲区上匹配。D可以与/ R组合。请注意,R是相对于前一个匹配的,因此两个匹配必须位于HTTP-raw-header中。

M:使请求方法上的pcre匹配。因此,它在与http_method相同的缓冲区上匹配。M可以与/ R组合。请注意,R与前一个匹配项相关,因此两个匹配项必须位于HTTP方法缓冲区中。

C:在HTTP-cookie上进行pcre匹配。因此,它与http_cookie在同一个缓冲区上匹配。C可以与/ R组合。请注意,R与前一个匹配项相关,因此两个匹配项必须位于HTTP-cookie缓冲区中。

S:使HTTP-stat-code上的pcre匹配。因此,它在与http_stat_code相同的缓冲区上匹配。S可与/ R组合使用。请注意,R是相对于前一个匹配的,因此两个匹配必须位于HTTP-stat-code缓冲区中。

Y:使HTTP-stat-msg上的pcre匹配。因此,它在与http_stat_msg相同的缓冲区上匹配。Y可以与/ R组合。请注意,R是相对于前一个匹配的,因此两个匹配必须位于HTTP-stat-msg缓冲区中。

B:您可以在签名中遇到B,但这只是为了兼容性。因此,Suricata不使用B但支持它,因此它不会导致错误。

O:覆盖配置pcre匹配限制。

V:在HTTP-User-Agent上进行pcre匹配。因此,它在与http_user_agent相同的缓冲区上匹配。V可以与/ R组合。请注意,R与前一个匹配项相关,因此两个匹配项必须位于HTTP-User-Agent缓冲区中。

W:在HTTP主机上进行pcre匹配。因此,它在与http_host相同的缓冲区上匹配。W可与/ R组合使用。请注意,R与前一个匹配项相关,因此两个匹配项必须位于HTTP-Host缓冲区中。


9.转换

转换关键字将粘性缓冲区中的数据转换为其他内容。例:

alert http any any->any any (file_data;strip_whitespace;\content:"window.navigate(";sid:1;)

即使在navigate和(之间有一个或多个空格,此示例也会匹配流量。变换可以链接。它们按照它们在规则中出现的顺序进行处理。每个转换输出都充当下一个输出的输入。

9.1  strip_whitespace

剥离isspace()C中调用所考虑的所有空格,如:

alert http any any->any any (file_data;strip_whitespace;\content:"window.navigate(";sid:1;)

9.2 compress_whitespace

将所有连续的空格压缩到单个空间中.

9.3 to_sha256

获取缓冲区,计算SHA-256哈希并传递原始哈希值。如:

alert http any any->any any(http_request_line;to_sha256;\content:"|54A9 7A8A B09C 1B81 3725 2214 51D3 F997 F015 9DD7 049E E5AD CED3 945A FC79 7401|";sid:1;)

注意:取决于libnss被编译到Suricata中。


10.预过滤关键字

10.1 fast_pattern 

10.1.1 Suricata快速模式确定解释

如果在规则中明确设置了'fast_pattern'关键字,Suricata将使用它作为快速模式匹配。'fast_pattern'关键字只能按规则设置一次。如果未设置“fast_pattern”,Suricata会自动确定要用作快速模式匹配的内容。以下说明Suricata用于自动确定要使用的快速模式匹配的逻辑。(请注意,如果存在正(即非否定)内容匹配,则忽略否定内容匹配以进行快速模式确定。否则,考虑否定的内容匹配)

fast_pattern选择标准如下:

1.Suricata首先识别签名中使用的具有最高“优先级”的所有内容匹配。优先级基于匹配的缓冲区,通常“http_ *”缓冲区具有更高的优先级(较低的数字是较高的优先级)。有关哪些缓冲区具有优先级的详细信息,请参见 附录B.

2.在步骤1中识别的内容匹配(最高优先级内容匹配)内,最长(就字符/字节长度而言)内容匹配被用作快速模式匹配。

3.如果多个内容匹配具有相同的最高优先级并且有资格获得最长长度,则具有最高字符/字节多样性分数(“模式强度”)的那个匹配用作快速模式匹配。有关用于确定图案强度的算法的详细信息,请参阅附录C.

4.如果多个内容匹配具有相同的最高优先级,符合最长长度和相同的最高模式强度,则最后注册的缓冲区(“list_id”)用作快速模式匹配。有关不同缓冲区/列表的注册顺序,请参阅附录B.

5.如果多个内容匹配具有相同的最高优先级,则有资格获得最长的长度,相同的最高模式强度,并且具有相同的list_id(即查看相同的缓冲区),然后是首先出现的(从左到右) )在规则中用作快速模式匹配。

值得注意的是,对于具有相同优先级,长度和模式强度的内容匹配,'http_stat_msg','http_stat_code'和'http_method'优先于常规'内容'匹配。

10.1.2 附录

附录A - Suricata 1.3.4的缓冲区,list_id值和注册顺序.对于Suricata 1.1.x - 1.4.x,这应该基本相同.

图27

附录B - Suricata 2.0.7的缓冲区,list_id值,优先级和注册顺序

对于Suricata 2.0.x,这应该基本相同。


附录C
- 模式强度算法

图29

来自detect-engine-mpm.c。基本上,模式强度“得分”从零开始,从左到右查看传入的字节数组中的每个字符/字节。如果之前在数组中没有看到字符/字节,如果它是一个字母字符,它会为分数增加3; 否则,如果它是可打印字符0x00,0x01或0xFF,它会为分数增加4; 否则它会增加6分。如果在分数加1之前已经看到字符/字节。最终得分返回。


在多模式匹配器(MPM)中仅使用一个签名内容。如果有多个内容,则Suricata使用“最强”的内容。这意味着长度的组合,内容的变化程度以及它所处的缓冲区。通常,越长越好,越多越好。有时,签名作者得出结论,他希望Suricata使用其他内容,而不是默认使用。例如:

User-agent: Mozilla/5.0 Badness;

content:”User-Agent|3A|”;

content:”Badness”; distance:0;

在此示例中,您会看到第一个内容比第二个内容更长且更多,因此您知道Suricata将使用此内容作为MPM。由于“User-Agent:”会经常匹配,并且“Badness”在网络流量中显得较少,因此您可以使用“fast_pattern”使Suricata使用第二个内容。

content:”User-Agent|3A|”;

content:”Badness”; distance:0; fast_pattern;

10.1.1  fast_pattern:only

有时签名只包含一个内容。在这种情况下,没有必要Suricata将在MPM中找到匹配后进一步检查。如果只有一个内容,则整个签名匹配。Suricata会自动注意到这一点。在某些签名中,仍然用'fast_pattern:only;'表示。虽然Suricata不需要fast_pattern:但它确实支持它。

10.1.2  fast_pattern:’chop’

如果您不希望MPM使用整个内容,可以使用fast_pattern'chop'。例如:

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

这样,MPM仅使用最后四个字符

10.2 prefilter

可以使用'prefilter'关键字在特定规则中启用其他非MPM关键字的预过滤器引擎。在以下规则中,TTL测试将用于预过滤而不是单字节模式:

alert ip any any->any any(ttl:123;prefilter;content:"a";sid:1;)

有关如何配置预滤器引擎的更多信息,请参阅预滤器引擎。


11 .流关键字

11.1 flowbits

Flowbits由两部分组成。第一部分描述了它将要执行的操作,第二部分是flowbit的名称。有多个数据包属于一个流。Suricata将这些流量保留在内存中。欲了解更多信息,请参阅 流和流处理。Flowbits可以确保在例如两个不同的数据包匹配时生成警报。只有两个数据包匹配时才会生成警报。因此,当第二个数据包匹配时,Suricata必须知道第一个数据包是否也匹配。如果数据包匹配,Flowbits标记流程,因此Suricata'知道'它应该在第二个数据包匹配时生成警报。

Flowbits有不同的动作。这些是:

flowbits:set,name

            将在流程中设置条件/'名称'(如果存在)。

flowbits:isset,name

            可以在规则中使用,以确保在规则匹配并在流中设置条件时生成警报。

flowbits:toggle,name

            反转当前设置。因此,例如,如果设置了条件,则将取消设置,反之亦然。

flowbits:unset,name

            可用于取消流程中的条件。

flowbits:isnotset,name

            可以在规则中使用,以确保它在匹配时生成警报,并且未在流中设置条件。

flowbits:noalert

            此规则不会生成警报。

如:

图30

当您查看第一个规则时,您将注意到它会生成一个警报,如果它匹配,如果它不是该规则末尾的'flowbits:noalert'。此规则的目的是检查“userlogin”上的匹配项并在流中标记该匹配项。因此,无需生成警报。没有第一条规则,第二条规则无效。如果第一个规则匹配,则flowbits将该特定条件设置为存在于流中。现在使用第二个规则可以检查先前的数据包是否满足第一个条件。如果此时第二个规则匹配,则会生成警报。

11.2 flow

flow关键字可用于匹配流的方向,因此可以to/from客户端或to/from服务器进行匹配。如果流程建立与否,它也可以匹配。flow关键字也可用于表示签名必须仅在流上(only_stream)或仅在数据包上匹配(no_stream)。

因此,使用flow关键字,您可以匹配:

to_client

            匹配从服务器到客户端的数据包。

to_server

            匹配从客户端到服务器的数据包。

from_client

            匹配从客户端到服务器的数据包(与to_server相同)。

from_server

            匹配从服务器到客户端的数据包(与to_client相同)。

established

            匹配已建立的连接。

not_established

            匹配不属于已建立连接的数据包。

stateless

            匹配已建立连接且不属于已建立连接的数据包。

only_stream

            匹配由流引擎重新组装的数据包。

no_stream

            匹配尚未由流引擎重组的数据包。将不匹配已重新组装的数据包。

only_frag

            匹配已从片段重组的数据包。

no_frag

            匹配尚未从片段重组的数据包。

可以组合多个流选项,例如:

图31

确定的标准取决于协议:

对于TCP,将在三次握手之后建立连接:

图32

对于其他协议(例如UDP),在看到来自连接两边的流量后,将认为建立了连接。

图33

11.3 flowint

Flowint允许使用变量进行存储和数学运算。它的运行方式与flowbits非常相似,但增加了数学功能,并且可以存储和操作整数,而不仅仅是标志集。我们可以将它用于许多非常有用的事情,例如计算出现次数,添加或减去出现次数,或者在流中对多个因子进行阈值处理。这将很快扩展到全局上下文,因此用户可以在流之间执行这些操作

语法如下:

flowint:name,modifier[,value];

定义var(不是必需的),或检查是否设置了一个:

flowint:name,<+,-,=,>,<,>=,<=,==,!=>,value;

flowint:name,(isset|isnotset);

比较或改变变量。加,减,比较大于或小于,大于或等于,小于或等于可用。要比较的项目可以是整数或其他变量。

例如,如果您想要计算在特定流中看到用户名的次数,并警告它是否超过5。

alert tcp any any->any any(msg:"Counting Usernames";content:"jonkman";\flowint:usernamecount,+,1;noalert;)这将计算每次出现并增加var usernamecount,而不为每个出现警报。现在说如果流中有超过五个匹配,我们想要生成警报:alert tcp any any->any any(msg:"More than Five Usernames!";content:"jonkman";\flowint:usernamecount,+,1;flowint:usernamecount,>,5;)因此,只有当usernamecount超过五个时,我们才会收到提醒.所以现在让我们说我们想要获得如上所述的警报,但不是如果有更多的用户名注销。假设此特定协议表示使用“jonkman logout”注销,请尝试:alert  tcp  any  any->any  any(msg:"Username Logged out";content:"logout jonkman";\flowint:usernamecount,-,1;flowint:usernamecount,>,5;)所以现在,如果此特定用户名的活动登录数超过五个,我们将仅收到警报.这是一个相当简单的例子,但我相信它显示了这样一个简单的函数可以为规则编写做些什么的力量。我在登录跟踪,IRC状态机,恶意软件跟踪和暴力登录检测等方面看到了很多应用程序。

假设我们正在跟踪一个通常允许每个连接有五次登录失败的协议,但是我们有一个漏洞,攻击者可以在五次尝试之后继续登录,我们需要了解它。alert tcp an yany->any any(msg:"Start a login count";content:"login failed";\flowint:loginfail,notset;flowint:loginfail,=,1;noalert;)因此,如果变量尚未设置,我们会检测到初始失败,如果是,则将其设置为1。我们的第一击。

alert tcp any any->any any(msg:"Counting Logins";content:"login failed";\flowint:loginfail,isset;flowint:loginfail,+,1;noalert;)

如果已设置,我们现在正在递增计数器。

alert tcp any any->any any(msg:"More than Five login fails in a Stream";\content:"login failed";flowint:loginfail,isset;flowint:loginfail,>,5;)

现在,如果我们在同一个流中交叉五次登录失败,我们将生成警报。

但是,我们还要说,如果有两次成功登录并且之后登录失败,我们也需要提醒。

alert tcp any any->any any(msg:"Counting Good Logins";\content:"login successful";flowint:loginsuccess,+,1;noalert;)

在这里,我们计算好登录,所以现在我们将计算与失败相关的良好登录:

alert tcp any any->any any(msg:"Login fail after two successes";\content:"login failed";flowint:loginsuccess,isset;\flowint:loginsuccess,=,2;)

11.4 stream_size 

流大小选项根据注册的字节数按序列号匹配流量。此关键字有几个修饰符

图34

格式:

stream_size:,,;

规则中stream-size关键字的示例:

alert tcp any any->any any(stream_size:both,>,5000;sid:1;)

12 . bypass关键字

Suricata有一个bypass关键字,可用于签名,以排除进一步评估的流量。该bypass关键字在预期流量较大的情况下非常有用(例如Netflix,Spotify,Youtube).该bypass关键字被视为匹配后关键字.如:在匹配的http流量上绕过流量:

alert http any any->any any(content:"suricata-ids.org";\http_host;bypass;sid:10001;rev:1;)

你可能感兴趣的:(suricata 规则及部分关键字)