Ce référentiel contient la preuve de concept d'exploitation d'une vulnérabilité dans TeamViewer qui permet à un utilisateur non privilégié de charger un pilote de noyau arbitraire dans le système. Je tiens à remercier Zero Day Initiative pour la coordination avec eux pour signaler et divulguer de manière responsable la vulnérabilité.
Les détails de la recherche qui a abouti à ces vulnérabilités peuvent être trouvés dans la série de blogs en trois parties 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.
Des vidéos de l'exploit peuvent être trouvées 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 SYSTEM IPC, il était possible de déclencher une installation de pilote arbitraire. TeamViewer ne vérifiait pas la signature du pilote en cours d'installation.
Ainsi une élévation des privilèges UTILISATEUR vers KERNEL a été 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 signé valide dans le noyau Windows, puis l'exploiter afin d'effectuer des actions privilégiées au niveau de l'utilisateur, comme changer le jeton d'un utilisateur arbitraire. processus avec un 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 dans 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 (en utilisant Overlapped I/O et IoCompletionPort ). Par défaut, les services TeamViewer SYSTEM é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 la signature, etc.
L'idée est donc la suivante : nous allons usurper un client TV et demander l'installation d'un 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 il s'agit du nom du pilote ciblé par l'INF d'origine.
Cela contourne également l'option TeamViewer . Les modifications nécessitent des droits d'administrateur sur cet ordinateur .
Cette vérification n'est efficace que via l'interface graphique, car les options TeamViewer sont désactivées lorsque vous cliquez 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 dans lequel le client a spécifié 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 vers la version TeamViewer_service.exe ciblée.
Donc, fondamentalement, nous usurpons un client TeamViewer connectant le service SYSTEM et demandons l'installation d'un pilote arbitraire. Le service TeamViewer doit le charger dans le noyau.
TeamViewer a un autre message IPC très similaire au premier que j'ai découvert en premier (lancé en cliquant sur Install VPN Driver ). Cet autre message consiste à installer le pilote d'imprimante .
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 un identifiant de méthode IPC différent.
Le résultat est le même, un pilote arbitraire peut être chargé.