Ya llega BlueKeep... aka ejecución remota de código en RDP

El pasado martes 14 de mayo Microsoft lanzaba un parche para la vulnerabilidad CVE-2019-0708 bautizada también como BlueKeep, una vulnerabilidad en Remote Desktop Services de Windows que permite ejecución remota de código sin pre-autenticación, mandando simplemente paquetes especialmente modificados.


Tal y como reza Microsoft en su boletín, Windows 7, Windows Server 2008 R2 y Windows Server 2008 son vulnerables, así como los Windows 2003 y Windows XP, estos últimos y como ya sabemos ya fuera de soporte.

Evidentemente la criticidad de la vulnerabilidad causó un gran revuelo porque además abre la posibilidad de nuevo de armar malware "wormable" o autopropagable del tipo WannaCry. El resultado ha sido una avalancha de búsquedas de un exploit funcional que todavía hoy no ha cesado. Pero antes de avanzar cualquier PoC entendamos un poco en qué consiste la vulnerabilidad...

Análisis técnico CVE-2019-0708

Nos enfrentamos a una vulnerabilidad del tipo use-after-free en termdd.sys, un driver de kernel que usa el RDP (Remote Desktop Protocol) de Microsoft. Para entenderlo un poco mejor vamos a ilustrar el inicio de una comunicación RDP gracias a un buen esquema que encontré en el blog de Ixia:


Primero, tenemos una conexión X.224 iniciada por el cliente que se utiliza para realizar una solicitud de conexión al servidor, seguido de una confirmación de esta conexión.

Las siguientes peticiones "MCS Connect Initial y GCC Create", dentro del intercambio de mensajes para la Configuración Básica, contienen información de creación de canales virtuales, información relacionada con la seguridad y otros parámetros de capacidad y compatibilidad del cliente RDP. Dentro hay un campo de 8 bytes terminado en un byte nulo llamado "channelName_N" que se usa para especificar el nombre del canal.


Si se especifica un canal con el nombre `MS_T120\x00`, la función termdd!IcaCreateChannel() llama a termdd!IcaFindChannelByName() y devuelve la estructura ChannelControl a la que apunta la estructura MS_T120 en el Slot (por ej. en el 10 o 0x1F). Ese puntero se almacena mediante la función termdd!IcaBindVirtualChannels() de manera que cuando se reciba la petición  MCS Channel Join Request se abrirá el canal MS_T120.

Si un atacante envía datos al canal MS_T120, termdd.sys intentará responder al mensaje enviando un mensaje de error y cerrando el canal mediante termdd!IcaCloseChannel(), que a su vez llamará a termdd!_IcaFreeChannel(), que liberará el ChannelControlStructure de MS_T120 y borrará el puntero en slot del usuario en la tabla ChannelPointerTable (el slot 10 en el ejemplo que comentamos).

El problema es que el puntero del slot no se borra... Cuando se finaliza la conexión posteriormente, se llama a RDPWD!SignalBrokenConnection(), que a su vez llama a termdd!IcaChannelInputInternal() e intenta escribir en la estructura de control de canales liberados utilizando el puntero del slot (el 0x1F). Esto conduce a la condición use-after-free.

El resultado es un atacante remoto no autenticado puede explotar esta vulnerabilidad al establecer una conexión RDP con el servidor de destino abriendo en canal MS_T120 y enviándole datos especialmente modificados. Si la explotación tiene éxito el atacante podrá ejecutar código arbitrariamente con privilegios administrativos (nivel de kernel).

Escáners

Hace unos días se publicó la herramienta rdpscan, basada en masscan que puede escanear sistemas vulnerables a BlueKeep de forma bastante eficiente. Mediante la misma se encontró un total de 7 millones de sistemas que estaban escuchando en el puerto 3389, de los cuales alrededor de 1 millón siguen siendo vulnerables.

También se ha publicado un módulo de Metasploit, ha sido implementado por @JaGoTu y @zerosum0x0 y se llama BlueKeep Microsoft Remote Desktop RCE Check.

msf5> use auxiliary/scanner/rdp/cve_2019_0708_bluekeep

Exploits PoCs

Afortunadamente hasta ahora no se ha publicado ningún exploit demasiado funcional y digo "hasta ahora" porque hace unas horas Ekultek si que nos ha regalado un script en Python que podría "cargarse" con un payload, digamos, más "útil":

https://github.com/Ekultek/BlueKeep

to_video

Sólo hace falta cargar el script con nuestro shellcode y a volar...

También han aparecido scripts que directamente crashean el sistema:

https://github.com/n1xbyte/CVE-2019-0708/

El resultado será provocar un bonito BSOD en la máquina vulnerable, como por ejemplo en un Windows 7 de 32 bits:

$ python crashpoc.py 192.168.122.39 32
[+] ClientData Packet Sent
[+] ChannelJoin/ErectDomain/AttachUser Sent
[+] ClientInfo Packet Sent
[+] ConfirmActive Packet Sent
[+] Session Established
[+] Vuln Should Trigger
[+] ClientData Packet Sent
[+] ChannelJoin/ErectDomain/AttachUser Sent
[+] ClientInfo Packet Sent
[+] ConfirmActive Packet Sent
[+] Session Established
[+] Vuln Should Trigger
[+] ClientData Packet Sent
[+] ChannelJoin/ErectDomain/AttachUser Sent
[+] ClientInfo Packet Sent
[+] ConfirmActive Packet Sent
[+] Session Established
[+] Vuln Should Trigger

 

Y eso no es nada... como veis, todo apunta a que pronto, muy pronto, scripts de "botón gordo" totalmente funcionales estarán disponibles al público en general y veremos el mundo arder...


Querido sysadmin, no será que no te hemos avisado con tiempo... ¡Actualiza!

3 comentarios :

  1. me avisas cuando este disponible xD

    ResponderEliminar
  2. la verdad que sigue pasando el tiempo y del script funcional nada

    ResponderEliminar
  3. este script ya fue explotado hace raaattttooooo men

    ResponderEliminar