
Windows - Armando escritas privilegiadas de arquivos com o serviço Update Session Orchestrator
⚠️ 2020-06-06 Atualização: esse truque não funciona mais nas versões mais recentes do Windows 10 Insider Preview. Isso significa que, embora ainda funcione na versão mainstream do Windows 10, você deve esperar que seja corrigido nos próximos meses.
Este PoC mostra uma técnica que pode ser usada para armar vulnerabilidades de gravação privilegiada de arquivos no Windows. Ele fornece uma alternativa ao "exploit" de carregamento de DLL do DiagHub encontrado por James Forshaw (também conhecido como @tiraniddo), que foi corrigido pela Microsoft a partir da versão de compilação 1903.
A partir do Windows 10, a Microsoft introduziu o serviço Update Session Orchestrator. Como um usuário comum, você pode interagir com este serviço usando COM e iniciar uma "verificação de atualizações" (ou seja, verificar se há atualizações disponíveis) ou iniciar o download de atualizações pendentes, por exemplo. Existe até uma ferramenta interna não documentada chamada usoclient.exe, que serve esse propósito.
Do ponto de vista de um invasor, este serviço é interessante porque ele é executado como NT AUTHORITY\System e tenta carregar uma DLL inexistente (windowscoredeviceinfo.dll) sempre que uma Sessão de Atualização é criada.
Isso significa que, se encontrarmos uma vulnerabilidade de gravação privilegiada de arquivos no Windows ou em algum software de terceiros, poderíamos copiar nossa própria versão de windowscoredeviceinfo.dll para C:\Windows\Sytem32\ e então fazê-la ser carregada pelo serviço USO para obter execução arbitrária de código como NT AUTHORITY\System.
Para mais informações:
Parte 1 - https://itm4n.github.io/usodllloader-part1/
Parte 2 - https://itm4n.github.io/usodllloader-part2/
Esta solução é composta por dois projetos: WindowsCoreDeviceInfo e UsoDllLoader.
Ela fornece uma DLL de PoC que iniciará um bind shell na porta 1337 (apenas localhost), sempre que a função QueryDeviceInformation() for chamada. Esse é o nome da função usada pelos workers do USO.
É uma versão simplificada do usoclient.exe. Pode ser executada como um usuário comum para interagir com o serviço USO e fazer com que ele carregue windowscoredeviceinfo.dll. Em seguida, tentará se conectar ao bind shell. Em caso de erros, por favor, leia a seção "Problemas conhecidos".
A solução já está pré-configurada, então a compilação deve ser fácil. Estou usando Visual Studio 2019. Pode não funcionar com versões mais antigas.
Release e a arquitetura x64..\x64\Release\WindowsCoreDeviceInfo.dll e o loader .\x64\Release\UsoDllLoader.exe.Para fins de teste, você pode:
WindowsCoreDeviceInfo.dll para C:\Windows\System32\.NT AUTHORITY\SYSTEM.Se UsoDllLoader.exe falhar, você pode fazer o acima manualmente.
WindowsCoreDeviceInfo.dll para C:\Windows\System32\.usoclient StartInteractiveScan como um usuário comum. Observe que você não receberá nenhum feedback do comando.nc.exe 127.0.0.1 1337 para se conectar ao bind shell.Este método provavelmente falhará se uma ou várias atualizações estiverem esperando para serem instaladas, ou se atualizações estiverem sendo instaladas.
Dependendo da versão do Windows, UsoDllLoader.exe pode falhar com vários códigos de erro. Não investiguei muito esses problemas. A razão para isso é que é apenas um PoC, que desenvolvi por conveniência. O que mais importa é a DLL, não o loader. Veja "Uso 2" para mais detalhes.