
Отчёт об исследовании в изолированной лабораторной среде для VMware vCenter Server CVE-2021-21972, охватывающий путь от неаутентифицированной произвольной загрузки файлов до RCE, обнаружение с помощью Nmap, цепочку эксплуатации и меры защиты.
Автор: Niranjan Pokhrel
Независимый исследовательский проект, воспроизводящий и документирующий критическую, публично раскрытую уязвимость VMware vCenter Server в изолированной домашней лаборатории, с целью понять класс уязвимости, путь эксплуатации и защитные меры.
| CVE | CVE-2021-21972 |
| Базовый балл CVSSv3 | 9.8 (Критический) |
| Рекомендации вендора | VMSA-2021-0002 |
| Затронутый продукт | VMware vCenter Server 6.5 / 6.7 / 7.0 |
| Класс уязвимости | Неаутентифицированная произвольная загрузка файлов → удалённое выполнение кода |
| Статус | Исправлено VMware (ноябрь 2020 — февраль 2021). В лаборатории использовались намеренно устаревшие, изолированные версии только в исследовательских целях. |
vCenter Server — это центральная панель управления виртуализированной инфраструктурой VMware — компрометация этой системы может означать компрометацию всего виртуального центра обработки данных. Эта уязвимость является классическим примером того, как отсутствие проверки аутентификации на одной конечной точке плагина может перерасти в полный захват хоста. Я создал эту лабораторию, чтобы перейти от чтения рекомендаций CVE к фактическому пониманию поверхности атаки, цепочки эксплуатации и — что не менее важно — того, как этого следовало избежать и как обнаруживать это с точки зрения защиты.
Уязвимость находится в vSphere Client (HTML5), а именно в плагине vCenter Server,
который предоставляет конечную точку загрузки файлов (/ui/vropspluginui/rest/services/uploadova) без
требования аутентификации. Злоумышленник с сетевым доступом к порту 443 может отправить специально
сформированный POST-запрос на эту конечную точку и загрузить произвольные файлы — включая веб-шелл — в
доступный через веб каталог на базовой ОС. Это даёт злоумышленнику выполнение кода с
привилегиями службы vCenter, что фактически означает полный контроль над устройством.
На высоком уровне цепочка атаки выглядит следующим образом:
Полностью построена в изолированной, не имеющей выхода в интернет виртуальной сети без производственных данных:
(Конкретные IP-адреса, учётные данные и детали инфраструктуры из исходной сборки намеренно опущены в этом публичном описании.)
Наличие уязвимости может быть подтверждено с защитной точки зрения (т.е. синей командой или аудитором) путём проверки того, отвечает ли конечная точка загрузки цели способом, соответствующим неисправленной уязвимости — это тот же тип проверки, который сканер уязвимостей или внутренняя команда безопасности запустила бы для выявления открытых, неисправленных экземпляров vCenter в своей сети до того, как это сделает злоумышленник.
Публичный скрипт обнаружения Nmap NSE для этого CVE доступен в нескольких репозиториях безопасности с открытым исходным кодом; он не воспроизводится здесь, в соответствии с фокусом этого README на документации, а не на распространении готовых к использованию инструментов сканирования/эксплуатации. В лаборатории уязвимая цель была помечена как VULNERABLE (Exploitable) в выводе сканирования, что является сигналом для приоритетного применения исправлений.
Рабочий proof-of-concept эксплойт для этого CVE доступен публично с 2021 года, после его обнаружения Михаилом Ключниковым из Positive Technologies; в интересах нераспространения готового к запуску RCE-пейлоада из этого профиля я не воспроизвожу код эксплойта здесь — фокус этого описания на понимании, а не на инструментарии. Вкратце, публичный эксплойт автоматизирует шаги 2–3 выше: он упаковывает JSP-веб-шелл в ожидаемый формат загрузки, отправляет его POST-запросом на уязвимую конечную точку, подтверждает, что он попал в доступный через веб путь, а затем использует его для запуска обратной оболочки к атакующему.
Этот проект был проведён в полностью изолированной, непроизводственной лабораторной среде в образовательных целях и для профессионального развития. Никакие несанкционированные системы не были затронуты.