Suricata规则-协议规则

1,277 阅读8分钟

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 OptionDescription
rrRecord Route
eolEnd of List
nopNo Op
tsTime Stamp
secIP Security
esecIP Extended Security
lsrrLoose Source Routing
ssrrStrict Source Routing
satidStream Identifier
anyany 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首部的协议是上一层的协议,就是传输层的协议,

1ICMPInternet Control Message
6TCPTransmission Control Protocol
17UDPUser Datagram
47GREGeneral Routing Encapsulation
50ESPEncap Security Payload for IPv6
51AHAuthentication Header for Ipv6
58IPv6-ICMPICMP 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;
OptionDescription
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目的地不可达
4Source Quench
5重定向
6备用主机地址
8Echo
9Router Advertisement
10路由器请求
11超时
12参数问题
13时间戳
14时间戳回复
15信息请求
16信息回复
17地址掩码请求
18地址掩码回复
30跟踪路由
31数据报转换错误
32移动主机重定向
33IPv6 你在哪里
34IPv6 我在这里
35移动注册请求
36手机注册回复
37域名请求
38域名回复
39跳过
40Photuris
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;)