Rdpscan – Un escáner rápido para la vulnerabilidad “BlueKeep” CVE-2019-0708

Este es un escáner rápido para la vulnerabilidad CVE-2019-0708 en el escritorio remoto de Microsoft .
En este momento, hay cerca de 900,000 máquinas en el Internet público vulnerables a esta vulnerabilidad, por lo que muchos esperan un gusano pronto como WannaCry y no Petya. Por lo tanto, escanee sus redes y parches (o al menos habilite NLA) en sistemas vulnerables.
Esta es una herramienta de línea de comandos. Puede descargar la fuente y compilarla usted mismo, o puede descargar uno de los archivos binarios precompilados para Windows o macOS desde el enlace de arriba.
Esta herramienta se basa completamente en el rdesktopparche de https://github.com/zerosum0x0/CVE-2019-0708 .
Uso principal
Para escanear una red, ejecútelo de la siguiente manera:

rdpscan 192.168.1.1-192.168.1.255

Esto produce uno de los 3 resultados para cada dirección:

  • SEGURO: si el objetivo ha determinado que el bot esté parchado o al menos requiera CredSSP / NLA
  • VULNERABLE – si se ha confirmado que el objetivo es vulnerable
  • DESCONOCIDO: si el objetivo no responde o tiene algún error de protocolo

Cuando no existe nada en una dirección IP de destino, las versiones anteriores publicaron el mensaje ” Desconocido: se agotó el tiempo de conexión “. Al escanear redes grandes, esto produce una sobrecarga de demasiada información sobre los sistemas que no le interesan. Por lo tanto, la nueva versión de forma predeterminada no produce esta información a menos que agregue -v (para más detalles) en la línea de comandos.
Puede aumentar la velocidad a la que escanea redes grandes al aumentar el número de trabajadores:

rdpscan --workers 10000 10.0.0.0/8

Sin embargo, en mi computadora, solo produce alrededor de 1500 trabajadores, debido a las limitaciones del sistema, no importa lo alto que configure este parámetro.
Puede aumentar la velocidad aún más si usa esto en conjunto con masscan, como se describe en el segundo a continuación.

Interpretando los resultados
Hay tres respuestas generales:

  • SEGURO : lo que significa que el objetivo probablemente esté parcheado o no sea vulnerable al error.
  • VULNERABLE : lo que significa que hemos confirmado que el objetivo es vulnerable a este error, y que cuando llegue el gusano, es probable que se infecte.
  • DESCONOCIDO : significa que no podemos confirmar de ninguna manera, generalmente porque el objetivo no responde o no ejecuta RDP, que es la gran mayoría de las respuestas. Además, cuando los destinos no tienen recursos o están experimentando problemas de red, obtendremos muchos de estos. Finalmente, los errores de protocolo son responsables de mucho. Si bien las tres respuestas principales son SEGURAS , VULNERABLES y DESCONOCIDAS , contienen un texto adicional que explica el diagnóstico. Esta sección describe las diversas cadenas que verá.

SEGURO
Hay tres razones principales que creemos que un objetivo es seguro:

  • SEGURO: el objetivo aparece parcheado Esto sucede cuando el objetivo no responde a la solicitud de activación. Esto significa que es un sistema Windows que ha sido parchado, o un sistema que no era vulnerable para empezar, como Windows 10 o Unix.
  • SEGURO: se requiere CredSSP / NLA Esto significa que el objetivo primero requiere la autenticación a nivel de red antes de que se pueda establecer la conexión RDP. La herramienta no puede pasar este punto, sin credenciales leigitimate, por lo que no puede determinar si el objetivo ha sido parchado. Sin embargo, los hackers tampoco pueden continuar más allá de este punto para explotar sistemas vulnerables, por lo que es probable que esté “seguro”. Sin embargo, cuando aparezcan los exploits, los usuarios con nombres de usuario / contraseñas válidos podrán explotar el sistema si no está parcheado.
  • SEGURO: no RDP Esto significa que el sistema no es RDP, pero tiene algún otro servicio que usa este mismo puerto y produce una respuesta que claramente no es RDP. Ejemplos comunes son HTTP y SSH. Sin embargo, tenga en cuenta que en lugar de un protocolo identificable, un servidor puede responder con un paquete RST o FIN. Estos se identifican como DESCONOCIDOS en lugar de SEGUROS /

VULNERABLE
Esto significa que hemos confirmado que el sistema es vulnerable al error.

  • VULNERABLE – got appid Esta es solo una respuesta cuando el sistema es vulnerable.

DESCONOCIDO
Hay un millón de variaciones para desconocido

  • DESCONOCIDO: sin conexión – tiempo de espera Esta es, con mucho, la respuesta más común, y ocurre cuando la dirección IP de destino no responde en absoluto. De hecho, es tan común que al escanear grandes rangos de direcciones, generalmente se omite. Debe agregar el indicador -v (detallado) para habilitarlo.
  • DESCONOCIDO: sin conexión, rechazado (RST) Esta es, con mucho, la segunda respuesta más común, y ocurre cuando el destino existe y responde al tráfico de la red, pero no ejecuta RDP, por lo que rechaza la conexión con un paquete TCP RST.
  • DESCONOCIDO: error del protocolo RDP: tiempo de espera de recepción Esta es la tercera respuesta más común, y ocurre cuando hemos establecido con éxito una conexión RDP, pero luego el servidor deja de respondernos. Esto se debe a errores de red y cuando el sistema de destino está sobrecargado por algún motivo. También podría haber errores de red en este extremo, como cuando estás detrás de un NAT y lo sobrecargas con demasiadas conexiones.
  • DESCONOCIDO – sin conexión – conexión cerrada Esto significa que hemos establecido una conexión (TCP SYN-ACK), pero luego la conexión se cierra de inmediato (con un RST o FIN). Hay muchas razones por las que esto sucede, que no podemos distinguir:
    • Está ejecutando RDP, pero por alguna razón cierra la conexión, posiblemente porque no tiene recursos.
    • No es RDP y no le gusta la solicitud de RDP que le enviamos, por lo que en lugar de enviarnos un mensaje de error agradable (que activaría SAFE, no RDP ), cierra la conexión de manera abrupta.
    • Algunos dispositivos intermedios, como un IPS, un firewall o NAT cerraron la conexión porque identificó esto como hostil o se quedó sin recursos.
    • Alguna otra razón por la que no he identificado, hay muchas cosas raras que suceden cuando escaneo Internet.
  • DESCONOCIDO: no hay conexión: no se puede acceder al host (error de ICMP) La red remota informa que no se puede acceder al host o que no se está ejecutando. Inténtalo de nuevo más tarde si crees que el host debería estar vivo.
  • DESCONOCIDO: no hay conexión: no se puede acceder a la red (error de ICMP) Hay un error de red (transitorio) en el otro extremo, inténtelo de nuevo más tarde si cree que la red debería estar funcionando.
  • DESCONOCIDO: error del protocolo RDP Esto significa que se produjo algún daño en el protocolo RDP, ya sea porque el lado remoto implique que está mal (no es un sistema Windows), porque está manejando mal un error transitorio de la red, o algo más.
  • DESCONOCIDO: error del protocolo SSL Desde Windows Vista, RDP usa el protocolo STARTTLS para ejecutarse sobre SSL. Esta capa tiene sus propios problemas, como el anterior, que incluye el manejo inadecuado de los errores de red subyacentes o el intento de comunicarse con sistemas que tienen algún tipo de incompatibilidad. Si recibe un mensaje de error muy largo aquí (como SSL3_GET_RECORD: versión incorrecta), es porque la otra parte tiene un error en SSL, o su propia biblioteca de SSL que está utilizando tiene un error.

Uso con masscan
Estardpscanherramienta es bastante lenta, solo escanea unos cientos de objetivos por segundo. En su lugar, puede utilizarmasscanpara acelerar las cosas. Lamasscanherramienta es aproximadamente 1000 veces más rápida, pero solo proporciona información limitada sobre el objetivo.
Los pasos son:

  • Primero escanee los rangos de direcciones con masscan para encontrar rápidamente hosts que respondan en el puerto 3389 (o cualquier puerto que use).
  • En segundo lugar alimentar la salida de masscandentro rdpscan, por lo que sólo tiene que escanear objetivos que conocemos 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

Construyendo
La parte difícil es tenerinstaladas las bibliotecas de OpenSSL , y no estar en conflicto con otras versiones en el sistema. Algunos ejemplos de versiones de Linux que he probado son los siguientes, pero siguen cambiando los nombres de los paquetes de una distribución a la siguiente. 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 haya resuelto ese problema, simplemente compile todos los .carchivos juntos de esta manera:

$ gcc *.c -lssl -lcrypto -o rdpscan

He puesto un Makefile en el directorio que hace esto, por lo que es probable que puedas hacer solo:

$ 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

Errores comunes de compilación
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 o bien no tiene instalados los encabezados OpensSSL, o que no están en una ruta en algún lugar. Recuerda que incluso si tienes instalados los binarios de OpenSSL, esto no significa que tengas las cosas de desarrollo instaladas. Necesitas tanto los encabezados como las bibliotecas instaladas.
Para instalar estas cosas en Debian, haz:

$ sudo apt install libssl-dev

Para solucionar el problema de la ruta, agregue un indicador de compilación -I/usr/local/includeo algo similar.
Un problema de enlazador de ejemplo 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 varias versiones de OpenSSL. Arreglo esto codificando los caminos:

$ gcc *.c -lssl -lcrypto -I/usr/local/include -L/usr/local/lib -o rdpscan

De acuerdo con los comentarios de otros, la siguiente línea de comandos podría funcionar en macOS si has usado Homebrew para instalar cosas. Sin embargo, aún obtengo los errores de enlace anteriores, porque he instalado otros componentes OpenSSL que están en conflicto.

gcc $(brew --prefix)/opt/openssl/lib/libssl.a $(brew --prefix)/opt/openssl/lib/libcrypto.a -o rdpscan *.c

Ejecución
La sección anterior proporciona consejos de inicio rápido para ejecutar el programa. Esta sección da más ayuda en profundidad.
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 en 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, utilizando direcciones IPv4 de principio a fin o la especificación CIDR de IPv4. Los rangos de IPv6 no son compatibles porque son muy grandes.

./rdpscan 10.0.0.1-10.0.0.25 192.168.0.0/16

Por defecto, solo escanea 100 objetivos a la vez. Puede aumentar este número con el --workersparámetro. 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 al mismo tiempo, 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 en su lugar, utilizando el --fileparámetro 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. El espacio en blanco adicional se recorta, las líneas en blanco se ignoran, cualquier línea de comentario se ignora. Un comentario es una línea que comienza con el #carácter o //caracteres.
La salida se envía para stdoutdar el estado de VULNERABLE, SAFE o UNKNOWN. Podría haber razones adicionales para cada uno. Estas razones se describen anteriormente.

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

Puede procesar esto con comandos unix adicionales como grepcut. Para obtener una lista de solo máquinas vulnerables:

./rdpscan 10.0.0.0/8 | grep 'VULN' | cut -f1 -d'-'

El parámetro -ddddsignifica información de diagnóstico , donde cuanto más dagregue, más detalles se imprimirán. Esto se envía en stderrlugar de stdout para que pueda separar las secuencias. Usando bashesto se hace así:

./rdpscan --file myips.txt -ddd 2> diag.txt 1> results.txt

Información de diagnóstico
Al agregar el-dparámetro se vuelca la información de diagnóstico en las conexiones astderr.

./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 stdoutstderrseparar a diferentes archivos de la manera habitual:

./rdpscan --file ips.txt 2> diag.txt 1> results.txt

SOCKS5 y Tor lulz
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 “DESCONOCIDOS”.

Enlace estático de OpenSSL
Para liberar los binarios de Windows y macOS adjuntos como versiones de este proyecto, vinculo estáticamente OpenSSL, para que no sea necesario incluirlo por separado, y los programas simplemente funcionan . Esta sección describe algunas notas sobre cómo hacer esto, especialmente porque la descripción en la propia página de OpenSSL parece estar desactualizada.
Estos dos pasos comienzan con la descarga de la fuente OpenSSL y lo ponen al lado del rdpscandirectorio:

git clone https://github.com/openssl/openssl

Windows
Para Windows, primero debe instalar alguna versión de Perl. Yo uso el de ActiveState .
A continuación, necesitará un “ensamblador” especial. Yo uso el recomendado llamado NASM )

A continuación, necesitará un compilador. Utilizo VisualStudio 2010. Puede descargar la última “Visual Studio Community Edition” (que es 2019) en lugar de Microsoft.
Ahora necesitas construir el makefile. Esto se hace entrando en el directorio OpenSSL y ejecutando el Configureprograma Perl:

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 las versiones anteriores.
Quiero una compilación completamente estática, incluido el tiempo de ejecución de C. Para hacer eso, abrí el makefile resultante en un editor y cambié la marca de compilación de C /MD(lo que significa que usa DLL) /MT. Mientras estuve allí, agregué lo siguiente a CPPFLAGS -D_WIN32_WINNT=0x501, que restringe OpenSSL a las funciones que funcionan en Windows XP y Server 2003. De lo contrario, obtendrás errores que bcrypt.dll no se encontraron si ejecutas en esos sistemas más antiguos.
Ahora tendrás que asegurarte de que todo esté en tu camino. Copié nasm.exe al directorio a en el PATH. Para Visual Studio 2010, ejecuté el programa. vcvars32.batpara configurar las variables de ruta para el compilador.
En este punto en la línea de comandos, escribí:

nmake

Esto hace que las bibliotecas. Los estáticos son libssl_static.liblibcrypto_static.lib, que utilizo para enlazar en rdpscan.

macOS En
primer lugar, necesita instalar un compilador. Uso las herramientas de desarrollo de Apple para instalar XCode y el compilador. Creo que puedes usar Homebrew para instalar en su gcclugar.
Luego vaya al directorio de origen de OpenSSL y cree un archivo make:

perl Configure darwin64-x86_64-cc

Ahora simplemente hazlo:

make depend
make

En este punto, se crean las bibliotecas dinámicas ( .dylib) y estáticas ( .lib). Eliminé las bibliotecas dinámicas para que atrape las estáticas por defecto.
Ahora en rdpscan, simplemente construir el makefile macOS:

make -f Makefile.macos

Esto compilará todos los rdpscanarchivos de origen, luego se vinculará a las bibliotecas de OpenSSL en el directorio ../opensslque acaba de construir.
Esto debería producir un exexeutable de 3 megabytes. Si, en cambio, solo obtuviste un ejecutable de 200 kilobytes, cometiste un error y, en cambio, lo vinculaste con las bibliotecas dinámicas.

Fuente: kitploit.com

Please follow and like us: