
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, circa 900.000 macchine su Internet pubblico sono vulnerabili a questa vulnerabilità, quindi molti si aspettano presto un worm come WannaCry e notPetya. Perciò, scansiona le tue reti e applica la patch (o almeno, abilita NLA) sui sistemi vulnerabili.
Questo è uno strumento a riga di comando. Puoi scaricare il 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 tagliato il codice per poter compilare facilmente su macOS e Windows,
oltre ad aver aggiunto la possibilità di scansionare più target.
Questo è sperimentale e ha solo pochi giorni. Tuttavia, lo sto testando scansionando
l'intero 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.255
Questo produce uno di 3 risultati per ogni indirizzo:
Quando non c'è nulla a un indirizzo IP target, le versioni precedenti stampavano il messaggio "UNKNOWN - connection timed out". Quando si scansionano grandi reti, questo produce un sovraccarico di informazioni sui sistemi che non ti interessano. Pertanto, la nuova versione per impostazione predefinita non produce queste informazioni a meno che non si aggiunga -v (verbose) sulla riga di comando.
Puoi aumentare la velocità di scansione delle grandi reti incrementando il numero di worker:
rdpscan --workers 10000 10.0.0.0/8
Tuttavia, sul mio computer produce solo circa 1500 worker, a causa delle limitazioni di sistema, indipendentemente da quanto alto io configuri questo parametro.
Puoi aumentare ulteriormente la velocità usando questo in combinazione
con masscan, descritto nella seconda sezione sotto.
Ci sono tre risposte generali:
Ci sono tre motivi principali per cui riteniamo che un target sia sicuro:
Questo significa che abbiamo confermato che il sistema è vulnerabile al bug.
Ci sono un'infinità di varianti per UNKNOWN
Questo strumento rdpscan è piuttosto lento, scansiona solo poche centinaia di target al secondo.
Puoi invece usare masscan per velocizzare 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 debba
scansionare solo target che sappiamo essere attivi.Il modo semplice per eseguire questo è 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. Alcuni esempi per versioni di Linux su cui ho testato sono i seguenti, ma i nomi dei pacchetti cambiano continuamente da una distribuzione all'altra. Inoltre, ci sono molte opzioni per un'API compatibile con OpenSSL, come BoringSSL e LibreSSL.
$ sudo apt install libssl-dev
$ sudo yum install openssl-devel
Una volta risolto quel problema, puoi 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 necessita di 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, oppure non sono in un percorso da qualche parte. Ricorda che anche se hai i binari di OpenSSL installati, questo non significa che hai installato i file di sviluppo. Hai bisogno sia degli header che delle librerie installati.
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 duramente 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, ricevo ancora gli errori di linking sopra, perché ho installato altri componenti OpenSSL 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 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, non importa quanto alto imposti questo
parametro, in pratica otterrai un massimo di circa 500 a 1500 worker in esecuzione
contemporaneamente, a seconda del 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 ignorate. Un commento è
una riga che inizia con il carattere # o i caratteri //.
L'output viene inviato su stdout fornendo lo stato di VULNERABLE, SAFE,
o UNKNOWN. Potrebbero esserci ragioni aggiuntive 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 ulteriori comandi unix 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 su stderr invece che su stdout
in modo che tu possa separare i flussi. Usando bash si fa così:
./rdpscan --file myips.txt -ddd 2> diag.txt 1> results.txt
Aggiungendo il parametro -d vengono stampate 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 in 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".
Per rilasciare i binari per Windows e macOS allegati come release a questo progetto, ho collegato staticamente OpenSSL, in modo che non debba essere incluso separatamente, e i programmi funzionino e basta. Questa sezione descrive alcune note su come fare ciò, specialmente poiché la descrizione sulla stessa pagina di OpenSSL sembra essere obsoleta.
Entrambi questi passaggi iniziano scaricando il sorgente di OpenSSL e mettendolo
accanto alla directory rdpscan:
git clone https://github.com/openssl/openssl
Per Windows, devi prima installare una qualche versione di Perl. Io uso quella di ActiveState.
Successivamente, ti servirà un "assembler" speciale. Io uso quello raccomandato chiamato NASM).
Poi ti servirà un compilatore. Io uso VisualStudio 2010. Puoi scaricare l'ultima "Visual Studio Community Edition" (che è la 2019) invece da Microsoft.
Ora devi costruire il makefile. Questo si fa andando nella directory di OpenSSL
ed eseguendo il programma Perl Configure:
perl Configure VC-WIN32
Ho scelto 32-bit per Windows perché c'è molto vecchio Windows in giro, e voglio rendere il programma il più compatibile possibile con versioni vecchie.
Voglio una build completamente statica, incluso il runtime C. Per fare ciò, ho aperto
il makefile risultante in un editor e ho cambiato il flag di compilazione C da
/MD (che significa usa DLL) a /MT. Mentre ero lì, ho aggiunto quanto segue
ai CPPFLAGS -D_WIN32_WINNT=0x501, che limita OpenSSL a funzionalità che
funzionano su Windows XP e Server 2003. Altrimenti, ottieni errori che bcrypt.dll
non è stata trovata se esegui su quei sistemi più vecchi.
Ora devi assicurarti che tutto sia nel tuo PATH. Ho copiato nasm.exe
in una directory nel PATH. Per Visual Studio 2010, ho eseguito il programma
vcvars32.bat per impostare le variabili d'ambiente per il compilatore.
A questo punto, sulla riga di comando, ho digitato:
nmake
Questo crea le librerie. Quelle statiche sono libssl_static.lib e libcrypto_static.lib,
che uso per collegare in rdpscan.
Prima di tutto, devi installare un compilatore. Io uso gli Strumenti per Sviluppatori di Apple, installando
XCode e il compilatore. Penso che tu possa usare Homebrew per installare gcc invece.
Poi vai nella directory del sorgente di OpenSSL e crea un makefile:
perl Configure darwin64-x86_64-cc
Ora semplicemente crealo:
make depend
make
A questo punto, ha creato sia librerie dinamiche (.dylib) che statiche (.lib). Io ho eliminato
le librerie dinamiche in modo che prenda quelle statiche per impostazione predefinita.
Ora in rdpscan, costruisci semplicemente il makefile per macOS:
make -f Makefile.macos
Questo compilerà tutti i file sorgente di rdpscan, poi linkerà con le librerie OpenSSL
nella directory ../openssl che hai appena costruito.
Questo dovrebbe produrre un eseguibile di 3 megabyte. Se invece ottieni solo un eseguibile di 200 kilobyte, allora hai commesso un errore e hai linkato alle librerie dinamiche.