
CVE-2021-21972 – ᴠᴍᴡᴀʀᴇ ᴄʟɪᴇɴᴛ ᴜɴᴀᴜᴛʜᴏʀɪᴢᴇᴅ ᴄᴏᴅᴇ ɪɴᴊᴇᴄᴛɪᴏɴ (ʀᴄᴇ)
[CVE-2021-21972] Upload de Arquivo Não Autorizado do VMware vSphere Client para Execução Remota de Código (RCE)
O vSphere Web Client (HTML5) é essencialmente uma interface administrativa que permite o gerenciamento de uma instalação vSphere. O vSphere Client fornece a um administrador acesso às funções principais do vSphere sem a necessidade de acessar um servidor vSphere diretamente. Ele permite que administradores criem novas máquinas virtuais e gerenciem as existentes e seus recursos. Como uma aplicação web multiplataforma, pode ser usado em todos os sistemas operacionais suportados através das versões suportadas de diferentes navegadores web.
CVE-2021-21972 é uma vulnerabilidade de upload de arquivo não autorizado no vCenter Server que leva à execução remota de código no servidor remoto. O problema decorre da falta de autenticação no vRealize Operations vCenter Plugin. Recebeu uma pontuação crítica de CVSSv3 de 9.8 em 10.0. Um atacante remoto não autenticado poderia explorar esta vulnerabilidade enviando um arquivo especialmente criado para um endpoint vulnerável do vCenter Server que seja publicamente acessível. As versões 6.5, 6.7 e 7.0 do VMware vCenter Server são afetadas por esta vulnerabilidade. A exploração bem-sucedida desta vulnerabilidade resultaria na obtenção de privilégios irrestritos de execução remota de código (RCE) no sistema operacional subjacente do vCenter Server. Apesar do fato de que esta vulnerabilidade decorre do vRealize Operations vCenter Plugin, o aviso da VMware confirma que este plugin está incluído em todas as instalações padrão do vCenter Server. Isso significa que o endpoint vulnerável está disponível independentemente da presença do vRealize Operations.
No blogpost original aqui, a descoberta da vulnerabilidade é explicada da forma mais detalhada possível, bem como dois caminhos separados para alcançar RCE. Para sistemas Windows, um atacante poderia enviar um arquivo .jsp especialmente criado para obter privilégios de NT AUTHORITY\SYSTEM no sistema operacional subjacente. Para sistemas Linux, um atacante precisaria gerar e enviar uma chave pública para o caminho authorized_keys do servidor e depois conectar-se ao servidor vulnerável via SSH para obter privilégios de usuário vsphere-ui. (se o serviço SSH estiver em execução e acessível pela rede)
vropsplugin-service.jar é um arquivo java do plugin vropspluginui e inclui algumas classes e outras funções e métodos relacionados. A parte vulnerável do código é ilustrada abaixo. Este trecho de código pertence ao ServicesController.class no controlador do vropsplugin-service.jar. Como você pode ver no trecho de código abaixo, a função uploadOvaFile é responsável pelo endpoint/URL /ui/vropspluginui/rest/services/uploadova
Caminho completo da classe vulnerável: vropsplugin-service\com\vmware\vropspluginui\mvc\ServicesController.class
@RequestMapping(value = {"/uploadova"}, method = {RequestMethod.POST})
public void uploadOvaFile(@RequestParam(value = "uploadFile", required = true) CommonsMultipartFile uploadFile, HttpServletResponse response) throws Exception {
logger.info("Entering uploadOvaFile api");
int code = uploadFile.isEmpty() ? 400 : 200;
PrintWriter wr = null;
try {
if (code != 200) {
response.sendError(code, "Arguments Missing");
return;
}
wr = response.getWriter();
} catch (IOException e) {
e.printStackTrace();
logger.info("upload Ova Controller Ended With Error");
}
response.setStatus(code);
String returnStatus = "SUCCESS";
if (!uploadFile.isEmpty())
try {
logger.info("Downloading OVA file has been started");
logger.info("Size of the file received : " + uploadFile.getSize());
InputStream inputStream = uploadFile.getInputStream();
File dir = new File("/tmp/unicorn_ova_dir");
if (!dir.exists()) {
dir.mkdirs();
} else {
String[] entries = dir.list();
for (String str : entries) {
File currentFile = new File(dir.getPath(), str);
currentFile.delete();
}
logger.info("Successfully cleaned : /tmp/unicorn_ova_dir");
}
TarArchiveInputStream in = new TarArchiveInputStream(inputStream);
TarArchiveEntry entry = in.getNextTarEntry();
List<String> result = new ArrayList<String>();
while (entry != null) {
if (entry.isDirectory()) {
entry = in.getNextTarEntry();
continue;
}
File curfile = new File("/tmp/unicorn_ova_dir", entry.getName());
File parent = curfile.getParentFile();
if (!parent.exists())
parent.mkdirs();
OutputStream out = new FileOutputStream(curfile);
IOUtils.copy((InputStream)in, out);
out.close();
result.add(entry.getName());
entry = in.getNextTarEntry();
}
in.close();
logger.info("Successfully deployed File at Location :/tmp/unicorn_ova_dir");
} catch (Exception e) {
logger.error("Unable to upload OVA file :" + e);
returnStatus = "FAILED";
}
wr.write(returnStatus);
wr.flush();
wr.close();
}
Na perspectiva de um atacante, o manipulador (handler) para esta classe está realizando as seguintes ações:
uploadFile com requisição do método POST (linha 2)uploadFile e escrevendo o conteúdo deste parâmetro na variável inputStream (linha 22)/tmp/unicorn_ova_dir + entry.getName() (linhas 42 e 47)Prova de Conceito: Para explorar esta vulnerabilidade, você pode usar os seguintes passos
../..//statsreport/uploadedFileName.jspPara verificar a vulnerabilidade, você pode usar a seguinte requisição
GET /ui/vropspluginui/rest/services/getstatus HTTP/1.1
Host: vulnerablehost
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36
Connection: close
Se a resposta da requisição acima for semelhante às respostas abaixo, significa que o host remoto é vulnerável ao CVE-2021-21972
HTTP/1.1 200
Strict-Transport-Security: max-age=30758400;includeSubDomains
X-XSS-Protection: 1; mode=block
Set-Cookie: VSPHERE-UI-JSESSIONID=35CB9D3F277D6B8413F099F93FB3A5CE; Path=/ui; Secure; HttpOnly
Content-Type: text/plain;charset=ISO-8859-1
Content-Length: 141
Date: Tue, 06 Apr 2021 14:32:30 GMT
Connection: close
Server: Anonymous
{"States":"[]","Install Progress":"UNKNOWN","Config Progress":"UNKNOWN","Config Final Progress":"UNKNOWN","Install Final Progress":"UNKNOWN"}
HTTP/1.0 200 OK
strict-transport-security: max-age=30758400;includeSubDomains
x-xss-protection: 1; mode=block
set-cookie: VSPHERE-UI-JSESSIONID=3D8FE882F9BD3DD1C66C10DFD00022C9; Path=/ui; Secure; HttpOnly
content-type: text/plain;charset=ISO-8859-1
content-length: 374
date: Tue, 06 Apr 2021 14:33:22 GMT
server: envoy
x-envoy-upstream-service-time: 1
connection: close