
Scanner di vulnerabilità per CVE-2020-0688
CVE-2020-0688 è una vulnerabilità critica in Microsoft Exchange dovuta all'uso di chiavi statiche. Sebbene lo sfruttamento richieda credenziali valide (a livello di utente email) e il rischio di sfruttamento di massa sia basso, questa vulnerabilità può essere molto utile in attacchi mirati in quanto porta a RCE a livello SYSTEM.
Ulteriori informazioni:
Ci sono diverse fonti note di falsi negativi (server Exchange vulnerabili che potrebbero essere mancati da questo script):
I potenziali server Exchange vengono pre-selezionati identificando gli host che hanno sia la porta 25 che la 443 aperte. Se ci sono configurazioni che ne bloccano una, verranno persi.
zmap è ottimizzato per velocità e scalabilità a scapito della precisione. Tipicamente, esecuzioni multiple consecutive di zmap forniscono risultati leggermente diversi. Di conseguenza, esecuzioni multiple di questo script mostreranno risultati leggermente diversi.
Non sono sicuro se ciò sia causato puramente dalla congestione di rete o da codice difettoso. Pull-request con patch/workaround sono certamente benvenute!
Non stiamo cercando di essere furtivi qui, quindi alcuni firewall potrebbero semplicemente bloccarci come robot.
Poiché non stiamo facendo fingerprinting sofisticato e ci affidiamo solo alla versione che il server Exchange riporta da solo, siamo limitati ai primi tre campi del numero di versione.
Ad esempio, l'ultimo aggiornamento cumulativo per Exchange Server 2019 è 15.2.529.5, rilasciato a dicembre e vulnerabile. L'ultimo aggiornamento che contiene la patch è 15.2.529.8. Entrambi riportano la versione come 15.2.529, quindi lo script assumerà che il server sia aggiornato anche se non ha l'ultima patch installata ed è vulnerabile.
In pratica, sembra che ci siano amministratori Exchange che aggiornano i loro sistemi non appena escono le patch o quelli che vivono secondo il principio "se funziona, non toccarlo". Non c'è via di mezzo.
zmap, Python >= 3.5, moduli:
Puoi installarli globalmente con:
$ sudo dnf install zmap python3-gevent python3-dns python3-pyOpenSSL
oppure:
$ sudo apt install zmap python3-gevent python3-dns python3-openssl
I moduli Python possono anche essere installati localmente tramite virtualenv:
$ virtualenv -p python3 CVE-2020-0688
$ . ./CVE-2020-0688/bin/activate
$ pip install -r ./requirements.txt
Per una scansione di base tutto ciò di cui hai bisogno è un file con IP/sottoreti (in formato CIDR) da scansionare:
$ ./scan.py ~/my_networks.txt output.csv
L'output sarà scritto in formato CSV con le seguenti colonne:
| IP | Versione Exchange | Nome Server | PTR | Nome Comune (dal certificato TLS) |
|---|
Opzionalmente, puoi chiedere di visualizzare le informazioni su tutti i server Exchange trovati:
$ ./scan.py -f ~/my_networks.txt output.csv
In tal caso ci sarà un'ulteriore colonna per indicare se il server è vulnerabile o meno:
| IP | Versione Exchange | Vulnerabile? | Nome Server | PTR | Nome Comune (dal certificato TLS) |
|---|
Puoi anche fornire un file con IP/sottoreti in blacklist (opzione -b), modificare il numero di attività parallele (-p) o la durata dei timeout (-t):
$ # ./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)