Este repositório contém a prova de conceito de exploração de uma vulnerabilidade no TeamViewer que permite que um usuário sem privilégios carregue um driver Kernel arbitrário no sistema. Gostaria de agradecer à Zero Day Initiative pela coordenação com eles para relatar e divulgar de forma responsável a vulnerabilidade.
Os detalhes sobre a pesquisa que terminou com essas vulnerabilidades podem ser encontrados na seguinte série de três partes no meu blog. Eles cobrem essas vulnerabilidades com mais detalhes e também mostram onde falhei durante o processo. A parte três é divertida :P.
Vídeos da exploração podem ser encontrados aqui:
Depois de conseguir falsificar (apenas uma autenticação simples conforme detalhado no blog) um cliente TeamViewer válido ao conectar-se ao serviço SYSTEM IPC, foi possível acionar uma instalação arbitrária do driver. O TeamViewer não estava verificando a assinatura do driver que estava sendo instalado.
Assim, uma escalação de privilégios USER para KERNEL foi possível graças ao TeamViewer.
Uma das melhores abordagens é usar a técnica bem conhecida BYOD, Traga seu próprio driver vulnerável para carregar um driver assinado válido no kernel do Windows e então explorá-lo para executar ações privilegiadas no nível do usuário, como alterar o token de um arbitrário processo com um privilegiado.
Quando o TeamViewer é instalado no sistema, ele cria um serviço que roda como SYSTEM, TeamViewer_service.exe
Este serviço é um auxiliar do cliente em algumas tarefas. Assim, o cliente não roda com privilégios elevados e algumas tarefas são delegadas ao serviço.
A comunicação com o serviço (IPC) é implementada através de soquetes (usando Overlapped I/O e IoCompletionPort ). Por padrão, os serviços TeamViewer SYSTEM escutam em 5939/tcp no localhost.
O TeamViewer não está filtrando o parâmetro enviado pelo cliente para solicitar instalação do driver nem verificação de assinatura, etc.
Então a ideia é: vamos falsificar um cliente de TV e pedir a instalação do driver VPN, mas indicando outro INF. Reutilizei o mesmo INF original do TeamViewer, mas em outro caminho (não privilegiado), renomeando o driver "ruim" para teamviewervpn.sys , pois este é o nome do driver alvo do INF original.
Isso também ignora a opção TeamViewer. As alterações exigem direitos administrativos neste computador .
Esta verificação só é eficaz através da GUI, pois as opções do TeamViewer são desativadas ao clicar no botão com um usuário sem privilégios. Mas é possível conectar ao soquete e realizar a carga arbitrária do driver.
A exploração depende da versão devido à mensagem IPC onde o cliente especificou seu PID e outros dados entre a versão. A versão do cliente deve corresponder à versão do serviço SYSTEM. A exploração deve ser modificada (linhas 140 a 143) em Main.cpp para a versão TeamViewer_service.exe que está sendo alvo.
Então, basicamente, falsificamos um cliente TeamViewer conectando o serviço SYSTEM e solicitamos a instalação de um driver arbitrário. Serviço TeamViewer, gentilmente carregue-o no Kernel.
O TeamViewer tem outra mensagem IPC muito semelhante à primeira que descobri primeiro (lançada ao clicar em Instalar driver VPN ). Esta outra mensagem é para instalar o driver da impressora .
Então, essencialmente, CVE-2024-7479 e CVE-2024-7481 são iguais, mas o TeamViewer cometeu o mesmo erro duas vezes. As mensagens são, embora diferentes, muito semelhantes. Eles têm ID de método IPC diferentes.
Os resultados são os mesmos, um driver arbitrário pode ser carregado.