
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.