1.1 TEST D’INTRUSION SUR MODBUS
1.1.1 COMPRENDRE LE PROTOCOLE MODBUS
Modbus est un protocole non propriétaire, créé en 1979 par la société Modicon. À l’origine, il fonctionnait sur des réseaux série utilisant RS232/422/485. Face à des besoins croissants, Modbus a évolué pour utiliser le mode TCP (Ethernet et Wifi), permettant aujourd’hui à un grand nombre d’équipements de communiquer entre eux. Dans ce sujet, nous nous concentrerons sur Modbus TCP.
Dans Modbus, les données sont organisées en différentes zones mémoire appelées coils (bobines) et registres, chacune ayant un rôle spécifique. Les coils sont des valeurs sur un seul bit qui peuvent être lues ou écrites par le maître, et représentent généralement des états binaires de sortie, comme allumer ou éteindre un appareil. Un autre type de données, appelé entrées discrètes, est également sur un seul bit mais en lecture seule. Les entrées discrètes indiquent l’état d’un dispositif externe, comme un interrupteur ou un capteur.
En plus des coils et des entrées discrètes, Modbus utilise des registres pour stocker des données plus complexes. Les registres de maintien (holding registers) sont des emplacements mémoire de 16 bits pouvant être lus et écrits par le maître. Ils servent à stocker des valeurs importantes telles que des configurations, des mesures de capteurs ou des paramètres de contrôle. En revanche, les registres d’entrée (input registers) sont aussi sur 16 bits mais en lecture seule. Ces registres contiennent généralement des données issues des dispositifs terrain, comme des mesures de température.
Le protocole définit plusieurs codes de fonction permettant au maître d’interagir avec ces données. Par exemple, il existe des codes pour lire l’état des coils ou des entrées discrètes, lire et écrire dans les registres de maintien, ou lire les registres d’entrée. Cette organisation structurée permet un échange de données efficace et un contrôle précis des équipements industriels.
1.2 PRINCIPALES VULNÉRABILITÉS
1.2.1 MITM (MAN-IN-THE-MIDDLE)
Les attaques MITM exploitent la communication entre deux parties :
- Usurpation d’identité : cela consiste à se faire passer pour un autre appareil ou utilisateur sur le réseau afin d’intercepter ou de modifier les données avant qu’elles n’atteignent leur destinataire, souvent sans que l’émetteur ou le destinataire ne s’en aperçoive.
- Interception illégale : cette attaque survient lorsque des communications non sécurisées (non chiffrées) sont interceptées par un attaquant. L’absence de chiffrement dans Modbus TCP facilite ces interceptions, permettant aux attaquants de lire ou modifier les données en transit (Veridify Security).
Nous verrons plus tard comment utiliser ce type d’attaque.
1.2.2 ERREURS DE CONFIGURATION
Ces vulnérabilités résultent de configurations incorrectes ou insuffisantes des dispositifs ou des réseaux :
- Envoi de valeurs de capteurs et lecture des valeurs : des configurations inadéquates peuvent permettre à des attaquants d’envoyer des valeurs erronées de capteurs ou de lire des valeurs sensibles, manipulant ainsi le fonctionnement du système ou divulguant des informations confidentielles.
- Connexion illégale : cela peut se produire lorsque les dispositifs autorisent des connexions non autorisées en raison de paramètres de sécurité insuffisants, tels que des mots de passe faibles ou par défaut, ou des ports inutilement ouverts sur Internet.
1.3 MODÉLISATION DE L’ATTAQUE
Lors de cette démonstration, nous allons examiner l’utilisation de deux types d’attaques : l’une impliquant une connexion anonyme illégitime et l’autre utilisant le spoofing pour altérer les valeurs dans les registres.
Pour représenter l’attaque, nous utiliserons le modèle Purdue. Le modèle Purdue est un cadre utilisé pour organiser l’architecture des systèmes de contrôle industriel (ICS) en différentes couches distinctes, allant des équipements physiques à la gestion d’entreprise. Il comprend plusieurs niveaux qui séparent les différentes fonctions :
- Les niveaux 0 à 2 gèrent le contrôle des processus en temps réel (équipements physiques, contrôleurs et supervision).
- Les niveaux 3 à 4 se concentrent sur la gestion de la production et les systèmes d’entreprise (gestion des opérations, planification et logistique).
Cette séparation permet d’améliorer la sécurité, la segmentation réseau et l’intégration entre l’IT (technologies de l’information) et l’OT (technologies opérationnelles), et dans notre cas, de localiser précisément l’endroit de l’attaque.
On constate ainsi que notre attaque se situe entre les niveaux un et zéro, car elle se déroule entre un automate S7-1200 et des capteurs. Toutefois, elle pourrait aussi se produire entre les niveaux un et deux si le système de supervision était connecté à l’automate via Modbus.
1.4 DEMONSTRATION
1.4.1 OUTILS REQUIS
- RustScan
- Ettercap
- Wireshark
- Python
- Pymodbus
- Argparse
- Scapy
- Time
1.4.2 ATTAQUE
1.4.2.1 PREMIÈRE ÉTAPE
La première étape de l’analyse du protocole Modbus commence par un scan réseau complet avec RustScan. Cette procédure permet de collecter des informations telles que la plage d’adresses IP et l’état des ports réseau.
Pour Modbus, notre objectif est de trouver une adresse IP avec le port 502 ouvert.
rustscan -a 192.168.0.0/24 -ulimit 5000
L’objectif principal de cette étape est d’obtenir une compréhension complète de la topologie réseau et de ses actifs potentiellement vulnérables (PLC, postes de travail, etc.).
Plusieurs options s’offrent alors à nous : soit nous nous connectons directement au serveur Modbus s’il ne dispose pas de processus d’authentification, soit nous procédons par usurpation d’identité (spoofing).
Demander à ChatGPT
1.4.2.2 ALTERNATIVE 1 : ATTAQUE PAR CONNEXION ILLÉGITIME/h6>
Attention : cette attaque peut provoquer un déni de service. Soyez prudent quant au nombre de requêtes envoyées par seconde.
Une fois la cible identifiée, une tentative de connexion anonyme a été réalisée avec succès, ne nécessitant que l’IP et le port du serveur. L’absence d’identification d’unité (Unit_ID) a simplifié le processus, bien que dans des réseaux plus complexes, un scanner de Unit_ID aurait pu être nécessaire. En utilisant une fonction de lecture en Python, deux registres avec des valeurs décimales ont été détectés. La manipulation répétée de ces valeurs a causé un déni de service, rendant le serveur incapable de déterminer la valeur correcte et entraînant une surcharge du système.
1.4.2.3 ALTERNATIVE 2 : ATTAQUE MAN-IN-THE-MIDDLE
Le serveur est identifié par le port ouvert 502, mais la fonction des clients reste incertaine. La première approche à laquelle un attaquant pourrait penser serait d’utiliser un outil d’analyse réseau comme Wireshark pour observer les communications, mais cela donnerait des résultats limités.
L’objectif est maintenant de rediriger toutes les communications réseau pour qu’elles transitent par notre système, ce qui nous permet d’observer et potentiellement modifier les échanges entre les appareils.
Pour cela, nous utiliserons une méthode appelée empoisonnement ARP (ARP poisoning), qui permet d’intercepter le trafic réseau en usurpant l’adresse MAC associée à une adresse IP, redirigeant ainsi les paquets destinés à une autre machine vers l’attaquant. Cela permet à la machine attaquante de capturer le trafic et d’analyser les données échangées sur le réseau.
Avec ce script, nous passons de l’observation passive à l’interaction active, ce qui nous permet de voir toutes les trames qui circulent sur le réseau. Cela ouvre la possibilité d’intercepter et d’analyser les trames Modbus échangées entre les appareils.
En appliquant un filtre pour les communications Modbus dans Wireshark, nous observons les échanges entre deux machines. Cette identification aide à cibler précisément nos victimes.
L’examen des trames Modbus sur le réseau est particulièrement révélateur pour comprendre les interactions entre les dispositifs client et serveur. La capture ci-dessous illustre une trame Modbus où le client envoie une requête d’écriture au serveur. Il est notable que la communication est en clair, exposant ainsi les détails spécifiques de la commande envoyée.
- Length 6: Ce champ précise que la longueur des données de la trame Modbus, suivant l’en-tête, est de 6 octets.
- Unit Identifier: 0: L’identifiant d’unité, ici fixé à 0 (valeur par défaut), désigne l’esclave destinataire dans les configurations où un seul appareil est interrogé via une connexion TCP. Dans notre cas, il est à 0, valeur par défaut quand aucun Unit_ID n’est défini.
- Function Code:Write Single Register (6): Ce code fonction, 6, correspond à une commande permettant d’écrire une seule valeur dans un registre de l’appareil esclave.
- Reference Number: 0: Le numéro de référence sert à désigner spécifiquement le registre cible dans l’appareil esclave. Ici, un numéro de référence de 0 indique que la modification doit s’appliquer au premier registre disponible, souvent utilisé pour des configurations ou commandes critiques.
- Data: 001c: La valeur ‘001c’ en hexadécimal, équivalente à 28 en décimal, est la donnée que le client souhaite écrire dans le registre désigné.
En résumé, le client envoie une requête au serveur, indiquant qu’il souhaite écrire la valeur 28 (001c) dans le registre 0. À des fins pédagogiques, nous supposerons que ces valeurs correspondent aux sorties d’un capteur de température.
Notre objectif est maintenant d’intercepter cette trame, de l’analyser, puis de la falsifier pour envoyer une valeur de 1000 degrés Celsius, soit 03 E8 en hexadécimal, afin de déclencher une alerte dans le système. Le registre de température contient généralement des valeurs comprises entre 25 et 30 degrés Celsius.
Pour effectuer ce spoofing, il est nécessaire de surveiller spécifiquement les trames contenant des valeurs dans les plages identifiées. Voici un exemple de trames collectées en hexadécimal sur Wireshark.
Lorsqu’une trame correspondante est détectée, le plan est de remplacer la valeur dans le champ Data par 03 E8, correspondant à 1000 en décimal. Pour valider l’efficacité de cette technique, j’utilise Ettercap, un outil open source d’interception réseau capable de mener des attaques de type « man-in-the-middle ».
Nous avons développé un module Ettercap (disponible ici) qui permet de surveiller le trafic réseau, de capturer les trames Modbus et d’analyser les données qu’elles contiennent. En utilisant des critères prédéfinis, notamment les trames indiquant des températures entre 25 et 30 degrés Celsius, le module intervient en modifiant la valeur du champ Data dès que ces conditions sont remplies. Pour cela, il utilise la fonction de remplacement d’Ettercap pour effectuer les modifications nécessaires.
Processus d’implémentation :
- Écoute réseau : Le module commence par une écoute passive du trafic afin d’identifier des trames Modbus spécifiques.
- Détection des conditions : Chaque trame est analysée pour vérifier qu’elle correspond aux critères définis pour la température.
- Modification des données : Lorsqu’une trame éligible est détectée, le champ Data est modifié pour refléter une température de 1000 degrés.
etterfilter -o « file path to prepare (/tmp/filename.ef) » « ettercap module » sudo ettercap -T -i « network interface (eth0) » -F « file path to prepare (/tmp/filename.ef) » -q -M arp / »client IP »// / »server IP »//
Voici un filtre Ettercap simple capable de remplacer un frame spécifique.
Bien sûr, celui-ci est très basique et minimaliste, mais il fait le travail pour notre exemple (ici 28°C) :
if (ip.proto == TCP && tcp.dst == 502 && ip.dst == « ‘IP ADDRESS' ») {
if (search(DATA.data, « Example of modbus frame to search\x00\x06\x00\x06\x00\x00\x00\x1c »)) {
replace(« »Example of a legitimate frame » : \x00\x06\x00\x06\x00\x00\x00\x1c », « Example of an illegitimate frame » : \x00\x06\x00\x06\x00\x00\x03\xe8″);
msg(« Reverse temperature value.\n »);
exit(); }}
2. COMMENT PRÉVENIR CES ATTAQUES ?
- Segmentation du réseau : Il est essentiel de mettre en place une segmentation efficace du réseau, notamment via des systèmes de contrôle réseau tels que les pare-feux. Cette mesure permet d’isoler les réseaux industriels des autres réseaux, réduisant ainsi les risques d’accès non autorisés et limitant l’impact potentiel des attaques.
- Adopter Modbus Secure : Lorsque cela est possible, adopter Modbus Secure afin de bénéficier de communications chiffrées entre les équipements. Cette version renforcée du protocole Modbus garantit que les données échangées sont protégées contre l’interception et la falsification, renforçant ainsi la sécurité des systèmes de contrôle industriels. Le chiffrement des données en environnement industriel est complexe, n’hésitez pas à faire appel à des experts pour mettre en œuvre ce type de solution.
- Maintenir les équipements à jour : Veiller à ce que les équipements bénéficient des derniers correctifs et mises à jour de sécurité. Cette pratique est cruciale pour éviter les vulnérabilités connues et réduire le risque d’exploitation par les attaquants. Ces mises à jour peuvent parfois entraîner des dysfonctionnements, elles doivent donc être déployées uniquement après des tests hors production et selon une politique adaptée de gestion des mises à jour et vulnérabilités.
- Mettre en place des solutions de détection : Installer, si possible, des systèmes de surveillance du réseau pour détecter et prévenir les attaques de type Man-in-the-Middle (MITM). Ces solutions permettent de surveiller les anomalies de trafic et les tentatives d’intrusion, facilitant une réaction rapide et efficace en cas d’incident.
3. AVERTISSEMENT
Les tests d’intrusion dans les environnements de Technologie Opérationnelle (OT) sont intrinsèquement dangereux et peuvent présenter des risques importants. Leur exécution peut entraîner des interruptions de processus, des pannes systèmes, voire la destruction complète d’infrastructures critiques.
Si vous envisagez de réaliser des tests d’intrusion dans un environnement OT, assurez-vous de bien comprendre l’intégralité du système ainsi que les impacts potentiels des tests. Il est fortement recommandé de n’effectuer ces tests que sur des systèmes de contrôle industriel (ICS) simulés afin d’éviter toute conséquence réelle.
Procédez avec une extrême prudence !
4. POUR ALLER PLUS LOIN
[The Modbus Protocol Vulnerability Test in Industrial Control Systems]
https://ieeexplore.ieee.org/abstract/document/9329422
CVE Research for Modbus
https://cve.mitre.org/cgi-bin/cvekey.cgi?keyword=modbus