
Un scanner rapide pour la vulnérabilité CVE-2019-0708 "BlueKeep".
Ceci est un scanner rapide et simple pour la vulnérabilité CVE-2019-0708 dans Microsoft Remote Desktop. Actuellement, environ 900 000 machines sur Internet public sont vulnérables à cette vulnérabilité, donc beaucoup s'attendent à un ver imminent comme WannaCry et notPetya. Par conséquent, analysez vos réseaux et corrigez (ou au moins, activez NLA) sur les systèmes vulnérables.
C'est un outil en ligne de commande. Vous pouvez télécharger le code source et le compiler vous-même, ou télécharger l'un des binaires pré-compilés pour Windows ou macOS depuis le lien ci-dessus.
Cet outil est entièrement basé sur le patch rdesktop de https://github.com/zerosum0x0/CVE-2019-0708.
J'ai simplement réduit le code afin de pouvoir le compiler facilement sur macOS et Windows,
et j'ai ajouté la possibilité de scanner plusieurs cibles.
Ceci est vieux de quelques jours seulement et expérimental. Cependant, je le teste en scannant tout l'Internet
(avec l'aide de masscan), donc je résous pas mal de problèmes assez rapidement.
Vous pouvez essayer de me contacter sur twttier(@erratarob) pour de l'aide/commentaires.
Pour scanner un réseau, exécutez-le comme suit :
rdpscan 192.168.1.1-192.168.1.255
Cela produit l'un des 3 résultats pour chaque adresse :
Lorsqu'il n'y a rien à une adresse IP cible, les anciennes versions imprimaient le message "UNKNOWN - connection timed out". Lors de l'analyse de grands réseaux, cela produit une surcharge d'informations sur des systèmes dont vous ne vous souciez pas. Par conséquent, la nouvelle version ne produit pas ces informations par défaut, sauf si vous ajoutez -v (pour verbose) sur la ligne de commande.
Vous pouvez augmenter la vitesse d'analyse des grands réseaux en augmentant le nombre de workers :
rdpscan --workers 10000 10.0.0.0/8
Cependant, sur mon ordinateur, cela ne produit qu'environ 1500 workers, en raison des limitations du système, peu importe la valeur élevée de ce paramètre.
Vous pouvez augmenter encore plus la vitesse en l'utilisant conjointement
avec masscan, décrit dans la deuxième section ci-dessous.
Il y a trois réponses générales :
Il y a trois raisons principales pour lesquelles nous pensons qu'une cible est sûre :
Cela signifie que nous avons confirmé que le système est vulnérable au bogue.
Il existe une multitude de variations pour inconnu
Cet outil rdpscan est assez lent, ne scannant que quelques centaines de cibles
par seconde. Vous pouvez plutôt utiliser masscan
pour accélérer les choses. L'outil masscan est environ 1000 fois plus rapide,
mais ne donne que des informations limitées sur la cible.
Les étapes sont :
masscan dans rdpscan, afin qu'il n'ait
à scanner que les cibles que nous savons actives.La façon simple de l'exécuter est de les combiner sur la ligne de commande :
masscan 10.0.0.0/8 -p3389 | rdpscan --file -
La façon dont je le fais est en deux étapes :
masscan 10.0.0.0/8 -p3389 > ips.txt
rdpscan --file ips.txt --workers 10000 >results.txt
La partie difficile est d'installer les bibliothèques OpenSSL sans entrer en conflit avec d'autres versions sur le système. Sur Debian Linux, je fais :
$ sudo apt install libssl-dev
Une fois ce problème résolu, il vous suffit de compiler tous les fichiers .c ensemble
comme ceci :
$ gcc *.c -lssl -lcrypto -o rdpscan
J'ai mis un Makefile dans le répertoire qui fait cela, donc vous pouvez probablement faire simplement :
$ make
Le code est écrit en C, donc nécessite un compilateur C installé, par exemple en faisant :
$ sudo apt install build-essential
Cette section décrit les erreurs de compilation les plus évidentes.
ssl.h:24:25: fatal error: openssl/rc4.h: No such file or directory
Cela signifie que vous n'avez pas les en-têtes OpenSSL installés, ou qu'ils ne sont pas dans un chemin quelque part. N'oubliez pas que même si vous avez les binaires OpenSSL installés, cela ne signifie pas que vous avez les éléments de développement installés. Vous devez avoir à la fois les en-têtes et les bibliothèques installés.
Pour installer ces éléments sur Debian, faites :
$ sudo apt install libssl-dev
Pour résoudre le problème de chemin, ajoutez un drapeau de compilation -I/usr/local/include,
ou quelque chose de similaire.
Un exemple de problème de liaison est le suivant :
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
J'obtiens cela sur macOS car il y a plusieurs versions d'OpenSSL. Je le résous en codant en dur les chemins :
$ gcc *.c -lssl -lcrypto -I/usr/local/include -L/usr/local/lib -o rdpscan
Selon les commentaires d'autres, la ligne de commande suivante pourrait fonctionner sur macOS si vous avez utilisé Homebrew pour installer des choses. J'obtiens toujours les erreurs de liaison ci-dessus, cependant, car j'ai installé d'autres composants OpenSSL qui sont en conflit.
gcc $(brew --prefix)/opt/openssl/lib/libssl.a $(brew --prefix)/opt/openssl/lib/libcrypto.a -o rdpscan *.c
La section ci-dessus donne des conseils de démarrage rapide pour exécuter le programme. Cette section donne une aide plus approfondie.
Pour scanner une seule cible, passez simplement l'adresse de la cible :
./rdpscan 192.168.10.101
Vous pouvez passer des adresses IPv6 et des noms DNS. Vous pouvez passer plusieurs cibles. Un exemple serait :
./rdpscan 192.168.10.101 exchange.example.com 2001:0db8:85a3::1
Vous pouvez également scanner des plages d'adresses, en utilisant soit des adresses IPv4 début-fin, soit une spécification CIDR IPv4. Les plages IPv6 ne sont pas prises en charge car elles sont trop grandes.
./rdpscan 10.0.0.1-10.0.0.25 192.168.0.0/16
Par défaut, il ne scanne que 100 cibles à la fois. Vous pouvez augmenter ce nombre avec
le paramètre --workers. Cependant, peu importe la valeur élevée de ce paramètre, en
pratique vous obtiendrez un maximum d'environ 500 à 1500 workers en cours d'exécution à
la fois, selon votre système.
./rdpscan --workers 1000 10.0.0.0/24
Au lieu de spécifier les cibles sur la ligne de commande, vous pouvez les charger à partir
d'un fichier, en utilisant le paramètre bien nommé --file :
./rdpscan --file ips.txt
Le format du fichier est une adresse, un nom ou une plage par ligne. Il peut également
consommer le texte généré par masscan. Les espaces supplémentaires sont supprimés, les
lignes vides ignorées et les lignes de commentaire ignorées. Un commentaire est une
ligne commençant par le caractère #, ou les caractères //.
La sortie est envoyée sur stdout donnant le statut VULNÉRABLE, SAFE ou INCONNU.
Il peut y avoir des raisons supplémentaires pour chacun. Ces raisons sont décrites
ci-dessus.
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
Vous pouvez traiter cela avec des commandes unix supplémentaires comme grep et cut.
Pour obtenir une liste des seules machines vulnérables :
./rdpscan 10.0.0.0/8 | grep 'VULN' | cut -f1 -d'-'
Le paramètre -dddd signifie information diagnostique, où plus vous ajoutez de d,
plus les détails sont imprimés. Ceci est envoyé sur stderr au lieu de stdout afin que
vous puissiez séparer les flux. Avec bash, cela se fait comme ceci :
./rdpscan --file myips.txt -ddd 2> diag.txt 1> results.txt
L'ajout du paramètre -d vide les informations de diagnostic sur les connexions vers 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
Sur macOS/Linux, vous pouvez rediriger stdout et stderr séparément vers différents
fichiers de la manière habituelle :
./rdpscan --file ips.txt 2> diag.txt 1> results.txt
Donc il inclut le support SOCKS5 :
./rdpscan --file ips.txt --socks5 localhost --socks5port 9050
Cela aggrave les problèmes de connexion, donc vous obtenez beaucoup plus de résultats "UNKNOWN".