【作者主页】只道当时是寻常
【专栏介绍】入侵检测。专注网络、主机安全,欢迎关注与评论。
1. 概要
本文详细介绍了网络入侵检测系统(如 Suricata)中用于检查数据包或流有效载荷的 Payload 关键字。content 用于匹配数据包内容,默认大小写敏感,特殊字符需十六进制表示;nocase 可使匹配不区分大小写;depth 指定从开头检查的字节数;startswith 和 endswith 分别确保内容在缓冲区起末匹配;offset、distance、within 用于控制匹配位置和范围。此外,还有用于字节操作的 byte_test、byte_math、byte_jump,计算熵值的 entropy,调整流量的 replace 等关键字,功能丰富多样。
2. content
在Suricata中,content 关键字用于匹配数据包中的特定字节或字符串序列。常用来在网络流量中查找特定的模式串,通常作为检测特征之一匹配恶意流量。
✉️ 关键字格式
content:"<要匹配的内容>";
下面是 content 关键字所支持的值类型:
- 纯字符串类型
content:"Match The String"; # 匹配 "Match The String" 字符串
- 字节码类型
content:"|4d 61 74 63 68 20 54 68 65 20 53 74 72 69 6e 67|"; # 十六进制字节码转换成字符串后为"Match The String"
- 混合类型
# 下面匹配的内容都是 "Match The String"
content:"|4d 61 74 63 68| The String";
content:"Match |54 68 65| String";
content:"Match The |53 74 72 69 6e 67|";
📔 规则示例
alert http any any -> any any (msg:"A risk of password leakage has been detected."; content:"passwd"; sid:9000000; rev:1;)
alert http any any -> any any (msg:"A risk of password leakage has been detected."; content:"|70 61 73 73 77 64|"; sid:9000001; rev:1;)
- 上面两条规则的作用是检测 http 报文中是否包含 "passwd" 字符串,如果包含,则可能正在泄露安全主机的密码信息。
👌 总结
- 纯字符串类型适用于所匹配的字符串中不包含特殊字符,规则可视化效果好。
- 字节码类型适用于特殊字符,例如'|'、':'等,或者无法用字符表示的字符。
- 混合类型适用于结合两者的长处,灵活使用。
📢 注意
- 默认情况下,字符串匹配是区分大小写的,字符串内容必须准确,否则将不匹配。
- 如果字符串中包含';'、'\'、'"',需要使用转义字符串。
3. nocase
在Suricata中,nocase 关键字是一个修饰符, 它的作用是:使内容匹配时忽略大小写。
✉️ 关键字格式
content:"<要匹配的内容>"; nocase;
📔 规则示例
alert http any any -> any any (msg:"A risk of password leakage has been detected."; content:"passwd"; nocase; sid:9000000; rev:1;)
- 上面规则的作用是检测 http 报文中是否包含 "passwd" 字符串,如果包含,则可能正在泄露安全主机的密码信息。其中"passwd"字符串是忽略大小写的,也就是报文数据中携带的内容不管是"Passwd",还是"PASSWD",如果只是变换字母的大小写都会匹配这条规则。
4. depth
在 Suricata 中,depth 关键字用于限制 content 匹配的字节范围。它指定了在数据包中检查内容时,只查看数据包的前多少字节,从而优化性能并提高规则的精确度。
✉️ 关键字格式
depth:<数字>;
📔 规则示例
alert http any any -> any any (msg:"A risk of password leakage has been detected."; content:"passwd"; depth:12; sid:9000000; rev:1;)
- 上面规则的作用是检测 http 报文中前 12 个字节中是否包含 "passwd" 字符串,如果包含,则可能正在泄露安全主机的密码信息。
📢 注意
- depth 关键字要求位于 content 关键字之后,用于修饰前面的 content 关键字。
5. startswith
在 Suricata 中,startswith 关键字是 content 关键字的修饰符,它要求 content 内容必须在数据包的开始位置命中。
✉️ 关键字格式
content:"<要匹配的内容>"; startswith;
📔 规则示例
alert http any any -> any any (msg:"A risk of password leakage has been detected."; content:"passwd"; startswith; sid:9000000; rev:1;)
- 上面规则的作用是检测 http 报文中数据开头的六个字节是否匹配 "passwd" 字符串,如果匹配,则可能正在泄露安全主机的密码信息。
📢 注意
- startswith 不能与 depth、offset、within 或 distance 关键字混合修饰同一个 content 关键字。
6. endswith
在 Suricata 中,endswith 关键字是 content 关键字的修饰符,它要求 content 内容必须在数据包的结尾位置。该关键字与 startswith 关键字功能正好相反。
✉️ 关键字格式
content:"<要匹配的内容>"; endswith;
📔 规则示例
alert http any any -> any any (msg:"A risk of password leakage has been detected."; content:"passwd"; endswith; sid:9000000; rev:1;)
- 上面规则的作用是检测 http 报文中数据结尾的六个字节是否匹配 "passwd" 字符串,如果匹配,则可能正在泄露安全主机的密码信息。
📢 注意
- endswith 不能与 offset、within 或 distance 关键字混合修饰同一个 content 关键字。
7. offset
在 Suricata 中,offset 关键字是 content 关键字的修饰符,用于指定匹配内容时开始检查的字节偏移位置。换句话说,offset 允许你跳过数据包的前面一定数量的字节,然后从指定的偏移位置开始匹配内容。该关键字经常和 depth 关键字组合使用。
✉️ 关键字格式
offset:<数字>;
📔 规则示例
alert http any any -> any any (msg:"A risk of password leakage has been detected."; content:"passwd"; offset:3; depth:20; sid:9000000; rev:1;)
- 上面规则的作用是检测 http 报文中从第 3 个字节开始,向后最多匹配 20 个字节中,是否包含 "passwd" 字符串,如果包含,则可能正在泄露安全主机的密码信息。
8. distance
在 Suricata 中,distance 关键字用于指定在数据包中查找内容时,当前匹配与下一个匹配之间最小的字节距离。也就是说,distance 定义了从当前匹配位置到下一个匹配内容之间至少大于或等于 distance 指定的距离。
✉️ 关键字格式
distance:<数字>;
📔 规则示例
alert http any any -> any any (msg:"A risk of password leakage has been detected."; content:"username"; content:"passwd"; distance:2; sid:9000000; rev:1;)
- 上面规则的作用是检测 http 报文,如果先出现 “username” 字符串,并且在其之后至少间隔 2 个字节的位置出现了 “passwd” 字符串,则可能正在泄露安全主机的密码信息。
📢 注意
- distance 绝对值必须 ≤ 1M(1048576 字节)。
- distance 允许是负数。
9. within
在 Suricata 中,within 关键字用于指定在数据包中查找内容时,当前匹配与下一个匹配之间最大的字节距离。也就是说,within 定义了从当前匹配位置到下一个匹配内容之间的距离最大小于或等于 within 指定的距离。
✉️ 关键字格式
within:<数字>;
📔 规则示例
alert http any any -> any any (msg:"A risk of password leakage has been detected."; content:"username"; content:"passwd"; within:10; sid:9000000; rev:1;)
- 上面规则的作用是检测 http 报文,如果先出现 “username” 字符串,并且在其之后最多间隔 10 个字节的范围内包含 “passwd” 字符串,则可能正在泄露安全主机的密码信息。
📢 注意
- within 绝对值必须 ≤ 1M(1048576 字节)。
- within 不允许为 0。
10. isdataat
Suricata 中,isdataat 关键字用于检查 数据包中的特定位置是否包含有效的数据。它允许你指定一个字节偏移量,并检查该位置是否存在数据。
✉️ 关键字格式
isdataat:<位置值> [, relative]
- relative 为可选值,表示相对于上一次匹配的位置开始,指定字节偏移量位置是否仍存在数据。
📔 规则示例
alert http any any -> any any (msg:"Excessively long data has been detected."; content:"end"; isdataat:1, relative; sid:9000000; rev:1;)
alert http any any -> any any (msg:"Excessively long data has been detected."; isdataat:100; sid:9000000; rev:1;)
- 上面第一条规则的作用是检测 http 报文,如果包含"end"字符串,那么从该字符串结尾后开始偏 1 个字节是否有数据,如果有数据则进行告警操作。
- 上面第一条规则的作用是检测 http 报文,检测第 100 字节位置是否有数据,如果有数据则进行告警操作。
11. absent
在 Suricata 中,absent 关键字用于匹配指定数据缺失的场景。
✉️ 关键字格式
absent: [or_else];
- or_else 是或者的意思,可用于将前后两个关键字关联起来。
📔 规则示例
alert http any any -> any any (msg:"HTTP request without referer"; http.referer; absent; sid:9000000; rev:1;)
alert http any any -> any any (msg:"HTTP request without referer"; http.referer; absent: or_else; content: !"abc"; sid:9000000; rev:1;)
- 上面第一条规则的作用是检测 http 报文,如果报文中没有 referer 字段值则告警。
- 上面第一条规则的作用是检测 http 报文,如果报文中没有 referer 字段值或者有 referer 字段值但是 referer 字段中不包含"abc"字符串则告警。
📢 注意
- 当 absent 关键字修饰 file.data 关键字时,含义是没有文件存在。
12. bsize
在 Suricata 中,bsize 关键字用于指定缓冲区大小的匹配条件。它通常用于检测网络流量中的特定数据包或协议行为,特别是在处理 TCP 流时。这里“缓冲区”通常指的是数据包重组后形成的连续数据块,它可以是多个TCP数据段重组后的结果。
✉️ 关键字格式
bsize:[<,<=,>,>=, !]number; || bsize:min<>max;
📔 规则示例
alert dns any any -> any any (msg:"bsize exact buffer size"; dns.query; content:"google.com"; bsize:10; sid:9000000; rev:1;)
alert dns any any -> any any (msg:"bsize less than value"; dns.query; content:"google.com"; bsize:<25; sid:9000000; rev:1;)
alert dns any any -> any any (msg:"test bsize rule"; dns.query; content:"middle"; bsize:6<>15; sid:9000000; rev:1;)
- 上面第 一 条规则的作用是检测 DNS 报文,如果 DNS 查询字段内容中包含字符串"google.com"并且重组后的缓冲区大小等于 10 字节时产生告警。
- 上面第 二 条规则的作用是检测 DNS 报文,如果 DNS 查询字段内容中包含字符串"google.com"并且重组后的缓冲区大小小于 20 字节时产生告警。
- 上面第 三 条规则的作用是检测 DNS 报文,如果 DNS 查询字段内容中包含字符串"middle"并且重组后的缓冲区大小大于 5 字节且小于 15 字节时产生告警。
📢 注意
- bsize 实现为 uint64_t 类型。
- 如果在 bsize 关键字之前有一个或多个 content 关键字,那么每个 content 的出现都会被检查。如果 content 的长度与 bsize 设定的值之间存在不匹配(即根据 bsize 指定的大小条件,使得 content 无法匹配)(例如,如果你设置了
bsize:<50
,意味着只考虑小于50字节的缓冲区,但你的content
长度为60字节),则会抛出一个错误。
13. dsize
在 Suricata 的中,dsize 关键字用于指定匹配数据包有效载荷大小。它与 bsize 类似,但不同的是,dsize 更专注于单个数据包的有效载荷大小,而不是流重组后的缓冲区大小。
✉️ 关键字格式
dsize:[<,<=,>,>=, !]number; || dsize:min<>max;
📌 规则示例
alert tcp any any -> any any (msg:"dsize exact size"; dsize:10; sid:1; rev:1;)
alert tcp any any -> any any (msg:"dsize less than value"; dsize:<10; sid:2; rev:1;)
alert tcp any any -> any any (msg:"dsize range value"; dsize:8<>20; sid:3; rev:1;)
- 上面第 一 条规则的作用是检测 TCP 报文,如果 TCP 报文的负载长度等于 10 字节则产生告警。
- 上面第 二 条规则的作用是检测 TCP 报文,如果 TCP 报文的负载长度小于 10 字节则产生告警。
- 上面第 三 条规则的作用是检测 TCP 报文,如果 TCP 报文的负载长度大于 8 字节且小于 20 字节则产生告警。
📢 注意
- dsize 实现为 uint16_t 类型。
14. byte_test
在 Suricata 中,byte_test 关键字用于对数据包有效载荷中的特定字节序列进行数值测试。它允许你从有效载荷中提取指定数量的字节,并根据设定的条件进行比较,以确定是否满足特定的规则。
✉️ 关键字格式
byte_test:<num of bytes> | <variable_name>, [!]<operator>, <test value>, <offset> [,relative] [,<endian>][, string, <num type>][, dce][, bitmask <bitmask value>];
- <num of bytes> :提取的字节数。
- <variable_name>:byte_extract 或者 byte_math 对应的变量名。
- <value>:用于比较的数值,支持十六进制和十进制。
- <offset>: 偏移值(以字节为单位)。
- [relative]:(可选)相对于上一个匹配项配置的偏移量。
- [endian]:(可选)字节序,big(大端),little(小端)。
- [string] <num>:(可选)将指定数据包内容转换成特定格式,支持 hex、dec 和 oct 格式。
- [dce]:(可选)允许使用 DCE 模块确定字节序。
- [bitmask]:(可选)对已转换的字节应用按位与(AND)操作符。
📌 规则示例
alert tcp any any -> any any (msg:"Byte_Test Example - Num = Value"; content:"|00 01 00 02|"; byte_test:2,=,0x01,0;sid:1; rev:1;)
alert tcp any any -> any any (msg:"Byte_Test Example - Num = Value relative to content"; content:"|00 01 00 02|"; byte_test:2,=,0x03,2,relative;sid:2; rev:1;)
alert tcp any any -> any any (msg:"Byte_Test Example - Num != Value"; content:"|00 01 00 02|"; byte_test:2,!=,0x06,0;sid:3; rev:1;)
alert tcp any any -> any any (msg:"Byte_Test Example - Detect Large Values"; content:"|00 01 00 02|"; byte_test:2,>,1000,1,relative;sid:4; rev:1;)
alert tcp any any -> any any (msg:"Byte_Test Example - Lowest bit is set"; content:"|00 01 00 02|"; byte_test:2,&,0x01,12,relative;sid:5; rev:1;)
alert tcp any any -> any any (msg:"Byte_Test Example - Compare to String"; content:"foobar"; byte_test:4,=,1337,1,relative,string,dec;sid:6; rev:1;)
- 规则 1: 当检测到 TCP 流量中存在包含字节序列 00 01 00 02 的数据包时,从该字节序列的起始位置开始提取 2 个字节,并检查这 2 个字节的值是否等于 0x01,如果相等则产生告警。
- 规则 2:当检测到 TCP 流量中存在包含字节序列 00 01 00 02 的数据包时,从该字节序列的结束位置开始向后偏移 2 个字节并提取 2 个字节,并检查这 2 个字节的值是否等于 0x03,如果相等则触发告警。
- 规则 3:当检测到 TCP 流量中存在包含字节序列 00 01 00 02 的数据包时,从该字节序列的起始位置开始提取 2 个字节,并检查这 2 个字节的值是否不等于 0x06,如果不相等则触发告警。
- 规则 4:当检测到 TCP 流量中存在包含字节序列 00 01 00 02 的数据包时,从该字节序列的结束位置开始向后偏移 1 个字节并提取 2 个字节,将这 2 个字节转换成 10 进制后与 1000 进行比较,如果转换后的值大于 1000,则触发告警。
- 规则 5:当检测到 TCP 流量中存在包含字节序列 00 01 00 02 的数据包时,从该字节序列的结束位置开始向后偏移 12 个字节的位置提取 2 个字节,将这 2 个字节与 0x01 进行按位与运算,若结果不为 0,则触发告警。
- 规则 6:当检测到 TCP 流量中存在包含字符串"foobar"时,从该字符串的结束位置开始向后偏移 1 个字节并提取 4 个字节,将这 4 个字节当作字符串处理并转换为十进制数值,然后检查其值是否等于 1337,如果相等则触发告警。
15. byte_math
在 Suricata 中,byte_math 是一个用于在规则中执行数学运算的关键字。它允许你从数据包的有效载荷中提取字节数据,进行指定的数学运算,并将结果存储在变量中,以供后续的规则选项使用。
✉️ 关键字格式
byte_math:bytes <num of bytes> | <variable-name> , offset <offset>, oper <operator>, rvalue <rvalue>, result <result_var> [, relative] [, endian <endian>] [, string <number-type>] [, dce] [, bitmask <value>];
- <num of bytes>:提取的字节数。
- <variable_name>:byte_extract 对应的变量名。
- <offset>:偏移值(以字节为单位)。
- oper <operator>:数学运算符号,支持+、 -、 *、 /、<<、>>。
- rvalue <rvalue>:数学运算的右值,可以指定变量名。
- result <result-var>:数学运算结果,存储在指定变量中。
- [relative]:(可选)相对于上一个匹配项配置的偏移量。
- [endian <type>]:(可选)字节序,big(大端),little(小端),dce(使用 DCE 模块自动确定字节序)。
- [string <num_type>]:(可选)将指定数据包内容转换成特定格式,支持 hex、dec 和 oct 格式。
- [dce]:(可选)允许使用 DCE 模块确定字节序。
- [bitmask] <value>:(可选)对已转换的字节应用按位与(AND)操作符。
📌 规则示例
alert tcp any any -> any any (msg:"Testing bytemath_body"; content:"|00 04 93 F3|"; content:"|00 00 00 07|"; distance:4; within:4; byte_math:bytes 4, offset 0, oper +, rvalue 248, result var, relative;sid:1; rev:1;)
- 上面这条规则的作用是:在 TCP 网络流量中,当数据包的有效载荷中依次出现字节序列 00 04 93 F3 和 00 00 00 07,且第二个字节序列在第一个字节序列匹配位置之后的 4 个字节内被找到时,从第二个字节序列的起始位置提取 4 个字节,将其与数值 248 进行加法运算,并将结果存储在名称为 var 的变量中,该变量可能后续或者其它规则会使用。
📢 注意
- 如果 byte_math 选项中包含 relative,则 byte_math 关键字需要在 content 或者 pcre 关键字之后使用。
- 如果 oper 为'/'且rvalue 为 0,则 byte_math 关键字失效。
16. byte_jump
在 Suricata 中,byte_jump 关键字用于允许规则在匹配过程中根据数据包的内容跳过一定数量的字节。这对于解析具有动态长度字段的协议特别有用,例如当需要根据某个字段的值来确定下一个字段的位置时。
✉️ 关键字格式
byte_jump:<num of bytes> | <variable-name>, <offset> [, relative][, multiplier <mult_value>][, <endian>][, string, <num_type>][, align][, from_beginning][, from_end] [, post_offset <value>][, dce][, bitmask <value>];
- <num of bytes>:提取的字节数。
- <variable_name>:byte_extract 或者 byte_math 对应的变量名。
- <offset>:偏移值(以字节为单位)。
- [relative]:(可选)相对于上一个匹配项配置的偏移量。
- [multiplier] <value>:将提取的数值乘以<value>的值。
- [endian]:(可选)字节序,big(大端),little(小端)。
- [string] <num_type>:(可选)将指定数据包内容转换成特定格式,支持 hex、dec 和 oct 格式。
- [align]:(可选)相关的数值向上取整到下一个 32 位边界。比如某个计算得到的字节位置数值不是 32 位边界上的值,使用 [align] 后就会将其调整到下一个 32 位边界对应的数值。
- [from_beginning]:(可选)从数据包的起始位置开始跳转。
- [from_end]:(可选)从数据包的结尾位置开始跳转。
- [post_offset] <value>:(可选)在执行完 byte_jump 操作之后,检测指针会按照 <value> 所指定的字节数,再额外地跳跃移动相应数量的字节。
- [dce]:(可选)允许使用 DCE 模块确定字节序。
- [bitmask] <value>:(可选)按位与(AND)操作符会将 <value>和经过转换的字节进行按位与运算,在完成这个按位与运算之后,才会执行 byte_jump 的跳转操作。
📌 规则示例
alert tcp any any -> any any (msg:"Byte_Jump Example"; content:"Alice"; byte_jump:2,0; content:"Bob";sid:1; rev:1;)
alert tcp any any -> any any (msg:"Byte_Jump From the End -8 Bytes"; byte_jump:0,0, from_end, post_offset -8; content:"|6c 33 33 74|";sid:2; rev:1;)
- 规则 1:这条规则的作用是在 TCP 网络流量中,先查找数据包有效载荷中是否包含字符串 “Alice”,若包含则从 “Alice” 所在位置提取 2 个字节并移动检测指针,然后在新位置继续查找字符串 “Bob”,若找到 “Bob” 则触发警报(注意,这里提取字节数起始就是跳过字节数,因为偏移为 0,所以提取字节的起始位置为所匹配字符串的第一个字节)。
- 规则 2: 在 TCP 网络流量中,先将检测指针移动到数据包有效载荷末尾向前数 8 个字节的位置,然后在该位置往后 4 个字节的范围内查找字节序列 6c 33 33 74,若找到则触发告警。
17. byte_extract
在 Suricata 中,byte_extract 关键字用于从数据包有效载荷中提取指定数量的字节,并将提取的结果存储到一个变量中,以供后续规则判断(byte_test)或运算(byte_math)使用。
✉️ 关键字格式
byte_extract:<num of bytes>, <offset>, <var_name>, [,relative] [,multiplier <mult-value>] [,<endian>] [, dce] [, string [, <num_type>] [, align <align-value];
- <num of bytes>:提取的字节数。
- <offset>:偏移值(以字节为单位)。
- <var_name>:存储所提取值的
- [relative]:(可选)相对于上一个匹配项配置的偏移量。
- multiplier <value>:将提取的数值乘以<value>的值。
- [endian]:(可选)字节序,big(大端),little(小端)。
- [string] <num>:(可选)将指定数据包内容转换成特定格式,支持 hex、dec 和 oct 格式。
- [dce]:(可选)允许使用 DCE 模块确定字节序。
- align <align-value>:一种操作指令,其中 <align-value> 是一个取值为 2 或 4 的参数。其作用是在进行乘法运算(如果存在乘法运算的话,对应之前提到的 [multiplier] <value> )之后,将提取的值向上取整到下一个 <align-value> 字节的边界。例如,如果 <align-value> 为 2,且提取的值经过乘法运算后不是 2 的倍数,那么就会将这个值向上取整到最接近且大于它的 2 的倍数。
📌 规则示例
alert tcp any any -> any any (msg:"Byte_Extract Example Using distance"; content:"Alice"; byte_extract:2,0,size; content:"Bob"; distance:size; within:3; sid:1;)
- 规则 1:这条规则的作用是在 TCP 网络流量中,先查找数据包有效载荷中是否包含字符串 “Alice”,若包含则从 “Alice” 所在位置提取 2 个字节并存储为变量 size,然后根据 size 的值确定位置,在该位置往后 3 个字节的范围内查找字符串 “Bob”,若找到 “Bob” 则触发告警。
18. entropy
在 Suricata 中,entropy 关键字用于计算数据包有效载荷的香农熵(Shannon entropy),并将其与指定的阈值进行比较,以判断数据的随机性程度。这对于检测加密、压缩或混淆的数据流非常有用,常用于识别潜在的恶意通信,如加密的命令与控制(C2)流量、数据泄露等。
✉️ 关键字格式
entropy: [operator ] value
或者
entropy: [bytes <byteval>,] [offset <offsetval>,] value <operator><entropy-value>
- bytes <byteval>:(可选)如果省略,就默认对当前内容的所有字节进行熵值计算。如果未省略,则计算 <byteval> 字节长度的内容的熵值。
- offset <offsetval>:(可选)如果省略,就默认对当前内容的起始位置开始计算。如果未省略,则从指定位置开始。
- <operator>:操作符,支持=、<、<=、>、>=、!=。
- <entropy-value>:所比较的熵值。
📌 规则示例
alert http any any -> any any (msg:"entropy simple test"; file.data; entropy: value >= 4; sid:1;)
- 这条规则的作用是在 HTTP 网络流量中,对传输的文件数据部分计算香农熵值,当该熵值大于或等于 4 时,触发告警。
📢 注意
- 熵值的范围在 0.0 到 8.0 之间(包含 0.0 和 8.0)。
- 熵值是以 64 位浮点数的形式来表示的。
19. replace
在 Suricata 中,replace 关键字用于修改网络数据包内容的关键字,主要应用于入侵防御系统(IPS)模式。
✉️ 关键字格式
content:<内容>; replace:<内容>;
📌 规则示例
alert tcp any any -> any any (msg:"replace name"; content:"jan"; replace:"bob"; sid:1;)
- 这条规则用于监控 TCP 流量,当发现数据包内容中有 "jan" 时,将其替换为 "bob",并触发警报,
📢 注意
- 替换的内容要与匹配的内容长度一致。
- 只能适用与 IPS 模式。
- 仅适用于单个数据包,不能用于重组后的流或者标准化后的缓冲区。
20. pcre
在 Suricata 中,pcre 关键字用于在规则中应用正则表达式匹配,提供比 content 更强大的模式匹配能力。
✉️ 关键字格式
pcre:"/<regex>/opts";
📌 规则示例
alert tcp any any -> any any (msg:"pcre match"; pcre:"/[0-9]{6}/"; sid:1;)
- 这段规则的作用是监测 TCP 协议的网络流量,一旦在数据包内容中发现连续的 6 位数字,就会触发告警。