
Scannt Netzwerke nach Microsoft Exchange-Servern, die anfällig für CVE-2020-0688 sind, und verwendet zmap zur Host-Erkennung sowie TLS-/Versions-Fingerprinting, um nicht gepatchte Instanzen zu identifizieren.
CVE-2020-0688 ist eine kritische Schwachstelle in Microsoft Exchange, die auf der Verwendung statischer Schlüssel beruht. Obwohl die Ausnutzung gültige Anmeldeinformationen (auf Ebene eines E-Mail-Benutzers) erfordert und das Risiko einer Massenausnutzung gering ist, könnte diese Schwachstelle bei gezielten Angriffen sehr nützlich sein, da sie zu RCE mit SYSTEM-Rechten führt.
Weitere Informationen:
Es gibt mehrere bekannte Ursachen für falsch negative Ergebnisse (anfällige Exchange-Server, die von diesem Skript übersehen werden):
Potenzielle Exchange-Server werden vorab identifiziert, indem Hosts erkannt werden, die sowohl Port 25 als auch 443 offen haben. Falls es Konfigurationen gibt, die einen dieser Ports blockieren, werden diese Server übersehen.
zmap ist auf Geschwindigkeit und Skalierbarkeit optimiert, auf Kosten der Präzision. In der Regel liefern mehrere aufeinanderfolgende Läufe von zmap leicht unterschiedliche Ergebnisse. Daher zeigen mehrere Läufe dieses Skripts ebenfalls leicht unterschiedliche Ergebnisse.
Es ist unklar, ob dies ausschließlich an Netzwerküberlastung oder an fehlerhaftem Code liegt. Pull-Requests mit Patches/Workarounds sind selbstverständlich willkommen!
Wir versuchen hier nicht, uns unauffällig zu verhalten, daher könnten einige Firewalls uns einfach als Roboter blockieren.
Da wir kein ausgefeiltes Fingerprinting betreiben und uns nur auf die Version verlassen, die der Exchange-Server selbst meldet, sind wir auf die ersten drei Felder der Versionsnummer beschränkt.
Zum Beispiel ist das neueste kumulative Update für Exchange Server 2019 die Version 15.2.529.5, die im Dezember veröffentlicht wurde und anfällig ist. Das neueste Update, das den Patch enthält, ist 15.2.529.8. Beide melden ihre Version als 15.2.529, daher nimmt das Skript an, dass der Server gepatcht ist, auch wenn er nicht den neuesten Patch installiert hat und anfällig ist.
In der Praxis scheint es jedoch so zu sein, dass es entweder Exchange-Administratoren gibt, die ihre Systeme aktualisieren, sobald Patches erscheinen, oder solche, die nach dem Prinzip „Wenn es funktioniert, fass es nicht an“ leben. Dazwischen gibt es nichts.
zmap, Python >= 3.5, Module:
Sie können sie global installieren mit:
$ sudo dnf install zmap python3-gevent python3-dns python3-pyOpenSSL
oder:
$ sudo apt install zmap python3-gevent python3-dns python3-openssl
Python-Module können auch lokal über virtualenv installiert werden:
$ virtualenv -p python3 CVE-2020-0688
$ . ./CVE-2020-0688/bin/activate
$ pip install -r ./requirements.txt
Für einen grundlegenden Scan benötigen Sie lediglich eine Datei mit IPs/Subnetzen (im CIDR-Format), die gescannt werden sollen:
$ ./scan.py ~/my_networks.txt output.csv
Die Ausgabe wird im CSV-Format mit den folgenden Spalten geschrieben:
| IP | Exchange-Version | Server-Name | PTR | Common Name (aus dem TLS-Zertifikat) |
|---|
Optional können Sie sich die Informationen zu allen gefundenen Exchange-Servern ausgeben lassen:
$ ./scan.py -f ~/my_networks.txt output.csv
In diesem Fall gibt es eine weitere Spalte, die angibt, ob der Server anfällig ist oder nicht:
| IP | Exchange-Version | Anfällig? | Server-Name | PTR | Common Name (aus dem TLS-Zertifikat) |
|---|
Sie können auch eine Datei mit blockierten IPs/Subnetzen angeben (Option -b), die Anzahl der parallelen Aufgaben (-p) oder die Länge der Timeouts (-t) ändern:
$ # ./scan.py -h
usage: scan.py [-h] [-b BLACKLIST] [-f] [-p PARALLEL] [-t TIMEOUT]
input output
Identify Exchange servers vulnerable to CVE-2020-0688.
positional arguments:
input Input file, each line contains one IP/subnet
output File to save the results (in CSV format)
optional arguments:
-h, --help show this help message and exit
-b BLACKLIST, --blacklist BLACKLIST
File containing IPs/subnets to avoid
-f, --full Don't filter seemingly up-to-date Exchange servers
-p PARALLEL, --parallel PARALLEL
How many requests to send in parallel (default: 1000)
-t TIMEOUT, --timeout TIMEOUT
Timeout (seconds) to use for network connections
(default: 5)