题 处理HTTP w00tw00t攻击


我有一个带apache的服务器,我最近安装了mod_security2,因为我受到了很多攻击:

我的apache版本是apache v2.2.3,我使用mod_security2.c

这是错误日志中的条目:

[Wed Mar 24 02:35:41 2010] [error] 
[client 88.191.109.38] client sent HTTP/1.1 request without hostname 
(see RFC2616 section 14.23): /w00tw00t.at.ISC.SANS.DFind:)

[Wed Mar 24 02:47:31 2010] [error] 
[client 202.75.211.90] client sent HTTP/1.1 request without hostname 
(see RFC2616 section 14.23): /w00tw00t.at.ISC.SANS.DFind:)

[Wed Mar 24 02:47:49 2010] [error]
[client 95.228.153.177] client sent HTTP/1.1 request without hostname
(see RFC2616 section 14.23): /w00tw00t.at.ISC.SANS.DFind:)

[Wed Mar 24 02:48:03 2010] [error] 
[client 88.191.109.38] client sent HTTP/1.1 request without hostname
(see RFC2616 section 14.23): /w00tw00t.at.ISC.SANS.DFind:)

以下是access_log中的错误:

202.75.211.90 - - 
[29/Mar/2010:10:43:15 +0200] 
"GET /w00tw00t.at.ISC.SANS.DFind:) HTTP/1.1" 400 392 "-" "-"
211.155.228.169 - - 
[29/Mar/2010:11:40:41 +0200] 
"GET /w00tw00t.at.ISC.SANS.DFind:) HTTP/1.1" 400 392 "-" "-"
211.155.228.169 - - 
[29/Mar/2010:12:37:19 +0200] 
"GET /w00tw00t.at.ISC.SANS.DFind:) HTTP/1.1" 400 392 "-" "-" 

我尝试像这样配置mod_security2:

SecFilterSelective REQUEST_URI "w00tw00t\.at\.ISC\.SANS\.DFind"
SecFilterSelective REQUEST_URI "\w00tw00t\.at\.ISC\.SANS"
SecFilterSelective REQUEST_URI "w00tw00t\.at\.ISC\.SANS"
SecFilterSelective REQUEST_URI "w00tw00t\.at\.ISC\.SANS\.DFind:"
SecFilterSelective REQUEST_URI "w00tw00t\.at\.ISC\.SANS\.DFind:\)"

mod_security2中的东西是不能使用SecFilterSelective,它给了我错误。相反,我使用这样的规则:

SecRule REQUEST_URI "w00tw00t\.at\.ISC\.SANS\.DFind"
SecRule REQUEST_URI "\w00tw00t\.at\.ISC\.SANS"
SecRule REQUEST_URI "w00tw00t\.at\.ISC\.SANS"
SecRule REQUEST_URI "w00tw00t\.at\.ISC\.SANS\.DFind:"
SecRule REQUEST_URI "w00tw00t\.at\.ISC\.SANS\.DFind:\)"

即使这样也行不通。我不知道该怎么办了。有人有什么建议吗?

更新1

我看到没有人可以使用mod_security解决这个问题。到目前为止,使用ip-tables似乎是最好的选择,但我认为该文件将变得非常大,因为ip每天会改变几次。

我提出了另外两个解决方案,有人可以评论他们是好还是不好。

  1. 我想到的第一个解决方案是从我的apache错误日志中排除这些攻击。这将使我更容易发现其他紧急错误,并且不必通过长日志吐出。

  2. 我认为第二种选择更好,那就是阻止未以正确方式发送的主机。在这个例子中,w00tw00t攻击是在没有主机名的情况下发送的,所以我想我可以阻止那些不正确的主机。

更新2

通过答案后,我得出以下结论。

  1. 要为apache进行自定义日志记录会消耗一些不必要的资源,如果确实存在问题,您可能希望查看完整日志而不会丢失任何内容。

  2. 最好忽略命中并专注于分析错误日志的更好方法。为您的日志使用过滤器是一个很好的方法。

关于这个问题的最终想法

如果你至少拥有一个最新的系统,上面提到的攻击将无法到达你的机器,所以基本上没有后顾之忧。

在一段时间之后,很难过滤出真实的所有虚假攻击,因为错误日志和访问日志都非常大。

防止这种情况以任何方式发生将花费您的资源,并且最好不要将资源浪费在不重要的东西上。

我现在使用的解决方案是 Linux日志。它向我发送日志摘要,并对它们进行过滤和分组。通过这种方式,您可以轻松地将重要部分与不重要部分分开。

谢谢大家的帮助,我希望这篇文章对其他人也有帮助。


80
2018-03-24 05:33






答案:


从您的错误日志中,他们发送的HTTP / 1.1请求没有Host:部分请求。根据我的阅读,Apache在交给mod_security之前回复了400(错误的请求)错误。因此,看起来您的规则不会被处理。 (Apache在要求移交给mod_security之前处理它)

试试自己:

telnet主机名80
GET /blahblahblah.html HTTP / 1.1(输入)
(输入)

您应该收到400错误并在日志中看到相同的错误。这是一个糟糕的请求,apache给出了正确的答案。

正确的请求应如下所示:

GET /blahblahblah.html HTTP / 1.1
主持人:blah.com

解决此问题的方法可能是修补mod_uniqueid,以便为失败的请求生成唯一ID,以便apache将请求传递给其请求处理程序。 以下URL是关于此工作的讨论,并包含您可以使用的mod_uniqueid补丁:   http://marc.info/?l=mod-security-users&m=123300133603876&w=2

找不到任何其他解决方案,并想知道是否真的需要解决方案。


34
2018-03-29 13:17



我现在看到了问题。您是否推荐文章中提供的解决方案,或者您认为最好不要保留原样。它是系统中任何后门的扫描仪。如果我离开它只是扫描,我有一天会受到攻击。 - Saif Bechan
你好赛义夫,我想只要你保持你的apache安装与你的发行版(或手动)安全补丁最新,你应该没问题。结构不良的HTTP / 1.1请求(正如您所见)不应返回除apache之外的400错误。它看起来像 可以 一直是针对DLink路由器的某种漏洞扫描。 (根据其他一些消息来源) - Imo
至少有一种方法可以从我的apache error_log中获取这些字段 - Saif Bechan
您 也许 能够通过mod_log做到:: httpd.apache.org/docs/2.2/mod/mod_log_config.html#customlog - Imo
我的额外提示是:配置你的 默认 虚拟主机旁边实际使用的主机。上面提到的尝试将最终出现在日志中 默认 虚拟主机。 - Koos van den Hout


过滤IP不是一个好主意,imho。 为什么不尝试过滤你知道的字符串?

我的意思是:

iptables -I INPUT -p tcp --dport 80 -m string --to 60 --algo bm --string 'GET /w00tw00t' -j DROP

15
2018-05-09 16:21



spamcleaner.org/en/misc/w00tw00t.html 类似的解决方案,但更详细一点。 - Isaac
防火墙中字符串过滤的一个问题是它“相当慢”。 - Alexis Wilke
@AlexisWilke你有证据表明iptables字符串过滤比在apache级别过滤慢吗? - jrwren


我也开始在我的日志文件中看到这些类型的消息。防止这些类型攻击的一种方法是设置fail2ban( http://www.fail2ban.org/ 并设置特定的过滤器以黑名单列出您的iptables规则中的这些IP地址。

下面是一个过滤器的例子,它会阻止与制作这些消息相关的ip地址

[Tue Aug 16 02:35:23 2011] [错误] [客户]文件不存在:/var/www/skraps/w00tw00t.at.blackhats.romanian.anti-sec :) === apache w00t w00t message jail - 正则表达式和过滤器=== 监狱

 [apache-wootwoot]
 enabled  = true
 filter   = apache-wootwoot
 action   = iptables[name=HTTP, port="80,443", protocol=tcp]
 logpath  = /var/log/apache2/error.log
 maxretry = 1
 bantime  = 864000
 findtime = 3600

过滤

 # Fail2Ban configuration file
 #
 # Author: Jackie Craig Sparks
 #
 # $Revision: 728 $
 #
 [Definition]
 #Woot woot messages
 failregex = ^\[\w{1,3} \w{1,3} \d{1,2} \d{1,2}:\d{1,2}:\d{1,2} \d{1,4}] \[error] \[client 195.140.144.30] File does not exist: \/.{1,20}\/(w00tw00t|wootwoot|WootWoot|WooTWooT).{1,250}
 ignoreregex =

11
2017-08-19 17:46



确实你可以阻止它们,但是没有必要因为它们只是糟糕的请求。最好忽略它们,保存你的工作,你将释放一些资源。 - Saif Bechan
对@Saif Bechan来说,如果有人担心“测试攻击”会成功,他/她应该更好地修复自己的应用程序而不是浪费时间来找到阻止它的方法。 - Thomas Berger
给你+1,谢谢你的回答。 - Saif Bechan
@SaifBechan,我不同意。 w00tw00t是一个漏洞扫描程序,并且在尝试其他类型的请求时无法信任发出此类请求的计算机,因此如果我是系统管理员并且我花了2分钟一次禁止这样的客户几天,我这样做。但是,我不会将我的整个安全实现建立在这样的方法上。 - Isaac


w00tw00t.at.blackhats.romanian.anti-sec是一次黑客攻击并使用欺骗IP,因此VisualRoute等查找将根据当时借调的IP报告中国,波兰,丹麦等。因此,设置拒绝IP或可解析的主机名几乎是不可能的,因为它会在一小时内改变。


3
2018-06-01 11:20



这些漏洞扫描不使用欺骗性IP地址。如果他们这样做,TCP 3次握手将无法完成,Apache也不会记录请求。有关警告(流氓ISP,路由器运营商等),请参阅 security.stackexchange.com/q/37481/53422 - Anthony Geoghegan


我亲自编写了一个Python脚本来自动添加IPtables规则。

这是一个略有缩写的版本,没有日志记录和其他垃圾:

#!/usr/bin/python
from subprocess import *
import re
import shlex
import sys

def find_dscan():
        p1 = Popen(['tail', '-n', '5000', '/usr/local/apache/logs/error_log'], stdout=PIPE)
        p2 = Popen(['grep', 'w00t'], stdin=p1.stdout, stdout=PIPE)

        output = p2.communicate()[0].split('\n')

        ip_list = []

        for i in output:
                result = re.findall(r"\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b", i)
                if len(result):
                        ip_list.append(result[0])

        return set(ip_list)

for ip in find_dscan():
        input = "iptables -A INPUT -s " + ip + " -j DROP"
        output = "iptables -A OUTPUT -d " + ip + " -j DROP"
        Popen(shlex.split(input))
        Popen(shlex.split(output))

sys.exit(0)

2
2018-03-24 07:06



这是为了防止w00tw00t攻击 - Saif Bechan
是的,我让它扫描Apache错误日志中的任何“w00tw00t”IP并添加它们,如果它们不存在,但为了简单起见,我没有添加检查重复项。 - Xorlev
这个脚本可能应该使用一个表,向iptables链添加大量额外的规则会减慢处理速度。 - Eric
它确实使用表格。但是我简化了很多,因为它是根据我的系统量身定制的。 - Xorlev
你认为这是一个使用mod_security的更好的解决方案吗? - Saif Bechan


我相信mod_security不适合你的原因是Apache无法解析请求本身,它们是不合规格的。我不确定你在这里遇到了什么问题 - apache正在记录网上发生的奇怪的事情,如果它没有记录它你将不会意识到它甚至正在发生。记录请求所需的资源可能很少。我理解有人填写您的日志令人沮丧 - 但如果您禁用日志记录只是为了发现您确实需要它,那将会更令人沮丧。就像有人闯入你的网络服务器,你需要日志来显示他们是如何闯入的。

一种解决方案是通过syslog设置ErrorLogging,然后使用rsyslog或syslog-ng,您可以专门过滤并丢弃有关w00tw00t的这些RFC违规。或者,您可以将它们过滤到单独的日志文件中,这样您的主ErrorLog就很容易阅读。在这方面,Rsyslog非常强大和灵活。

所以在httpd.conf中你可能会这样做:

ErrorLog syslog:user 

然后在rsyslog.conf中你可能有:

:msg, contains, "w00tw00t.at.ISC.SANS.DFind" /var/log/httpd/w00tw00t_attacks.log

请注意,这种方法实际上会使用很多次 更多资源 比最初使用的直接记录到文件。如果您的网络服务器非常繁忙,这可能会成为一个问题。

最好的做法是尽快将所有日志发送到远程日志记录服务器,如果您遇到问题,这将使您受益,因为擦除已完成操作的审计跟踪要困难得多。

IPTables阻塞是一个想法,但你最终可能会得到一个非常大的iptables阻止列表,它本身就会产生性能影响。 IP地址中是否存在模式,或者它是来自大型分布式僵尸网络?在获得iptables的好处之前,需要有X%的重复项。


2
2018-03-30 11:09



不错的回答,我喜欢不同的方法。考虑到这一点,拥有自定义日志将创建更多的追索权使用,因为必须首先检查所有内容,我想这个选项也会下降。我现在启用了logwatch。这每天给我发送一次报告,其中包含整个系统的摘要。 apache日志也会被检查,它只是说w00tw00t尝试了300次。我想我会暂时离开设置。 - Saif Bechan


你在更新2中说:

问题仍然存在   仍然存在的问题如下。这些攻击来自搜索服务器上某些文件的机器人。此特定扫描程序搜索文件/w00tw00t.at.ISC.SANS.DFind :)。

现在你可以忽略它,这是最值得推荐的。问题仍然存在,如果你有一天在你的服务器上有这个文件,你有一些麻烦。

从我之前的回复中我们收集到Apache由于HTML 1.1查询格式不正确而返回错误消息。支持HTTP / 1.1的所有Web服务器在收到此消息时可能会返回错误(我没有仔细检查过RFC - 也许RFC2616告诉我们)。

有了w00tw00t.at.ISC.SANS.DFind:在你的服务器上某些地方没有神秘意味着“你遇到了麻烦”......如果你在DocumentRoot中创建了w00tw00t.at.ISC.SANS.DFind:文件甚至DefaultDocumentRoot无所谓......扫描程序正在发送一个破坏的HTTP / 1.1请求,而apache正在说“不,这是一个糟糕的请求......再见”。将不会提供w00tw00t.at.ISC.SANS.DFind:文件中的数据。

在这种情况下使用mod_security是不必要的,除非你真的想要(没有点?)......在这种情况下,你可以看一下手动修补它(在其他答案中链接)。

您可以使用的另一件事是mod_security中的RBL功能。也许有一个RBL在线一些提供wstw00t IP(或其他已知的恶意IP)的地方。但这意味着mod_security会为每个请求执行DNS查找。


1
2018-03-31 08:52



我不认为apache拒绝它们,它只是抛出错误但查找仍然通过。我在访问日志中有相同的w00tw00t.at.ISC.SANS.DFind。它做了GET。因此查找完成,如果您的计算机上有该文件,它将被执行。我可以发布访问日志条目,但它们看起来与错误日志相同,只是前面有一个GET。 Apache抛出错误但请求通过。这就是为什么我问在没有主机名的情况下阻止这些请求是否是个好主意。但我不想阻止普通用户。 - Saif Bechan
当然,您在访问日志中获得相同的条目,但查看错误代码... 400.它未被处理。 HTTP / 1.1(主机名)用于告诉apache将请求发送到哪个虚拟主机...没有HTTP / 1.1请求的主机名部分apache不知道在哪里发送请求并返回“400错误请求”错误回到客户端。 - Imo
自己尝试一下......在你的网络服务器上创建一个html页面并尝试使用“telnet hostname 80”手动设置...其他步骤在我的第一个答案中。我会给它一个很大的赏金,你不能使用没有主机名的HTTP / 1.1来显示html文件。 - Imo
啊是的,那是指出我的意思。我一直认为access_log是通过错误日志传递并实际进入你的机器的条目。感谢您指出这一点,我将编辑我的帖子。我非常感谢你的帮助。 - Saif Bechan
嗨赛义夫,没有问题,很乐意帮助。此致,Imo - Imo


如何将规则添加到modsecurity? 像这样的东西:

   SecRule REQUEST_URI "@rx (?i)\/(php-?My-?Admin[^\/]*|mysqlmanager
   |myadmin|pma2005|pma\/scripts|w00tw00t[^\/]+)\/"
   "severity:alert,id:'0000013',deny,log,status:400,
   msg:'Unacceptable folder.',severity:'2'"

1
2017-08-09 08:23





我看到大多数解决方案已经在上面介绍过,但我想指出的不是全部 客户端发送没有主机名的HTTP / 1.1请求 攻击直接针对您的服务器。指纹和/或利用服务器之前的网络系统有许多不同的尝试,即使用:

client sent HTTP/1.1 request without hostname (see RFC2616 section 14.23): /tmUnblock.cgi

因此,有时它有助于扩大你的注意力,并在所有系统之间分配相同份额的防御工作,即:实施路由器规则,实施防火墙规则(希望你的网络有一个),实现服务器防火墙/ IP表规则和相关服务,即mod_security,fail2ban等。


1
2017-10-08 18:10





这个怎么样 ?

iptables -I INPUT -p tcp --dport 80 -m string --to 70 --algo bm --string 'GET /w00tw00t.at.ISC.SANS.DFind' -j DROP
iptables -I INPUT -p tcp --dport 80 -m string --to 70 --algo bm --string 'GET /w00tw00t.at.ISC.SANS.DFind' -j LOG --log-level 4 --log-prefix Hacktool.DFind:DROP:

对我来说很好。


1
2018-03-01 20:42



我为mod_security推荐了OWASP_CRS / 2.2.5或grater规则集 - Urbach-Webhosting
这真的不是一个好主意。你最终会有很多悬挂连接。此外,如果您的网站有关于这些请求的任何讨论,您最终可能会出现误报。 - kasperd


如果你使用 hiawatha 网络服务器 作为一个 reverse proxy这些扫描会自动丢弃为垃圾和垃圾 client 取缔。它也过滤 XSS & CSRF 战功。


0
2017-08-18 01:03