Protección de procesos protegidos de Windows
Este breve blog es el primero de una serie de dos partes que analiza un exploit de Windows en userland revelado inicialmente por James Forshaw y Alex Ionescu. El exploit permite a los atacantes realizar acciones de altos privilegios que normalmente requieren un controlador de kernel.
Protected process light
Windows 8.1 introdujo el concepto de Protected Process Light (PPL), que permite que los programas firmados especialmente se ejecuten de tal manera que sean inmunes a la manipulación y la terminación, incluso por parte de usuarios administrativos. El objetivo es evitar que el malware actúe sin control —manipulando procesos del sistema crítico y terminando aplicaciones antimalware. Existe una jerarquía de "niveles" de PPL, en la que los de mayor privilegio son inmunes a la manipulación por parte de los de menor privilegio, pero no a la inversa.
Para obtener más información sobre los procesos de PPL, consulta los siguientes recursos:
- Protección de servicios antimalware - apps de Win32
- La evolución de los procesos protegidos, parte 1
- La evolución de los procesos protegidos, parte 2
El exploit
A grandes rasgos, el exploit es un ataque de envenenamiento de caché donde un atacante puede añadir una DLL a la caché de KnownDlls, una lista de confianza de DLL de Windows. KnownDlls solo puede ser escrita por procesos WinTcb, que es la forma más alta de PPL... pero un error en la implementación de la API DefineDosDevice permite a los atacantes engañar a CSRSS, un proceso WinTcb, para que cree una entrada de caché en su nombre. KnownDlls cuenta con la confianza del cargador de Windows, por lo que no se realizan comprobaciones de seguridad adicionales a medida que se cargan las KnownDlls, incluso dentro de procesos PPL. Después de envenenar la caché, el atacante lanza un proceso protegido que termina cargando su DLL y ejecutando su payload.
Debido a que este exploit permite a los atacantes inyectar una DLL de su elección en un proceso PPL, pueden realizar cualquier acción con privilegios de WinTcb. Microsoft ha indicado que no tiene interés en dar soporte a esta vulnerabilidad. Se ha confirmado que funciona en Windows 10 21H1 versión 10.0.19043.985.
Open source
El primer POC de exploit público del que tenemos conocimiento es el recientemente lanzado PPLDump, una herramienta que puede volcar cualquier proceso PPL, como LSASS en modo RunAsPPL. Unas semanas después del lanzamiento de PPLDump, apareció Sealighter-TI, que reutiliza el código de exploit de PPLDump para otorgar acceso al feed de ETW de Threat-Intelligence, el cual normalmente está restringido a empresas antimalware bajo acuerdo de confidencialidad (NDA). La rápida respuesta de Sealighter-TI demuestra lo fácil que es reutilizar el código de exploit para ejecutar un nuevo payload.
Con el código de exploit público, esperamos que las herramientas ofensivas lo aprovechen rápidamente, ejecutando cargas útiles como WinTcb PPL. Esto les permitirá:
- Volcar credenciales empresariales, incluso cuando LSASS está reforzado para ejecutarse como PPL.
- Terminar o deshabilitar silenciosamente procesos PPL como productos de seguridad.
- Ejecutar implantes completos como procesos WinTcb PPL. Estos implantes no pueden ser inspeccionados ni terminados por productos de seguridad en modo usuario. Microsoft restringe los productos de seguridad a AntiMalware PPL, que tiene menos privilegios que WinTcb.
- Inyectar código en procesos PPL existentes. Imagina ejecutar la carga útil beacon de Cobalt Strike dentro de Windows Defender.
Cierre de la brecha
Al ver que esta vulnerabilidad no cuenta con una mitigación pública, lanzamos una herramienta llamada PPLGuard para cerrarla. PPLGuard, que se basa en la base de código de PPLDump con permiso, utiliza el exploit para elevar primero los privilegios a WinTcb PPL y, a continuación, aplica una DACL que hace que el directorio de objetos KnownDlls sea de solo lectura. Esto bloquea el exploit al prevenir que CSRSS añada una nueva entrada, un paso crítico en la cadena de explotación. Esta DACL solo existe en la memoria, por lo que se borra al reiniciar.
Dado que PPLGuard cierra la vulnerabilidad de la que depende el exploit, las ejecuciones posteriores fallarán.
C:\git\PPLGuard>x64\Release\PPLGuard.exe [+] ¡El endurecimiento de KnownDlls fue exitoso! :) C:\git\PPLGuard>x64\Release\PPLGuard.exe [-] DefineDosDevice falló con el código de error 5: acceso denegado.
La herramienta de prueba de concepto PPLGuard se puede encontrar aquí.
Conclusión
En este blog, cubrimos un exploit de escalada de privilegios de Windows y proporcionamos una herramienta de open source que mitiga la vulnerabilidad explotada. En la parte 2 de este blog, cubriremos cómo buscar este tipo de ataques mediante Elastic Security. Mantente atento.
Mientras tanto, experimenta nuestra versión más reciente de Elasticsearch Service en Elastic Cloud. Asegúrate también de aprovechar nuestra capacitación de Inicio rápido para prepararte para tener éxito.
Actualización 03/06/2021: después de que se escribiera este blog, alguien portó el exploit PPLDump a .NET para ejecutar Cobalt Strike beacon como WinTCB PPL.