6.39. 与打鼾的区别¶
本文件旨在强调适用于规则和规则编写的Suricata和Snort之间的主要差异。
如果没有规定,以下陈述适用于苏里嘉。一般来说,对snort的引用是指2.9版的分支。
6.39.1. 自动协议检测¶
Suricata对以下应用层协议进行自动协议检测:
DCERPC公司
DNP3型
DNS
HTTP协议
IMAP(默认情况下仅检测;无解析)
FTP协议
Modbus(默认情况下禁用;最小探针分析器;可能导致误报)
中小企业
smb2(发动机内部禁用)
SMTP
SSH
tls(sslv2、sslv3、tlsv1、tlsv1.1和tlsv1.2)
在Suricata中,协议检测是端口不可知论(在大多数情况下)。在呼噜声中,为了
http_inspect
而其他的预处理器要应用于流量,它必须经过一个配置好的端口。默认情况下,Suricata Yaml中应用层的某些配置可以/可以指定特定的目标端口(例如DNS)
您可以查看“任意”端口,而不必担心Snort可能会对性能产生的影响。
如果Suricata检测到流量为HTTP,则
http_*
缓冲区是填充的,可以使用,而不考虑规则中指定的端口。您不必检查HTTP协议(即
alert http ...
)使用http_*
尽管建议使用缓冲器。如果您试图检测合法(支持的)应用程序层协议流量,但不想查看特定端口,则应将规则编写为
alert <protocol> ...
具有any
in place of the usual protocol port(s). For example, when you want to detect HTTP traffic and don't want to limit detection to a particular port or list of ports, the rules should be written asalert http ...
具有any
代替$HTTP_PORTS
.您也可以使用
app-layer-protocol:<protocol>;
而是在规则里面。
所以,不是这个打鼾规则:
alert tcp $HOME_NET any -> $EXTERNAL_NET $HTTP_PORTS ...
为苏里塔做这个:
alert http $HOME_NET -> $EXTERNAL_NET any ...
或:
alert tcp $HOME_NET any -> $EXTERNAL_NET any (app-layer-protocol:http; ...
6.39.2. urilen
关键字¶
中给出的范围
urilen
关键字包含Snort,但不包含Suricata。例子:
urilen:2<>10
Snort解释为,“URI长度必须是 大于或等于 2,和 小于或等于 10英寸。
Suricata将此解释为“URI长度必须为 大于 2和 小于 10英寸。
在未来的版本中,有一个请求要求Suricata像Snort一样工作- https://redmine.openinfosecfoundation.org/issues/1416
当前处于保留状态
默认情况下,使用 沼狸属 ,
urilen
适用于 归一化 缓冲区使用
,raw
对于原始缓冲区例如
urilen:>20,raw;
默认情况下,使用 用鼻子哼哼 ,
urilen
适用于 raw 缓冲区使用
,norm
对于标准化缓冲区例如
urilen:>20,norm;
6.39.3. http_uri
缓冲区¶
在呼噜声中,
http_uri
缓冲区将“+”字符(0x2b)规范化为空格(0x20)。Suricata也可以这样做,但必须明确设置
query-plusspace-decode: yes
在libhtp
苏里卡山药档案的一部分。
6.39.4. http_header
缓冲区¶
在呼噜声中,
http_header
缓冲区包括CRLF CRLF(0x0D 0x0A 0x0D 0x0A),它将最后一个HTTP头的结尾与HTTP正文的开头分隔开。Suricata在http_header
缓冲区,但不是像Snort那样的额外的。如果要匹配缓冲区的结尾,请使用http_raw_header
缓冲器,相对isdataat
(例如)isdataat:!1,relative
)或者PCRE(尽管PCRE的性能会更差)。沼狸属 will 在
http_raw_header
像Snort一样缓冲。Snort将包括 主要的 CRLF在
http_header
缓冲区 服务器响应 (但不是客户端请求)。Suricata在http_header
服务器响应或客户端请求的缓冲区。在
http_header
Buffer,Suricata将规范化HTTP头行,以便在冒号(“:”)后面有一个单独的空格(0x20),用于将头名称与头值分隔开;此单独的空格将替换零个或多个空白字符(包括制表符),这些字符可能会出现在原始HTTP头行immed中。结肠后不久。如果额外的空白(或缺少空白)对于匹配很重要,请使用http_raw_header
缓冲区而不是http_header
缓冲区。snort还将像suricata一样规范化头名称和头值之间的多余空白,但前提是在冒号后面紧跟至少有一个空格字符(0x20,所以不是0x90)。这意味着,与Suricata不同,如果在标题值之前的冒号后面没有空格(或者如果有制表符),则标题行的内容将在
http_header
缓冲区。当存在重复的HTTP头(仅引用头名称,而不是值)时,规范化缓冲区 (
http_header
)将按看到的顺序(从上到下)连接值,每个值之间用逗号和空格(“,”)。如果这妨碍了检测,请使用http_raw_header
而是缓冲区。请求示例:
GET /test.html HTTP/1.1 Content-Length: 44 Accept: */* Content-Length: 55
内容长度标题行在
http_header
缓冲区:Content-Length: 44, 55
HTTP“cookie”和“set cookie”头是 NOT 包括在
http_header
缓冲区;相反,它们被提取并放入自己的缓冲区-http_cookie
. 见 http_cookie Buffer 部分。HTTP“cookie”和“set cookie”头 ARE 包括在
http_raw_header
缓冲区,因此,如果您试图匹配某些特定的头排序(涉及(或不涉及)HTTP cookie头,请使用http_raw_header
缓冲区。如果为snort设置了“启用u cookie”,则HTTP cookie头名称和尾随的crlf(即“cookie:\r\n”和“set cooke\r\n”)将保留在
http_header
缓冲区。这不是Suricata的情况,它从http_header
缓冲区。其他具有自己缓冲区的HTTP头 (
http_user_agent
,http_host
)不会从中删除http_header
像cookie头一样的缓冲区。在检查服务器响应和
file_data
使用,内容匹配http_*
缓冲区应该在file_data
除非你用pkt_data
在匹配之前重置光标http_*
缓冲区。打鼾不会抱怨,如果你使用http_*
后缓冲区file_data
被设置。
6.39.6. 新建HTTP关键字¶
Suricata支持Snort没有的几个HTTP关键字。
例如 http_user_agent
, http_host
和 http_content_type
.
见 HTTP关键字 所有HTTP关键字。
6.39.7. byte_extract
关键字¶
Suricata支持
byte_extract
从http_*
缓冲器,包括http_header
这在Snort中并不总是如预期的那样有效。在Suricata中,使用
byte_extract
必须在同一个缓冲区中使用,否则它们将具有值“0”(零)。Snort不允许跨缓冲区字节提取和使用。务必始终积极和消极地测试使用
byte_extract
和byte_test
以验证它们是否按预期工作。
6.39.8. isdataat
关键字¶
这个
rawbytes
Suricata语法支持关键字,但实际上不执行任何操作。绝对的
isdataat
如果使用的偏移量为 小于 检查缓冲区的大小。这对苏里卡和斯诺特来说是真的。为了 相对的
isdataat
支票,有 1字节差 在这方面,Snort和Suricata做了比较。如果相对偏移量为 小于或等于 检查缓冲区的大小。这和绝对的不同
isdataat
检查。如果相对偏移量为 小于 检查缓冲区的大小,就像绝对值一样
isdataat
检查。示例-检查最后一个内容匹配后检查缓冲区中是否没有数据:
用鼻子哼哼:
isdataat:!0,relative;
测量:
isdataat:!1,relative;
对于snort,在检查
isdataat
关键字通常是数据包/段,但有一些例外:启用PAF后,将检查PDU,而不是检查数据包/段。什么时候?
file_data
或base64_data
已经设置,它是那些缓冲区(除非rawbytes
设置)。对于一些预处理器(Modbus、GTP、SIP、DCE2和DNP3),缓冲区可以是这些协议的特定部分(除非
rawbytes
设置)。对于一些预处理器-rpc u decode、ftp u telnet、smtp和dnp3-缓冲区可以是特定的 译码 这些协议的一部分(除非
rawbytes
设置)。
在Suricata中,检查绝对值时使用的“检查缓冲区”
isdataat
关键字是数据包/数据段,如果查看数据包(例如alert tcp-pkt...
)或重新组装的流段。在苏里卡,A 相对的
isdataat
关键字 将应用于上一个内容匹配的缓冲区 .所以如果前面的内容匹配是http_*
缓冲器,相对isdataat
应用于该缓冲区,从该缓冲区中上一个内容匹配的结尾开始。 打鼾不是这样的!例如,这个suricata规则在uri的末尾查找字符串“.exe”;要在snort中的规范化uri缓冲区中执行相同的操作,您必须使用pcre-
pcre:"/\x2Eexe$/U";
alert http $HOME_NET any -> $EXTERNAL_NET any (msg:".EXE File Download Request"; flow:established,to_server; content:"GET"; http_method; content:".exe"; http_uri; isdataat:!1,relative; priority:3; sid:18332111;)
如果您对特定情况下的行为不清楚,则鼓励您积极和消极地测试使用
isdataat
关键字。
6.39.9. 相对PCRE¶
您可以使用suricata在规范化/特殊缓冲区中进行相对PCRE匹配。例子::
content:".php?sign="; http_uri; pcre:"/^[a-zA-Z0-9]{8}$/UR";
使用snort,您不能将“relative”pcre选项(“r”)与其他缓冲区选项(如规范化的uri(“u”))组合在一起–您会得到一个语法错误。
6.39.10. tls*
关键词¶
除了TLS协议标识之外,Suricata还支持将证书存储到磁盘、验证证书上的有效日期、与计算出的证书sha1指纹匹配以及在某些tls/ssl证书字段上匹配,包括:
协商的TLS/SSL版本。
证书主题字段。
证书颁发者字段。
证书SNI字段
有关详细信息,请参阅 ssl/tls关键字 .
6.39.11. dns_query
关键字¶
设置指向DNS查询的检测指针。
作品像
file_data
是(“粘性缓冲区”),但用于DNS请求查询。使用
pkt_data
将检测指针重置到数据包有效负载的开始。见 DNS关键字 有关详细信息。
6.39.12. 知识产权声誉和 iprep
关键字¶
Snort具有“信誉”预处理器,可用于定义IP的白名单和黑名单文件,这些文件用于生成gid 136警报,并根据配置方式阻止/丢弃/通过列出的IP的流量。
Suricata还具有包含IP的文件的概念,但提供了分配这些文件的能力:
类别
声誉得分
Suricata规则可以利用这些IP列表
iprep
可配置为匹配的关键字:方向
类别
价值(信誉评分)
https://blog.inliniac.net/2012/11/21/ip-reputation-in-suricata/
6.39.13. 流动钻头¶
Suricata完全支持在同一个包/流上设置和检查流位(包括同一个流位)。打鼾并不总是允许这样做。
在苏里达,
flowbits:isset
在快速模式匹配之后检查,但在其他之前检查content
比赛。打鼾时,flowbits:isset
按规则中显示的顺序从左到右进行检查。如果有一个流位链,其中多个规则设置了流位,并且它们相互依赖,那么规则的顺序或
sid
值可以改变正在按正确顺序评估的规则,并按预期生成警报。参见bug 1399- https://redmine.openinfosecfoundation.org/issues/1399 .
6.39.14. 流量:Noalert;¶
现有规则中的一个常见模式是使用 flowbits:noalert;
以确保规则匹配时不会生成警报。
Suricata允许使用 noalert;
也。这两个词在苏格拉底有着相同的含义。
6.39.15. 否定内容匹配特殊情况¶
对于打鼾,A 否定的 如果搜索的起始点位于或超出检查缓冲区的结尾,则内容匹配永远不会返回true。
对于否定的匹配,如果找不到内容,您希望它返回true。
这被认为是一个Snort bug,而不是一个引擎差异,但它在很多年前被报告给了SourceFire,并在很多年前得到了承认,这表明它可能是由设计造成的。
苏里塔的行为与预期不符。
HTTP请求示例:
POST /test.php HTTP/1.1 Content-Length: 9 user=suri
此规则片段在Snort中永远不会返回true,但在Suricata中将返回true::
content:!"snort"; offset:10; http_client_body;
6.39.16. 文件提取¶
Suricata能够匹配来自ftp、http和smtp流的文件,并将它们记录到磁盘上。
Snort有一个“文件”预处理器,它可以做类似的事情,但它是试验性的,多年来它的开发一直停滞不前,而且它不应该在生产环境中使用。
可以使用多个关键字匹配文件,包括:
filename
fileext
filemagic
filesize
filemd5
filesha1
filesha256
filesize
见 文件关键字 完整的列表。
这个
filestore
关键字告诉Suricata将文件保存到磁盘。提取的文件用元数据记录到磁盘上,元数据包括时间戳、SRC/DST IP、协议、SRC/DST端口、HTTP URI、HTTP主机、HTTP引用、文件名、文件魔力、MD5sum、大小等。
如果您希望在Suricata中充分利用文件提取,那么应该了解许多配置选项和注意事项(例如流重新组装深度和libhtp主体限制)。
https://blog.inliniac.net/2011/11/29/file-extraction-in-suricata/
https://blog.inliniac.net/2014/11/11/smtp-file-extraction-in-suricata/
6.39.17. Lua脚本¶
苏里塔有
lua
(或)luajit
)关键字,允许规则引用可以访问数据包、有效负载、HTTP缓冲区等的Lua脚本。提供了Snort不具备的强大灵活性和功能。
6.39.18. 快速模式¶
Snort的快速模式匹配器始终不区分大小写;除非在快速模式匹配器使用的内容匹配上设置了“nocase”,否则Suricata的区分大小写。
Snort将根据
max-pattern-len
配置(默认无限制),除非fast_pattern:only
在规则中使用。Suricata不做任何自动的快速模式截断,不能配置为这样做。就像在snort中一样,在suricata中,可以指定内容字符串的子字符串用作快速模式匹配。例如
fast_pattern:5,20;
在snort中,在确定/使用最长的内容匹配时,将从内容匹配中删除前导的空字节(0x00),除非
fast_pattern
是显式设置的。Suricata不截断任何内容,包括空字节。打鼾不允许一切
http_*
用于快速模式匹配的缓冲区(例如http_raw_*
,http_method
,http_cookie
等等)。Suricata允许您使用任何“http”_ * '用于快速模式匹配的缓冲区,包括 ``http_raw_*' and `` http_cookie``缓冲区。苏里塔支持
fast_pattern:only
语法,但从技术上讲,它并没有真正实现;only
在规则中遇到时被自动忽略。仍然建议您使用fast_pattern:only
在适当的情况下,如果将来实现了这一点和/或Snort也将使用该规则。打鼾,除非
fast_pattern
是显式设置的,规范化HTTP检查缓冲区中的内容匹配(例如,HTTP内容修饰符,例如http_uri
,http_header
等)优先于非HTTP检查内容匹配,即使它们较短。苏里塔做了同样的事情,并给予了更高的“优先权”(优先权)http_*
缓冲器(除http_method
,http_stat_code
和http_stat_msg
)见 苏里塔快速模式确定解释 有关Suricata如何自动确定要用作快速模式匹配的内容的完整详细信息。
当对什么将被用于通过苏里塔快速模式匹配有疑问时,设置
fast_pattern
在规则中显式地和/或使用--engine-analysis
切换并查看生成的文件 (rules_fast_pattern.txt
)和Snort一样,之前也会检查快速模式匹配
flowbits
在苏里达。使用Hyperscan作为MPM匹配器 (
mpm-algo
设置)可以大大提高性能,特别是在快速模式匹配方面。在进行快速模式匹配时,Hyperscan还将考虑深度和偏移量,这是其他算法和Snort无法做到的。
6.39.19. 不要过河¶
Suricata将把网络流量作为单个数据包进行检查,在TCP情况下,它将作为(重新组装)流的一部分进行检查。但是,有些规则关键字只适用于数据包 (dsize
, flags
, ttl
)某些只适用于流 (http_*
)而且你不能混合分组和流关键字。使用数据包关键字的规则将仅检查单个数据包,使用数据流关键字的规则将仅检查数据流。当你把它们混合在一起的时候,打鼾会更宽容一点——例如,在打鼾中,你可以使用 dsize
(包关键字)与 http_*
尽管如此,由于 dsize
,它将只对单个数据包应用检测(除非启用了PAF,否则它将应用于PDU)。
如果 dsize
在一个规则中,该规则还查找基于流的应用层协议(例如 http
)上的Suricata将不匹配 第一应用层包 自从 dsize
使Suricata对包进行评估,直到对该包的协议进行检查之后,才进行协议检测; 后来的 该流中的数据包应适当设置应用程序协议,并将使用 dsize
以及基于流的应用层协议。
如果需要检查使用stream关键字的规则或查找基于流的应用程序层协议的规则中的流的大小,请考虑使用 stream_size
关键字和/或 isdataat
.
Suricata还支持在规则中使用这些协议值,Snort不支持:
tcp-pkt
–示例:alert tcp-pkt ...
这告诉Suricata只将规则应用于TCP数据包,而不是(重新组装)流。
tcp-stream
–示例:alert tcp-stream ...
这告诉Suricata只检查(重新组装)TCP流。
6.39.20. 警报¶
在Snort中,为数据包/流生成的警报数可以受
event_queue
配置。Suricata的内部硬编码限制为每个数据包/流15个警报(不能对此进行配置);所有与正在分析的流量匹配的规则都将达到该限制。
有时Suricata会为同一个TCP包生成两个警报。当Suricata单独评估数据包并将其作为(重新组装)流的一部分时,就会发生这种情况。
6.39.21. 缓冲器参考图¶
缓冲区 |
Snort 2.9.x支持? |
苏里塔支持? |
PCRE标志 |
可以用作快速模式吗? |
搜索快速模式优先级(数字越低优先级越高) |
---|---|---|---|---|---|
内容(无修改) |
YES |
YES |
<none> |
YES |
3 |
http_method |
YES |
YES |
M |
仅限苏里塔 |
3 |
http_stat_code |
YES |
YES |
S |
仅限苏里塔 |
3 |
http_stat_msg |
YES |
YES |
Y |
仅限苏里塔 |
3 |
尿酸含量 |
是,但已弃用,请改用http_-uri |
是,但已弃用,请改用http_-uri |
U |
YES |
2 |
http_uri |
YES |
YES |
U |
YES |
2 |
http_raw_uri |
YES |
YES |
I |
仅限苏里塔 |
2 |
http_header |
YES |
YES |
H |
YES |
2 |
http_raw_header |
YES |
YES |
D |
仅限苏里塔 |
2 |
http_cookie |
YES |
YES |
C |
仅限苏里塔 |
2 |
http_raw_cookie |
YES |
否(使用http-raw-header代替) |
K |
NO |
n/a |
http_host |
NO |
YES |
W |
仅限苏里塔 |
2 |
http_raw_host |
NO |
YES |
Z |
仅限苏里塔 |
2 |
http_client_body |
YES |
YES |
P |
YES |
2 |
http_server_body |
NO |
YES |
Q |
仅限苏里塔 |
2 |
http_user_agent |
NO |
YES |
V |
仅限苏里塔 |
2 |
dns_query |
NO |
YES |
n/a * |
仅限苏里塔 |
2 |
tls_sni |
NO |
YES |
n/a * |
仅限苏里塔 |
2 |
tls_cert_issuer |
NO |
YES |
n/a * |
仅限苏里塔 |
2 |
tls_cert_subject |
NO |
YES |
n/a * |
仅限苏里塔 |
2 |
file_data |
YES |
YES |
n/a * |
YES |
2 |
* 粘性缓冲液