
Scanner de vulnérabilités pour CVE-2020-0688
CVE-2020-0688 est une vulnérabilité critique dans Microsoft Exchange due à l'utilisation de clés statiques. Bien que l'exploitation nécessite des informations d'identification valides (au niveau d'un utilisateur de messagerie) et que le risque d'exploitation de masse soit faible, cette vulnérabilité peut être très utile dans des attaques ciblées car elle conduit à une exécution de code à distance (RCE) au niveau SYSTEM.
Plus d'informations :
Il y a plusieurs sources connues de faux négatifs (serveurs Exchange vulnérables qui ne seront pas détectés par ce script) :
Les serveurs Exchange potentiels sont présélectionnés en identifiant les hôtes qui ont à la fois le port 25 et 443 ouverts. Si certaines configurations bloquent l'un de ces ports, ils ne seront pas détectés.
zmap est optimisé pour la vitesse et la scalabilité au détriment de la précision. Typiquement, plusieurs exécutions consécutives de zmap donnent des résultats légèrement différents. En conséquence, plusieurs exécutions de ce script montreront des résultats légèrement différents également.
Je ne sais pas si cela est dû purement à la congestion du réseau ou à un code défectueux. Les pull-requests avec des correctifs/contournements sont les bienvenues !
Nous n'essayons pas d'être discrets ici, donc certains pare-feu pourraient simplement nous bloquer comme un robot.
Étant donné que nous n'effectuons aucune empreinte numérique sophistiquée et que nous nous appuyons uniquement sur la version que le serveur Exchange rapporte lui-même, nous sommes limités aux trois premiers champs du numéro de version.
Par exemple, la dernière mise à jour cumulative pour Exchange Server 2019 est 15.2.529.5 qui a été publiée en décembre et est vulnérable. La dernière mise à jour contenant le correctif est 15.2.529.8. Les deux se rapportent comme version 15.2.529, donc le script supposera que le serveur est patché même s'il n'a pas la dernière mise à jour installée et est vulnérable.
En pratique, il semble qu'il y ait soit des administrateurs Exchange qui mettent à jour leurs systèmes dès que les correctifs sortent, soit ceux qui vivent selon le principe "si ça marche, n'y touchez pas". Il n'y a pas de juste milieu.
zmap, Python >= 3.5, modules :
Vous pouvez les installer globalement avec :
$ sudo dnf install zmap python3-gevent python3-dns python3-pyOpenSSL
ou :
$ sudo apt install zmap python3-gevent python3-dns python3-openssl
Les modules Python peuvent également être installés localement, via virtualenv :
$ virtualenv -p python3 CVE-2020-0688
$ . ./CVE-2020-0688/bin/activate
$ pip install -r ./requirements.txt
Pour une analyse de base, tout ce dont vous avez besoin est un fichier contenant des IP/sous-réseaux (au format CIDR) à analyser :
$ ./scan.py ~/my_networks.txt output.csv
La sortie sera écrite dans un format CSV avec les colonnes suivantes :
| IP | Version Exchange | Nom du serveur | PTR | Nom commun (du certificat TLS) |
|---|
Optionnellement, vous pouvez demander à afficher les informations sur tous les serveurs Exchange trouvés :
$ ./scan.py -f ~/my_networks.txt output.csv
Dans ce cas, il y aura une colonne supplémentaire pour indiquer si le serveur est vulnérable ou non :
| IP | Version Exchange | Vulnérable ? | Nom du serveur | PTR | Nom commun (du certificat TLS) |
|---|
Vous pouvez également fournir un fichier d'IP/sous-réseaux mis sur liste noire (option -b), modifier le nombre de tâches parallèles (-p) ou la durée des timeouts (-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)