HTTP/2 协议拒绝服务漏洞(CVE-2023-44487)允许恶意攻击者发起针对HTTP/2 服务器的DDoS攻击,使用HEADERS
和RST_STREAM
发送一组HTTP
请求,并重复此模式以在目标HTTP/2
服务器上生成大量流量。通过在单个连接中打包多个HEADERS
和RST_STREAM
帧,可能导致每秒请求量显著增加,并导致服务器上的CPU 利用率较高,最终导致资源耗尽,造成拒绝服务。
对于漏洞原理,简而言之,就是HTTP/2
协议有一个bug,它使得用户单方面可以取消通信(耗时短),而服务器需要耗时来处理该响应(耗时长),从而导致拒绝服务,可参考如下文章。
配置环境:Ubuntu20.04两台
被攻击主机:victim
攻击主机:jfkk
python3.8、python3.10、python3.11都可
Ubuntu20.04安装教程:https://blog.csdn.net/fr16021028/article/details/125888815
在被攻击主机(victim
)上安装apache2服务,以模拟http/2
服务,命令如下
sudo apt update
sudo apt install apache2
示意图如下
安装成功以后,可以通过浏览器访问127.0.0.1
,可以看到,是安装成功的。
使用service apache2 status
命令也可以看到是成功的,如下所示。
使用curl
命令可以查看协议(默认是80端口)
curl -I -k -s --http2 localhost
由上可以看到,刚安装的apache2是没有http/2模块的,需要手动安装,命令如下
sudo a2enmod http2
systemctl restart apache2
操作示意图如下所示
当使用浏览器访问443端口时,可以看到,是失败的,这是因为要为apache2配置一些ssl等东西。
开启SSL https 443比较麻烦,ssl配置不好搞,可以参考这个文章Linux Apache2如何开启SSL https 443,下面提供比较简单的命令,执行即可。
sudo a2enmod ssl
sudo a2ensite default-ssl
sudo systemctl restart apache2
用https再次访问(https://127.0.0.1/
),发现是可以访问的,如下所示。
以上就是配置的环境,攻击主机可以在宿主机上进行,也可以在虚拟机中进行,只要能ping通就行。
想要实现精确的攻击,可以查看该github:https://github.com/secengjeff/rapidresetclient,该工具需要安装go环境,比较麻烦,不再赘述,想要尝试,可以参考文献引用部分的第一条。
该漏洞github上的脚本有很多,这边挑一个简单的就行,下载攻击脚本(在攻击主机(jfkk
)上下载),命令如下。
git clone https://github.com/imabee101/CVE-2023-44487.git
查看一下被攻击主机(victim
)的IP:192.168.70.169
然后修改CVE-2023-44487
目录下的main.py
文件,将url
改为被攻击主机的ip192.168.70.169
。
在**攻击主机(jfkk)**上执行main.py
需要安装依赖库
pip install hyper
DDoS
攻击成功的表现如下:
**请求超时:**客户端在等待服务器响应时超时。
**服务不可用:**浏览器或客户端收到服务器错误(如502 Bad Gateway,503 Service Unavailable等)。
**高负载:**系统监控工具(如
top
,htop
)显示CPU使用率达到100%,内存和交换空间被完全使用。**系统响应缓慢或无响应:**服务器上的其他操作(如登录,命令执行)变得非常缓慢或无法完成。
其实本文的复现应该称为
DoS
攻击,因为DDOS
攻击的实施更为复杂,需要控制大量的计算资源和僵尸网络。
执行main.py
,并使用htop
命令(这个命令没有安装可以apt安装一下)在虚拟机(victim
)中观察,下面是没有进行攻击时的CPU使用情况,可以看到,CPU利用率很少,其中图上的1
和2
表示CPU的序号,其下面为内存Mem
和交换区Swp
。
如果虚拟机的CPU越多,那么服务器处理消息的能力就越强,那么DoS的效果就越差,所以为了尽可能的展现出攻击的效果,必须使得服务器端的CPU核数越少越好,客户端的CPU核数越多越好。
sudo apt update
sudo apt install htop
开启攻击脚本之后,可以看到,CPU使用率迅速上涨,攻击成功,如下图所示。
至于为什么有这么多apache的进程,这是因为apache使用多个进程或线程来处理并发的客户端请求。这样做主要是为了提高性能、扩展性和可靠性,能够处理大量并发请求和高负载。(我的猜测)
当然,在运行脚本时可能会遇到一下情况,[Errno 24] Too many open files
。
too many open files(打开的文件过多)是Linux系统中常见的错误,从字面意思上看就是说程序打开的文件数过多,不过这里的files不单是文件的意思,也包括打开的通讯连接(比如socket),正在监听的端口等等,所以有时候也可以叫做句柄(handle),这个错误通常也可以叫做句柄数超出系统限制,使用如下命令查看当前系统设置的最大句柄数是多少。
ulimit -a
可以看到,最大打开数量是1024
提高一下最大打开数量,再次运行脚本即可
ulimit -n 8912
在安装过程中,有些python包之间可能会冲突,如下图所示
因此可以使用虚拟环境,每个虚拟环境都有自己独立的 Python 解释器和依赖包。这样,不同项目的依赖不会相互冲突,安装过程如下。
(1)安装venv 模块:
sudo apt update
sudo apt install python3-venv
(2)创建虚拟环境:
选择一个目录来创建虚拟环境,并运行以下命令:
python3 -m venv myenv
上述命令将在当前目录下创建一个名为myenv
的虚拟环境,可以根据需要更改虚拟环境的名称。
(3)激活虚拟环境:
要激活刚创建的虚拟环境,运行以下命令:
source myenv/bin/activate
激活后,命令提示符会发生变化,显示虚拟环境的名称,类似于这样:
(myenv) user@hostname:~/path/to/your/project$
(4)安装依赖包:
在激活的虚拟环境中,你可以使用pip
来安装所需的Python
包。例如,安装hyper
包:
pip install hyper
(5)停用虚拟环境:
完成工作后,可以通过以下命令停用虚拟环境:
deactivate
https://www.youtube.com/watch?v=zvNnqblGGs0&pp=ygUOY3ZlLTIwMjMtNDQ0ODc%3D
https://www.youtube.com/watch?v=XD_PONWpdmw&pp=ygUOY3ZlLTIwMjMtNDQ0ODc%3D
https://github.com/bcdannyboy/CVE-2023-44487
https://github.com/imabee101/CVE-2023-44487
5.https://blog.csdn.net/Roy_70/article/details/78423880
https://stack.chaitin.com/techblog/detail/164