Snort语法规则 | 单位 distance within depth offset
offset偏移量单位说明
在计算机中,一个字符占用的字节数取决于所使用的字符编码方式。在 ASCII 编码中,每个字符占用 1 个字节,而在 Unicode 编码中,每个字符占用 2 个或 4 个字节,具体取决于所使用的编码格式。
在 Snort 规则中,偏移量指的是要检测的数据从数据的起始位置开始的字节数,而不是字符数。因此,如果使用的是 ASCII 编码,并且要从第 13 个字符开始进行匹配,那么偏移量就是 12(因为字符计数从 0 开始)。
如果使用的是 Unicode 编码,偏移量需要乘以每个字符所占用的字节数,例如,如果使用 UTF-16 编码,并且要从第 13 个字符开始进行匹配,那么偏移量就是 24(因为每个字符占用 2 个字节)。

1 offset
例子1:
content:"GET"; offset:0;
这是Snort规则中的一个选项,用于指定要检测的数据的内容、偏移量和其他特征。
content
:用于指定要检测的数据的内容。"GET"
:是要检测的具体内容,这里是检测HTTP请求中是否包含”GET”。offset
:用于指定从数据开始处的偏移量。0
:这里是指从数据的起始位置开始进行匹配。
因此,该规则将检测HTTP请求中是否包含”GET”,并且将从请求的开始位置进行匹配。例如,以下HTTP请求将匹配该规则:
GET /index.html HTTP/1.1
Host: example.com
而以下HTTP请求则不会匹配该规则:
POST /submit-form HTTP/1.1
Host: example.com
请注意,这只是Snort规则中的一部分,还需要将其与其他选项组合使用,例如http_method
选项以限定匹配HTTP请求方法。
例子2:
content:"GET"; offset:0; content:"downloads"; offset:10;
这个 Snort 规则将匹配包含字符串 “GET” 和 “downloads” 的数据流。具体来说,它会从数据流的起始位置(偏移量为 0)开始查找 “GET” 字符串,然后从第 10 个字节开始查找 “downloads” 字符串。
GET /downloads/index.html HTTP/1.1
Host: www.example.com
2 depth
content:"GET"; depth:3;
这个 Snort 规则将从数据流的起始位置开始查找 “GET” 字符串,但只会查找前三个字节。具体来说,这个规则会在数据流的前三个字节中查找 “GET” 字符串。
例如,考虑以下 HTTP 请求:
GET /index.html HTTP/1.1
Host: www.example.com
在这个请求中,”GET” 出现在请求行的第一个单词中,因此符合 Snort 规则的匹配条件。但是由于规则的深度限制为 3,因此 Snort 只会查找请求行的前三个字节,即 “GET”。由于 “GET” 出现在这个位置,因此 Snort 将触发规则的动作(例如生成警报或记录日志)。
3 distance
distance该关键字类似于offset,都是距离哪多少个字节开始搜索,但是distance是相对于前面的内容匹配(于此案例中是content:”GET”),而offset是距离有效负载/缓冲区的开头(也就是从全文的0字节开始)。简单来说,distance它告诉 Snort 在查找此内容匹配之前在最后一个内容匹配后查看跳过 X 个字节。
content:"GET"; content:"downloads"; distance:10;
这条 Snort 规则用于检测数据流中是否存在 “GET” 和 “downloads” 这两个关键字,并且它们之间的距离为 10 个字节以内。
具体来说,Snort 在数据流中搜索 “GET” 这个关键字,然后继续往后搜索直到找到 “downloads” 这个关键字。在这个过程中,Snort 将检查这两个关键字之间的距离是否小于等于 10 个字节。如果满足条件,该规则将被触发,表示数据流中存在匹配该规则的内容。
4 within
within和depth类似,depth 和 within 是 Snort 规则中用于限制搜索数据流的参数。它们的区别如下:
- depth:depth 参数用于限制搜索数据流的深度。在规则中指定 depth 参数后,Snort 只会搜索数据流的前 N 个字节。这有助于提高规则的性能并减少误报,因为在深度限制之前停止搜索数据流可以减少不必要的处理。如果深度设置得太小,可能会错过与规则匹配的数据。因此,应该根据具体情况调整深度参数,以确保规则可以准确地匹配关键字。
- within:within 参数用于限制搜索关键字出现的范围。在规则中指定 within 参数后,Snort 将在距离关键字之后的 N 个字节内搜索规则。如果关键字出现在 within 参数指定的范围内,则规则将触发。这有助于提高规则的准确性并减少误报,因为限制搜索范围可以减少不必要的处理。如果 within 参数设置得太小,可能会错过与规则匹配的数据。因此,应该根据具体情况调整 within 参数,以确保规则可以准确地匹配关键字。
假如distance大于within会怎么样?
如果使用distance参数限定的位置与within参数限定的长度范围相比较,distance大于within,那么匹配规则将会无效。
例如,以下规则:
alert tcp any any -> any any (msg:"Test"; content:"abc"; distance:20; within:10;)
表示在匹配到”abc”后的20个字节之后开始,往后最多匹配10个字节,但是由于匹配的起点已经超过了往后10个字节,因此无法匹配成功,该规则将不会生效。
在使用distance和within时,需要注意两者之间的关系,避免出现规则无法匹配的情况。