
TeamViewer Benutzer-zu-Kernel Privilegieneskalation PoC. CVE-2024-7479 und CVE-2024-7481. ZDI-24-1289 und ZDI-24-1290. TV-2024-1006.
Dieses Repository enthält den Exploit-Proof-of-Concept einer Schwachstelle in TeamViewer, die es einem unprivilegierten Benutzer ermöglicht, einen beliebigen Kernel-Treiber in das System zu laden. Ich möchte mich bei der Zero Day Initiative für die Koordination mit ihnen bedanken, um die Schwachstelle zu melden und verantwortungsvoll offenzulegen.

Die Details zu der Forschung, die zu diesen Schwachstellen führte, finden Sie in der folgenden dreiteiligen Blogserie auf meinem Blog. Sie behandeln diese Schwachstellen ausführlicher und zeigen auch, wo ich während des Prozesses gescheitert bin. Teil drei macht am meisten Spaß :).
Videos des Exploits finden Sie hier:
Nachdem es möglich war, einen gültigen TeamViewer-Client zu spoofen (nur eine einfache Authentifizierung, wie im Blog beschrieben), wenn man sich mit dem SYSTEM-Dienst-IPC verbindet, war es möglich, eine beliebige Treiberinstallation auszulösen. TeamViewer überprüfte nicht die Signatur des installierten Treibers.
Somit war eine Privilegieneskalation von BENUTZER zu KERNEL dank TeamViewer möglich.
Einer der besten Ansätze ist die Verwendung der bekannten Technik BYOD, Bring Your Own Vulnerable Driver, um einen gültig signierten Treiber in den Windows-Kernel zu laden und ihn dann auszunutzen, um privilegierte Aktionen auf Benutzerebene durchzuführen, wie z. B. das Token eines beliebigen Prozesses durch ein privilegiertes zu ersetzen.
Wenn TeamViewer auf dem System installiert ist, erstellt es einen Dienst, der als SYSTEM läuft, TeamViewer_service.exe
Dieser Dienst ist ein Helfer für den Client bei einigen Aufgaben. Somit läuft der Client nicht mit erhöhten Rechten, und einige Aufgaben werden an den Dienst delegiert.
Die Kommunikation mit dem Dienst (IPC) wird über Sockets implementiert (mittels Overlapped I/O und IoCompletionPort). Standardmäßig lauschen TeamViewer SYSTEM-Dienste auf 5939/tcp auf localhost.
TeamViewer filtert den vom Client gesendeten Parameter nicht, um die Treiberinstallation oder Signaturprüfung anzufragen, etc.
Die Idee ist also: Wir spoofen einen TV-Client und fordern die Installation eines VPN-Treibers an, geben aber eine andere INF an. Ich habe die gleiche originale INF von TeamViewer in einem anderen (nicht-privilegierten) Pfad wiederverwendet, indem ich den "bösen" Treiber in teamviewervpn.sys umbenannte, da dies der Treibername ist, der von der originalen INF anvisiert wird.
Dies umgeht auch die TeamViewer-Option Änderungen erfordern Administratorrechte auf diesem Computer.
Diese Überprüfung ist nur über die GUI wirksam, da TeamViewer-Optionen deaktiviert ist, wenn die Schaltfläche mit einem unprivilegierten Benutzer geklickt wird. Aber es ist möglich, eine Verbindung zum Socket herzustellen und den beliebigen Treiber zu laden.
Der Exploit ist versionsabhängig aufgrund der IPC-Nachricht, in der der Client seine PID und andere Daten zusammen mit der Version angibt. Die Version des Clients muss mit der Version des SYSTEM-Dienstes übereinstimmen. Der Exploit muss (Zeilen 140 bis 143) in Main.cpp an die Version von TeamViewer_service.exe angepasst werden, die angegriffen wird.
Also, im Grunde spoofen wir einen TeamViewer-Client, der eine Verbindung zum SYSTEM-Dienst herstellt, und fordern die Installation eines beliebigen Treibers an. Der TeamViewer-Dienst lädt ihn freundlicherweise in den Kernel.
TeamViewer hat eine weitere IPC-Nachricht, die der ersten sehr ähnlich ist, die ich zuerst entdeckt habe (ausgelöst durch Klicken auf VPN-Treiber installieren). Diese andere Nachricht dient der Installation des Druckertreibers.
Im Wesentlichen sind CVE-2024-7479 und CVE-2024-7481 identisch, aber TeamViewer hat denselben Fehler zweimal begangen. Die Nachrichten sind, obwohl unterschiedlich, sehr ähnlich. Sie haben unterschiedliche IPC-Method Ids.
Das Ergebnis ist dasselbe: Ein beliebiger Treiber kann geladen werden.