
Un escáner rápido para la vulnerabilidad CVE-2019-0708 "BlueKeep".
Este es un escáner rápido y sencillo para la vulnerabilidad CVE-2019-0708 en Escritorio Remoto de Microsoft. En este momento, hay alrededor de 900.000 máquinas en Internet público vulnerables a esta vulnerabilidad, por lo que muchos esperan un gusano pronto como WannaCry y notPetya. Por lo tanto, escanea tus redes y parchea (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 de arriba.
Esta herramienta se basa completamente en el parche de 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 y es experimental. Sin embargo, lo estoy probando escaneando
todo el Internet (con la ayuda de masscan), por lo 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 importan. Por lo tanto, la nueva versión por defecto no produce esta información a menos que añadas -v (verbose) en la línea de comandos.
Puedes aumentar la velocidad de escaneo de redes grandes incrementando el número de workers:
rdpscan --workers 10000 10.0.0.0/8
Sin embargo, en mi computadora, solo produce alrededor de 1500 workers, debido a las limitaciones del sistema, sin importar qué tan alto configure este parámetro.
Puedes aumentar la velocidad aún más usando esto junto
con masscan, descrito en la segunda sección a continuación.
Hay tres respuestas generales:
Hay tres razones principales por las que creemos que un objetivo es seguro:
Esto significa que hemos confirmado que el sistema es vulnerable al error.
Hay muchísimas variaciones para desconocido
Esta herramienta rdpscan es bastante lenta, escaneando solo unos pocos cientos de objetivos por segundo.
Puedes usar masscan para acelerar las cosas.
La herramienta masscan es aproximadamente 1000 veces más rápida, pero solo da información limitada
sobre el objetivo.
Los pasos son:
masscan en 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 instalar las bibliotecas OpenSSL, y que no entren en conflicto con otras versiones en el sistema. Algunos ejemplos para versiones de Linux en las que he probado son los siguientes, pero los nombres de los paquetes cambian constantemente de una distribución a otra. Además, hay muchas opciones para una API compatible con OpenSSL, como BoringSSL y LibreSSL.
$ sudo apt install libssl-dev
$ sudo yum install openssl-devel
Una vez que hayas resuelto ese problema, simplemente compila todos los archivos .c juntos
así:
$ gcc *.c -lssl -lcrypto -o rdpscan
He puesto un Makefile en el directorio que hace esto, por lo que probablemente puedas hacer simplemente:
$ make
El código está escrito en C, por lo que necesita un compilador de C instalado, como por ejemplo haciendo lo siguiente:
$ sudo apt install build-essential
Esta sección describe los errores de compilación más obvios.
ssl.h:24:25: fatal error: openssl/rc4.h: No such file or directory
Esto significa que no tienes los encabezados de OpenSSL instalados, o no están en alguna ruta. Recuerda que incluso si tienes los binarios de OpenSSL instalados, esto no significa que tengas instalado el material de desarrollo. Necesitas tanto los encabezados como las bibliotecas instalados.
Para instalar estas cosas en Debian, haz:
$ sudo apt install libssl-dev
Para solucionar el problema de la 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
Obtengo esto en macOS porque hay múltiples versiones de OpenSSL. Lo soluciono codificando las rutas:
$ 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 cosas. Sin embargo, todavía obtengo los errores de enlace 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 da consejos de inicio rápido para ejecutar el programa. Esta sección da ayuda más detallada.
Para escanear un solo objetivo, simplemente pasa la dirección del objetivo:
./rdpscan 192.168.10.101
Puedes pasar direcciones IPv6 y nombres DNS. Puedes pasar múltiples objetivos. Un ejemplo de esto 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 cuán alto configures este
parámetro, en la práctica obtendrás un máximo de alrededor de 500 a 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 parámetro --file bien nombrado:
./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. 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 de diagnóstico, donde cuantas más ds
añadas, más detalles se imprimen. Esto se envía a stderr en lugar de 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
Incluye soporte SOCKS5:
./rdpscan --file ips.txt --socks5 localhost --socks5port 9050
Empeora los problemas de conexión, por lo que obtienes muchos más resultados "UNKNOWN".
Para publicar los binarios de Windows y macOS adjuntos como lanzamientos a este proyecto, enlazo estáticamente OpenSSL, para que no necesite ser incluido por separado y los programas simplemente funcionen. Esta sección describe algunas notas sobre cómo hacer esto, especialmente dado que la descripción en la propia página de OpenSSL parece estar desactualizada.
Ambos pasos comienzan descargando el código fuente de OpenSSL y colocándolo
junto al directorio de rdpscan:
git clone https://github.com/openssl/openssl
Para Windows, primero necesitas instalar alguna versión de Perl. Yo uso el de ActiveState.
A continuación, necesitarás un "ensamblador" especial. Uso el recomendado llamado NASM.
A continuación, necesitarás un compilador. Yo uso VisualStudio 2010. Puedes descargar la última "Visual Studio Community Edition" (que es 2019) en su lugar desde Microsoft.
Ahora necesitas construir el makefile. Esto se hace yendo al directorio de OpenSSL
y ejecutando el programa Perl Configure:
perl Configure VC-WIN32
Elegí 32 bits para Windows porque hay muchos Windows antiguos por ahí, y quiero que el programa sea lo más compatible posible con versiones antiguas.
Quiero una construcción completamente estática, incluyendo el runtime de C. Para hacer eso, abrí
el makefile resultante en un editor y cambié la bandera de compilación de C de
/MD (que significa usar DLLs) a /MT. Mientras estaba allí, añadí lo siguiente
a CPPFLAGS -D_WIN32_WINNT=0x501, que restringe OpenSSL a características que
funcionan en Windows XP y Server 2003. De lo contrario, obtienes errores de que bcrypt.dll
no se encontró si ejecutas en esos sistemas más antiguos.
Ahora necesitarás asegurarte de que todo esté en tu PATH. Copié nasm.exe
a un directorio en el PATH. Para Visual Studio 2010, ejecuté el programa
vcvars32.bat para configurar las variables de ruta para el compilador.
En este punto, en la línea de comandos, escribí:
nmake
Esto crea las bibliotecas. Las estáticas son libssl_static.lib y libcrypto_static.lib,
que uso para enlazar en rdpscan.
Primero, necesitas instalar un compilador. Yo uso las Herramientas de Desarrollador de Apple, instalando
XCode y el compilador. Creo que puedes usar Homebrew para instalar gcc en su lugar.
Luego ve al directorio de código fuente de OpenSSL y crea un makefile:
perl Configure darwin64-x86_64-cc
Ahora simplemente hazlo:
make depend
make
En este punto, ha creado bibliotecas tanto dinámicas (.dylib) como estáticas (.lib). Eliminé
las bibliotecas dinámicas para que tome las estáticas por defecto.
Ahora en rdpscan, simplemente construye el makefile de macOS:
make -f Makefile.macos
Esto compilará todos los archivos fuente de rdpscan, y luego enlazará con las bibliotecas OpenSSL
en el directorio ../openssl que acabas de construir.
Esto debería producir un ejecutable de 3 megabytes. Si en su lugar solo obtuviste un ejecutable de 200 kilobytes, entonces cometiste un error y enlazaste con las bibliotecas dinámicas.