Несанкционированный RCE в VMware vCenter

Несанкционированный RCE в VMware vCenter

В этой статье мы расскажем, как мы обнаружили уязвимость 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 / * я обнаружил, что на самом деле он не требует никакой аутентификации.

Несанкционированный RCE в VMware vCenter

URL доступен без авторизации

Для некоторых функций веб-приложение использует плагины, обычно расположенные в отдельных файлах .jar. Например, плагин vropspluginui реализован в файле vropsplugin-service.jar.

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

Функция uploadOvaFile, отвечающая за URL / ui / vropspluginui / rest / services / uploadova, вызвала у меня интерес.

Несанкционированный RCE в VMware vCenter

Уязвимая часть кода

 
Обработчик этого пути выполнил следующие действия:
  1. Получен запрос POST с параметром uploadFile.
  2. Прочтите и запишите содержимое этого параметра в переменную inputStream.
  3. Открыл полученные данные в виде архива .tar.
  4. Получены все записи из архива (не из каталога).
  5. При итерации по всем записям на диске была создана копия каждой текущей записи с использованием соглашения об именах файлов: / 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--
Несанкционированный RCE в VMware vCenter

Мой файл .txt был успешно загружен и теперь доступен по адресу C: \ testFolder \ testUpload.txt.

Получение RCE в Windows

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

  • Найдите доступные для записи пути на диске, где могут быть созданы файлы с ранее описанной уязвимостью.
  • Сопоставьте найденные пути к файлам со структурой папок доступных корневых веб-сайтов, способных запускать сценарии .jspи не требующих авторизации.

Во-первых, давайте проверим, какие разрешения получают наши загруженные файлы, загрузив файл testUpload.txt и просмотрев меню его свойств. Мы видим, что он принадлежит пользователю vsphere-ui.

Несанкционированный RCE в VMware vCenter

Свойства загруженного файла
 
В нашем поиске подходящего местоположения перспективным выглядит каталог C: \ ProgramData \ VMware \ vCenterServer \ data \ perfcharts \ tc-instance \ webapps \ statsreport \ (в котором присутствуют файлы .jsp).
 
Несанкционированный RCE в VMware vCenter
 
Скрипт 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, используя закрытый ключ?

Давайте проверим, доступен ли 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
 
 
Создание tar-архива с помощью evilarc
 
Затем мы загружаем файл, используя уязвимость, и пытаемся подключиться к целевому хосту через SSH:
 
ssh -i /path/to/id_rsa vsphere-ui@vSphereLinux.local
 
 
Получение доступа к командной строке
 
У нас есть доступ к серверу с правами пользователя vsphere-ui.
 

Заключение

В этой статье я продемонстрировал метод достижения RCE в VMware vSphere Client в качестве пользователя, не прошедшего проверку подлинности. Помимо получения доступа к командной строке, злоумышленник может выполнять другие вредоносные действия из-за отсутствия аутентификации в плагине vropspluginui. Настоятельно рекомендуется обновить VMware vSphere Client до последней версии. Пожалуйста, смотрите iVMSA-2021-0002 для получения дополнительной информации.

 

 

Click to rate this post!
[Total: 0 Average: 0]

Leave a reply:

Your email address will not be published.