我的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:\)"
即使这不起作用。我不知道该怎么办了。任何人有任何建议吗?
Update 1
我看到没有人可以使用mod_security解决此问题。到目前为止,使用ip-tables似乎是执行此操作的最佳选择,但是我认为文件会变得非常大,因为ip每天都会更改服务器次数。
我想出了另外两种解决方案,有人可以对它们的优劣发表评论。
我想到的第一个解决方案是从我的Apache错误日志中排除这些攻击。这将使我更容易发现其他紧急错误,因为它们发生时不必吐出较长的日志。
我认为第二种方法更好,这是阻止未发送的主机。正确的方法。在此示例中,发送的w00tw00t攻击没有主机名,因此我认为我可以阻止格式不正确的主机。
更新2
经过深入的回答,我得出以下结论。
为Apache进行自定义日志记录会消耗一些不必要的资源,如果确实有问题,您可能希望查看完整的日志而不会丢失任何内容。
最好忽略这些命中并专注于一个更好的日志分析错误日志的方法。为您的日志使用过滤器是实现此目的的一种好方法。
关于此主题的最终想法
如果您至少具有最新的系统,那么上述攻击将不会对您的计算机造成影响,因此基本上没有后顾之忧。
过一会儿很难过滤掉所有真实的虚假攻击,因为错误日志和访问日志都变得非常大。
以任何方式防止这种情况的发生将使您付出巨大的代价。资源,这是一个好习惯,不要将资源浪费在不重要的东西上。
我现在使用的解决方案是Linux logwatch。它向我发送日志摘要,并对其进行过滤和分组。这样,您可以轻松地将重要信息与不重要的信息区分开。
谢谢大家的帮助,我希望本文对其他人也有所帮助。
#1 楼
他们从错误日志中发送了HTTP / 1.1请求,而没有请求的Host:部分。根据我的阅读,在移交给mod_security之前,Apache对此请求答复了400(错误请求)错误。因此,看起来您的规则不会被处理。 (Apache需要先处理它,然后再移交给mod_security)尝试一下:
telnet hostname 80 GET /blahblahblah.html HTTP/1.1 (enter) (enter)
您应该得到400错误并查看您的日志中出现相同的错误。这是一个错误的请求,Apache正在给出正确的答案。
正确的请求应如下所示:
GET /blahblahblah.html HTTP/1.1 Host: blah.com
解决此问题的方法可能是修补mod_uniqueid,甚至为失败的请求生成唯一的ID,以使apache将请求传递给其请求处理程序。
以下URL是有关此解决方法的讨论,并包括一个补丁您可以使用mod_uniqueid:
http://marc.info/?l=mod-security-users&m=123300133603876&w=2
找不到其他解决方案,想知道是否有解决方案是实际需要的。
#2 楼
过滤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类似的解决方案,但更为详细。
–艾萨克
13年6月10日在11:20
防火墙中字符串过滤的一个问题是它“相当慢”。
– Alexis Wilke
15年12月28日在5:18
@AlexisWilke您是否有证据表明iptables字符串过滤比apache级别的过滤慢?
– jrwren
17年11月6日15:59
@jrwren实际上,当且仅当您不传递数据包偏移量以停止搜索(即此处为“-至60”)时,它的速度可能相当慢。默认情况下,它将搜索整个数据包,最大限制设置为65,535字节,最大IP数据包长度:blog.nintechnet.com/…该手册明确告诉“如果未通过,则默认为数据包大小”。
–gouessej
18/12/16在10:59
这是理论上的最大值互联网上更实际的最大长度为1500。
– jrwren
18/12/19在21:13
#3 楼
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 =
评论
您确实可以阻止它们,但是没有必要,因为它们只是错误的请求。最好不理会它们,节省您的工作,这样您就可以腾出一些资源。
– Saif Bechan
2011年8月19日在17:50
对@Saif Bechan来说,如果有人担心“测试攻击”是否成功,他/她应该更好地修复自己的应用程序,而不是浪费时间来寻找阻止它的方法。
–托马斯·伯格(Thomas Berger)
2011年8月19日在23:57
给您+1,谢谢您的回答。
– Saif Bechan
11年8月20日在0:49
@SaifBechan,我不同意。 w00tw00t是一个漏洞扫描程序,发出此类请求的计算机无法尝试其他类型的请求,因此,如果我是系统管理员,并且我花了2分钟时间禁止此类客户端几天,会这样做。但是,我不会将整个安全实现都基于这种方法。
–艾萨克
2012年11月26日下午3:51
#4 楼
w00tw00t.at.blackhats.romanian.anti-sec是一种黑客尝试,并使用了欺骗IP,因此诸如VisualRoute之类的查询将根据当时被借用的IP报告中国,波兰,丹麦等。因此,设置拒绝IP或可解析的主机名几乎是不可能的,因为它会在一小时内发生变化。评论
这些漏洞扫描不使用欺骗的IP地址。如果这样做,则TCP 3向握手将不会完成,并且Apache将不会记录该请求。有关警告(恶意ISP,路由器运营商等),请参阅security.stackexchange.com/q/37481/53422
– Anthony Geoghegan
'18 Sep 12'在17:23
#5 楼
我亲自编写了一个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
10 Mar 24 '10在7:24
是的,我扫描了Apache错误日志中的所有“ w00tw00t” IP并添加了它们(如果它们不存在),尽管为简单起见,我没有添加重复检查。
– Xorlev
10 Mar 24 '10在20:26
该脚本可能应该使用一个表,向iptables链添加大量额外的规则,这将大大减慢处理速度。
–埃里克
10 Mar 28 '10在4:35
它确实使用表格。但是,由于它是针对我的系统量身定制的,因此我简化了很多工作。
– Xorlev
10 Mar 28 '10在7:43
您是否认为使用mod_security是更好的解决方案
– Saif Bechan
10 Mar 28 '10在10:10
#6 楼
我认为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
请注意,与直接登录到文件时,这种方法实际上将比原来使用的资源多很多倍。如果您的Web服务器很忙,这可能会成为问题。
最佳做法是将所有日志尽快发送到远程日志记录服务器,如果您遇到问题,这将使您受益。进入IPTables阻止是一个想法,但是最终可能会得到一个非常大的iptables阻止列表,该列表本身可能会对性能产生影响。 。 IP地址中是否存在模式,还是来自大型分布式僵尸网络?您必须先获得X%的重复项,然后才能从iptables中受益。
评论
好的答案,我喜欢其他方法。考虑一下,使用自定义日志将创建更多资源,因为必须首先检查所有内容,我想这个选项也会失效。我现在启用了日志监视。这一天两次向我发送一份报告,其中包含整个系统的摘要。 apache日志也被检查,只是说w00tw00t尝试了300次。我想我会暂时离开设置。
– Saif Bechan
2010-3-30在11:53
#7 楼
您在Update 2中说:仍然存在的问题
仍然存在的问题如下。这些攻击来自在服务器上搜索某些文件的机器人。此特定的扫描仪搜索文件/w00tw00t.at.ISC.SANS.DFind :)。
现在,您可以忽略它,这是最推荐的。问题仍然是,如果有一天在服务器上确实有此文件,则会遇到麻烦。
从我之前的答复中我们得知,Apache由于以下原因返回了错误消息:格式不正确的HTML 1.1查询。所有支持HTTP / 1.1的Web服务器都可能在收到此消息时返回错误(我没有仔细检查RFC-也许RFC2616告诉了我们)。
具有w00tw00t.at.ISC.SANS.DFind :在您的服务器上,有些地方并不神秘地意味着“您遇到了麻烦” ...如果您在DocumentRoot甚至是DefaultDocumentRoot中创建w00tw00t.at.ISC.SANS.DFind:文件,都没有关系...扫描仪正在发送中断的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引发错误,但请求通过。这就是为什么我问如果没有主机名阻止这些请求是否是一个好主意。但是我不想阻止普通用户。
– Saif Bechan
2010年3月31日在9:07
当然,您会在访问日志中获得相同的条目,但是请查看错误代码...400。它不会被处理。 HTTP / 1.1(主机名)用于告诉apache将请求发送到哪个虚拟主机...没有HTTP / 1.1请求的主机名部分,apache不知道将请求发送到何处并返回“ 400错误请求”错误回到客户。
– Imo
2010年3月31日在9:18
自己尝试...在您的Web服务器上创建一个html页面,然后尝试使用“ telnet hostname 80”手动访问它。...其他步骤在我的第一个答案中。我对它大加赞赏,因为如果没有主机名,您将无法使用HTTP / 1.1显示html文件。
– Imo
10 Mar 31 '10在9:20
是的,是因为向我指出了这一点。我一直以为access_log是通过错误日志传递并实际进入您的计算机的条目。感谢您向我指出,我将编辑我的帖子。非常感谢您的帮助。
– Saif Bechan
10 Mar 31 '10在9:27
嗨,赛义夫,没问题,很高兴为您提供帮助。问候,Imo
– Imo
10 Mar 31 '10在10:45
#8 楼
如何在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'"
#9 楼
我看到上面已经涵盖了大多数解决方案,但是我想指出的是,并非所有没有主机名攻击的客户端发送的HTTP / 1.1请求都直接针对您的服务器。有很多尝试对服务器之前的网络系统进行指纹识别和/或利用的尝试,即使用:client sent HTTP/1.1 request without hostname (see RFC2616 section 14.23): /tmUnblock.cgi
锁定Linksys路由器等。因此,有时它有助于扩大范围您将注意力集中在所有系统上,并在所有系统之间平均分配防御工作,例如:实施路由器规则,实施防火墙规则(希望您的网络拥有一个),实施服务器防火墙/ IP表规则以及相关服务(例如mod_security,fail2ban等)。 br />
#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:
对我来说很好。
评论
我建议为mod_security使用OWASP_CRS / 2.2.5或刨丝器规则集
– Urbach虚拟主机
16年1月1日在20:52
这确实不是一个好主意。最后,您将获得许多悬挂连接。另外,如果您的站点上有关于这些请求的任何讨论,则最终可能会带来误报。
–卡巴斯德
16年1月1日在21:04
#11 楼
如果将hiawatha
Web服务器用作reverse proxy
,这些扫描将自动作为垃圾丢弃,并且client
被禁止。它还过滤XSS
和CSRF
漏洞。
评论
我现在看到了问题。您是推荐本文中提供的解决方案,还是认为将其保持原样更好。它是系统中所有后门的扫描仪。如果我只扫描它,有一天我可能会受到攻击。
– Saif Bechan
10 Mar 29 '10在14:10
您好Saif,我想只要您使Apache安装与发行版(或手册)安全补丁保持最新,就可以了。结构不良的HTTP / 1.1请求(如您所见)不应返回apache中的400错误。看起来可能是针对DLink路由器的某种漏洞扫描。 (根据其他一些资料)
– Imo
2010年3月29日在18:16
至少有一种方法可以使这些字段脱离我的Apache error_log
– Saif Bechan
10 Mar 29 '10在22:35
您也许可以通过mod_log :: httpd.apache.org/docs/2.2/mod/mod_log_config.html#customlog做到这一点
– Imo
10 Mar 30 '10在7:02
我的额外提示是:在实际使用的虚拟主机旁边配置默认虚拟主机。上面提到的尝试将最终出现在默认虚拟主机的日志中。
– Koos van den Hout
2012年8月19日在11:35