В этой статье мы поговорим о некоторых атаках на систему мониторинга Zabbix и рассмотрим сценарии удаленного выполнения кода (RCE).
Zabbix- это свободная система мониторинга и отслеживания статусов разнообразных сервисов, серверов и сетевого оборудования. Рассказывать про всю функциональность Zabbix’а не имеет смысла, отметим лишь то, что есть серверная часть, которая собирает, обрабатывает и хранит данные, и агенты, которые располагаются на устройствах, с которых эти данные собираются.
Нередко на пентестах встречаются устаревшие версии 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 определены глобальные скрипты, которые мы можем изменить или создать новые. Например, мы можем пропинговать или выполнить трассировку хостов.
Чтобы создать новый скрипт нажимаем Create script. В поле Commands прописываем команды, которые хотим исполнить, например, hostname и id. Выбираем, где мы хотим исполнять скрипт: на агенте или сервере. Сохраняем.
Для того, чтобы выполнить скрипт, заходим в раздел Monitoring → Latest data. Выбираем нужный хост и название созданного скрипта, далее в окне отобразится вывод команд.
2. Выполнение команд через Items
Данный способ будет полезен в случае, если вы получили учетную запись с привилегиями Admin (стоит уточнить, что при получении УЗ Super Admin все перечисленные сценарии RCE будут работать, так как этот тип УЗ имеет максимальные привилегии). У такой учетной записи будет ограниченный доступ к панели администратора.
В таких условиях также можно будет выполнить команды на агентах, для этого переходим в раздел Configuration → Hosts → Items → Create Item
В поле Key указываем команду через ключ system.run. Сохраняем и команда автоматически будет выполнена на агенте.
Сохраняем и проверяем подключение в nc.
3. Выполнение команд через Actions
Данный способ также будет работать, если вы получили учетную запись с привилегиями Admin. В Zabbix есть функциональность с помощью которой можно выполнять команды в результате каких-либо событий. Чтобы создать событие, заходим в раздел Configuration→Actions→Event source→Discovery→Create action.
Задаем имя, выбираем тип операции Remote command, в поле Commands вводим полезную нагрузку, в поле Execute on указываем каким способом этот скрипт будет выполняться (Zabbix агентом, Zabbix сервером (прокси) или только Zabbix сервером).
Сохраняем и проверяем nc.
4. Выполнение команд через jsonRPC
В старых версиях Zabbix’а (версии 2.2<3.03) уязвимо API, с помощью которого можно взаимодействовать с сервером и агентами через json-RPC. На гитхабе присутствует множество эксплойтов, для успешной эксплуатации нам необходимо знать учетные данные администратора Zabbix и hostId.
Чтобы определить hostId, необходимо зайти в Configuration → Hosts → Items и в GET-параметре увидим его значение.
Указываем в эксплойте недостающие учетные данные и получаем RCE.
Заключение
Полученный низкопривилегированный доступ к системе может быть использован для дальнейшего продвижения по сети. На Windows системах Zabbix-агенты запущены с правами NT AUTHORITY\SYSTEM, что позволяет сразу получить высокие привилегии.
При написании данной статьи я сталкивался с описаниями различных кейсов компрометации внутренней информационной инфраструктуры с помощью Zabbix. В одной статье был описан случай, когда Zabbix-агент был установлен на контроллере домена, а панель администратора Zabbix была доступна с паролем по умолчанию. Вот, что значит получить доменного админа за пару минут ?.
На сегодня это все, в конце хотелось бы напомнить, что необходимо вовремя обновлять ПО и менять пароли, установленные по умолчанию, а также не использовать словарные пароли.