我今天刚开始学习如何使用Snort。
但是,我需要一些关于规则设置的帮助。
我正在尝试在网络上查找发送到机器的以下代码。这台机器上安装了snort(就像我现在安装的那样)。
我想在网络上分析的代码以字节为单位。
xAAx00x00x00x00x00x00x0Fx00x00x02x74x00x00' (total of 14 bytes)
现在,我想分析代码的前7个字节。对我来说,如果第一个字节是(AA)
,而第七个字节是(0F)
。然后我想哼一声来报警。
到目前为止,我的规则是:
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。
假设字节将在TCP数据包的有效负载中找到,那么您的规则头应该是好的:
alert tcp any any -> any any
然后,我们可以使用管道(||)指定内容匹配,让snort知道这些字符应该被解释为十六进制字节,而不是ascii:
content:"|AA 00 00 00 00 00 00 0F|"; depth:8;
由于我们只希望在数据包或缓冲区的前8个字节中找到这些字节时规则匹配,因此我们可以添加"深度"。"depth"关键字修饰符告诉snort检查在数据包或缓冲区中找到内容匹配的位置。为了使上述内容匹配返回true,必须在数据包或缓冲区的前八个字节中找到所有八个字节。
这里不需要"rawbytes",只能用于一个特定目的;以匹配telnet控制字符。"字节测试"也不需要,因为我们已经使用内容匹配验证了字节1和8分别是"AA"one_answers"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;)
如果在备用数据(文件数据)缓冲区中发现外壳代码,则会发出警报。
如果你想让你的规则只查看这个外壳代码的某些文件类型,你可以使用这样的"流位":
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流位的规则。设置文件流位的规则和其他好的示例可以在这里免费提供的社区规则集中找到https://www.snort.org/snort-rules.