
Un escáner rápido para la vulnerabilidad CVE-2019-0708 "BlueKeep".
Este es un escáner rápido y sucio para la vulnerabilidad CVE-2019-0708 en Microsoft Remote Desktop. Ahora mismo, hay alrededor de 900.000 máquinas en Internet público vulnerables a esta vulnerabilidad, por lo que muchos esperan que pronto aparezca un gusano como WannaCry y notPetya. Por tanto, escanea tus redes y aplica el parche (o al menos, habilita NLA) en los sistemas vulnerables.
Esta es una herramienta de línea de comandos. Puedes descargar el código fuente y compilarlo tú mismo, o descargar uno de los binarios precompilados para Windows o macOS desde el enlace anterior.
Esta herramienta se basa por completo 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 añadir la capacidad de escanear múltiples objetivos.
Esto tiene solo unos días de vida 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. Puedes intentar contactarme en Twitter (@erratarob) para ayuda/comentarios.
Para escanear una red, ejecútalo de la siguiente manera:
rdpscan 192.168.1.1-192.168.1.255
Esto produce uno de 3 resultados para cada dirección:
Cuando no hay nada en una dirección IP objetivo, las versiones antiguas imprimían el mensaje "UNKNOWN - connection timed out". Al escanear redes grandes, esto produce una sobrecarga de demasiada información sobre sistemas que no te interesan. Por lo tanto, la nueva versión por defecto no produce esta información a menos que añadas -v (para verbose) en la línea de comandos.
Puedes aumentar la velocidad con la que escanea redes grandes incrementando el número de workers:
rdpscan --workers 10000 10.0.0.0/8
Sin embargo, en mi ordenador solo produce unos 1500 workers, debido a las limitaciones del sistema, no importa lo alto que configure este parámetro.
Puedes aumentar la velocidad aún más usando esto en combinación
con masscan, descrito en la sección de abajo.
Hay tres respuestas generales:
Aunque las tres respuestas principales son SAFE, VULNERABLE y UNKNOWN, contienen texto adicional que explica el diagnóstico. Esta sección describe las distintas cadenas que verás.
Hay tres razones principales por las que creemos que un objetivo está seguro:
Esto significa que hemos confirmado que el sistema es vulnerable al fallo.
Hay una infinidad de variaciones para UNKNOWN.
Esta herramienta rdpscan es bastante lenta, ya que solo escanea unos cientos de objetivos por segundo.
En su lugar, puedes usar masscan para acelerar las cosas.
La herramienta masscan es aproximadamente 1000 veces más rápida, pero solo proporciona información limitada
sobre el objetivo.
Los pasos son:
masscan a rdpscan, para que solo tenga que escanear los objetivos
que sabemos que están activos.La forma sencilla de ejecutar esto es simplemente combinarlos en la línea de comandos:
masscan 10.0.0.0/8 -p3389 | rdpscan --file -
La forma en que lo hago es en dos pasos:
masscan 10.0.0.0/8 -p3389 > ips.txt
rdpscan --file ips.txt --workers 10000 >results.txt
La parte difícil es conseguir instalar las librerías OpenSSL sin que entren en conflicto con otras versiones del sistema. En Debian Linux, hago:
$ sudo apt install libssl-dev
Una vez resuelto ese problema, solo tienes que compilar todos los archivos .c juntos
de esta manera:
$ gcc *.c -lssl -lcrypto -o rdpscan
He puesto un Makefile en el directorio que hace esto, así que probablemente puedas hacer simplemente:
$ make
El código está escrito en C, por lo que necesita un compilador de C instalado, como haciendo 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 o no tienes instaladas las cabeceras de OpenSSL, o no están en alguna ruta. Recuerda que aunque tengas los binarios de OpenSSL instalados, esto no significa que tengas instalado el material de desarrollo. Necesitas tener instaladas tanto las cabeceras como las librerías.
Para instalar estas cosas en Debian, haz:
$ sudo apt install libssl-dev
Para solucionar el problema de ruta, añade una bandera 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
Me ocurre 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 has usado Homebrew para instalar las cosas. Aun así, sigo obteniendo los errores de enlazado anteriores, porque he instalado otros componentes de OpenSSL que están 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 ofrece una ayuda más detallada.
Para escanear un solo objetivo, basta con pasar la dirección del objetivo:
./rdpscan 192.168.10.101
Puedes pasar direcciones IPv6 y nombres DNS. Puedes pasar múltiples objetivos. Un ejemplo sería:
./rdpscan 192.168.10.101 exchange.example.com 2001:0db8:85a3::1
También puedes escanear rangos de direcciones, usando direcciones IPv4 inicio-fin o especificación CIDR IPv4. Los rangos IPv6 no son compatibles porque son demasiado grandes.
./rdpscan 10.0.0.1-10.0.0.25 192.168.0.0/16
Por defecto, escanea solo 100 objetivos a la vez. Puedes aumentar este número
con el parámetro --workers. Sin embargo, no importa lo alto que establezcas
este parámetro; en la práctica obtendrás un máximo de entre 500 y 1500 workers
ejecutándose a la vez, dependiendo de tu sistema.
./rdpscan --workers 1000 10.0.0.0/24
En lugar de especificar objetivos en la línea de comandos, puedes cargarlos desde
un archivo usando el bien llamado 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. Se recortan los espacios en blanco sobrantes,
se ignoran las líneas en blanco y se ignoran las líneas de comentario. Un comentario
es una línea que comienza con el carácter #, o con los caracteres //.
La salida se envía a stdout indicando el estado VULNERABLE, SAFE o UNKNOWN.
Puede haber razones adicionales para cada uno. Estas razones se describen arriba.
211.101.37.250 - SAFE - CredSSP/NLA required
185.11.124.79 - SAFE - not RDP - SSH response seen
125.121.137.42 - UNKNOWN - no connection - refused (RST)
40.117.191.215 - SAFE - CredSSP/NLA required
121.204.186.182 - SAFE - CredSSP/NLA required
99.8.11.148 - SAFE - CredSSP/NLA required
121.204.186.114 - SAFE - CredSSP/NLA required
49.50.145.236 - SAFE - CredSSP/NLA required
106.12.74.155 - VULNERABLE - got appid
222.84.253.26 - SAFE - CredSSP/NLA required
144.35.133.109 - UNKNOWN - RDP protocol error - receive timeout
199.212.226.196 - UNKNOWN - RDP protocol error - receive timeout
183.134.58.152 - UNKNOWN - no connection - refused (RST)
83.162.246.149 - VULNERABLE - got appid
Puedes procesar esto con comandos unix adicionales como grep y cut.
Para obtener una lista solo de máquinas vulnerables:
./rdpscan 10.0.0.0/8 | grep 'VULN' | cut -f1 -d'-'
El parámetro -dddd significa información diagnóstica; cuantas más ds añadas,
más detalles se imprimen. Esto se envía a stderr en lugar de a stdout para que
puedas separar los flujos. Usando bash esto se hace así:
./rdpscan --file myips.txt -ddd 2> diag.txt 1> results.txt
Añadir 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, puedes 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
Hace que los problemas de conexión empeoren, por lo que obtienes muchos más resultados "UNKNOWN".