
Rilevamento della vulnerabilità CVE-2019-0708 BlueKeep
Questo è uno scanner rapido e approssimativo per la vulnerabilità CVE-2019-0708 in Microsoft Remote Desktop. Attualmente, ci sono circa 700.000 macchine sulla Internet pubblica vulnerabili a questa vulnerabilità, rispetto a circa 2.000.000 di macchine che hanno Desktop remoto esposto, ma sono corrette/sicure dallo sfruttamento. Molti si aspettano che nei prossimi mesi appaia un devastante worm Internet simile a WannaCry e notPetya. Pertanto, scansiona le tue reti e applica le patch ai tuoi sistemi. Questo strumento semplifica la scansione delle reti per trovare macchine vulnerabili.
Per usare questo strumento, puoi scaricare un "binario" da eseguire dalla riga di comando, oppure scaricare il codice sorgente e compilarlo. Per Windows, è disponibile un binario precompilato.
Questo strumento è basato interamente sulla patch di rdesktop da https://github.com/zerosum0x0/CVE-2019-0708.
Ho semplicemente tagliato il codice per poterlo compilare facilmente su macOS e Windows,
e ho aggiunto la possibilità di scansionare più target.
Questo è vecchio solo di un paio di giorni e sperimentale. Tuttavia, lo sto testando scansionando
l'intera Internet (con l'aiuto di masscan), quindi sto risolvendo molti problemi
abbastanza rapidamente. Puoi contattarmi su Twitter (@erratarob) per aiuto/commenti.
Per scansionare una rete, esegui come segue:
rdpscan 192.168.1.1-192.168.1.1.255
Questo stamperà un risultato per riga per ogni indirizzo, indicando VULNERABLE se è vulnerabile al bug, SAFE se è (probabilmente) sicuro, o UNKNOWN se il programma non ha potuto determinare lo stato, ad esempio non ricevendo risposta dal target. Poiché la maggior parte dei target non risponde, statisticamente, la maggior parte sarà UNKNOWN.
È piuttosto lento. Puoi aumentare la velocità aggiungendo il parametro da riga di comando
--workers 1000. Ma puoi aumentare ulteriormente la velocità anteponendo
masscan per trovare rapidamente le macchine con la porta 3389 disponibile, e poi usare solo
rdpscan per scansionare quelle macchine risultanti per la vulnerabilità.
masscan 10.0.0.0/8 -p3389 --rate 1000000 >ips.txt
rdpscan --file ips.txt > results.txt
Oppure, in un unico passaggio, reindirizzando l'output dell'uno all'altro:
masscan 10.0.0.0/8 -p3389 --rate 1000000 | rdpscan --file -
Puoi ottenere dettagli diagnostici più verbosi usando il parametro -d, che vengono
stampati su stderr. Ecco come eseguo di solito il programma:
rdpscan --file ips.txt 2> diag.txt 1> results.txt
La parte difficile è installare le librerie OpenSSL, e assicurarsi che non entrino in conflitto con altre versioni presenti sul sistema. Su Debian Linux, faccio:
$ sudo apt install libssl-dev
Una volta risolto il problema, basta compilare tutti i file .c insieme
così:
$ gcc *.c -lssl -lcrypto -o rdpscan
Ho messo un Makefile nella directory che fa questo, quindi probabilmente puoi fare semplicemente:
$ make
Il codice è scritto in C, quindi richiede un compilatore C installato, ad esempio eseguendo:
$ sudo apt install build-essential
Questa sezione descrive gli errori di compilazione più ovvi.
ssl.h:24:25: fatal error: openssl/rc4.h: No such file or directory
Questo significa che non hai gli header di OpenSSL installati, o che non si trovano in un percorso valido. Ricorda che anche se hai i binari di OpenSSL installati, questo non significa che hai installato i file di sviluppo. Devi installare sia gli header che le librerie.
Per installare queste cose su Debian, esegui:
$ sudo apt install libssl-dev
Per risolvere il problema del percorso, aggiungi un flag di compilazione
-I/usr/local/include, o qualcosa di simile.
Un esempio di problema del linker è il seguente:
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
Ottengo questo su macOS perché ci sono più versioni di OpenSSL. Risolvo codificando i percorsi in modo esplicito:
$ gcc *.c -lssl -lcrypto -I/usr/local/include -L/usr/local/lib -o rdpscan
Secondo i commenti di altri, la seguente riga di comando potrebbe funzionare su macOS se hai usato Homebrew per installare le cose. Tuttavia, ottengo ancora gli errori di linking di cui sopra, perché ho installato altri componenti OpenSSL che sono in conflitto.
gcc $(brew --prefix)/opt/openssl/lib/libssl.a $(brew --prefix)/opt/openssl/lib/libcrypto.a -o rdpscan *.c
La sezione precedente fornisce suggerimenti rapidi per eseguire il programma. Questa sezione fornisce un aiuto più approfondito.
Per scansionare un singolo target, passa l'indirizzo del target:
./rdpscan 192.168.10.101
Puoi passare indirizzi IPv6 e nomi DNS. Puoi passare più target. Un esempio potrebbe essere:
./rdpscan 192.168.10.101 exchange.example.com 2001:0db8:85a3::1
Puoi anche scansionare intervalli di indirizzi, usando indirizzi IPv4 inizio-fine o specifica CIDR IPv4. Gli intervalli IPv6 non sono supportati perché sono troppo grandi.
./rdpscan 10.0.0.1-10.0.0.25 192.168.0.0/16
Per impostazione predefinita, scansiona solo 100 target alla volta. Puoi aumentare
questo numero con il parametro --workers. Tuttavia, indipendentemente da quanto alto
imposti questo parametro, in pratica otterrai un massimo di circa 500-1500 worker
in esecuzione contemporaneamente, a seconda del tuo sistema.
./rdpscan --workers 1000 10.0.0.0/24
Invece di specificare i target sulla riga di comando, puoi caricarli
da un file usando l'appropriato parametro --file:
./rdpscan --file ips.txt
Il formato del file è un indirizzo, nome o intervallo per riga. Può anche
consumare il testo generato da masscan. Gli spazi bianchi extra vengono rimossi,
le righe vuote ignorate e le righe di commento vengono ignorate. Un commento è
una riga che inizia con il carattere # o con i caratteri //.
L'output viene inviato a stdout fornendo lo stato di VULNERABLE, SAFE,
o UNKNOWN. Potrebbero esserci motivi aggiuntivi per ciascuno.
149.129.120.24 - UNKNOWN - FIN received
45.60.213.160 - SAFE - not RDP but HTTP