В этой статье мы расскажем, как мы обнаружили уязвимость VMware vSphere client RCE, расскажем о технических деталях и объясним, как ее можно использовать на различных платформах. Что такое VMware vCenter / vSphere? vSphere и vCenter позволяют виртуализировать корпоративную инфраструктуру и обеспечивают средства контроля над ней. Хотя это программное обеспечение можно встретить по периметру, в большинстве случаев оно находится во внутренних сетях. В этой статье мы проанализируем несанкционированный RCE в VMware vCenter.
Поскольку PoC для VMware vCenter RCE (CVE-2021-21972) теперь легко доступен, мы публикуем нашу статью, охватывающую все технические детали. Осенью 2020 года мы обнаружили пару уязвимостей в клиентском компоненте vSphere в VMware vCenter. Эти уязвимости позволяли мошенническим клиентам выполнять произвольные команды и отправлять запросы от имени целевого сервера с использованием различных протоколов:
- Несанкционированная загрузка файла, ведущая к удаленному выполнению кода (RCE) (CVE-2021-21972)
- Уязвимости несанкционированной подделки запросов на стороне сервера (SSRF) (CVE-2021-21973)
Что такое VMware vCenter / vSphere?
vSphere и vCenter обеспечивают виртуализацию и контроль корпоративной инфраструктуры. Хотя это программное обеспечение можно найти по периметру, в основном оно находится во внутренних сетях.
Обнаружение уязвимости
При обзоре vSphere Client я, как обычно, использовал подходы к тестированию «черный ящик» и «белый ящик», уделяя особое внимание уязвимостям, которые могут быть использованы без авторизации. На веб-панели я попытался отправить как можно больше разных запросов, и все без заголовков файлов cookie.
После отправки несанкционированного запроса на / ui / vropspluginui / rest / services / * я обнаружил, что на самом деле он не требует никакой аутентификации.
URL доступен без авторизации
Для некоторых функций веб-приложение использует плагины, обычно расположенные в отдельных файлах .jar. Например, плагин vropspluginui реализован в файле vropsplugin-service.jar.
Насколько я понимаю, каждый плагин должен указывать, какие из его конечных точек требуют авторизации веб-панели для запуска, а какие нет. Этот плагин был настроен так, чтобы неавторизованные пользователи могли получать доступ к любому URL-адресу, который он обрабатывает.
Функция uploadOvaFile, отвечающая за URL / ui / vropspluginui / rest / services / uploadova, вызвала у меня интерес.
Уязвимая часть кода
- Получен запрос POST с параметром uploadFile.
- Прочтите и запишите содержимое этого параметра в переменную
inputStream.
- Открыл полученные данные в виде архива
.tar.
- Получены все записи из архива (не из каталога).
- При итерации по всем записям на диске была создана копия каждой текущей записи с использованием соглашения об именах файлов:
/ tmp / unicorn_ova_dir + entry_name.
Здесь я заметил, что имена записей .tar не фильтруются. Они просто объединены строкой «/ tmp / unicorn_ova_dir»; в полученном месте создается файл. Это означало, что мы могли создать запись в архиве, содержащую строку «../», которая позволила бы нам загрузить любой файл в любой каталог на сервере.
Чтобы создать архив .tar, использующий эту причуду, я использовал утилиту evilarc. Это был второй раз, когда это пригодилось.
python evilarc.py -d 2 -p 'testFolder\' -o win -f winexpl.tar testUpload.txt
.. \ .. \ testFolder \ testUpload.txt.
Я загрузил его по URL-адресу / ui / vropspluginui / rest / services / uploadova и проверил файловую систему сервера на наличие папки testFolder
и ее вложенного файла в корневом каталоге C: \.
POST/ui/vropspluginui/rest/services/uploadova HTTP/1.1
Host: vSphereClient.local
Connection: close
Accept: application/json
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryH8GoragzRFVTw1VD
Content-Length: 10425
------WebKitFormBoundaryH8GoragzRFVTw1VD
Content-Disposition: form-data; name="uploadFile"; filename="a.ova"
Content-Type: text/plain
{craftedArchive}
------WebKitFormBoundaryH8GoragzRFVTw1VD--
Мой файл .txt
был успешно загружен и теперь доступен по адресу C: \ testFolder \ testUpload.txt.
Получение RCE в Windows
Чтобы иметь возможность выполнять произвольные команды в целевой системе, нам необходимо загрузить оболочку .jsp,
которая будет доступна без авторизации. Чтобы найти такое место:
- Найдите доступные для записи пути на диске, где могут быть созданы файлы с ранее описанной уязвимостью.
- Сопоставьте найденные пути к файлам со структурой папок доступных корневых веб-сайтов, способных запускать сценарии
.jsp
и не требующих авторизации.
Во-первых, давайте проверим, какие разрешения получают наши загруженные файлы, загрузив файл testUpload.txt
и просмотрев меню его свойств. Мы видим, что он принадлежит пользователю vsphere-ui.
C: \ ProgramData \ VMware \ vCenterServer \ data \ perfcharts \ tc-instance \ webapps \ statsreport \
(в котором присутствуют файлы .jsp
).jsp
-скриптам дает успех. Давайте проверим, есть ли у vsphere-ui права на запись в этот каталог..jsp
для выполнения команд в системе. Давайте создадим архив, содержащий созданную нами полезную нагрузку оболочки .jsp, и отправим ее по URL-адресу, который мы изучаем.python evilarc.py -d 5 -p 'ProgramData\VMware\vCenterServer\data\perfcharts\tc-instance\webapps\statsreport' -o win -f winexpl.tar testRCE.jsp
jsp
загружен на сервер, что дает нам возможность выполнять произвольные команды в системе с привилегиями NT AUTHORITY \ SYSTEM.
Получение RCE в Linux
Для экземпляров Linux все немного иначе. Но они тоже уязвимы и позволяют внешним пользователям загружать произвольные файлы.
В Linux мне не удалось найти каталог, который позволял бы одновременно загружать и запускать оболочки .jsp.
Вместо этого существует другой метод выполнения команд на сервере.
Мы знаем, что можем загружать произвольные файлы с правами пользователя vsphere-ui. Что, если мы загрузим открытый ключ в домашний каталог этого пользователя и попробуем подключиться к серверу через SSH, используя закрытый ключ?
nmap -p 22 vSphereLinux.local
ssh-keygen -t rsa
.tar
с сгенерированным открытым ключом:python evilarc.py -d 5 -p 'home/vsphere-ui/.ssh' -o unix -f linexpl.tar authorized_keys
ssh -i /path/to/id_rsa vsphere-ui@vSphereLinux.local
Заключение
В этой статье я продемонстрировал метод достижения RCE в VMware vSphere Client в качестве пользователя, не прошедшего проверку подлинности. Помимо получения доступа к командной строке, злоумышленник может выполнять другие вредоносные действия из-за отсутствия аутентификации в плагине vropspluginui. Настоятельно рекомендуется обновить VMware vSphere Client до последней версии. Пожалуйста, смотрите iVMSA-2021-0002 для получения дополнительной информации.