suricate签名包括三部分组成。分别为action、header、rule options。
action部分有四种可选项。
pass: 如果和pass的规则匹配,数据包会立即发送到目标。
Drop:如果程序匹配到了这类规则,数据包会被阻断发送。
Reject:在匹配到规则时会拒绝数据包。当数据包为TCP时,会返回一个 RST 数据包重置连接。
Alert:当匹配到规则时,会对数据包进行放行,但是会记录一条警报。
默认的优先级为:Pass > Drop > Reject > Alert。
header部分
有四大类规则选项
协议(Protocol):这个字段用来告诉 Suricata 当前规则所包含的协议。
源/目的地址(Source and destination):源/目的地址
端口号(Ports):端口号。通常情况下端口号会设置为 any,这样会影响所有的协议。
流向(Direction):告诉规则匹配哪些方向上的流量数据。
rule options部分
规则选项构成了Snort入侵检测引擎的核心,将易用性、强大性和灵活性结合在一起。所有Snort规则选项都使用分号(;)相互分隔性格规则选项关键字用冒号(:)字符与其参数分隔开。
有几大类规则选项
Meta Keywords:元设置对 Suricata 的检查没有影响;它们确实对 Suricata 报告事件的方式产生了影响。
IP Keywords: ip规则关键词
TCP keywords: TCP规则关键词
Payload Keywords:有效负载关键字检查数据包或流的有效负载内容。
UDP keywords
ICMP keywords
规则 | 介绍 | 示例 |
msg | 告诉日志和警报引擎要与数据包转储一起打印的消息或要打印的警报。\作为转义字符。 | msg:"狼来辣" |
reference | 识别外部攻击者 | reference:"arachnids" |
sid | 规则的唯一序列(100~~999999) | sid:101 |
gid | 规则组 | alert tcp any any -> any 80 (content:"BOB"; gid:1000001; sid:1; rev:1;) |
rev | 标识snort规则的修订,与sid配合使用(说明规则的版本) | |
classtype | snort根据其默认的规则,将攻击进行相应分类,并具有4种优先级。见配置文件(/etc/suricata/classification.config) | alert tcp any any -> any 25 (msg:"SMTP expn root"; flags:A+; content:"expn root"; nocase; classtype:attempted-recon;) |
priority | 规则优先级(可以覆盖classstype) | alert tcp any any -> any 80 (msg:"EXPLOIT ntpdx overflow";dsize:>128; classtype:attempted-admin; priority:10 ); |
metadata | 额外的标记,用于标明规则的目标服务类型\gid和sid,以及是否在规则共享库中共享。 | alert tcp any any -> any 80 (msg:"HTTP Service Rule Example"; \ metadata:service http;) |
target | 允许规则编写者指定警报的哪一侧是攻击的目标。如果指定,警报事件将被增强以包含有关源和目标的信息。 | target:[src_ip] target : [dest_ip] |
content | content 关键字在签名中非常重要。在引号之间,您可以写下您希望签名匹配的内容。 某些逻辑字符以及不可打印字符需要被特殊表示: " |22| ; |3B| : |3A| | |7C| 就像这样:content: "http|3A|//" 如果不添加特殊参数来让它匹配特定范围,则会匹配所有内容。 默认区分大小写 | alert http $HOME_NET any -> $EXTERNAL_NET any (msg:"Outdated Firefox on Windows"; content:"User-Agent|3A| Mozilla/5.0 |28|Windows|3B| "; content:"Firefox/3."; distance:0; content:!"Firefox/3.6.13"; distance:-10; sid:9000000; rev:1;) |
nocase | 如果不想content区分大小写字符,可以使用 nocase。 | content: "abc"; nocase; |
depth | 修改content的匹配深度(深度是起始位置之后多少字节作为匹配空间,之后的内容不做匹配)。 | depth:12; |
startswitch | 修饰content,只尝试匹配负载开头。不接受其他任何其他content修饰参数(depth,offset,within),必须跟随content出现。 | content:"GET|20|"; startswith; |
endswith | 类似startswitch。修饰content,只尝试匹配负载末尾。不接受任何其他content修饰参数 | content:".php"; endswith; |
offset | 修饰content,指定从负载的哪个字节开始检查匹配项。如果offset:3,则检查第四个字节起之后的所有缓存区 | content:"def"; offset:3; depth:3; |
distance | 修饰content。如此处有两次content匹配,第一次匹配到后以第一次匹配项末尾字节位+distance数值开始第二次匹配。 | content:"abc"; content:"klm"; distance:0; |
within | 修饰content。可以配合distance使用,指定范围 | content:"abc"; content:"klm"; distance:1; within:4; (匹配到abc后以c字符之后的第一个字符右边第一个字符之后四个字节范围内进行匹配) |
isdataat | 查看负载的特定部分是否仍有数据。可以添加relative作为可选项,用于规定检查位置相对于上一次匹配位末尾。 | isdataat:50, relative; (检查最后一次匹配项末尾后第50个字节是否有数据) |
bsize | 使用 bsize 关键字,您可以匹配缓冲区的长度 | alert dns any any -> any any (msg:”test bsize rule”; dns.query; content:”google.com”; bsize:10; sid:123; rev:1;) |
dsize | 匹配数据包有效负载的大小 | alert udp $EXTERNAL_NET any -> $HOME_NET 65535 (msg:”GPL DELETED EXPLOIT LANDesk Management Suite Alerting Service buffer overflow”; dsize:>268;) |
byte_test | byte_test 关键字提取 <num of bytes> 并在特定 <offset> 处针对 <test value> 中的值执行使用 <operator> 选择的操作。<bitmask value> 应用于提取的字节(在应用运算符之前),对于 <bitmask value> 中的每个尾随 0,最终结果将右移一位。 byte_test: <num of bytes>, [!]<operator>, <test value>, <offset> [,relative] [,<endian>] [, string, <num type>][, dce] [, bitmask <bitmask value>]; num of bytes 需要转换的字节数 operator 操作 value 用于根据测试转换的值(十六、十进制) offset 有效载荷中的字节数 relative 相对于最后匹配项的偏移量 endian 大小端 string <num> 以几进制表示转换后的字符串 dce 允许DCE模块确定字节顺序 bitmask 对转换的字节应用AND运算符 | |
byte_math | ||
byte_jump | ||
byte_extract | ||
rpc | ||
replace |
ttl | 检查数据包标头中的特定IP 生存时间值 | alert ip $EXTERNAL_NET any -> $HOME_NET any (msg:”GPL MISC 0 ttl”; ttl:0;) |
ipopts | 检查是否设置了特定的 IP 选项。 Ipopts 必须在规则的开头使用。每个规则只能匹配一个选项。 | alert ip $EXTERNAL_NET any -> $HOME_NET any (msg:”GPL MISC source route ssrr”; ipopts:ssrr;) |
sameip | 检查源地址和目标地址是否是同一个地址 | alert ip any any -> any any (msg:”GPL SCAN same SRC/DST”; sameip;) |
ip_proto | 检查ip协议编号,可以是名词或编号。编号详情http://en.wikipedia.org/wiki/List_of_IP_protocol_numbers | alert ip any any -> any any (msg:”GPL MISC IP Proto 103 PIM”; ip_proto:103;) |
ipv4.hdr | 匹配整个IPv4 header的Sticky buffer。 | alert ip any any -> any any (ipv4.hdr; content:”|3A|”; offset:9; depth:1; sid:1234; rev:5;) |
ipv6.hdr | 匹配整个IPv6 header的Sticky buffer。 | |
id | 检查IP ID | alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg:”ET DELETED F5 BIG-IP 3DNS TCP Probe 1”; id: 1;) |
geoip | 匹配源\目标\源和目标的流量中属于哪个国家 | geoip: src,RU; geoip: both,CN,RU; geoip: dst,CN,RU,IR; geoip: both,US,CA,UK; geoip: any,CN,IR; |
fragbits(IP fragmentation) | 检查ip表头是否分片。 M - More Fragments D - Do not Fragment R - Reserved Bit ---------------------------- * 匹配如果设置了任何指定的位 ----------- fragbits:[*+!]<[MDR]> | alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg:”ET EXPLOIT Invalid non-fragmented packet with fragment offset>0”; fragbits: M; fragoffset: >0; |
fragoffset | ip表头片位偏移,如果要看第一个则需要将fragoffset设为0且fragbits设为M | alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg:”ET EXPLOIT Invalid non-fragmented packet with fragment offset>0”; fragbits: M; fragoffset: >0; |
tos | 检查Ip表头TOS字段。 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;) |
seq | 检查特定的TCP序列号 | 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 | 监拆毁特定的TCP确认号 | 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;) |
windwo | 检查特定的TCP窗口大小。 window:[!]<number>; | alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg:”GPL DELETED typot 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 | 获得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.hdr | 获得整个UDP表头匹配的粘性缓存区 | alert udp any any -> any any (udp.hdr; content:”|00 08|”; offset:4; depth:2; sid:1234; rev:5;) |
itype | 匹配特定的ICMP类型。 | 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;) |
icode | 匹配特定的 ICMP 码。 icode:min<>max; icode:[<|>]<number>; | 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-values | 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 序列号 | 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 | 获得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;) |