В этой статье мы поговорим о некоторых атаках на систему мониторинга 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 была доступна с паролем по умолчанию. Вот, что значит получить доменного админа за пару минут ????.
На сегодня это все, в конце хотелось бы напомнить, что необходимо вовремя обновлять ПО и менять пароли, установленные по умолчанию, а также не использовать словарные пароли.
Комментарии (9)
AlexGluck
22.03.2022 20:05-1Всё начинается с того что у вас есть доступ в заббикс, потом повышение привелегий, потом в некоторых случаях особые настройки агентов... Понятно, значит верно защищали до этой статьи мониторинг...
unsignedchar
Можно подробнее? Как атакующий может заполучить cookie?
Delyura Автор
При первом обращении, zabbix вам выдаст cookie, этот файл необходимо раздекодить и будет он выглядеть примерно так {"sessionid":"7c818d431e9e64c3569253f412f020bc","sign":"X16y42m2Yy7uDQLyLzHWFBMtlugFMOnHDhqvNc8hhZTQzcGCfHS94uQ3UFUvow+jzUj2fefheryBbwvFJ6zgIg=="}
Дальше уже добавляем атрибут saml_data[username_attribute] в json. В итоге получается
{"saml_data":{"username_attribute":"Admin"},"sessionid":"7c818d431e9e64c3569253f412f020bc","sign":"X16y42m2Yy7uDQLyLzHWFBMtlugFMOnHDhqvNc8hhZTQzcGCfHS94uQ3UFUvow+jzUj2fefheryBbwvFJ6zgIg=="} и декодим обратно в base64.
unsignedchar
Ага, то есть нужно сначала залогиниться, или получить доступ до браузера с активной сессией?
Delyura Автор
Нет, логиниться не надо.
unsignedchar
Как тогда получить cookie?
unsignedchar
"In the case of instances where the SAML SSO authentication is enabled (non-default)"
Можно выдохнуть ;)
Delyura Автор
При первом посещении сайта, приложение вам выдаст гостевую cookie. Зайдите на http://185.15.20.140:8081 (взял рандомный с шодана zabbix), убедитесь, что файл cookie будет выдан.
unsignedchar
Да, спасибо, уже понял. Неприятно, у кого он так настроен.
ЗЫ: нужно обновляться:
Fixed in:
5.4.9rc2 aaad5fefcdb, eea1f70ac66
6.0.0beta2 (master) b0f916a867a, 96e900cf3d3