Este repositorio contiene la prueba de concepto de explotación de una vulnerabilidad en TeamViewer que permite a un usuario sin privilegios cargar un controlador Kernel arbitrario en el sistema. Me gustaría agradecer a Zero Day Initiative por la coordinación con ellos para informar y divulgar responsablemente la vulnerabilidad.
Los detalles sobre la investigación que terminó con estas vulnerabilidades se pueden encontrar en la siguiente serie de tres partes de mi blog. Cubren estas vulnerabilidades con más detalle y también muestran dónde fallé durante el proceso. La tercera parte es la divertida :P.
Los vídeos del exploit se pueden encontrar aquí:
Después de poder falsificar (solo una autenticación simple como se detalla en el blog) un cliente TeamViewer válido al conectarse al servicio IPC del SISTEMA, fue posible desencadenar una instalación de controlador arbitraria. TeamViewer no estaba verificando la firma del controlador que se estaba instalando.
Así, una escalada de privilegios de USUARIO a KERNEL fue posible gracias a TeamViewer.
Uno de los mejores enfoques es utilizar la conocida técnica BYOD, Bring Your Own Vulnerable Driver para cargar un controlador firmado válido en el kernel de Windows y luego explotarlo para realizar acciones privilegiadas desde el nivel de usuario, como cambiar el token de un servidor arbitrario. proceso con un privilegiado.
Cuando TeamViewer se instala en el sistema, crea un servicio que se ejecuta como SISTEMA, TeamViewer_service.exe
Este servicio es una ayuda para el cliente en algunas tareas. Por tanto, el cliente no se ejecuta con privilegios elevados y algunas tareas se delegan al servicio.
La comunicación con el servicio (IPC) se implementa a través de sockets (usando Overlapped I/O e IoCompletionPort ). De forma predeterminada, los servicios TeamViewer SYSTEM escuchan en 5939/tcp en localhost.
TeamViewer no filtra el parámetro enviado por el cliente para solicitar la instalación del controlador ni la verificación de firma, etc.
Entonces la idea es: falsificaremos un cliente de TV y solicitaremos la instalación de un controlador VPN pero indicaremos otro INF. Reutilicé el mismo INF original de TeamViewer pero en otra ruta (sin privilegios) cambiando el nombre del controlador "malo" a teamviewervpn.sys , ya que este es el nombre del controlador al que apunta el INF original.
Esto también omite la opción TeamViewer. Los cambios requieren derechos administrativos en esta computadora .
Esta verificación solo es efectiva a través de la GUI, ya que las opciones de TeamViewer se desactivan al hacer clic en el botón con un usuario sin privilegios. Pero es posible conectarse al zócalo y realizar la carga arbitraria del controlador.
El exploit depende de la versión debido al mensaje IPC donde el cliente especifica su PID y otros datos entre la versión. La versión del cliente debe coincidir con la versión del servicio SISTEMA. El exploit se debe modificar (líneas 140 a 143) en Main.cpp a la versión TeamViewer_service.exe a la que se dirige.
Básicamente, falsificamos un cliente TeamViewer que conecta el servicio SISTEMA y solicitamos la instalación de un controlador arbitrario. El servicio TeamViewer por favor cárguelo en el Kernel.
TeamViewer tiene otro mensaje de IPC muy similar al primero que descubrí por primera vez (aparece al hacer clic en Instalar controlador VPN ). Este otro mensaje es para instalar el Driver de Impresora .
Básicamente, CVE-2024-7479 y CVE-2024-7481 son iguales, pero TeamViewer cometió el mismo error dos veces. Los mensajes son, aunque diferentes, muy similares. Tienen diferentes ID de método IPC.
El resultado es el mismo, se puede cargar un controlador arbitrario.