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):
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):
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;)