
PoC per l'elevazione dei privilegi da utente a kernel in TeamViewer. CVE-2024-7479 e CVE-2024-7481. ZDI-24-1289 e ZDI-24-1290. TV-2024-1006.
Questo repository contiene la proof of concept dell'exploit di una vulnerabilità in TeamViewer che consente a un utente senza privilegi di caricare un driver di kernel arbitrario nel sistema. Desidero ringraziare Zero Day Initiative per la collaborazione nella segnalazione e nella divulgazione responsabile della vulnerabilità.

I dettagli della ricerca che ha portato a queste vulnerabilità sono disponibili nella seguente serie di blog in tre parti sul mio blog. Coprono queste vulnerabilità in maggior dettaglio e mostrano anche dove ho sbagliato durante il processo. La terza parte è quella divertente :P.
I video dell'exploit sono disponibili qui:
Dopo essere riusciti a spoofare (solo una semplice autenticazione come dettagliato nel blog) un client TeamViewer valido durante la connessione all'IPC del servizio SYSTEM, è stato possibile attivare l'installazione di un driver arbitrario. TeamViewer non verificava la firma del driver installato.
Pertanto, grazie a TeamViewer, è stata possibile un'elevazione di privilegi da USER a KERNEL.
Uno dei migliori approcci è utilizzare la nota tecnica BYOD, Bring Your Own Vulnerable Driver per caricare un driver firmato valido nel kernel di Windows e poi sfruttarlo per eseguire azioni privilegiate dal livello utente, come cambiare il token di un processo arbitrario con uno privilegiato.
Quando TeamViewer è installato sul sistema, crea un servizio che gira come SYSTEM, TeamViewer_service.exe
Questo servizio è un helper per il client per alcune attività. Pertanto, il client non gira con privilegi elevati e alcune attività vengono delegate al servizio.
La comunicazione con il servizio (IPC) è implementata tramite socket (usando Overlapped I/O e IoCompletionPort). Di default, il servizio SYSTEM di TeamViewer è in ascolto su 5939/tcp in localhost.
TeamViewer non filtra il parametro inviato dal client per richiedere l'installazione del driver né il controllo della firma, ecc.
Quindi l'idea è: spoofiamo un client TV e chiediamo l'installazione di un VPN Driver ma indicando un altro INF. Ho riutilizzato lo stesso INF originale di TeamViewer ma in un altro percorso (non privilegiato), rinominando il driver "maligno" in teamviewervpn.sys, poiché è il nome del driver preso di mira dall'INF originale.
Questo bypassa anche l'opzione di TeamViewer Le modifiche richiedono i diritti di amministratore su questo computer.
Questo controllo è efficace solo tramite GUI, poiché Opzioni di TeamViewer è disabilitato quando si fa clic sul pulsante con un utente senza privilegi. Ma è possibile connettersi al socket ed eseguire il caricamento arbitrario del driver.
L'exploit dipende dalla versione a causa del messaggio IPC in cui il client specifica il proprio PID e altri dati insieme alla versione. La versione del client deve corrispondere alla versione del servizio SYSTEM. L'exploit deve essere modificato (righe da 140 a 143) in Main.cpp in base alla versione di TeamViewer_service.exe presa di mira.
Quindi, in pratica, spoofiamo un client TeamViewer che si connette al servizio SYSTEM e richiediamo l'installazione di un driver arbitrario. Il servizio TeamViewer lo carica gentilmente nel Kernel.
TeamViewer ha un altro messaggio IPC molto simile al primo che ho scoperto (invocato quando si fa clic su Installa driver VPN). Questo altro messaggio serve per installare il driver della stampante.
Quindi, essenzialmente, CVE-2024-7479 e CVE-2024-7481 sono la stessa cosa, ma TeamViewer ha commesso lo stesso errore due volte. I messaggi, sebbene diversi, sono molto simili. Hanno un Method Id IPC diverso.
Il risultato è lo stesso: un driver arbitrario può essere caricato.