
Uno scanner rapido per la vulnerabilità CVE-2019-0708 "BlueKeep".
Questo è uno scanner rapido e sporco per la vulnerabilità CVE-2019-0708 in Microsoft Remote Desktop. Al momento, ci sono circa 900.000 macchine sulla Internet pubblica vulnerabili a questa falla, quindi molti si aspettano un worm imminente come WannaCry e notPetya. Pertanto, scansiona le tue reti e aggiorna (o almeno, abilita NLA) sui sistemi vulnerabili.
Questo è uno strumento a riga di comando. Puoi scaricare il codice sorgente e compilarlo da solo, oppure scaricare uno dei binari precompilati per Windows o macOS dal link sopra.
Questo strumento è basato interamente sulla patch di rdesktop da https://github.com/zerosum0x0/CVE-2019-0708.
Ho semplicemente rifilato il codice per poter compilare facilmente su macOS e Windows,
oltre ad aver aggiunto la capacità di scansionare più target.
Questo è solo di qualche giorno fa 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, eseguilo in questo modo:
rdpscan 192.168.1.1-192.168.1.255
Questo produce uno di 3 risultati per ogni indirizzo:
Quando non esiste nulla a un indirizzo IP target, le versioni precedenti stampavano il messaggio "UNKNOWN - connection timed out". Scansionando reti grandi, questo produce un sovraccarico di troppe informazioni su sistemi che non ti interessano. Pertanto, la nuova versione di default non produce questa informazione a meno che non aggiungi -v (verbose) sulla riga di comando.
Puoi aumentare la velocità di scansione di reti grandi incrementando il numero di worker:
rdpscan --workers 10000 10.0.0.0/8
Tuttavia, sul mio computer, produce solo circa 1500 worker, a causa di limitazioni di sistema, indipendentemente da quanto alto configuri questo parametro.
Puoi aumentare ulteriormente la velocità utilizzandolo in combinazione
con masscan, descritto nel secondo paragrafo sotto.
Ci sono tre risposte generali:
Ci sono tre motivi principali per cui pensiamo che un target sia sicuro:
Questo significa che abbiamo confermato che il sistema è vulnerabile al bug.
Ci sono un'infinità di variazioni per sconosciuto
Questo strumento rdpscan è piuttosto lento, scansiona solo poche centinaia di target al secondo.
Puoi invece usare masscan per accelerare le cose.
Lo strumento masscan è circa 1000 volte più veloce, ma fornisce solo informazioni limitate
sul target.
I passaggi sono:
masscan in rdpscan, in modo che scansiona solo
target che sappiamo essere attivi.Il modo semplice per eseguire questo è semplicemente combinarli sulla riga di comando:
masscan 10.0.0.0/8 -p3389 | rdpscan --file -
Il modo in cui lo faccio io è in due passaggi:
masscan 10.0.0.0/8 -p3389 > ips.txt
rdpscan --file ips.txt --workers 10000 >results.txt
La parte difficile è ottenere le librerie OpenSSL installate, e non in conflitto con altre versioni sul sistema. Su Debian Linux, faccio:
$ sudo apt install libssl-dev
Una volta risolto quel problema, compili 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 serve un compilatore C installato, ad esempio facendo:
$ 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 non sono in un percorso. Ricorda che anche se hai i binari di OpenSSL installati, questo non significa che hai il pacchetto di sviluppo installato. Hai bisogno sia degli header che delle librerie installate.
Per installare queste cose su Debian, fai:
$ 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 di linking è 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. Lo risolvo codificando i percorsi:
$ 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 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 sopra fornisce suggerimenti rapidi per eseguire il programma. Questa sezione fornisce un aiuto più approfondito.
Per scansionare un singolo target, passa semplicemente 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 specifiche 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, non importa 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 il ben chiamato 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 i caratteri //.
L'output viene inviato allo stdout dando lo stato di VULNERABLE, SAFE,
o UNKNOWN. Potrebbero esserci ulteriori ragioni per ciascuno. Queste ragioni
sono descritte sopra.
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
Puoi elaborare questo con comandi unix aggiuntivi come grep e cut.
Per ottenere un elenco solo delle macchine vulnerabili:
./rdpscan 10.0.0.0/8 | grep 'VULN' | cut -f1 -d'-'
Il parametro -dddd significa informazioni diagnostiche, dove più d aggiungi,
più dettagli vengono stampati. Questo viene inviato a stderr invece che a stdout
in modo da poter separare i flussi. Usando bash si fa così:
./rdpscan --file myips.txt -ddd 2> diag.txt 1> results.txt
Aggiungendo il parametro -d si scaricano informazioni diagnostiche sulle connessioni su 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
Su macOS/Linux, puoi reindirizzare stdout e stderr separatamente a file
diversi nel modo usuale:
./rdpscan --file ips.txt 2> diag.txt 1> results.txt
Include anche il supporto SOCKS5:
./rdpscan --file ips.txt --socks5 localhost --socks5port 9050
Peggiora i problemi di connessione, quindi ottieni molti più risultati "UNKNOWN".