
CVE-2019-0708 bluekeep detección de vulnerabilidades
Este es un escáner rápido y sucio para la vulnerabilidad CVE-2019-0708 en Microsoft Remote Desktop. Actualmente, hay alrededor de 700,000 máquinas en Internet público vulnerables a esta vulnerabilidad, en comparación con aproximadamente 2,000,000 de máquinas que tienen Remote Desktop expuesto, pero están parcheadas/seguras frente a la explotación. Muchos esperan que en los próximos meses aparezca un gusano de Internet devastador similar a WannaCry y notPetya. Por lo tanto, escanee sus redes y parchee sus sistemas. Esta herramienta facilita el escaneo de sus redes para encontrar máquinas vulnerables.
Para usar esta herramienta, puede descargar un "binario" para ejecutar desde la línea de comandos, o puede descargar el código fuente y compilarlo. Para Windows, hay un binario precompilado disponible.
Esta herramienta se basa completamente en el parche rdesktop de https://github.com/zerosum0x0/CVE-2019-0708.
Simplemente he recortado el código para poder compilarlo fácilmente en macOS y Windows,
además de agregar la capacidad de escanear múltiples objetivos.
Esto tiene solo un par de días y es experimental. Sin embargo, lo estoy probando escaneando
todo Internet (con la ayuda de masscan), así que estoy resolviendo muchos problemas
bastante rápido. Puede intentar contactarme en Twitter (@erratarob) para obtener ayuda/comentarios.
Para escanear una red, ejecútelo de la siguiente manera:
rdpscan 192.168.1.1-192.168.1.1.255
Esto imprimirá un resultado de una línea por dirección, indicando VULNERABLE si es vulnerable al error, SAFE si es (probablemente) seguro, o UNKNOWN si el programa no pudo determinar el estado, como al no obtener respuesta del objetivo. Dado que la mayoría de los objetivos no responderán, estadísticamente, la mayoría serán UNKNOWN.
Es bastante lento. Puede aumentar la velocidad agregando el parámetro de línea de comandos
--workers 1000. Pero puede aumentar la velocidad aún más anteponiendo
masscan primero para encontrar rápidamente los puertos 3389 disponibles, y luego usar
solo rdpscan para escanear esas máquinas resultantes en busca de la vulnerabilidad.
masscan 10.0.0.0/8 -p3389 --rate 1000000 >ips.txt
rdpscan --file ips.txt > results.txt
O, en un solo paso, canalizando la salida de uno al otro:
masscan 10.0.0.0/8 -p3389 --rate 1000000 | rdpscan --file -
Puede obtener detalles de diagnóstico más detallados usando el parámetro -d, que se
imprime en stderr. Así es como suelo ejecutar el programa:
rdpscan --file ips.txt 2> diag.txt 1> results.txt
La parte difícil es tener las bibliotecas OpenSSL instaladas y que no entren en conflicto con otras versiones del sistema. En Debian Linux, hago:
$ sudo apt install libssl-dev
Una vez resuelto ese problema, simplemente compile todos los archivos .c juntos
así:
$ gcc *.c -lssl -lcrypto -o rdpscan
He incluido un Makefile en el directorio que hace esto, por lo que probablemente pueda hacer simplemente:
$ make
El código está escrito en C, por lo que necesita un compilador de C instalado, como hacer lo siguiente:
$ sudo apt install build-essential
Esta sección describe los errores de compilación más evidentes.
ssl.h:24:25: fatal error: openssl/rc4.h: No such file or directory
Esto significa que no tiene los encabezados de OpenSSL instalados, o no están en alguna ruta. Recuerde que incluso si tiene los binarios de OpenSSL instalados, esto no significa que tenga el material de desarrollo instalado. Necesita tanto los encabezados como las bibliotecas instaladas.
Para instalar estas cosas en Debian, haga:
$ sudo apt install libssl-dev
Para solucionar el problema de la ruta, agregue un indicador de compilación -I/usr/local/include, o algo
similar.
Un ejemplo de problema del enlazador es el siguiente:
Undefined symbols for architecture x86_64:
"_OPENSSL_init_ssl", referenced from:
_tcp_tls_connect in tcp-fac73c.o
"_RSA_get0_key", referenced from:
_rdssl_rkey_get_exp_mod in ssl-d5fdf5.o
"_SSL_CTX_set_options", referenced from:
_tcp_tls_connect in tcp-fac73c.o
"_X509_get_X509_PUBKEY", referenced from:
_rdssl_cert_to_rkey in ssl-d5fdf5.o
Obtengo esto en macOS porque hay múltiples versiones de OpenSSL. Lo soluciono codificando las rutas de forma fija:
$ gcc *.c -lssl -lcrypto -I/usr/local/include -L/usr/local/lib -o rdpscan
Según comentarios de otros, la siguiente línea de comandos podría funcionar en macOS si ha usado Homebrew para instalar cosas. Sin embargo, todavía obtengo los errores de enlace anteriores, porque he instalado otros componentes de OpenSSL que entran en conflicto.
gcc $(brew --prefix)/opt/openssl/lib/libssl.a $(brew --prefix)/opt/openssl/lib/libcrypto.a -o rdpscan *.c
La sección anterior ofrece consejos de inicio rápido para ejecutar el programa. Esta sección proporciona ayuda más detallada.
Para escanear un solo objetivo, simplemente pase la dirección del objetivo:
./rdpscan 192.168.10.101
Puede pasar direcciones IPv6 y nombres DNS. Puede pasar múltiples objetivos. Un ejemplo de esto sería:
./rdpscan 192.168.10.101 exchange.example.com 2001:0db8:85a3::1
También puede escanear rangos de direcciones, usando direcciones IPv4 de inicio-fin o especificación CIDR IPv4. Los rangos IPv6 no son compatibles porque son muy grandes.
./rdpscan 10.0.0.1-10.0.0.25 192.168.0.0/16
Por defecto, escanea solo 100 objetivos a la vez. Puede aumentar este número
con el parámetro --workers. Sin embargo, no importa qué tan alto establezca este
parámetro, en la práctica obtendrá un máximo de alrededor de 500 a 1500 trabajadores ejecutándose
a la vez, dependiendo de su sistema.
./rdpscan --workers 1000 10.0.0.0/24
En lugar de especificar objetivos en la línea de comandos, puede cargarlos
desde un archivo usando el bien nombrado parámetro --file:
./rdpscan --file ips.txt
El formato del archivo es una dirección, nombre o rango por línea. También puede
consumir el texto generado por masscan. Los espacios en blanco adicionales se recortan,
las líneas en blanco se ignoran y cualquier línea de comentario se ignora. Un comentario es
una línea que comienza con el carácter #, o los caracteres //.
La salida se envía a stdout dando el estado de VULNERABLE, SAFE,
o UNKNOWN. Podría haber razones adicionales para cada uno.
149.129.120.24 - UNKNOWN - FIN received
45.60.213.160 - SAFE - not RDP but HTTP
208.43.229.89 - SAFE - CredSSP required
170.104.127.137 - UNKNOWN - FIN received
86.188.190.117 - UNKNOWN - connect timeout
62.15.34.157 - SAFE - Target appears patched
216.15.251.120 - VULNERABLE -- got appid
69.62.158.174 - VULNERABLE -- got appid
92.111.20.13 - SAFE - Target appears patched
Puede procesar esto con comandos adicionales de Unix como grep y cut.
Para obtener una lista de solo las máquinas vulnerables:
./rdpscan 10.0.0.0/8 | grep 'VULN' | cut -f1 -d'-'
Aquellos marcados como "UNKNOWN" probablemente valga la pena escanearlos más tarde, especialmente
para "FIN received", que generalmente significa que el otro lado terminó la conexión
temprano debido a retrasos en Internet. Guárdelos en un archivo y luego léalos
de nuevo en el siguiente escaneo con la opción --file.
Si "CredSSP required" (que significa NLA requerido) es "SAFE" es discutible. Significa que requiere un inicio de sesión con contraseña antes de que podamos probar/disparar la vulnerabilidad. Puede que no esté parcheado y sea vulnerable a un usuario autenticado, simplemente no es explotable por un gusano o un usuario no autenticado.
Debería obtener siempre un único estado en stdout para cada dirección IP
que escanee. Por supuesto, si especifica una dirección IP varias veces, obtendrá múltiples
estados para esa dirección.
Sin embargo, debido a que este código se basa en rdesktop, hay ciertos errores
de protocolo que no conducirán a un estado. Si tiene una dirección IP pública en Internet
que produce uno de estos errores, estaré encantado de solucionarlo.
Agregar el parámetro -d vuelca información de diagnóstico sobre las conexiones a stderr.
./rdpscan 62.15.34.157 -d
[+] [62.15.34.157]:3389 - connecting...
[+] [62.15.34.157]:3389 - connected from [10.1.10.133]:49211
[+] [62.15.34.157]:3389 - SSL connection
[+] [62.15.34.157]:3389 - version = v4.8
[+] [62.15.34.157]:3389 - Sending MS_T120 check packet
[-] [62.15.34.157]:3389 - Max sends reached, waiting...
62.15.34.157 - SAFE - Target appears patched
En macOS/Linux, puede redirigir stdout y stderr por separado a diferentes
archivos de la manera habitual:
./rdpscan --file ips.txt 2> diag.txt 1> results.txt
Así que incluye soporte SOCKS5:
./rdpscan --file ips.txt --socks5 localhost --socks5port 9050
Empeora los problemas de conexión, por lo que obtiene muchos más resultados "UNKNOWN".