6.3. IP关键字

6.3.1. 生存时间(TTL)

TTL关键字用于检查数据包头中的特定IP生存时间值。格式为:

ttl:<number>

例如::

ttl:10;

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

规则中TTL关键字的示例:

警报IP$external_net any->$home_net any(msg:“gpl misc 0 ttl”; ttl:0; 参考:url,support.microsoft.com/default.aspx?scid=kb--en-us--q138268;参考:url,www.isi.edu/in-notes/rfc1122.txt;classtype:misc activity;sid:2101321;rev:9;)

6.3.2. IPopts公司

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

IP选项

描述

右后

记录路线

EOL

列表末尾

不适用

无操作

TS

时间戳

IP安全

欧洲证券交易所

IP扩展安全

最低有效辐射率

松散源路由

SSRR系统

严格的源路由

萨蒂德

流标识符

任何

设置了任何IP选项

ipopts关键字的格式:

ipopts: <name>

例如::

ipopts: lsrr;

规则中IPopts的示例:

警报IP$external_net any->$home_net any(msg:“gpl misc source route ssrr”; ipopts:ssrr; 参考文献:蛛形纲,422;分类类型:Bad Unknown;sid:2100502;版本:3;)

6.3.3. 萨迈普

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

sameip;

规则中的sameip示例:

alert ip any->any any(msg:“gpl scan same src/dst”; sameip; 参考:Bugtraq,2666;参考:cve,1999-0016;参考:url,www.cert.org/advisories/ca-1997-28.html;classtype:bad unknown;sid:2100527;rev:9;)

6.3.4. ip_proto

使用ip_proto关键字,您可以在包头的ip协议上进行匹配。您可以使用协议的名称或编号。例如,您可以在以下协议上进行匹配:

 1     ICMP        Internet Control Message
 6     TCP         Transmission Control Protocol
17     UDP         User Datagram
47     GRE         General Routing Encapsulation
50     ESP         Encap Security Payload for IPv6
51     AH          Authentication Header for Ipv6
58     IPv6-ICMP   ICMP for Ipv6

有关协议及其编号的完整列表,请参阅http://en.wikipedia.org/wiki/list_-ip_-protocol_-numbers

规则中的IP协议示例:

警告ip any->any any(msg:“gpl misc ip proto 103 pim”; ip_proto:103; 参考:Bugtraq,8211;参考:CVE,2003-0567;类别:非标准协议;SID:2102189;版本:4;)

该示例的命名变量为:

ip_proto:PIM

6.3.5. ipv4.hdr

在整个IPv4标头上匹配的粘性缓冲区。

示例规则:

警报ip any any->any any (ipv4.hdr; content:"|3A|"; offset:9; depth:1; sid:1234;版本:5;)

这个例子检查IPv4头的字节9是否有值3A,这意味着IPv4协议是ICMPv6。

6.3.6. ipv6.hdr

整个IPv6缓冲区上的粘性匹配。

6.3.7. 身份证件

使用id关键字,可以匹配特定的IP id值。标识标识主机发送的每个数据包,并且通常随着发送的每个数据包增加一个。IP ID用作片段标识号。每一个包都有一个IP ID,当包成为碎片时,这个包的所有片段都有相同的ID,这样,包的接收者就知道哪些片段属于同一个包。(IP ID不处理顺序,在这种情况下使用偏移量。它澄清了碎片的顺序。)

ID格式:

id:<number>;

规则中的ID示例:

警告tcp$external_net any->$home_net any(msg:“et deleted f5 big-ip 3dns tcp probe 1”; id: 1; dsize:24;flags:s,12;content:“00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ”;window:2048;reference:url,www.f5.com/f5products/v9intro/index.html;reference:url,doc.emergingthreats.net/2001609;classtype:misc activity;sid:2001609;rev:13;)

6.3.8. 大地水准面

geoip关键字使(您)能够匹配网络流量的源、目标或源和目标IPv4地址,并查看它属于哪个国家。为了能够做到这一点,Suricata使用了MaxMind的geoip2 API。

geoip的语法:

geoip: src,RU;
geoip: both,CN,RU;
geoip: dst,CN,RU,IR;
geoip: both,US,CA,UK;
geoip: any,CN,IR;

所以,你可以看到你可以用下面的方法来明确你想要匹配的方向

期权

描述

二者都

两个方向都必须与给定的地理位置相匹配

任何

其中一个方向必须与给定的地理位置相匹配。

如果目的地与给定的geoip匹配。

SRC

源与给定的geoip匹配。

关键字只支持IPv4。由于它使用了maxmind的geoip2 API,因此必须在中编译libmaxmindb。必须下载并安装所需的geoip2或geolite2数据库版本。有关详细信息,请访问MaxMind网站:https://dev.maxmind.com/geoip/geoip2/geolite2/

您还必须在yaml文件配置中提供本地系统上geoip2或geolite2数据库文件的位置(例如):

geoip-database: /usr/local/share/GeoIP/GeoLite2-Country.mmdb

6.3.9. fragbits(IP碎片)

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

您可以匹配以下位:

M - More Fragments
D - Do not Fragment
R - Reserved Bit

可以使用以下修饰符更详细地指定此位上的匹配:

+         match on the specified bits, plus any others
*         match if any of the specified bits are set
!         match if the specified bits are not set

格式::

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

规则中的fragbits示例:

警告tcp$external_net any->$home_net any(msg:“et exploit invalid non-fragmented packet with fragment offset>0”; fragbits: M; fragoffset:>0;参考:url,doc.emergingthreats.net/bin/view/main/2001022;类类型:bad unknown;sid:2001022;版本:5;元数据:在2010年创建,在2010年更新)

6.3.10. 碎片补偿

使用fragoffset关键字,可以匹配IP片段偏移字段的特定十进制值。如果要检查会话的第一个片段,则必须将fragoffset 0与more fragment选项组合在一起。碎片偏移场便于重新组装。ID用于确定哪些片段属于哪个包,碎片偏移字段澄清片段的顺序。

可以使用以下修改器:

<       match if the value is smaller than the specified value
>       match if the value is greater than the specified value
!       match if the specified value is not present

fragoffset格式:

fragoffset:[!|<|>]<number>;

规则中的fragoffset示例:

警告tcp$external_net any->$home_net any(msg:“et exploit invalid non-fragmented packet with fragment offset>0”;fragbits:m; fragoffset: >0; 参考:url,doc.emergingthreats.net/bin/view/main/2001022;classtype:bad unknown;sid:2001022;rev:5;metadata:created_at 2010_07_30,updated_at 2010_07_30;)

6.3.11. TOS公司

TOS关键字可以匹配IP头TOS字段的特定十进制值。TOS关键字的值可以是0-255。IP头的此字段已由更新 rfc2474 包括以下功能: Differentiated services . 请注意,字段的值已定义为最右边的2位值为0。为tos指定值时,请确保该值紧跟其后。

E、 g,不是指定十进制值34(hex 22),而是右移两次并使用十进制136(hex 88)。

可以将十六进制值指定为 x ,例如, x88 .

TOS格式:

tos:[!]<number>;

规则中的TOS示例:

警告ip any->any any(msg:“差分服务码点:类选择器1(8)”;流:已建立; tos:8; classtype:不可疑;sid:2600115;rev:1;)

具有负值的TOS示例:

警告ip any->any any(msg:“tgi hunt non diffserv aware tos setting”;流:已建立,到服务器; tos:!0; tos:!8; tos:!16; tos:!24; tos:!32; tos:!40; tos:!48; tos:!56; 阈值:类型限制,按src跟踪,秒60,计数1;类类型:错误未知;sid:2600124;rev:1;)

6.4. TCP关键字

6.4.1. SEQ

seq关键字可以在签名中用于检查特定的TCP序列号。序列号实际上是由TCP连接的两个端点随机生成的数字。客户机和服务器都创建了一个序列号,序列号随着发送的每个字节的增加而增加。所以两边的序列号是不同的。连接两侧必须确认此序列号。TCP通过序列号处理确认、排序和重传。它的数目随着发送方发送的每个数据字节的增加而增加。seq帮助跟踪字节所属的数据流中的位置。如果syn标志设置为1,那么数据第一个字节的序列号就是这个数字加1(so,2)。

例子::

seq:0;

签名中的seq示例:

警告tcp$external_net any->$home_net any(msg:“gpl scan null”;flow:stateless;ack:0;flags:0; seq:0; 参考文献:蛛形纲动物,4;分类类型:试图侦察;sid:2100623;版本:7;)

数据包中的seq示例(wireshark):

../_images/Wireshark_seq.png

6.4.2. 确认

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

确认格式:

ack:1;

签名中的ACK示例:

警告tcp$external_net any->$home_net any(msg:“gpl scan null”;流:无状态; ack:0; 标志:0;序列:0;参考:蛛形纲动物,4;分类类型:尝试侦察;sid:2100623;版本:7;)

包中的ACK示例(wireshark):

../_images/Wireshark_ack.png

6.4.3. 窗口

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

window关键字的格式:

window:[!]<number>;

规则中的窗口示例:

警告tcp$external_net any->$home_net any(msg:“gpl deleted typot trojan traffic”;流:无状态;标志:s,12; window:55808; 参考:McAfee,100406;分类类型:特洛伊木马活动;sid:2182;版本:8;)

6.4.4. tcp.mss

匹配tcp mss选项值。如果选项不存在,将不匹配。

关键字的格式:

tcp.mss:<min>-<max>;
tcp.mss:[<|>]<number>;
tcp.mss:<value>;

示例规则:

警告tcp$external_net any->$home_net any(流:无状态;标志:s,12; tcp.mss:<536; sid:1234;版本:5;)

6.4.5. tcp.hdr

在整个TCP头上匹配的粘性缓冲区。

示例规则:

警告tcp$external_net any->$home_net any(标志:s,12; tcp.hdr; content:"|02 04|"; offset:20; byte_test:2,<,536,0,big,relative; sid:1234;版本:5;)

这个例子开始关注报头的固定部分,所以进入可变大小的选项。在这里,它将查找mss选项(类型2,选项len 4),并使用字节_测试确定选项的值是否低于536。这个 tcp.mss 选项将更有效,因此此关键字用于没有特定关键字可用的情况。

6.5. UDP关键字

6.5.1. udp.hdr

在整个UDP头上匹配的粘性缓冲区。

示例规则:

通知udp any any->any any (udp.hdr; content:"|00 08|"; offset:4; depth:2; sid:1234;版本:5;)

此示例与UDP头的长度字段匹配。在这种情况下,8的长度意味着没有有效载荷。也可以使用 dsize:0; .

6.6. ICMP关键字

ICMP(Internet控制消息协议)是IP的一部分。在传递数据(数据报)方面,IP本身并不可靠。如果出现问题,ICMP会给出反馈。它并不能防止问题的发生,但有助于理解哪里出了问题,哪里出了问题。如果可靠性是必要的,那么使用IP的协议必须自己考虑可靠性。在不同情况下,将发送ICMP消息。例如,当目的地不可到达时,如果没有足够的缓冲容量来转发数据,或者当一个数据报被分段发送时,它不应该是,等等。在包含消息类型的列表中可以找到更多信息。

一条ICMP报文有四个重要内容,可与相应的ICMP关键字相匹配。它们是:消息的类型、代码、ID和序列。

6.6.1. 城市体育

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

IType关键字的格式:

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

示例此示例查找大于10的ICMP类型:

itype:>10;

签名中的IType关键字示例:

警报ICMP$external_net any->$home_net any(msg:“gpl scan broadscan smurf scanner”;dsize:4;ICMP_id:0;ICMP_seq:0; itype:8; classtype:试图侦察;sid:2100478;rev:4;)

以下列出了写入时已知的所有ICMP类型。可以找到最近的表 at the website of IANA

ICMP类型

名字

0

回音回复

3

目标不可达

4

源淬火

5

重定向

6

修改主机地址

8

回声

9

路由器通告

10

路由器请求

11

超过时间

12

参数问题

13

时间戳

14

时间戳应答

15

信息请求

16

信息回复

17

地址屏蔽请求

18

地址屏蔽回复

30

追踪路线

31

数据报转换错

32

移动主机重定向

33

ipv6你在哪里

34

ipv6我在这里

35

移动注册请求

36

手机注册回复

37

域名请求

38

域名回复

39

SKIP

40

石楠属

41

实验性移动协议,如Seamoby

6.6.2. ICode

使用icode关键字可以匹配特定的ICMP代码。ICMP消息的代码澄清了该消息。它与ICMP类型一起指示您正在处理的问题类型。每种ICMP类型的代码都有不同的用途。

icode关键字的格式:

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

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

icode:>5;

规则中ICode关键字的示例:

警告icp$home_net any->$external_net any(msg:“gpl misc time to live exceeded in transit”; icode:0; ITYPE:11;ClassType:Misc活动;SID:2100449;版本:7;)

以下列出了所有ICMP类型的含义。如果没有列出代码,则在上表中只定义类型0并具有ICMP代码的含义。可以找到最近的表 at the website of IANA

ICMP代码

ICMP类型

描述

3

0

无法访问网络

1

主机不可达

2

协议不可达

3

端口不可达

4

需要碎片,但未设置碎片

5

源路由失败

6

目标网络未知

7

目标主机未知

8

源主机已隔离

9

禁止与目的地网络通信。

10

在管理上禁止与目标主机通信

11

服务类型无法访问目标网络

12

服务类型无法访问目标主机

13

行政禁止通讯

14

主机优先级冲突

15

优先权截止生效

5

0

重定向网络(或子网)的数据报

1

重定向主机的数据报

2

重定向服务和网络类型的数据报

3

重定向服务和主机类型的数据报

9

0

普通路由器广告

16

不路由普通流量

11

0

在运输过程中超过了生存时间

1

碎片重新组装时间超过

12

0

指针指示错误

1

缺少必需的选项

2

长度错误

40

0

不良SPI

1

身份验证失败

2

解压缩失败

3

解密失败

4

需要身份验证

5

需要授权

6.6.3. icmp_id

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

icmp_id关键字的格式:

icmp_id:<number>;

示例:此示例查找ICMP ID 0::

icmp_id:0;

规则中的icmp_id关键字示例:

警告ICMP$External_net any->$Home_net any(msg:“gpl scan broadscan smurf scanner”;dsize:4; icmp_id:0; icmp_seq:0;type:8;classtype:attempted recon;sid:2100478;rev:4;)

6.6.4. icmp_seq

可以使用icmp_seq关键字检查icmp序列号。ICMP消息都有序列号。这对于检查哪个回复消息属于哪个请求消息(与ID一起)很有用。

icmp_seq关键字的格式:

icmp_seq:<number>;

示例:此示例查找0的ICMP序列:

icmp_seq:0;

规则中的ICMP序列示例:

警告ICMP$external_net any->$home_net any(msg:“gpl scan broadscan smurf scanner”;dsize:4;ICMP_id:0; icmp_seq:0; ITYPE:8;ClassType:尝试侦察;Sid:2100478;Rev:4;)

6.6.5. icmpv4.hdr

匹配整个ICMPv4报头的Sitcky缓冲区。

6.6.6. icmpv6.hdr

在整个ICMPv6标头上匹配的粘性缓冲区。

6.6.7. icmpv6.mtu

匹配ICMPv6 MTU可选值。如果MTU不存在,则不匹配。

关键字的格式:

icmpv6.mtu:<min>-<max>;
icmpv6.mtu:[<|>]<number>;
icmpv6.mtu:<value>;

示例规则:

警报ip$EXTERNALu NET any->$HOMEu NET any (icmpv6.mtu:<1280; sid:1234;版本:5;)