应对HTTP w00tw00t攻击


82

我有一台装有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 logwatch。它向我发送日志摘要,并对其进行过滤和分组。这样,您可以轻松地将重要事项与不重要事项区分开。

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

Answers:


34

他们从错误日志中发送了HTTP / 1.1请求,而没有请求的Host:部分。根据我的阅读,在移交给mod_security之前,Apache对此请求回复了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

找不到其他解决方案,想知道是否确实需要解决方案。


我现在看到了问题。您是推荐本文中提供的解决方案,还是认为保持原样更好。它是系统中所有后门的扫描仪。如果我只扫描它,我有一天可能会受到攻击。
Saif Bechan 2010年

1
您好Saif,我想只要您使apache安装与发行版(或手册)安全补丁保持最新,就可以了。结构不良的HTTP / 1.1请求(如您所见)不应返回apache中的400错误。看起来可能是针对DLink路由器的某种漏洞扫描。(根据其他一些消息)
Imo 2010年

是否至少有一种方法可以使这些字段脱离我的Apache error_log
Saif Bechan 2010年


我的额外提示是:在实际使用的虚拟主机旁边配置默认虚拟主机。上面提到的尝试将最终出现在默认虚拟主机的日志中。
Koos van den Hout 2012年

16

恕我直言,过滤IP不是一个好主意。为什么不尝试过滤您知道的字符串?

我的意思是:

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

spamcleaner.org/en/misc/w00tw00t.html类似的解决方案,但更为详细。
艾萨克(Isaac)2013年

防火墙中字符串过滤的一个问题是它“相当慢”。
亚历克西斯·威尔克

@AlexisWilke您是否有证据表明iptables字符串过滤比apache级别的过滤慢?
jrwren

@jrwren实际上,当且仅当您不传递数据包偏移量以停止搜索(即此处为“-至60”)时,它才会相当慢。默认情况下,它将搜索整个数据包,最大限制设置为65,535字节,最大IP数据包长度:blog.nintechnet.com/…该手册明确告知“如果未通过,则默认为数据包大小”。
gouessej

这是理论上的最大值 互联网上更实际的最大长度为1500。
jrwren

11

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

这是一个过滤器的示例,该过滤器将阻止与发出这些消息相关的IP地址

[2011年8月16日星期二02:35:23] [错误] [客户端]文件不存在:/var/www/skraps/w00tw00t.at.blackhats.romanian.anti-sec :) === apache w00t w00t消息监狱-正则表达式和过滤器===监狱

 [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 =

2
您可以阻止它们,但这是不必要的,因为它们只是不好的请求。最好不理会它们,节省您的工作,您将释放一些资源。
赛义夫·拜尚

对@Saif Bechan,如果有人担心“测试攻击”是否成功,他/她应该更好地修复自己的应用程序,而不是浪费时间来寻找阻止它的方法。
托马斯·伯格

给您+1,谢谢您的回答。
赛义夫·拜尚

4
@SaifBechan,我不同意。w00tw00t是一个漏洞扫描程序,发出此类请求的计算机无法尝试其他类型的请求,因此,如果我是系统管理员,并且我花了2分钟时间禁止此类客户端几天,会这样做。但是,我不会将整个安全实现都基于这种方法。
艾萨克(Isaac)

3

w00tw00t.at.blackhats.romanian.anti-sec是一种黑客尝试,并使用欺骗IP,因此诸如VisualRoute之类的查询将根据当时被借用的IP报告中国,波兰,丹麦等。因此,设置拒绝IP或可解析的主机名几乎是不可能的,因为它会在一小时内更改。


这些漏洞扫描不使用欺骗的IP地址。如果这样做,TCP 3向握手将不会完成,并且Apache将不会记录该请求。有关警告(恶意ISP,路由器运营商等),请参阅security.stackexchange.com/q/37481/53422
Anthony Geoghegan

2

我亲自编写了一个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)

这是为了防止w00tw00t攻击吗
Saif Bechan

是的,我扫描了Apache错误日志中的所有“ w00tw00t” IP并添加了它们(如果它们不存在),尽管为简单起见,我没有添加重复检查。
Xorlev

该脚本可能应该使用一个表,向iptables链中添加大量额外的规则,这将大大减慢处理速度。
埃里克

它确实使用表格。但是,由于它是针对我的系统量身定制的,因此我简化了很多工作。
Xorlev

您是否认为使用mod_security是更好的解决方案
Saif Bechan 2010年

2

我认为mod_security对您不起作用的原因是Apache本身无法解析请求,因为它们不合规格。我不确定您是否在这里遇到问题-apache正在记录网络上正在发生的怪异狗屎,如果不记录,您甚至不会意识到它正在发生。记录请求所需的资源可能很小。我知道有人在填写您的日志令人沮丧,但是如果您禁用日志记录只是为了找到自己真正需要的日志,那将更加令人沮丧。就像有人闯入您的Web服务器一样,您需要日志来显示他们是如何闯入的。

一种解决方案是通过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地址中是否存在模式,还是来自大型分布式僵尸网络?您必须先获得X%的重复项,然后才能从iptables中受益。


好的答案,我喜欢不同的方法。考虑一下,使用自定义日志将创建更多资源,因为必须首先检查所有内容,所以我猜这个选项也会失效。我现在启用了日志监视。这一天两次向我发送一份报告,其中包含整个系统的摘要。apache日志也会被检查,它只是说w00tw00t尝试了300次。我认为我将暂时退出该设置。
赛义夫·贝坎

1

您在更新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提供了IP(或其他已知的恶意IP)。但是,这意味着mod_security为每个请求执行DNS查找。


我不认为apache拒绝它们,它只是引发错误,但查找仍然可以通过。我在访问日志中有相同的w00tw00t.at.ISC.SANS.DFind。它执行GET。这样查找就完成了,如果您的计算机上有文件,它将被执行。我可以发布访问日志条目,但是它们看起来与错误日志相同,只是前面带有GET。Apache引发错误,但请求通过。这就是为什么我问如果没有主机名阻止这些请求是否是一个好主意。但是我不想阻止普通用户。
赛义夫·贝坎

1
当然,您会在访问日志中获得相同的条目,但是请查看错误代码...400。它不会被处理。HTTP / 1.1(主机名)用于告诉apache将请求发送到哪个虚拟主机...没有HTTP / 1.1请求的主机名部分,apache不知道将请求发送到哪里并返回“ 400错误请求”错误回到客户。
Imo 2010年

自己尝试...在您的Web服务器上创建一个html页面,然后尝试使用“ telnet主机名80”手动访问它。...其他步骤在我的第一个答案中。我对它大加赞赏,因为如果没有主机名,您将无法使用HTTP / 1.1显示html文件。
Imo 2010年

是的,是因为向我指出了这一点。我一直以为access_log是通过错误日志传递并实际进入您的计算机的条目。感谢您向我指出,我将编辑我的帖子。非常感谢您的帮助。
赛义夫·贝坎

嗨,赛义夫,没问题,很高兴为您提供帮助。问候,伊莫
伊莫

1

如何向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

我看到上面已经涵盖了大多数解决方案,但是我想指出的是,并非所有没有主机名攻击的客户端发送的HTTP / 1.1请求都直接针对您的服务器。有多种尝试对服务器之前的网络系统进行指纹识别和/或利用的尝试,即使用:

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

瞄准Linksys路由器等。因此有时它有助于扩大您的关注范围,并在所有系统之间以相等的份额分配防御工作,例如:实施路由器规则,实施防火墙规则(希望您的网络有一个),实施服务器防火墙/ IP表规则和相关服务,例如mod_security,fail2ban等。


1

这个怎么样 ?

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:

对我来说很好。


我建议为mod_security使用OWASP_CRS / 2.2.5或更好的规则集
Urbach-Webhosting

这确实不是一个好主意。最后,您将获得许多悬挂连接。另外,如果您的站点上有关于这些请求的讨论,那么您可能会得到误报。
卡巴斯德(Kasperd)'16

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.