Recientemente Matt Graeber (@mattifestation) ha publicado una nueva vía para llevar a cabo un bypass del sistema de seguridad UAC de Microsoft. UAC, es User Account Control, y protege a los usuarios de Windows de ejecutar acciones con el máximo privilegio sin que ellos se den cuenta, siendo una pieza fundamental de la fortificación de sistemas Microsoft Windows. En un test de intrusión es interesante conocer este tipo de técnicas para conseguir el máximo privilegio, y poder ejecutar procesos como SYSTEM. La técnica de bypass de UAC funcionará siempre y cuando el usuario pertenezca al grupo administradores, entre otras cosas, además de ciertos condicionantes en cada caso.
Algunas de las técnicas de Bypass de UAC son conocidas, y dependen de la configuración que tenga en cada sistema. Se puede hacer un ataque remplazando los accesos directos de un usuario como se vio en Windows Vista en al año 2007, o usando algunas de las técnicas previamente conocidas desde Metasploit o con PowerShell Empire, tal y como vimos ya por aquí.
Matt Graeber encontró una tarea programada llamada SilentCleanup en Windows 10, la cual está configurada para ser ejecutada por usuarios sin privilegios, pero con integridad alta. Matt descubrió esto de forma sencilla, viendo la tarea programada se puede observar como cualquier usuario que haya iniciado sesión ejecutará dicha tarea en un contexto de integridad alta.
Según la investigación de Matt y haciendo uso de la herramienta Procmon, se encontró que el proceso real comenzó con la tarea cleanmgr.exe y autoelevada debido a que se ejecuta con “ejecutar con alto privilegio” o “Run with highest privileges”. Esto se encuentra, como se ha visto en la imagen anterior, en la configuración de la tarea. Cuando cleanmgr.exe se ejecuta, se crea una nueva carpeta con el nombre de GUID en la ruta \users\[usuario]\appdata\local\temp\[GUID]. Una vez que el proceso cleanmgr.exe crea la carpeta temporal copia múltiples archivos DLL junto con dismhost.exe en la nueva carpeta.
Después de que dismhost.exe y los archivos DLL se copien en la ruta especificada anteriormente, cleanmgr.exe ejecuta dismhost.exe como un proceso de alta integridad. Cuando dismhost.exe es ejecutado, éste comienza a cargar las diferentes DLL en cierto orden. Debido a que el usuario que está ejecutando la tarea tiene un nivel de integridad medio, éste tiene acceso de escritura al directorio %TEMP%. Entonces es posible realizar un Hijacking DLL cargado por dismhost.exe y obtener la ejecución de código en un proceso de alta integridad, y es aquí dónde obtenemos el bypass UAC.
Escenario de explotación
El escenario presentado es sencillo. Nosotros tenemos la posibilidad de escribir en la carpeta indicada anteriormente, por lo que podremos realizar un secuestro de DLL o hijacking DLL. Tenemos que ser capaces de escribir la DLL en cuestión antes de que dismhost.exe la cargue. Tras la investigación de Matt se sabe que la DLL denominada LogProvider.dll es la última en ser cargada, por lo que es idónea para ser secuestrada. Si lo hacemos de forma correcta el binario dismhost.exe cargará nuestra DLL y no la original, por lo que conseguiremos ejecutar código en un proceso con integridad alta, consiguiendo el bypass.
La técnica solo valdrá para usuarios administrativos y nunca para usuarios estándar. No es una escalada de privilegios total, pero sí es un bypass UAC, ya que nos permitiría ejecutar código saltándonos el UAC. Esto puede ser realmente útil cuando, por ejemplo, conseguimos una sesión de Meterpreter con Metasploit de un usuario del grupo administrador, pero que no es el administrador real de la máquina. Con esta técnica podríamos lograr ser SYSTEM y control total sobre la máquina. Por supuesto, el mundo del cibercrimen lo podría utilizar para explotar con mayor virulencia los esquemas de ransomware.
La PoC de Matt Graeber
Matt Graeber escribió una prueba de concepto en Powershell, la cual registrará un evento WMI para supervisar la creación de la carpeta GUID por cleanmgr.exe. Una vez detectada la carpeta, se tomará la DLL especificada y la copiará a la carpeta con el GUID para sobrescribir LorProvider.dll. El código se encuentra disponible en Github.
Una vez dismhost.exe vaya a cargar LogProvider.dll será nuestra DLL maliciosa la que se ejecute, en lugar de la DLL legítima. Además, también proporcionan una DLL de prueba para probar la ejecución de código a través de un MessageBox.
Como se puede ver el concepto es realmente sencillo. El script que podemos descargar que implementa la PoC es Invoke-ByPassUAC.ps1, el cual implementa una función que podemos cargar a nuestra Powershell a través del comando import-modude. La ejecución de la función se llevaría a cabo con la siguiente sintaxis:
Autor: Pablo González Pérez (@pablogonzalezpe)
Escritor de los libros "Metasploit para Pentesters", "Ethical Hacking", "Got Root" y “Pentesting con Powershell”
Figura 1: Nuevo Bypass de UAC en Windows 10 usando Disk Cleanup |
Algunas de las técnicas de Bypass de UAC son conocidas, y dependen de la configuración que tenga en cada sistema. Se puede hacer un ataque remplazando los accesos directos de un usuario como se vio en Windows Vista en al año 2007, o usando algunas de las técnicas previamente conocidas desde Metasploit o con PowerShell Empire, tal y como vimos ya por aquí.
Figura 2: Windows7Elevate. Una herramienta para hacer ByPass de UAC en Windows 7 |
Matt Graeber encontró una tarea programada llamada SilentCleanup en Windows 10, la cual está configurada para ser ejecutada por usuarios sin privilegios, pero con integridad alta. Matt descubrió esto de forma sencilla, viendo la tarea programada se puede observar como cualquier usuario que haya iniciado sesión ejecutará dicha tarea en un contexto de integridad alta.
Según la investigación de Matt y haciendo uso de la herramienta Procmon, se encontró que el proceso real comenzó con la tarea cleanmgr.exe y autoelevada debido a que se ejecuta con “ejecutar con alto privilegio” o “Run with highest privileges”. Esto se encuentra, como se ha visto en la imagen anterior, en la configuración de la tarea. Cuando cleanmgr.exe se ejecuta, se crea una nueva carpeta con el nombre de GUID en la ruta \users\[usuario]\appdata\local\temp\[GUID]. Una vez que el proceso cleanmgr.exe crea la carpeta temporal copia múltiples archivos DLL junto con dismhost.exe en la nueva carpeta.
Figura 3: Configuración de privilegios de la tarea SilentCleanup |
Después de que dismhost.exe y los archivos DLL se copien en la ruta especificada anteriormente, cleanmgr.exe ejecuta dismhost.exe como un proceso de alta integridad. Cuando dismhost.exe es ejecutado, éste comienza a cargar las diferentes DLL en cierto orden. Debido a que el usuario que está ejecutando la tarea tiene un nivel de integridad medio, éste tiene acceso de escritura al directorio %TEMP%. Entonces es posible realizar un Hijacking DLL cargado por dismhost.exe y obtener la ejecución de código en un proceso de alta integridad, y es aquí dónde obtenemos el bypass UAC.
Escenario de explotación
El escenario presentado es sencillo. Nosotros tenemos la posibilidad de escribir en la carpeta indicada anteriormente, por lo que podremos realizar un secuestro de DLL o hijacking DLL. Tenemos que ser capaces de escribir la DLL en cuestión antes de que dismhost.exe la cargue. Tras la investigación de Matt se sabe que la DLL denominada LogProvider.dll es la última en ser cargada, por lo que es idónea para ser secuestrada. Si lo hacemos de forma correcta el binario dismhost.exe cargará nuestra DLL y no la original, por lo que conseguiremos ejecutar código en un proceso con integridad alta, consiguiendo el bypass.
La técnica solo valdrá para usuarios administrativos y nunca para usuarios estándar. No es una escalada de privilegios total, pero sí es un bypass UAC, ya que nos permitiría ejecutar código saltándonos el UAC. Esto puede ser realmente útil cuando, por ejemplo, conseguimos una sesión de Meterpreter con Metasploit de un usuario del grupo administrador, pero que no es el administrador real de la máquina. Con esta técnica podríamos lograr ser SYSTEM y control total sobre la máquina. Por supuesto, el mundo del cibercrimen lo podría utilizar para explotar con mayor virulencia los esquemas de ransomware.
La PoC de Matt Graeber
Matt Graeber escribió una prueba de concepto en Powershell, la cual registrará un evento WMI para supervisar la creación de la carpeta GUID por cleanmgr.exe. Una vez detectada la carpeta, se tomará la DLL especificada y la copiará a la carpeta con el GUID para sobrescribir LorProvider.dll. El código se encuentra disponible en Github.
Figura 4: PoC en PowerShell publicada por Matt Graeber |
Una vez dismhost.exe vaya a cargar LogProvider.dll será nuestra DLL maliciosa la que se ejecute, en lugar de la DLL legítima. Además, también proporcionan una DLL de prueba para probar la ejecución de código a través de un MessageBox.
Figura 5: Ejecución de la PoC con el Bypass de UAC en Windows 10 |
Como se puede ver el concepto es realmente sencillo. El script que podemos descargar que implementa la PoC es Invoke-ByPassUAC.ps1, el cual implementa una función que podemos cargar a nuestra Powershell a través del comando import-modude. La ejecución de la función se llevaría a cabo con la siguiente sintaxis:
invoke-bypassuac -DllPath [ruta de la DLL a copiar en la carpeta target]Esta nueva forma de realizar Bypass UAC en Windows 10 es una técnica que debemos llevar en nuestra mochila en las auditorias y por supuesto, fortificar al máximo nuestro Windows para evitar estos ataques.
Autor: Pablo González Pérez (@pablogonzalezpe)
Escritor de los libros "Metasploit para Pentesters", "Ethical Hacking", "Got Root" y “Pentesting con Powershell”
Hola Chema, sólo para saber cómo podemos hablar en privado. Le quiero invitar a Tech Talks que organizamos desde la Universidad en dónde trabajo (Facultad de Comunicación y Ciencias Sociales). Sería para el próximo febrero o marzo del 2017.
ResponderEliminarSaludos y gracias,
que interesante la idea de replicar un proceso con alto privilegio y permitir una silenciosa a cualquier usuario... Tal vez esto ya es conocido y solo es la punta de iceberg...
ResponderEliminar