29 oct 2019

Explotando BlueKeep con Metasploit

Muy buenas a todos!

En este post nos vamos a centrar en cómo desplegar y ejecutar el módulo de Bluekeep desarrollado por zerosum0x0 que ha sido añadido recientemente en Metasploit. Aunque todavía no está desarrollado en su totalidad (se encuentra en pull request en GitHub aún), está en disposición de ser utilizado con unos ligeros retoques. En este caso, nuestros objetivo será una máquina Windows 2008 R2, obviamente, vulnerable a BlueKeep (CVE-2019-0708).

Un poco de historia

Pero antes de empezar lo divertido... ¿Qúe es Bluekeep? Según lo define el equipo de Microsoft, es una vulnerabilidad de ejecución de código remoto existente en el servicio de Escritorio Remoto. Esta funcionalidad puede ser explotada por un atacante sin autenticar mediante el envío de peticiones especialmente construidas. Si un atacante consiguiera explotar satisfactoriamente esta vulnerabilidad, tendría acceso a la máquina de la víctima como usuario NT Authority/System. 

El 14 de Mayo de 2019, Microsoft lanzó varios KBs para solucionar esta vulnerabilidad en equipos Windows 7 SP1, Windows 2008 R2 SP1 y SP2 y Windows Vista respectivamente (KB4499175 y KB4499180).

Montando el laboratorio

Para realizar lo descrito en este post se ha utilizado:
  • Virtualbox 6.0.1 para crear la máquina virtual objetivo. 
  • Una VMWare de Kali Linux Rolling 2019.3 8 amd64 (descárgala aquí) con Metasploit en la versión 5.0.53-dev. IP: 192.168.1.4. 
  • Una VM con una imagen .iso de Windows Server 2008 R2 64 bit vulnerable (descárgala aquí). IP: 192.168.1.37 
Para confirmar que el despliegue se ha realizado correctamente y que la máquina no presenta los parches antes citados, podemos ejecutar el comando systeminfo en una cmd/powershell. Como se observa en la siguiente imagen, la máquina W2008 tiene un único parche instalado (KB976902) por lo que, a priori, es vulnerable a BlueKeep.
Fig 1: Salida del comando systeminfo
El siguiente paso será habilitar el Escritorio Remoto ya que, por defecto, no viene activado.
Fig 2: Habilitar RDP

Fig 3: Permitiendo cualquier tipo de conexión


Nota 1: En el despliegue de la máquina Windows, se ha realizado la instalación por defecto y no se han aplicado actualizaciones del sistema. 

Nota 2: Docker en una Kali con arquitectura x86 me dio problemas para montar el contenedor, tuve que usar una com arquitectura x86_64.

Seleccionando el módulo de BlueKeep

Como hemos comentado antes, se ha usado una Kali Rolling 2019.3 con la última versión disponible de Metasploit (5.0.53-dev), la cual incluye el exploit de BlueKeep por defecto. Para actualizar a la última versión de Metasploit disponible, basta con usar el comando apt-get install metasploit-framework en la consola. Una vez terminado el proceso, bastará con lanzar el comando version dentro de Metasploit para confirmar cual se está ejecutando.
Fig 4: Versión de Metasploit

A continuación, mediante el comando use exploit/windows/rdp/cve_2019_0708_bluekeep_rce podemos seleccionarlo. Con show info podemos confirmar con exactitud que es el exploit deseado
Fig 5: Información sobre el exploit

Probando el exploit 

De todas las opciones que se nos ofrece por pantalla para rellenar, sólo es necesario incluir el parámetro RHOSTS con la IP de la máquina destino (en nuestro caso 192.168.1.37) y seleccionar el TARGET correctamente. Como bien se indica en la página de Rapid 7, el módulo aún es manual, por lo que si no se modifica este valor, el exploit no funcionará. Al ser nuestro objetivo un Windows 2008 R2 corriendoVirtualbox 6, tendremos que seleccionar el TARGET 2. Como payload, usaremos una reverse tcp de meterpreter.
Fig 6: Opciones selecionadas
Si echamos un ojo a los comentarios del exploit (localizado en /usr/share/metasploit-framework/modules/exploits/windows/rdp/cve_2019_0708_bluekeep_rce.rb), para las versiones superiores a Windows 7, el registro HKLM\SYSTEM\CurrentControlSet\Control\TerminalServer\Winstations\RDP-Tcp\fDisableCam tiene que valer 0. Además, en los Windows Server 2008 R2 debe ser asignado manualmente.
Fig 7: Cambiando el registro
Si lanzamos el exploit tras cambiar el registro, observaremos que todo se ejecuta correctamente, sin embargo, la máquina Windows 2008 habrá sufrido un pantallazo azul.
Fig 8: Fallo de paginación
Nota: Puede ocurrir que el exploit se ejecute correctamente. Sin embargo, es recomendable seguir leyendo para garantizar una tasa de éxito más elevada.

Ajustando Bluekeep

El pantallazo azul indica un fallo de paginación del sistema, es decir, una pagína de memoria no ha sido asignada correctamente y el sistema no ha podido recuperarse. Para poder arreglar esta situación, es necesario modificar el valor GROOMBASE del script para que apunte al valor NPP (Non Paged Pool Area) de nuestra máquina virtual. Esto se debe a un comentario incluido en el interior de script:
Fig 9: Explicación NPP obtenida del script
O lo que es lo mismo, según que máquina virtual se esté usando, el inicio de la NPP puede encontrarse en un rango cercano al puntero incluido por defecto en GROOMBASE o, encontrarse a "kilómetros" de el, impidiendo que el exploit funcione correctamente (es por eso que ha veces funciona sin modificar y, otras veces, nunca genera una shell). La solución (a día de hoy) es bastante "sencilla"; basta con obtener el puntero NPP de nuestra máquina virtual y sustituirlo en el script. Para obtenerlo, es necesario realizar un volcado de memoria y emplear el plugin pools de Rekall.

Realizando el volcado de memoria

Para realizar el volcado de memoria, aprovecharemos el ejecutable VBoxmanage.exe incluido en los archivos de programa Virtualbox por defecto.
  • cmd> C:\Program Files\Oracle\VirtualBox>VBoxManage.exe debugvm "W2008 R2" dumpvmcore --filename="C:\Users\%USERNAME%\Desktop\files"
Donde "W2008 R2" es el nombre asignado a la máquina Windows.
Fig 10: Nombre de la  VM

Obteniendo la dirección de NPP

Primero, actualizamos docker (o instalaremos) en nuestra Kali mediante el comando apt-get install docker.io. A continuación, creamos un contenedor de Docker con Rekall, docker pull remnux/rekall

lo levantamos con:
  • docker run --rm -it -v files:/home/nonroot/files remnux/rekall bash
Por último, mediante el comando rekall -f files poolsobtenemos el valor de NPP.
Fig 11: Valor de NPP
Editando el script

Una vez tenemos el valor de NPP de la máquina Windows 2008, sólo nos falta por editar el contenido del script y cambiar el valor de GROOMBASE por el nuevo. En nuestro caso, al ser una máquina virtual corriendo en VBox, cambiaremos el GROOMBASE del Target 2 (línea 128 del script).

Nota: Rekall nos muestra la posición en memoria con una sola "f", debemos añadir el valor al script con todas las "f", si no, volverá a generarse un error al lanzar el exploit.
  • 0xfa8001802000 => 0xfffffa8001802000
Fig 12: Cambiando GROOMBASE

Lanzando el exploit definitivo

Antes de lanzar el exploit, debemos volver a cargar el módulo en exploit. Existen varias maneras diferentes, ya sea usando el comando reload, el comando reload_all o, ante la duda, la vieja confiable, reiniciar Metasploit (esta es la mejor opción, así no hay dudas de que se cargan correctamente los cambios). Una vez dicho esto, si ejecutamos el exploit (con la misma configuración que antes)... la preciada shell aperece.
Fig 13: System!

Happy Juancking!


Referencias
  1. https://pentest-tools.com/blog/bluekeep-exploit-metasploit/
  2. https://klaus.hohenpoelz.de/playing-with-the-bluekeep-metasploit-module.html

2 comentarios:

  1. """ Realizando el volcado de memoria

    Para realizar el volcado de memoria, aprovecharemos el ejecutable VBoxmanage.exe incluido en los archivos de programa Virtualbox por defecto."""


    Cómo usar el script en una máquina física. Cada vez que intento la pantalla azul sucede. ¿Me pueden ayudar con esta pregunta?

    ResponderEliminar
    Respuestas
    1. Buenas,

      Para poder aplicar este exploit sobre una máquina cualquiera, primero necesitas tener un volcado de memoria de la misma para sustituir el valor GROOMBASE. Para ello, puedes usar herramientas como FTKImager (https://accessdata.com/product-download/ftk-imager-version-3-4-3), Bambiraptor (https://www.brimorlabsblog.com/2016/12/live-response-collection-bambiraptor.html) o dumpIT (https://blog.comae.io/your-favorite-memory-toolkit-is-back-f97072d33d5c). Además, tiene que ser un SO de los listados en el exploit (además de haber asignado el valor fdisablecam=0). De todas formas, si el exploit sigue sin funcionar, puedes probar a usar otro payload diferente (reverse_shell normal, el de meterpreter...). Aún con todo esto, el exploit no es más que una PoC, por lo que puede ocurrir que no funcione 100% fuera de los casos para los que se ha confirmado.

      PD: Confirma que el exploit se actualiza cuando lo modificas, usando el comando reload o reload_all. Incluso si tienes dudas, renicia Metasploit.

      Saludos!

      Eliminar