
PoC d'élévation de privilèges de l'utilisateur au noyau de TeamViewer. CVE-2024-7479 et CVE-2024-7481. ZDI-24-1289 et ZDI-24-1290. TV-2024-1006.
Ce dépôt contient la preuve de concept de l'exploit d'une vulnérabilité dans TeamViewer qui permet à un utilisateur non privilégié de charger un pilote noyau arbitraire dans le système. Je remercie Zero Day Initiative pour la coordination avec eux afin de signaler et divulguer la vulnérabilité de manière responsable.

Les détails de la recherche qui a abouti à ces vulnérabilités se trouvent dans la série de trois articles de blog suivante sur mon blog. Ils couvrent ces vulnérabilités plus en détail et montrent également où j'ai échoué au cours du processus. La troisième partie est la plus amusante :P.
Les vidéos de l'exploit se trouvent ici :
Après avoir pu usurper (juste une simple authentification comme détaillé dans le blog) un client TeamViewer valide lors de la connexion au service IPC SYSTEM, il était possible de déclencher une installation de pilote arbitraire. TeamViewer ne vérifiait pas la signature du pilote installé.
Ainsi, une escalade de privilèges UTILISATEUR vers NOYAU était possible grâce à TeamViewer.
L'une des meilleures approches consiste à utiliser la technique bien connue BYOD, Bring Your Own Vulnerable Driver pour charger un pilote valide signé dans le noyau Windows, puis l'exploiter afin d'effectuer des actions privilégiées depuis le niveau utilisateur, comme changer le jeton d'un processus arbitraire pour un jeton privilégié.
Lorsque TeamViewer est installé sur le système, il crée un service qui s'exécute en tant que SYSTEM, TeamViewer_service.exe
Ce service est une aide pour le client pour certaines tâches. Ainsi, le client ne s'exécute pas avec des privilèges élevés et certaines tâches sont déléguées au service.
La communication avec le service (IPC) est implémentée via des sockets (utilisant Overlapped I/O et IoCompletionPort). Par défaut, les services SYSTEM de TeamViewer écoutent sur 5939/tcp sur localhost.
TeamViewer ne filtre pas le paramètre envoyé par le client pour demander l'installation du pilote ni la vérification de signature, etc.
Donc, l'idée est la suivante : nous allons usurper un client TV et demander une installation de pilote VPN mais en indiquant un autre INF. J'ai réutilisé le même INF original de TeamViewer mais dans un autre chemin (non privilégié) en renommant le "mauvais" pilote en teamviewervpn.sys, car c'est le nom de pilote ciblé par l'INF original.
Cela contourne également l'option de TeamViewer Les modifications nécessitent des droits d'administration sur cet ordinateur.
Cette vérification n'est efficace que via l'interface graphique, car Options de TeamViewer est désactivé lorsque l'on clique sur le bouton avec un utilisateur non privilégié. Mais il est possible de se connecter au socket et d'effectuer le chargement arbitraire du pilote.
L'exploit dépend de la version en raison du message IPC où le client spécifie son PID et d'autres données parmi la version. La version du client doit correspondre à la version du service SYSTEM. L'exploit doit être modifié (lignes 140 à 143) dans Main.cpp selon la version de TeamViewer_service.exe ciblée.
Donc, en gros, nous usurpons un client TeamViewer connecté au service SYSTEM et demandons l'installation d'un pilote arbitraire. Le service TeamViewer le charge gentiment dans le noyau.
TeamViewer a un autre message IPC très similaire au premier que j'ai découvert en premier (déclenché en cliquant sur Installer le pilote VPN). Cet autre message sert à installer le pilote d'impression.
Donc, essentiellement, CVE-2024-7479 et CVE-2024-7481 sont identiques, mais TeamViewer a commis la même erreur deux fois. Les messages sont, bien que différents, très similaires. Ils ont des identifiants de méthode IPC différents.
Le résultat est le même, un pilote arbitraire peut être chargé.