
Windows - Armando escrituras privilegiadas de archivos con el servicio Update Session Orchestrator
⚠️ Actualización 2020-06-06: este truco ya no funciona en las últimas compilaciones de Windows 10 Insider Preview. Esto significa que, aunque todavía funciona en la versión estándar de Windows 10, debe esperar que sea parcheado en los próximos meses.
Este PoC muestra una técnica que se puede usar para armar vulnerabilidades de escritura de archivos privilegiados en Windows. Proporciona una alternativa al "exploit" de carga de DLL de DiagHub descubierto por James Forshaw (también conocido como @tiraniddo), que fue corregido por Microsoft a partir de la versión de compilación 1903.
A partir de Windows 10, Microsoft introdujo el servicio Update Session Orchestrator. Como usuario normal, puede interactuar con este servicio usando COM, e iniciar un "análisis de actualizaciones" (por ejemplo, verificar si hay actualizaciones disponibles) o iniciar la descarga de actualizaciones pendientes. Incluso hay una herramienta integrada no documentada llamada usoclient.exe que sirve para ese propósito.
Desde el punto de vista de un atacante, este servicio es interesante porque se ejecuta como NT AUTHORITY\System e intenta cargar una DLL inexistente (windowscoredeviceinfo.dll) cada vez que se crea una sesión de actualización.
Esto significa que, si encontramos una vulnerabilidad de escritura de archivos privilegiados en Windows o en algún software de terceros, podríamos copiar nuestra propia versión de windowscoredeviceinfo.dll en C:\Windows\Sytem32\ y luego hacer que el servicio USO la cargue para obtener ejecución de código arbitrario como NT AUTHORITY\System.
Para más información:
Parte 1 - https://itm4n.github.io/usodllloader-part1/
Parte 2 - https://itm4n.github.io/usodllloader-part2/
Esta solución se compone de dos proyectos: WindowsCoreDeviceInfo y UsoDllLoader.
WindowsCoreDeviceInfo: Proporciona una DLL PoC que iniciará un shell vinculante en el puerto 1337 (solo localhost) cuando se llame a la función QueryDeviceInformation(). Ese es el nombre de la función utilizada por los workers de USO.
UsoDllLoader (opcional): Es una versión reducida de usoclient.exe. Puede ejecutarse como un usuario normal para interactuar con el servicio USO y hacer que cargue windowscoredeviceinfo.dll. Luego, intentará conectarse al shell vinculante. En caso de errores, lea la sección 'Problemas conocidos'.
La solución ya está preconfigurada, por lo que compilar debería ser fácil. Estoy usando Visual Studio 2019. Puede que no funcione con versiones anteriores.
Release y la arquitectura x64..\x64\Release\WindowsCoreDeviceInfo.dll y el cargador .\x64\Release\UsoDllLoader.exe.Para fines de prueba, puede:
WindowsCoreDeviceInfo.dll a C:\Windows\System32\.NT AUTHORITY\SYSTEM.Si UsoDllLoader.exe falla, puede hacer lo anterior manualmente.
WindowsCoreDeviceInfo.dll a C:\Windows\System32\.usoclient StartInteractiveScan como usuario normal. Tenga en cuenta que no obtendrá ningún feedback del comando.nc.exe 127.0.0.1 1337 para conectarse al shell vinculante.Este método probablemente fallará si una o varias actualizaciones están esperando ser instaladas, o si se están instalando actualizaciones.
Dependiendo de la versión de Windows, UsoDllLoader.exe puede fallar con varios códigos de error. No investigué demasiado estos problemas. La razón es que es solo un PoC, que desarrollé por comodidad. Lo que más importa es la DLL, no el cargador. Consulte 'Uso 2' para más detalles.