Источник:https://eternalhost.net/wp-content/uploads/2020/02/0-Sistema-Zabbix-.png
Источник:https://eternalhost.net/wp-content/uploads/2020/02/0-Sistema-Zabbix-.png

В этой статье мы поговорим о некоторых атаках на систему мониторинга 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)


  1. unsignedchar
    22.03.2022 15:45

    атакующему достаточно изменить значение поля saml_data[username_attribute] в jwt-токене, который содержится в cookie zabbix_session. В этом поле нужно указать логин администратора

    Можно подробнее? Как атакующий может заполучить cookie?


    1. Delyura Автор
      22.03.2022 18:33
      +1

      При первом обращении, zabbix вам выдаст cookie, этот файл необходимо раздекодить и будет он выглядеть примерно так {"sessionid":"7c818d431e9e64c3569253f412f020bc","sign":"X16y42m2Yy7uDQLyLzHWFBMtlugFMOnHDhqvNc8hhZTQzcGCfHS94uQ3UFUvow+jzUj2fefheryBbwvFJ6zgIg=="}
      Дальше уже добавляем атрибут saml_data[username_attribute] в json. В итоге получается
      {"saml_data":{"username_attribute":"Admin"},"sessionid":"7c818d431e9e64c3569253f412f020bc","sign":"X16y42m2Yy7uDQLyLzHWFBMtlugFMOnHDhqvNc8hhZTQzcGCfHS94uQ3UFUvow+jzUj2fefheryBbwvFJ6zgIg=="} и декодим обратно в base64.


      1. unsignedchar
        22.03.2022 19:38

        Ага, то есть нужно сначала залогиниться, или получить доступ до браузера с активной сессией?


        1. Delyura Автор
          22.03.2022 20:56

          Нет, логиниться не надо.


          1. unsignedchar
            22.03.2022 21:22

            Как тогда получить cookie?


            1. unsignedchar
              22.03.2022 21:56

              "In the case of instances where the SAML SSO authentication is enabled (non-default)"

              Можно выдохнуть ;)


            1. Delyura Автор
              22.03.2022 21:57

              При первом посещении сайта, приложение вам выдаст гостевую cookie. Зайдите на http://185.15.20.140:8081 (взял рандомный с шодана zabbix), убедитесь, что файл cookie будет выдан.


              1. unsignedchar
                22.03.2022 22:00
                +1

                Да, спасибо, уже понял. Неприятно, у кого он так настроен.

                ЗЫ: нужно обновляться:

                Fixed in:


  1. AlexGluck
    22.03.2022 20:05
    -1

    Всё начинается с того что у вас есть доступ в заббикс, потом повышение привелегий, потом в некоторых случаях особые настройки агентов... Понятно, значит верно защищали до этой статьи мониторинг...