Suricata规则-协议规则
接下来就介绍各种协议的签名。
IP 关键字
关于IP关键字要结合相关的Ip协议的网络知识。
ttl
time-to-live 在IP协议中涉及到跳转的路由次数,
格式:ttl:<number>
例子:ttl:10;
实例:
alert ip $EXTERNAL_NET any -> $HOME_NET any (msg:”GPL MISC 0 ttl”; ttl:0; reference:url,support.microsoft.com/default.aspx?scid=kb#-#-EN-US#-#-q138268; reference:url,www.isi.edu/in-notes/rfc1122.txt; classtype:misc-activity; sid:2101321; rev:9;)
ipopts
这个对应的IP首部的可选项Options,在每一个规则中我们可以选择下表其中一个选项作去匹配。
| IP Option | Description | |
|---|---|---|
| rr | Record Route | |
| eol | End of List | |
| nop | No Op | |
| ts | Time Stamp | |
| sec | IP Security | |
| esec | IP Extended Security | |
| lsrr | Loose Source Routing | |
| ssrr | Strict Source Routing | |
| satid | Stream Identifier | |
| any | any IP options are set |
格式:ipopts: <name>
例子:ipopts: lsrr;
实例:
alert ip $EXTERNAL_NET any -> $HOME_NET any (msg:”GPL MISC source route ssrr”; ipopts:ssrr; reference:arachnids,422; classtype:bad-unknown; sid:2100502; rev:3;)
sameip
检查和源IP是否和目标IP相同。
格式: sameip;
例子: sameip;
实例:
alert ip any any -> any any (msg:”GPL SCAN same SRC/DST”; sameip; reference:bugtraq,2666; reference:cve,1999-0016; reference:url,www.cert.org/advisories/CA-1997-28.html; classtype:bad-unknown; sid:2100527; rev:9;)
ip_proto
对应这IP首部的协议,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 |
上面只是一部分,详细的请看en.wikipedia.org/wiki/List_o…
例子:ip_proto:PIM; ip_proto:103;
实例:
alert ip any any -> any any (msg:”GPL MISC IP Proto 103 PIM”; ip_proto:103; reference:bugtraq,8211; reference:cve,2003-0567; classtype:non-standard-protocol; sid:2102189; rev:4;)
ipv4.hdr
Sticky buffer 匹配整个IPV4的头部
例子:
alert ip any any -> any any (ipv4.hdr; content:”|3A|”; offset:9; depth:1; sid:1234; rev:5;)
ipv6.hdr
Sticky buffer 匹配整个IPV6的头部
id
ip字段里的标识,用户分片的重组,同一个分片的标识相同,
格式:
id:<number>
实例:
alert 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|”; window: 2048; reference:url,www.f5.com/f5products/v9intro/index.html; reference:url,doc.emergingthreats.net/2001609; classtype:misc-activity; sid:2001609; rev:13;)
geoip
这个查看目标和源的ip位置,并且你能看到他属于哪个国家的,为了查看位置使用GeoIP2的数据库文件。IP数据库未见你需要去官网下载。
格式:
geoip: src,RU;
geoip: both,CN,RU;
geoip: dst,CN,RU,IR;
geoip: both,US,CA,UK;
geoip: any,CN,IR;
| Option | Description |
|---|---|
| both | 两个方向都必须与给定的geoip(s)匹配 |
| any | 方向之一必须与给定的geoip(s)匹配 |
| dest | 如果目的地与给定的geoip匹配 |
| src | 源与给定的geoip匹配 |
fragbits(ip fragmentation)
使用 fragbits 关键字,您可以检查 IP 标头中是否设置了分片和保留位。fragbits 关键字应该放在规则的开头。
格式:
fragbits:[*+!]<[MDR]>;
字符说明:
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
实例:
alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg:”ET EXPLOIT Invalid non-fragmented packet with fragment offset>0”; fragbits: M; fragoffset: >0; reference: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;)
fragoffset
使用 fragoffset 关键字,您可以匹配 IP 片段偏移字段的特定十进制值。如果要检查会话的第一个片段,则必须将 fragoffset 0 与 More Fragment 选项结合使用。
格式:
fragoffset:[!|<|>]<number>;
修饰符:
< 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
示例:
alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg:”ET EXPLOIT Invalid non-fragmented packet with fragment offset>0”; fragbits: M; fragoffset: >0; reference: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;)
tos
匹配ip头部的区别服务
格式:
tos:[!]<number>;
规则例子:
alert ip any any -> any any (msg:”Differentiated Services Codepoint: Class Selector 1 (8)”; flow:established; tos:8; classtype:not-suspicious; sid:2600115; rev:1;)
TCP关键字
seq
seq 关键字可用于签名以检查特定的 TCP 序列号。序列号实际上是由 TCP 连接的两个端点随机生成的数字。客户端和服务器都创建一个序列号,它们发送的每个字节都会增加一个序列号。所以这个序列号对双方都是不同的。该序列号必须得到连接双方的确认。通过序列号,TCP 处理确认、排序和重传。它的数量随着发送方发送的每个数据字节而增加。seq 有助于跟踪一个字节属于数据流中的哪个位置。如果 SYN 标志设置为 1,那么数据的第一个字节的序列号就是这个数字加 1(所以,2)。
例子:
seq:0
实例:
alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg:”GPL SCAN NULL”; flow:stateless; ack:0; flags:0; seq:0; reference:arachnids,4; classtype:attempted-recon; sid:2100623; rev:7;)
ack
ack 是对 TCP 连接另一端发送的所有先前(数据)字节的接收的确认。在大多数情况下,TCP 连接的每个数据包在第一个 SYN 之后都有一个 ACK 标志和一个随着每个新数据字节的接收而增加的 ack 编号。可以在签名中使用 ack 关键字来检查特定的 TCP 确认号。
格式:
ack:1
实例:
alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg:”GPL SCAN NULL”; flow:stateless; ack:0; flags:0; seq:0; reference:arachnids,4; classtype:attempted-recon; sid:2100623 ; rev:7;)
window
window 关键字用于检查特定的 TCP 窗口大小。TCP 窗口大小是一种控制数据流的机制。窗口由接收器设置(接收器通告的窗口大小)并指示可以接收的字节数。在发送方可以发送相同数量的新数据之前,接收方必须首先确认此数量的数据。该机制用于防止接收器被数据溢出。窗口大小的值是有限的,可以是 2 到 65.535 字节。为了更多地利用您的带宽,您可以使用更大的 TCP 窗口。
格式:
window:[!]<number>;
实例:
alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg:"GPL DELETED Typtrot trojan traffic"; flow:stateless; flags:S,12; window:55808; reference:mcafee,100406; classtype:trojan-activity; sid:2182 ; rev:8;)
tcp.mss
匹配 TCP MSS 选项值。如果选项不存在,则不匹配。
格式:
tcp.mss:<min>-<max>;
tcp.mss:[<|>]<number>;
tcp.mss:<value>;
示例:
alert tcp $EXTERNAL_NET any -> $HOME_NET any (flow:stateless; flags:S,12; tcp.mss:<536; sid:1234; rev:5;)
tcp.hdr
这个Sticky buffer 匹配整个TCP的头部
规则例子:
alert tcp $EXTERNAL_NET any -> $HOME_NET any (flags:S,12; tcp.hdr; content:”|02 04|”; offset:20; byte_test:2,<,536,0,big,relative; sid:1234; rev:5;)
UDP 关键字
udp.hdr
在整个 UDP 标头上匹配的粘性缓冲区。
示例规则:
alert udp any any -> any any ( udp.hdr; content:"|00 08|"; offset:4; depth:2; sid:1234; rev:5;)
ICMP关键字
itype
itype 关键字用于匹配特定的 ICMP 类型(数字)。ICMP 有多种消息,并使用代码来阐明这些消息。不同的消息因名称不同而不同,但更重要的是数字值。
itype 关键字的格式:
itype:min<>max;
itype:[<|>]<number>;
示例
alert icmp $EXTERNAL_NET any -> $HOME_NET any (msg:”GPL SCAN Broadscan Smurf Scanner”; dsize:4; icmp_id:0; icmp_seq:0; itype:8; classtype:attempted-recon; sid:2100478; rev:4 ;)
| ICMP | 类型 | 名称 |
|---|---|---|
| 0 | 回声回复 | |
| 3 | 目的地不可达 | |
| 4 | Source Quench | |
| 5 | 重定向 | |
| 6 | 备用主机地址 | |
| 8 | Echo | |
| 9 | Router Advertisement | |
| 10 | 路由器请求 | |
| 11 | 超时 | |
| 12 | 参数问题 | |
| 13 | 时间戳 | |
| 14 | 时间戳回复 | |
| 15 | 信息请求 | |
| 16 | 信息回复 | |
| 17 | 地址掩码请求 | |
| 18 | 地址掩码回复 | |
| 30 | 跟踪路由 | |
| 31 | 数据报转换错误 | |
| 32 | 移动主机重定向 | |
| 33 | IPv6 你在哪里 | |
| 34 | IPv6 我在这里 | |
| 35 | 移动注册请求 | |
| 36 | 手机注册回复 | |
| 37 | 域名请求 | |
| 38 | 域名回复 | |
| 39 | 跳过 | |
| 40 | Photuris | |
| 41 | 实验性移动协议,例如 Seamoby |
icode
使用 icode 关键字,您可以匹配特定的 ICMP 代码。ICMP 消息的代码阐明了该消息。它与 ICMP 类型一起指示您正在处理的问题类型。每种 ICMP 类型的代码都有不同的用途。
格式:
icode:min<>max;
icode:[<|>]<number>;
示例:此示例查找大于 5 的 ICMP 代码:
icode:>5;
规则中 icode 关键字的示例:
alert icmp $HOME_NET any -> $EXTERNAL_NET any (msg:”GPL MISC Time-To-Live Exceeded in Transit”; icode:0; itype:11; classtype:misc-activity; sid:2100449; rev:7;)
icmp_id
使用 icmp_id 关键字,您可以匹配特定的 ICMP id 值。每个 ICMP 数据包在发送时都会获得一个 ID。在接收方收到数据包的那一刻,它将使用相同的 id 发送回复,以便发送方识别它并将其与正确的 ICMP 请求连接。
icmp_id 关键字的格式:
icmp_id:<number>;
示例:此示例查找 0 的 ICMP ID:
icmp_id:0;
规则中 icmp_id 关键字的示例:
alert icmp $EXTERNAL_NET any -> $HOME_NET any (msg:”GPL SCAN Broadscan Smurf Scanner”; dsize:4; icmp_id:0; icmp_seq:0; itype:8; classtype:attempted-recon; sid:2100478; rev:4 ;)
icmp_seq
您可以使用 icmp_seq 关键字来检查 ICMP 序列号。ICMP 消息都有序列号。这对于检查哪个回复消息属于哪个请求消息很有用(与 id 一起)。
icmp_seq 关键字的格式:
icmp_seq:<number>;
示例:此示例查找 0 的 ICMP 序列:
icmp_seq:0;
规则中的 icmp_seq 示例:
alert icmp $EXTERNAL_NET any -> $HOME_NET any (msg:”GPL SCAN Broadscan Smurf Scanner”; dsize:4; icmp_id:0; icmp_seq:0; itype:8; classtype:attempted-recon; sid:2100478; rev:4 ;)
icmpv4.hdr
Sitcky 缓冲区匹配整个 ICMPv4 标头。
icmpv6.hdr
在整个 ICMPv6 标头上匹配的粘性缓冲区。
icmpv6.mtu
匹配 ICMPv6 MTU 可选值。如果 MTU 不存在,则不匹配。
关键字格式:
icmpv6.mtu:<min>-<max>;
icmpv6.mtu:[<|>]<number>;
icmpv6.mtu:<value>;
示例规则:
alert ip $EXTERNAL_NET any -> $HOME_NET any ( icmpv6.mtu:<1280; sid:1234; rev:5;)