
CVE-2019-0708 bluekeep Schwachstellenerkennung
Dies ist ein schneller und einfacher Scanner für die Sicherheitslücke CVE-2019-0708 in Microsoft Remote Desktop. Derzeit gibt es etwa 700.000 Maschinen im öffentlichen Internet, die für diese Sicherheitslücke verwundbar sind, verglichen mit etwa 2.000.000 Maschinen, die Remote Desktop exponiert haben, aber gepatcht/sicher vor Ausnutzung sind. Viele erwarten, dass in den nächsten Monaten ein verheerender Internet-Wurm ähnlich wie WannaCry und notPetya auftauchen wird. Scanne daher deine Netzwerke und patche deine Systeme. Dieses Tool macht es einfach, deine Netzwerke zu scannen, um verwundbare Maschinen zu finden.
Um dieses Tool zu verwenden, kannst du eine „Binärdatei“ herunterladen, um sie von der Kommandozeile auszuführen, oder du kannst den Quellcode herunterladen und kompilieren. Für Windows gibt es eine vorkompilierte Binärdatei.
Dieses Tool basiert vollständig auf dem rdesktop-Patch von https://github.com/zerosum0x0/CVE-2019-0708.
Ich habe den Code lediglich beschnitten, damit ich ihn problemlos unter macOS und Windows kompilieren kann,
und außerdem die Möglichkeit hinzugefügt, mehrere Ziele zu scannen.
Dies ist erst ein paar Tage alt und experimentell. Ich teste es jedoch, indem ich
das gesamte Internet scanne (mit Hilfe von masscan), daher arbeite ich ziemlich schnell viele Probleme ab.
Du kannst versuchen, mich auf Twitter (@erratarob) für Hilfe/Kommentare zu kontaktieren.
Um ein Netzwerk zu scannen, führe es wie folgt aus:
rdpscan 192.168.1.1-192.168.1.1.255
Dies gibt ein einzeiliges Ergebnis pro Adresse aus, das VULNERABLE anzeigt, wenn sie für den Fehler verwundbar ist, SAFE, wenn sie (wahrscheinlich) sicher ist, oder UNKNOWN, wenn das Programm den Status nicht herausfinden konnte, z. B. wenn keine Antwort vom Ziel empfangen wurde. Da die meisten Ziele nicht antworten, werden statistisch gesehen die meisten UNKNOWN sein.
Es ist ziemlich langsam. Du kannst die Geschwindigkeit erhöhen, indem du den Befehlszeilenparameter
--workers 1000 hinzufügst. Du kannst die Geschwindigkeit aber noch weiter erhöhen, indem du
masscan vorschaltest, um schnell die Maschinen zu finden, auf denen Port 3389 verfügbar ist, und dann nur
rdpscan verwendest, um diese resultierenden Maschinen auf die Sicherheitslücke zu scannen.
masscan 10.0.0.0/8 -p3389 --rate 1000000 >ips.txt
rdpscan --file ips.txt > results.txt
Oder in einem Schritt, indem die Ausgabe des einen an den anderen weitergeleitet wird:
masscan 10.0.0.0/8 -p3389 --rate 1000000 | rdpscan --file -
Du kannst mit dem Parameter -d detailliertere Diagnoseinformationen erhalten, die auf
stderr ausgegeben werden. So führe ich das Programm normalerweise aus:
rdpscan --file ips.txt 2> diag.txt 1> results.txt
Der schwierige Teil ist die Installation der OpenSSL-Bibliotheken, ohne mit anderen Versionen auf dem System zu kollidieren. Auf Debian Linux mache ich Folgendes:
$ sudo apt install libssl-dev
Sobald du dieses Problem gelöst hast, kompilierst du einfach alle .c-Dateien zusammen,
etwa so:
$ gcc *.c -lssl -lcrypto -o rdpscan
Ich habe ein Makefile in das Verzeichnis gelegt, das dies erledigt, sodass du wahrscheinlich einfach Folgendes tun kannst:
$ make
Der Code ist in C geschrieben, benötigt also einen installierten C-Compiler, z. B. durch folgendes Kommando:
$ sudo apt install build-essential
Dieser Abschnitt beschreibt die offensichtlichsten Build-Fehler.
ssl.h:24:25: fatal error: openssl/rc4.h: No such file or directory
Das bedeutet, dass du entweder die OpenSSL-Header nicht installiert hast oder sie sich nicht in einem Pfad befinden. Denke daran, dass selbst wenn du OpenSSL-Binärdateien installiert hast, dies nicht bedeutet, dass du die Entwicklungspakete installiert hast. Du benötigst sowohl die Header als auch die Bibliotheken.
Um diese Dinge auf Debian zu installieren, führe aus:
$ sudo apt install libssl-dev
Um das Pfadproblem zu beheben, füge ein Kompilier-Flag -I/usr/local/include oder etwas
Ähnliches hinzu.
Ein Beispiel für ein Linker-Problem ist das Folgende:
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
Ich bekomme das auf macOS, weil es mehrere Versionen von OpenSSL gibt. Ich behebe das, indem ich die Pfade fest kodiere:
$ gcc *.c -lssl -lcrypto -I/usr/local/include -L/usr/local/lib -o rdpscan
Laut Kommentaren anderer könnte die folgende Befehlszeile unter macOS funktionieren, wenn du Homebrew zur Installation verwendet hast. Ich erhalte die obigen Linker-Fehler dennoch, weil ich andere OpenSSL-Komponenten installiert habe, die in Konflikt stehen.
gcc $(brew --prefix)/opt/openssl/lib/libssl.a $(brew --prefix)/opt/openssl/lib/libcrypto.a -o rdpscan *.c
Der Abschnitt oben enthält Schnellstart-Tipps zum Ausführen des Programms. Dieser Abschnitt enthält ausführlichere Hilfe.
Um ein einzelnes Ziel zu scannen, übergib einfach die Adresse des Ziels:
./rdpscan 192.168.10.101
Du kannst IPv6-Adressen und DNS-Namen übergeben. Du kannst mehrere Ziele übergeben. Ein Beispiel dafür wäre:
./rdpscan 192.168.10.101 exchange.example.com 2001:0db8:85a3::1
Du kannst auch Adressbereiche scannen, entweder mit Begin-Ende-IPv4-Adressen oder mit IPv4-CIDR-Spezifikation. IPv6-Bereiche werden nicht unterstützt, da sie so groß sind.
./rdpscan 10.0.0.1-10.0.0.25 192.168.0.0/16
Standardmäßig scannt es nur 100 Ziele gleichzeitig. Du kannst diese Zahl mit dem Parameter
--workers erhöhen. Egal wie hoch du diesen Parameter setzt, in der Praxis erhältst du
je nach System maximal etwa 500 bis 1500 gleichzeitig laufende Worker.
./rdpscan --workers 1000 10.0.0.0/24
Anstatt Ziele auf der Kommandozeile anzugeben, kannst du sie stattdessen aus einer Datei laden,
mit dem treffend benannten Parameter --file:
./rdpscan --file ips.txt
Das Format der Datei ist eine Adresse, ein Name oder ein Bereich pro Zeile. Sie kann auch
den von masscan erzeugten Text verarbeiten. Überflüssige Leerzeichen werden entfernt,
leere Zeilen ignoriert und Kommentarzeilen werden ignoriert. Ein Kommentar ist
eine Zeile, die mit dem Zeichen # oder mit // beginnt.
Die Ausgabe wird auf stdout ausgegeben und zeigt den Status VULNERABLE, SAFE
oder UNKNOWN. Es kann zusätzliche Gründe für jeden geben.
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
Du kannst das mit zusätzlichen Unix-Befehlen wie grep und cut verarbeiten.
Um eine Liste nur der verwundbaren Maschinen zu erhalten:
./rdpscan 10.0.0.0/8 | grep 'VULN' | cut -f1 -d'-'
Diejenigen, die als „UNKNOWN“ markiert sind, lohnt es sich wahrscheinlich, später erneut zu scannen, insbesondere
bei „FIN received“, was normalerweise bedeutet, dass die Gegenseite die Verbindung vorzeitig beendet hat,
weil es im Internet zu Verzögerungen kam. Speichere sie in einer Datei und lies sie
beim nächsten Scan mit der Option --file erneut ein.
Ob „CredSSP required“ (was bedeutet, dass NLA erforderlich ist) „SAFE“ ist, ist umstritten. Es bedeutet, dass ein Passwort-Login erforderlich ist, bevor wir die Schwachstelle testen/auslösen können. Es kann ungepatcht und für einen authentifizierten Benutzer verwundbar sein, es ist nur nicht durch einen Wurm oder einen nicht authentifizierten Benutzer ausnutzbar.
Du solltest für jede gescannte IP-Adresse immer genau einen Status auf stdout erhalten.
Wenn du natürlich eine IP-Adresse mehrfach angibst, erhältst du mehrere Status für diese Adresse.
Da dieser Code jedoch auf rdesktop basiert, gibt es bestimmte Protokollfehler,
die nicht zu einem Status führen. Wenn du eine öffentliche IP-Adresse im Internet hast,
die einen dieser Fehler erzeugt, bin ich bestrebt, ihn zu beheben.
Das Hinzufügen des Parameters -d gibt Diagnoseinformationen über die Verbindungen auf stderr aus.
./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
Unter macOS/Linux kannst du stdout und stderr wie gewohnt in getrennte Dateien umleiten:
./rdpscan --file ips.txt 2> diag.txt 1> results.txt
Es enthält also SOCKS5-Unterstützung:
./rdpscan --file ips.txt --socks5 localhost --socks5port 9050
Dadurch werden Verbindungsprobleme verschlimmert, sodass du viel mehr „UNKNOWN“-Ergebnisse erhältst.