Zabbix是一个开源的监控解决方案,用于监控网络和应用程序的性能和健康状况。它能够监控IT基础设施,包括服务器、虚拟机、网络设备、Web应用程序等。
Zabbix 服务器可以对配置的脚本执行命令。执行命令后,审计条目将添加到“审计日志”中。由于“clientip”字段未经过清理,因此可以将 SQL 注入“clientip”并利用基于时间的盲 SQL 注入。此漏洞可能导致权限从用户提升到管理员。在某些情况下,SQL 注入会导致 RCE。
6.0.0 <= Zabbix <= 6.0.27
6.4.0 <= Zabbix <= 6.4.12
7.0.0alpha1 <= Zabbix <= 7.0.0beta1
参考https://support.zabbix.com/browse/ZBX-24505,漏洞的利用过程大概是先登录一个普通权限的账户,通过登录的账户提取其sessionID和任意一个主机ID。然后利用这两个值去注入,提取管理员session_id和session_key来对zbx_session进行签名,这些数据可以一起用于生成正确的管理员zbx_session。
从互联网上的信息可以知道,漏洞位置在zbx_auditlog_global_script
函数中。我们VS
编辑器打开源码(源码从zabbix github处下载)。
全局搜索函数,在zudit.c
中找到函数定义
在函数的223行处执行了sql语句,期间也没有对传入的参数进行过滤。那么这些参数从那里来?
往前跟,只在nodecommand.c
文件中的execute_script
函数中进行了调用。
这些参数同样是从其他调用传进来,继续往前跟
最终跟踪到服务端入口处。该函数处理从前端收到的命令
现在找到了数据的入口,接下来就是分析数据的格式。有两种方法,一种是直接从web端查看,另一种就是跟踪处理数据的过程,一点点反推。
很显然前者更方便一些,这时候又涉及到怎么在web端找到对应得数据封包格式得问题。最简单得方法就是关键字搜索,先试一下吧,从前边的参数中选择了一个clientip
只搜到了一个结果,点进去后看到函数名也一样,那么基本就可以确定了。
跟进request
函数看一下。先用json编码,然后封包ZBX_TCP_HEADER
头,然后发送给后端。
头定义如下
define('ZBX_TCP_HEADER_DATA', "ZBXD");
define('ZBX_TCP_HEADER_VERSION', "\1");
define('ZBX_TCP_HEADER', ZBX_TCP_HEADER_DATA.ZBX_TCP_HEADER_VERSION);
define('ZBX_TCP_HEADER_LEN', 5);
define('ZBX_TCP_DATALEN_LEN', 8);
漏洞利用的时候,直接在clientIP
的值中插入sql语句,即可造成sql注入
DBexecute("insert into auditlog (auditid,userid,username,clock,action,ip,resourceid,"
"resourcename,resourcetype,recordsetid,details) values ('%s'," ZBX_FS_UI64 ",'%s',%d,'%d','%s',"
ZBX_FS_UI64 ",'%s',%d,'%s','%s')", auditid_cuid, userid, username, (int)time(NULL),
AUDIT_ACTION_EXECUTE, clientip, hostid, hostname, AUDIT_RESOURCE_SCRIPT, auditid_cuid,
details_esc)
通过sql注入,可以从数据库获取管理员权限。
应用的权限认证是通过cookie
中的sign
的值
看一下sign
的值怎么来的,先全局搜一下,可以看到是通过CEncryptHelper::sign
函数生成的。
看一下sign,通过一个KEY计算数据的hash。
这个KEY是session key
所以从数据库中获取管理员的session key,就可以以管理员权限登录。
获取管理员权限之后,在管理配置中,有设置脚本的功能,可以执行系统命令
https://www.zabbix.com/download_appliance
直接下载虚拟机压缩包,打开即可
http://<ip>:80/
System:
Zabbix frontend:
Database:
sql注入
命令执行
该漏洞比较鸡肋,因为需要有一个普通用户的权限。然后就是系统对用户输入的参数过滤不严,导致SQL注入。
8 篇文章
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!