
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
208.43.229.89 - SAFE - CredSSP required
170.104.127.137 - UNKNOWN - FIN received
86.188.190.117 - UNKNOWN - connect timeout
62.15.34.157 - SAFE - Target appears patched
216.15.251.120 - VULNERABLE -- got appid
69.62.158.174 - VULNERABLE -- got appid
92.111.20.13 - SAFE - Target appears patched
Puoi elaborare questo con comandi unix aggiuntivi come grep e cut.
Per ottenere un elenco delle sole macchine vulnerabili:
./rdpscan 10.0.0.0/8 | grep 'VULN' | cut -f1 -d'-'
Quelli contrassegnati come "UNKNOWN" probabilmente vale la pena scansionarli in seguito,
specialmente per "FIN received", che di solito significa che l'altra parte ha terminato
la connessione anticipatamente a causa di un ritardo su Internet. Salvali in un file, e poi
leggili nella scansione successiva con l'opzione --file.
Se "CredSSP required" (che significa NLA required) sia "SAFE" è discutibile. Significa che richiede un login con password prima che possiamo testare/innescare la vulnerabilità. Potrebbe essere non corretta e vulnerabile per un utente autenticato, semplicemente non è sfruttabile da un worm o da un utente non autenticato.
Dovresti sempre ottenere uno e un solo stato su stdout per ogni indirizzo IP
che scansiona. Ovviamente, se specifichi un indirizzo IP più volte, otterrai più stati
per quell'indirizzo.
Tuttavia, poiché questo codice è basato su rdesktop, ci sono alcuni errori di protocollo
che non porteranno a uno stato. Se hai un indirizzo IP pubblico su Internet
che produce uno di questi errori, allora sono ansioso di risolverlo.
Aggiungendo il parametro -d viene scaricata l'informazione diagnostica 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 solito:
./rdpscan --file ips.txt 2> diag.txt 1> results.txt
Quindi include il supporto SOCKS5:
./rdpscan --file ips.txt --socks5 localhost --socks5port 9050
Peggiora i problemi di connessione, quindi ottieni molti più risultati "UNKNOWN".