2

我今天才开始学习如何使用 Snort。

但是,我需要一些关于我的规则设置的帮助。

我正在尝试在网络上查找以下发送到机器的代码。这台机器上安装了 snort(就像我现在安装的那样)。

我想在网络上分析的代码是以字节为单位的。

\xAA\x00\x00\x00\x00\x00\x00\x0F\x00\x00\x02\x74\x00\x00' (total of 14 bytes)

现在,我想分析代码的前 7 个字节。对我来说,如果第 1 个字节是(AA),第 7 个字节是(0F). 然后我想让snort发出警报。

到目前为止,我的规则是:

alert tcp any any -> any any \
(content:"|aa 00 00 00 00 00 00 0f|"; msg:"break in attempt"; sid:10; rev:1; \
classtype:shellcode-detect; rawbytes;)
byte_test:1, =, aa, 0, relative;
byte_test:7 =, 0f, 7, relative;

我猜我显然在某个地方犯了错误。也许熟悉snort的人可以帮助我?

谢谢。

4

1 回答 1

3

恭喜你决定学习 snort。

假设将在 TCP 数据包的有效负载中找到字节,您的规则标头应该没问题:

alert tcp any any -> any any

然后我们可以使用管道 (||) 指定内容匹配,让 snort 知道这些字符应该被解释为十六进制字节而不是 ascii:

content:"|AA 00 00 00 00 00 00 0F|"; depth:8; 

由于我们只希望规则匹配这些字节是否在数据包或缓冲区的前 8 个字节中找到,我们可以添加“深度”。“depth”关键字修饰符告诉 snort 检查在数据包或缓冲区中的哪个位置找到了内容匹配项。要使上述内容匹配返回真,所有八个字节必须在数据包或缓冲区的前八个字节中找到。

“rawbytes”在这里不是必需的,只能用于一个特定目的;匹配 telnet 控制字符。也不需要“byte_test”,因为我们已经使用内容匹配验证了字节 1 和 8 分别是“AA”和“0F”。

因此,最终规则变为:

alert tcp any any -> any any ( \
msg:"SHELLCODE Break in attempt"; \
content:"|AA 00 00 00 00 00 00 0F|"; depth:8; \
classtype:shellcode-detect; sid:10;)

如果您决定这应该只在文件内匹配,您可以使用“粘性”缓冲区“file_data”,如下所示:

alert tcp any any -> any any ( \
msg:"SHELLCODE Break in attempt"; file_data; \
content:"|AA 00 00 00 00 00 00 0F|"; depth:8; \
classtype:shellcode-detect; sid:10;)

如果在备用数据(文件数据)缓冲区中找到 shellcode,这将发出警报。

如果您希望您的规则仅查看此 shellcode 的某些文件类型,您可以使用“flowbits”,如下所示:

alert tcp any any -> any any ( \
msg:"SHELLCODE Break in attempt"; \
flowbits:isset,file.pdf; file_data; \
content:"|AA 00 00 00 00 00 00 0F|"; depth:8; \
classtype:shellcode-detect; sid:10;)

如果在设置 file.pdf 流位时找到这些字节,这将发出警报。您将需要启用设置 pdf flowbit 的规则。可以在此处免费提供的社区规则集中找到设置文件流位的规则和其他好的示例https://www.snort.org/snort-rules

于 2014-04-11T03:50:34.987 回答