
Ein schneller Scanner für die CVE-2019-0708 "BlueKeep"-Sicherheitslücke.
Dies ist ein schneller und einfacher Scanner für die Sicherheitslücke CVE-2019-0708 in Microsoft Remote Desktop. Derzeit sind etwa 900.000 Rechner im öffentlichen Internet anfällig für diese Sicherheitslücke, daher ist zu erwarten, dass bald ein Wurm wie WannaCry oder notPetya auftaucht. Scannen Sie daher Ihre Netzwerke und patchen Sie (oder aktivieren Sie zumindest NLA) auf anfälligen Systemen.
Dies ist ein Kommandozeilenwerkzeug. Sie können den Quellcode herunterladen und selbst kompilieren, oder Sie können eine der vorkompilierten Binärdateien für Windows oder macOS über den obigen Link herunterladen.
Dieses Werkzeug basiert vollständig auf dem rdesktop-Patch von https://github.com/zerosum0x0/CVE-2019-0708.
Ich habe den Code lediglich so gekürzt, dass ich ihn problemlos unter macOS und Windows kompilieren kann,
und habe die Möglichkeit hinzugefügt, mehrere Ziele zu scannen.
Dies ist erst wenige Tage alt und experimentell. Ich teste es jedoch durch Scannen
des gesamten Internets (mit Hilfe von masscan), sodass ich recht schnell eine Menge Probleme
behebe. Sie können mich auf Twitter (@erratarob) kontaktieren, um Hilfe/Kommentare zu erhalten.
Um ein Netzwerk zu scannen, führen Sie es wie folgt aus:
rdpscan 192.168.1.1-192.168.1.255
Dies erzeugt für jede Adresse eines von drei Ergebnissen:
Wenn an einer Ziel-IP-Adresse nichts vorhanden ist, druckten die älteren Versionen die Meldung "UNKNOWN – Verbindungszeitüberschreitung". Beim Scannen großer Netzwerke führt dies zu einer Überflutung mit Informationen über Systeme, die Sie nicht interessieren. Daher unterdrückt die neue Version diese Informationen standardmäßig, es sei denn, Sie fügen -v (für verbose) auf der Kommandozeile hinzu.
Sie können die Geschwindigkeit beim Scannen großer Netzwerke erhöhen, indem Sie die Anzahl der Worker erhöhen:
rdpscan --workers 10000 10.0.0.0/8
Auf meinem Computer werden jedoch nur etwa 1500 Worker erzeugt, aufgrund von Systemeinschränkungen, egal wie hoch ich diesen Parameter einstelle.
Sie können die Geschwindigkeit noch weiter erhöhen, indem Sie dies in Verbindung
mit masscan verwenden, wie unten im zweiten Abschnitt beschrieben.
Es gibt drei allgemeine Antworten:
Es gibt drei Hauptgründe, warum wir ein Ziel für sicher halten:
Dies bedeutet, dass wir bestätigt haben, dass das System anfällig für den Fehler ist.
Es gibt unzählige Variationen für UNKNOWN
Dieses rdpscan-Werkzeug ist recht langsam – es scannt nur einige hundert Ziele pro Sekunde.
Sie können stattdessen masscan verwenden, um
die Dinge zu beschleunigen. Das masscan-Werkzeug ist etwa 1000-mal schneller, liefert aber nur
begrenzte Informationen über das Ziel.
Die Schritte sind:
masscan in rdpscan, sodass es nur noch
Ziele scannen muss, die wir als aktiv kennen.Die einfache Methode, dies auszuführen, ist, sie auf der Kommandozeile zu kombinieren:
masscan 10.0.0.0/8 -p3389 | rdpscan --file -
Die Art und Weise, wie ich es mache, ist in zwei Schritten:
masscan 10.0.0.0/8 -p3389 > ips.txt
rdpscan --file ips.txt --workers 10000 >results.txt
Der schwierige Teil ist die Installation der OpenSSL-Bibliotheken, ohne dass sie mit anderen Versionen auf dem System in Konflikt geraten. Einige Beispiele für von mir getestete Linux-Versionen sind die folgenden, aber die Paketnamen ändern sich von einer Distribution zur nächsten. Außerdem gibt es viele Optionen für eine OpenSSL-kompatible API, wie BoringSSL und LibreSSL.
$ sudo apt install libssl-dev
$ sudo yum install openssl-devel
Wenn Sie dieses Problem gelöst haben, kompilieren Sie einfach alle .c-Dateien zusammen
wie folgt:
$ gcc *.c -lssl -lcrypto -o rdpscan
Ich habe ein Makefile im Verzeichnis abgelegt, das dies erledigt, sodass Sie wahrscheinlich einfach
$ make
ausführen können. Der Code ist in C geschrieben, benötigt also einen installierten C-Compiler, z. B. durch die folgende Aktion:
$ sudo apt install build-essential
Dieser Abschnitt beschreibt die offensichtlicheren Build-Fehler.
ssl.h:24:25: fatal error: openssl/rc4.h: No such file or directory
Dies bedeutet, dass Sie entweder die OpenSSL-Header nicht installiert haben oder sie sich nicht in einem Pfad befinden. Denken Sie daran: Selbst wenn Sie OpenSSL-Binärdateien installiert haben, bedeutet das nicht, dass Sie die Entwicklungspakete installiert haben. Sie benötigen sowohl die Header als auch die Bibliotheken.
Um diese Dinge unter Debian zu installieren, führen Sie Folgendes aus:
$ sudo apt install libssl-dev
Um das Pfadproblem zu beheben, fügen Sie ein Compilierungs-Flag wie -I/usr/local/include oder ähnlich 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
Dies erhalte ich unter macOS, weil es mehrere OpenSSL-Versionen gibt. Ich behebe dies, 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 Sie Homebrew zur Installation verwendet haben. 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 obige Abschnitt enthält Schnellstarttipps zum Ausführen des Programms. Dieser Abschnitt bietet detailliertere Hilfe.
Um ein einzelnes Ziel zu scannen, übergeben Sie einfach die Adresse des Ziels:
./rdpscan 192.168.10.101
Sie können IPv6-Adressen und DNS-Namen übergeben. Sie können mehrere Ziele übergeben. Ein Beispiel wäre:
./rdpscan 192.168.10.101 exchange.example.com 2001:0db8:85a3::1
Sie können auch Adressbereiche scannen, entweder mit Start-End-IPv4-Adressen oder mit IPv4-CIDR-Angabe. IPv6-Bereiche werden nicht unterstützt, da sie zu groß sind.
./rdpscan 10.0.0.1-10.0.0.25 192.168.0.0/16
Standardmäßig werden nur 100 Ziele gleichzeitig gescannt. Sie können diese Anzahl
mit dem Parameter --workers erhöhen. Allerdings erhalten Sie in der Praxis
höchstens etwa 500 bis 1500 Worker, die gleichzeitig laufen, unabhängig davon,
wie hoch Sie diesen Parameter einstellen.
./rdpscan --workers 1000 10.0.0.0/24
Anstatt Ziele auf der Kommandozeile anzugeben, können Sie sie auch aus einer Datei laden,
mithilfe des gut benannten Parameters --file:
./rdpscan --file ips.txt
Das Format der Datei ist eine Adresse, ein Name oder ein Bereich pro Zeile. Es kann auch
den von masscan erzeugten Text verarbeiten. Zusätzliche Leerzeichen werden entfernt,
leere Zeilen ignoriert und Kommentarzeilen werden ignoriert. Ein Kommentar ist
eine Zeile, die mit dem Zeichen # oder den Zeichen // beginnt.
Die Ausgabe wird nach stdout gesendet und gibt den Status VULNERABLE, SAFE oder UNKNOWN an.
Es können zusätzliche Gründe für jeden Status vorliegen. Diese Gründe werden oben beschrieben.
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
Sie können dies mit weiteren Unix-Befehlen wie grep und cut verarbeiten.
Um nur eine Liste der anfälligen Maschinen zu erhalten:
./rdpscan 10.0.0.0/8 | grep 'VULN' | cut -f1 -d'-'
Der Parameter -dddd steht für Diagnoseinformationen, wobei
mit jedem zusätzlichen d mehr Details ausgedruckt werden. Diese werden an stderr
statt an stdout gesendet, sodass Sie die Streams trennen können. In bash
geschieht dies wie folgt:
./rdpscan --file myips.txt -ddd 2> diag.txt 1> results.txt
Das Hinzufügen des Parameters -d gibt Diagnoseinformationen zu den 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 können Sie stdout und stderr wie üblich getrennt in verschiedene
Dateien umleiten:
./rdpscan --file ips.txt 2> diag.txt 1> results.txt
Es enthält SOCKS5-Unterstützung:
./rdpscan --file ips.txt --socks5 localhost --socks5port 9050
Es verschlimmert Verbindungsprobleme, sodass Sie viel mehr "UNKNOWN"-Ergebnisse erhalten.
Für die Veröffentlichung der Windows- und macOS-Binärdateien, die als Releases an dieses Projekt angehängt sind, linke ich OpenSSL statisch, sodass es nicht separat mitgeliefert werden muss und die Programme einfach funktionieren. Dieser Abschnitt enthält einige Hinweise zur Vorgehensweise, insbesondere da die Beschreibung auf der OpenSSL-eigenen Seite veraltet zu sein scheint.
Beide Schritte beginnen mit dem Herunterladen des OpenSSL-Quellcodes und dem Platzieren
neben dem rdpscan-Verzeichnis:
git clone https://github.com/openssl/openssl
Für Windows müssen Sie zuerst eine Perl-Version installieren. Ich verwende die von ActiveState.
Als nächstes benötigen Sie einen speziellen "Assembler". Ich verwende den empfohlenen NASM).
Dann benötigen Sie einen Compiler. Ich verwende VisualStudio 2010. Sie können stattdessen die neueste "Visual Studio Community Edition" (2019) von Microsoft herunterladen.
Jetzt müssen Sie das Makefile erstellen. Dazu gehen Sie in das OpenSSL-Verzeichnis
und führen das Perl-Programm Configure aus:
perl Configure VC-WIN32
Ich habe mich für 32-Bit unter Windows entschieden, weil es noch viele alte Windows-Systeme gibt und ich das Programm so kompatibel wie möglich mit alten Versionen halten möchte.
Ich möchte einen vollständig statischen Build, einschließlich der C-Laufzeit. Dazu habe ich das resultierende
Makefile in einem Editor geöffnet und das C-Compilierungs-Flag von /MD (bedeutet DLLs verwenden) auf /MT geändert.
Gleichzeitig habe ich zu den CPPFLAGS -D_WIN32_WINNT=0x501 hinzugefügt, was OpenSSL auf Funktionen
beschränkt, die unter Windows XP und Server 2003 funktionieren. Andernfalls erhalten Sie die Fehlermeldung,
dass bcrypt.dll nicht gefunden wurde, wenn Sie auf diesen älteren Systemen ausführen.
Jetzt müssen Sie sicherstellen, dass alles in Ihrem Pfad ist. Ich habe nasm.exe in ein Verzeichnis
im PATH kopiert. Für Visual Studio 2010 habe ich das Programm vcvars32.bat ausgeführt, um die Pfadvariablen
für den Compiler einzurichten.
An diesem Punkt habe ich auf der Kommandozeile eingegeben:
nmake
Dies erstellt die Bibliotheken. Die statischen sind libssl_static.lib und libcrypto_static.lib,
die ich zum Linken in rdpscan verwende.
Zuerst müssen Sie einen Compiler installieren. Ich verwende die Developer Tools von Apple, indem ich
XCode und den Compiler installiere. Ich denke, Sie können stattdessen Homebrew verwenden, um gcc zu installieren.
Dann gehen Sie in das Quellverzeichnis von OpenSSL und erstellen ein Makefile:
perl Configure darwin64-x86_64-cc
Jetzt einfach bauen:
make depend
make
An diesem Punkt wurden sowohl dynamische (.dylib) als auch statische (.a) Bibliotheken erstellt. Ich habe die dynamischen Bibliotheken gelöscht, damit standardmäßig die statischen verwendet werden.
Jetzt in rdpscan einfach das macOS-Makefile bauen:
make -f Makefile.macos
Dies kompiliert alle rdpscan-Quelldateien und linkt dann gegen die OpenSSL-Bibliotheken
im Verzeichnis ../openssl, die Sie gerade erstellt haben.
Dies sollte eine ausführbare Datei von etwa 3 Megabyte erzeugen. Wenn Sie stattdessen nur eine 200-Kilobyte-Datei erhalten haben, haben Sie einen Fehler gemacht und gegen die dynamischen Bibliotheken gelinkt.