Remote Code Execution через SQL инъекцию в Zabbix (CVE-2024-42327)

от автора

Введение

Zabbix — это система мониторинга, предназначенная для отслеживания состояния ИТ-инфраструктуры, серверов, сетевых устройств, приложений и сервисов в реальном времени.

Для чего нужен:

  • Мониторинг ресурсов: CPU, память, диски, сетевые интерфейсы.

  • Слежение за доступностью: Проверка работы сайтов, приложений, баз данных.

  • Уведомления: Настройка алертов (e-mail, Telegram, SMS) при сбоях или достижении критических значений.

  • Сбор метрик: Анализ производительности и прогнозирование проблем.

  • Автоматизация задач: Выполнение удалённых команд на серверах.

Zabbix полезен для обеспечения стабильной работы инфраструктуры и быстрого реагирования на проблемы.

Данная статья представлена исключительно в образовательных целях. Red Team сообщество «GISCYBERTEAM» не несёт ответственности за любые последствия ее использования третьими лицами.

Об уязвимости

27 ноября 2024 года была выявлена критическая уязвимость в Zabbix с CVSS-оценкой 9.9, представляющая собой SQL-инъекцию в одном из эндпоинтов API Zabbix. Уязвимость позволяет атакующему, имеющему доступ к API, выполнить произвольные SQL-запросы. При определённых настройках Zabbix, которые разрешают удалённое выполнение команд через агентов, эта уязвимость может быть использована для полной компрометации инфраструктуры, находящейся под мониторингом Zabbix.

Уязвимости подвержены следующие версии Zabbix Frontend:

6.0.0 - 6.0.31 / 6.0.32rc1 6.4.0 - 6.4.16 / 6.4.17rc1 7.0.0 / 7.0.1rc1

SQL-инъекция — это тип уязвимости в приложениях, при которой злоумышленник может вставить вредоносные SQL-запросы в строку запроса к базе данных. Это может позволить ему получить несанкционированный доступ к данным, изменить их, удалить или выполнить другие вредоносные операции, такие как обход аутентификации или управление системой. SQL-инъекции часто возникают из-за недостаточной валидации входных данных.

Подготовка тестового окружения

Для развертывания стенда будет использована виртуальная машина с операционной системой Debian, на которой Zabbix версии 6.0.30 будет развернут в Docker контейнере. Установка будет производиться с использованием следующих команд:

sudo apt install docker.io docker-compose # установка Docker и docker-compose nano docker-compose.yaml

После выполнения этих команд откроется текстовый редактор с файлом docker-compose.yaml, в который необходимо внести следующее содержимое:

version: '3.5'  services:   zabbix-db:     image: mysql:8.0-oracle     container_name: zabbix-db     environment:       MYSQL_DATABASE: zabbix       MYSQL_USER: zabbix       MYSQL_PASSWORD: zabbix_password       MYSQL_ROOT_PASSWORD: root_password     volumes:       - zabbix-db-data:/var/lib/mysql     restart: unless-stopped    zabbix-server:     image: zabbix/zabbix-server-mysql:ubuntu-6.0.30     container_name: zabbix-server     environment:       DB_SERVER_HOST: zabbix-db       MYSQL_DATABASE: zabbix       MYSQL_USER: zabbix       MYSQL_PASSWORD: zabbix_password     depends_on:       - zabbix-db     ports:       - "10051:10051"     restart: unless-stopped    zabbix-web:     image: zabbix/zabbix-web-nginx-mysql:ubuntu-6.0.30     container_name: zabbix-web     environment:       DB_SERVER_HOST: zabbix-db       MYSQL_DATABASE: zabbix       MYSQL_USER: zabbix       MYSQL_PASSWORD: zabbix_password       PHP_TZ: Europe/Moscow     depends_on:       - zabbix-server     ports:       - "8080:8080"     restart: unless-stopped    zabbix-agent:     image: zabbix/zabbix-agent:ubuntu-6.0.30     container_name: zabbix-agent     environment:       ZBX_SERVER_HOST: zabbix-server     depends_on:       - zabbix-server     restart: unless-stopped  volumes:   zabbix-db-data:

Теперь для запуска Zabbix достаточно выполнить команду из каталога, содержащего файл docker-compose.yaml:

sudo docker-compose up -d

Веб-интерфейс Zabbix стал доступен по адресу: http://127.0.0.1:8080:

Также обратите внимание, что Zabbix можно установить с помощью официальных Docker контейнеров. Они доступны для скачивания на GitHub.

Подготовка условий для эксплуатации уязвимости

Для эксплуатации уязвимости необходим пользовательский аккаунт с доступом к API. Для демонстрации создадим аккаунт с минимальными правами, но доступом к API. Создать пользователя можно в разделе Administration -> Users:

Стандартные админские учётные данные Zabbix:

Логин: Admin

Пароль: zabbix

Создадим учетную запись giscyber и назначим специальную роль для этой учетной записи в разделе Administration -> User roles. Роль будет настроена с минимальными привилегиями и доступом к API:

Для получения токена сессии отправьте POST запрос с логином и паролем пользователя к API Zabbix:

Получив сессионный ключ, можно приступить к эксплуатации уязвимости.

Эксплуатация уязвимости

Эндпоинт users.get, доступный любому пользователю Zabbix с доступом к API, уязвим к Time-based Blind SQL injection. Для проверки уязвимости можно отправить следующий запрос на /api_jsonrpc.php:

{   "jsonrpc": "2.0",   "method": "user.get",   "params": {     "selectRole": [       "roleid",       "name",       "type",       "readonly AND (SELECT(SLEEP(5)))"     ],     "userids": [       "1",       "2"     ]   },   "id": 1,   "auth": "**ЗДЕСЬ ИСПОЛЬЗУЕТСЯ ПОЛУЧЕННЫЙ РАНЕЕ СЕССИОННЫЙ КЛЮЧ**" }

SQL инъекция — это атака, при которой злоумышленник вводит вредоносный SQL код в приложение для доступа или изменения данных в базе данных.

Time-based SQL инъекция — это тип атаки, при котором злоумышленник использует функцию паузы в SQL запросе, чтобы проверить наличие определенных условий путем измерения времени ответа сервера.

Как видно, в данном запросе используется встроенная в MySQL функция SLEEP(), которая вызывает паузу на заданное внутри скобок количество секунд. Отправив запрос, можно убедиться, что ответ сервера занимает ровно 5 секунд, что подтверждает уязвимость к Time-based blind SQL injection:

Для демонстрации возможной пользы уязвимости воспользуемся следующей нагрузкой, чтобы извлечь название базы данных, с которой работает Zabbix.

AND (SELECT SLEEP(5) FROM DUAL WHERE DATABASE() LIKE '_')

Для начала необходимо выяснить сколько символов в названии базы данных, для этого добавляем символ «_» в нагрузку пока приложение не ответит с задержкой >= 5 секундам. Для тестовой конфигурации нагрузка отработала при 6 символах «_», значит имя базы данных содержит ровно 6 символов:

Выделим 1-й символ «_» и отправим его в Intruder Burp Suite, затем выберем режим Brute forcer для перебора первого символа имени базы данных:

Сортируем по времени ответы сервера и узнаём, что первая буква в имени базы данных — «z»:

Проделав такие манипуляции для всех символов, выясняем что имя БД — «zabbix»:

Заключение

С помощью Time-based SQL инъекции злоумышленник может получить доступ к более привилегированным учетным записям Zabbix, что создает угрозу компрометации всей инфраструктуры, находящейся под наблюдением агентов Zabbix. Это делает уязвимость особенно серьезной, что подтверждается высоким рейтингом CVSS. В связи с этим крайне рекомендуется устанавливать самые последние версии программного обеспечения, в которых выпущены соответствующие патчи для устранения данной уязвимости.

Подписывайтесь на наш Telegram-канал https://t.me/giscyberteam


ссылка на оригинал статьи https://habr.com/ru/articles/865828/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *