恭喜你决定学习 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。