![Источник:https://eternalhost.net/wp-content/uploads/2020/02/0-Sistema-Zabbix-.png Источник:https://eternalhost.net/wp-content/uploads/2020/02/0-Sistema-Zabbix-.png](https://habrastorage.org/getpro/habr/upload_files/468/a25/6e7/468a256e71ebd913fc93352a01eebf2b.webp)
В этой статье мы поговорим о некоторых атаках на систему мониторинга Zabbix и рассмотрим сценарии удаленного выполнения кода (RCE).
Zabbix- это свободная система мониторинга и отслеживания статусов разнообразных сервисов, серверов и сетевого оборудования. Рассказывать про всю функциональность Zabbix’а не имеет смысла, отметим лишь то, что есть серверная часть, которая собирает, обрабатывает и хранит данные, и агенты, которые располагаются на устройствах, с которых эти данные собираются.
![](https://habrastorage.org/getpro/habr/upload_files/cb6/59a/9f9/cb659a9f98046fc50176cea2c6f744bd.png)
Нередко на пентестах встречаются устаревшие версии Zabbix, или Zabbix с дефолтными или словарными паролями администраторов (а иногда и все вместе). В таких случаях Zabbix становится легкой добычей для пентестера.
Стоит отметить и новую уязвимость CVE-2022-23131, которая позволяет обойти аутентификацию, если используется SAML SSO. Уязвимость заключается в том, что в некоторых классах не вызывается метод проверки подписи CEncryptedCookieSession::checkSign(), в частности в классе CCookieSession, который отвечает за обработку файлов Cookie. Из-за этого значение cookie не верифицируется на сервере, а так как клиент может модифицировать cookie, то атакующий может спокойно его поменять. Это приводит к возможности обхода аутентификации, так как атакующему достаточно изменить значение поля saml_data[username_attribute] в Cookie-файле zabbix_session. В этом поле нужно указать логин администратора, от имени которого нужно авторизоваться.
Часть кода ui/index_sso.php, в котором отсутствует верификация cookie.
if (CSessionHelper::has('saml_data')) {
$saml_data = CSessionHelper::get('saml_data');
CWebUser::$data = API::getApiService('user')->loginByUsername($saml_data['username_attribute'],
(CAuthenticationHelper::get(CAuthenticationHelper::SAML_CASE_SENSITIVE) == ZBX_AUTH_CASE_SENSITIVE),
CAuthenticationHelper::get(CAuthenticationHelper::AUTHENTICATION_TYPE)
);
Так как в классе CCookieSession не вызывается метод проверки подписи, то мы успешно пройдем аутентификацию и получим доступ к панели администратора.
Предположим, что нам удалось каким-либо образом получить доступ к панели администратора Zabbix. Для того, чтобы выполнять системные команды на сервере и агентах, достаточно заглянуть в документацию, так как возможность выполнения команд на сервере и агентах заложена разработчиками в продукт. Разберем несколько кейсов с помощью которых можно выполнить системные команды. Отметим, что команды можно исполнять на агентах, только если установлен флаг EnableRemoteCommands=1 в файле /etc/zabbix/zabbix_agentd.conf. По умолчанию выставлено значение EnableRemoteCommands=0.
1. Выполнение команд через scripts
Для выполнения команд вам необходима учетная запись с ролью Super Admin. В документации сказано, что в разделе Administration → Scripts определены глобальные скрипты, которые мы можем изменить или создать новые. Например, мы можем пропинговать или выполнить трассировку хостов.
![](https://habrastorage.org/getpro/habr/upload_files/23c/bc2/3f5/23cbc23f5b13f936c3c69b04f8d28b0a.png)
Чтобы создать новый скрипт нажимаем Create script. В поле Commands прописываем команды, которые хотим исполнить, например, hostname и id. Выбираем, где мы хотим исполнять скрипт: на агенте или сервере. Сохраняем.
![](https://habrastorage.org/getpro/habr/upload_files/926/ee9/f0a/926ee9f0a5588d6c6ff01b4f9969f8ee.png)
Для того, чтобы выполнить скрипт, заходим в раздел Monitoring → Latest data. Выбираем нужный хост и название созданного скрипта, далее в окне отобразится вывод команд.
![](https://habrastorage.org/getpro/habr/upload_files/a50/7bc/ed6/a507bced6580db0b4ad91b935d0c2fdd.png)
![](https://habrastorage.org/getpro/habr/upload_files/b79/e2a/ae6/b79e2aae65e3c279ffa689588565016e.png)
2. Выполнение команд через Items
Данный способ будет полезен в случае, если вы получили учетную запись с привилегиями Admin (стоит уточнить, что при получении УЗ Super Admin все перечисленные сценарии RCE будут работать, так как этот тип УЗ имеет максимальные привилегии). У такой учетной записи будет ограниченный доступ к панели администратора.
![](https://habrastorage.org/getpro/habr/upload_files/3a6/892/e7d/3a6892e7d631be1bd5f9765ea6b621a3.png)
В таких условиях также можно будет выполнить команды на агентах, для этого переходим в раздел Configuration → Hosts → Items → Create Item
![](https://habrastorage.org/getpro/habr/upload_files/f29/cbc/740/f29cbc7403f6bbe6b2c744bd9bcb21d9.png)
В поле Key указываем команду через ключ system.run. Сохраняем и команда автоматически будет выполнена на агенте.
![](https://habrastorage.org/getpro/habr/upload_files/592/71e/d54/59271ed5449bb31a05dec46d2ca78bf7.png)
Сохраняем и проверяем подключение в nc.
![](https://habrastorage.org/getpro/habr/upload_files/1be/647/aa3/1be647aa356d510f4a86606f6fcf48d3.png)
3. Выполнение команд через Actions
Данный способ также будет работать, если вы получили учетную запись с привилегиями Admin. В Zabbix есть функциональность с помощью которой можно выполнять команды в результате каких-либо событий. Чтобы создать событие, заходим в раздел Configuration→Actions→Event source→Discovery→Create action.
![](https://habrastorage.org/getpro/habr/upload_files/319/8ef/64b/3198ef64b48db6d0c823b7d8d607f37a.png)
Задаем имя, выбираем тип операции Remote command, в поле Commands вводим полезную нагрузку, в поле Execute on указываем каким способом этот скрипт будет выполняться (Zabbix агентом, Zabbix сервером (прокси) или только Zabbix сервером).
![](https://habrastorage.org/getpro/habr/upload_files/9e1/f42/595/9e1f42595c79dfa1f598eb2f59ca6601.png)
Сохраняем и проверяем nc.
![](https://habrastorage.org/getpro/habr/upload_files/ca4/784/2ad/ca47842ad04c395c75bc3f8b93544480.png)
4. Выполнение команд через jsonRPC
В старых версиях Zabbix’а (версии 2.2<3.03) уязвимо API, с помощью которого можно взаимодействовать с сервером и агентами через json-RPC. На гитхабе присутствует множество эксплойтов, для успешной эксплуатации нам необходимо знать учетные данные администратора Zabbix и hostId.
Чтобы определить hostId, необходимо зайти в Configuration → Hosts → Items и в GET-параметре увидим его значение.
![](https://habrastorage.org/getpro/habr/upload_files/204/a25/d6a/204a25d6a29caa52efc30f834933989d.png)
Указываем в эксплойте недостающие учетные данные и получаем RCE.
![](https://habrastorage.org/getpro/habr/upload_files/9d6/f78/0c0/9d6f780c04335880268e06193cb44f91.png)
![](https://habrastorage.org/getpro/habr/upload_files/fa0/9e8/872/fa09e8872da4414f51e200bfc33ca75e.png)
Заключение
Полученный низкопривилегированный доступ к системе может быть использован для дальнейшего продвижения по сети. На Windows системах Zabbix-агенты запущены с правами NT AUTHORITY\SYSTEM, что позволяет сразу получить высокие привилегии.
При написании данной статьи я сталкивался с описаниями различных кейсов компрометации внутренней информационной инфраструктуры с помощью Zabbix. В одной статье был описан случай, когда Zabbix-агент был установлен на контроллере домена, а панель администратора Zabbix была доступна с паролем по умолчанию. Вот, что значит получить доменного админа за пару минут ?.
На сегодня это все, в конце хотелось бы напомнить, что необходимо вовремя обновлять ПО и менять пароли, установленные по умолчанию, а также не использовать словарные пароли.