我在 windows server 2008 R2 x64 上使用 Snort 2.9,配置非常简单,如下所示:
# Entire content of Snort.conf:
alert tcp any any -> any any (sid:5000000; content:"_secret_"; msg:"TRIGGERED";)
# command line:
snort.exe -c etc/Snort.conf -l etc/log -A console
使用我的浏览器,我将 url 中的字符串“_secret_”发送到我的服务器(Snort 所在的位置)。例子:http://myserver.com/index.php?_secret_
Snort 收到它并发出警报,它可以工作,没问题!但是当我尝试这样的事情时:
<?php // (index.php)
header('XTest: _secret_'); // header
echo '_secret_'; // data
?>
如果我只是请求http://myserver.com/index.php
,即使 php 文件在标头和数据中都发送相同的字符串,没有压缩/编码或其他任何内容,它也不起作用或检测到传出流量中的任何内容。(我使用 Wireshark 检查过)
这在我看来像是一个 Snort 问题。无论我做什么,它只检测接收数据包。有人在使用 Snort 时遇到过这种问题吗?知道如何解决吗?
经过6个小时的痛苦尝试,我终于修好了!
只需要添加
-k none
到命令行。出于某种原因,在我的台式电脑中,它可以在没有
-k none
参数的情况下工作。如果有人愿意解释发生了什么,那将非常有帮助。谢谢。听起来校验和卸载正在导致您的问题。
校验和卸载允许 NIC 计算 TCP 校验和,从而使 CPU 不必执行计算。NIC 在发送数据包之前执行每个计算,不幸的是,Snort 可以在计算之前捕获本地数据包。结果,Snort 的内部校验和验证看到校验和为 0(因为尚未完成),将其解释为错误校验和,并且不进一步分析数据包。
这就是为什么将
-k none
选项添加到 snort.exe 来修复它的原因;它禁用 Snort 的内部校验和验证,从而让数据包被分析。请注意,可以检查和禁用 checksum offloading,但由于存在一些性能风险,我认为该
-k
解决方案更好。有时 snaplen ( -P ) 也可能是一个问题。增加该值(默认为 MTU 的大小),您将获得更多数据。