我刚刚开始学习如何使用Snort。
但是,我需要对规则设置提供一些帮助。
我正在尝试在发送到计算机的网络上查找以下代码。这台机器上安装了snort(我现在安装了它)。
我想在网络上分析的代码是以字节为单位。
\xAA\x00\x00\x00\x00\x00\x00\x0F\x00\x00\x02\x74\x00\x00' (total of 14 bytes)
现在,我正在考虑分析代码的前7个字节。对我来说,如果第一个字节是(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一起玩的人可以帮助我吗?
感谢。
答案 0 :(得分:3)
恭喜决定学习鼻涕。
假设将在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控制字符。 " 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;)
如果您认为这只能在文件中匹配,则可以使用" sticky"缓冲区" 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 flowbit时找到这些字节,则会发出警报。您将需要启用设置pdf flowbit的规则。设置文件flowbits和其他好例子的规则可以在这里免费提供的社区规则集https://www.snort.org/snort-rules中找到。