
Identifier les serveurs Microsoft Exchange exposés publiquement et déterminer leurs versions logicielles

Cet outil analyse plusieurs services courants exposés au public sur un hôte cible afin de détecter Microsoft Exchange Server et d'identifier sa version logicielle si possible.
Pour ce faire, il utilise les techniques suivantes :
Les numéros de build détectés sont mis en correspondance avec une table des versions récupérée par scraping auprès de Microsoft qui couvre toutes les versions, d'Exchange Server 5.5 à Exchange Server Subscription Edition (SE), y compris les niveaux Service Pack (SP), Cumulative Update (CU), Security Update (SU), Hotfix Update (HU) et Update Rollup (RU). Les correspondances sont signalées avec un nom de produit, une date de sortie et des chaînes CPE au format du dictionnaire de la NVD.
La méthode recommandée pour exécuter le scanner est d'utiliser Docker, qui ne nécessite aucune dépendance locale en dehors de Docker lui-même. Si vous préférez exécuter le script directement, il a été conçu pour une utilisation sur Debian Linux 64 bits, mais devrait fonctionner avec toute variante Linux prise en charge par Python 3, dnsx et fingerprintx (avec des modifications mineures du script d'installation).
Construisez l'image. Elle regroupe Python, les paquets Python épinglés et les binaires dnsx et fingerprintx à versions verrouillées, et récupère par scraping la table des versions d'Exchange Server auprès de Microsoft au moment de la construction :
docker build -t exchange-scanner .
Exécutez ensuite le scanner, en passant les mêmes arguments que ceux que vous passeriez au script (décrits dans la section Utilisation ci-dessous) :
# Scan a single target
docker run --rm exchange-scanner -q -t 192.168.5.3
# Scan a list of targets (mount the file into the container)
docker run --rm -v "$PWD/targets.txt:/app/targets.txt" exchange-scanner -l targets.txt
Reconstruisez l'image pour actualiser la table des versions.
Exécutez scripts/install-requirements.sh pour installer les outils, paquets et autres dépendances requis. Les paquets Python sont épinglés à des versions spécifiques dans scripts/requirements.txt.
N'hésitez pas à réexécuter scripts/get-exchange-versions.py séparément à tout moment pour mettre à jour la table des versions logicielles trouvée dans exchange-versions.json.
Exécutez le script exchange-scanner.py avec -h pour afficher les détails d'utilisation :
❯ ./exchange-scanner.py -h
usage: exchange-scanner.py [-h] [-q] [-d] [-x TIMEOUT] [-o OUTFILE] (-t TARGET | -l LIST)
optional arguments:
-h, --help show this help message and exit
-q, --quiet Suppress log output (except errors)
-d, --debug Print debugging messages
-x TIMEOUT, --timeout TIMEOUT
Set timeout for HTTP requests (defaults to 3 seconds)
-o OUTFILE, --outfile OUTFILE
Save output to a file instead of writing to stdout
-t TARGET, --target TARGET
A single hostname or IP address to scan
-l LIST, --list LIST File containing a list of hostnames and/or IP addresses to scan (one per line)
Requis : -t ou -l
-t avec un seul nom d'hôte ou une seule adresse IP. Si le nom d'hôte se résout en plusieurs adresses IP, le script analysera chacune d'elles séparément.-l avec le nom du fichier.Journalisation : pour supprimer la plupart des messages de journal, utilisez -q. Pour afficher plus de détails de journalisation, utilisez -d.
Délai d'attente (timeout) : pour modifier le temps de réponse maximal par requête HTTP, spécifiez une valeur de délai en secondes (3 par défaut). Gardez à l'esprit qu'une seule adresse IP peut générer plus de 200 requêtes dans certaines circonstances (bien que la plupart des analyses n'atteignent pas ce volume), un délai plus court est donc généralement préférable.
Sortie : les résultats d'analyse sont imprimés au format JSON par défaut. Pour enregistrer la sortie dans un fichier au lieu de l'afficher sur stdout, utilisez -o avec un nom de fichier.
$ ./exchange-scanner.py -q -t 192.168.5.3
[
{
"hostname": "192.168.5.3",
"ip_address": "192.168.5.3",
"build_number": "15.2.1118",
"exchange_services": [
"https://192.168.5.3:443",
"imaps://192.168.5.3:993"
],
"product_name": "Exchange Server 2019 CU12 (2022H1)",
"major_version": "2019",
"update": "Cumulative Update 12",
"security_update": null,
"release_date": "2022-04-20",
"recalled": false,
"cpes": [
"cpe:2.3:a:microsoft:exchange_server:2019:cumulative_update_12:*:*:*:*:*:*",
"cpe:2.3:a:microsoft:outlook_web_access:2019:cumulative_update_12:*:*:*:*:*:*"
]
}
]
L'utilisation de cet outil pour attaquer des cibles sans consentement mutuel préalable est illégale. Il incombe à l'utilisateur final de respecter toutes les lois locales, nationales et fédérales applicables. Les développeurs déclinent toute responsabilité et ne sont pas responsables de tout usage abusif ou dommage causé par ce programme.
Ce projet est sous licence GNU General Public License.
recalled dans sa sortie.