Il s’agit d’une épreuves de rapidité sur le thème de l’OT.
Cette épreuve sera déclenché à la surprise des participants par les organisateurs. Le but de cette épreuve est de mettre les équipes face à une situation de gestion de crise dans laquelle ils devront s’organiser et réagir rapidement. La thématique de l’épreuve est :
Compromission d’un automate industriel
Reverse d’un malware industriel
Réglement
Une fois l’annonce du démarrage d’une épreuve de rapidité faite par les organisateurs, les participants auront 1 à 2 minutes pour se connecter à la plateforme Cyber Range avant que l’épreuve ne démarre. Ils auront ainsi au maximum 15 à 20 minutes pour résoudre l’épreuve (en fonction de la limite fixée par les organisateurs selon la difficulté de l’épreuve), cette dernière prendra fin une fois le flag de l’épreuve correspondante trouvé et soumis dans le portail de points.
Score
Une des particularités des épreuves de rapidité est que les équipes perdront des points tant qu’elles n’auront pas réussi à résoudre l’épreuve en question. La perte de points s’arrêtera également si le temps maximum alloué à la résolution d’une épreuve est atteint. La première équipe parvenant à résoudre l’épreuve se verra gratifier d’un bonus de points, contrairement aux autres équipes qui devront toutefois résoudre l’épreuve rapidement pour limiter leur perte de points.
Épreuve
📜 Contexte
Une centrale nucléaire subit une cyberattaque. La France est en danger !
La cause de ce problème serait l’exécution d’un malware sur nos automates de gestion des réacteurs.
Trouvez d’où vient le problème et remettez en état de marche la centrale ☢️
1️⃣ - Le jeu
Pour commencer, nous devions nous connecter à une interface web “NukeCloud”, une plateforme de collaboration sécurisé pour les ingénieurs nucléaires.
Le site nous met à disposition un “jeu” dans lequel il est possible de déplacer les carrés bleu et rouge.
Après avoir joué quelques secondes, on se rend compte que le jeu est inutile.
On se tourne rapidement vers le code source de la page :
3 scripts js
1 fichier CSS
Le jeu est géré via le script app.js
<!DOCTYPE html><htmllang="en"><head><metahttp-equiv="content-type"content="text/html; charset=UTF-8"> <metacharset="utf-8"> <title>NukeCloud</title> <scriptsrc="NukeCloud_fichiers/jquery.js"></script> <scriptsrc="NukeCloud_fichiers/p5.js"></script> <scriptsrc="NukeCloud_fichiers/app.js"></script> <linkrel="stylesheet"type="text/css"href="NukeCloud_fichiers/style.css"> </head> <body> <divstyle="text-align:center;margin-top:20px;margin-bottom:-10px"> <imgsrc="NukeCloud_fichiers/logo.svg"width="150"></div> <h1>NukeCloud</h1> <divstyle="text-align:center;margin-top:-20px;font-size:20px"> <label>The secured collaboration platform for nuclear engineers.</label> </div> <divstyle="background:#EBEBEB;padding-top:10px;padding-bottom:20px;margin-top:20px"> <divid="container"> <h2>Please prove you are an engineer (or a hacker...) to continue:</h2> <div id="view"><canvas id="defaultCanvas0" class="p5Canvas" style="width: 500px; height: 500px;" width="1000" height="1000"></canvas></div>
<divclass="footer"> <divclass="buttons"> <buttonid="resetButton">Reset</button> </div> </div> </div> </div></body></html>
On remarque dans la code de app.js, une fonction qui renvoie vers une page /home
Il s’agissait en effet de ROT13, puisqu’après décodage on retrouve la documentation originale.
tr 'A-Za-z' 'N-ZA-Mn-za-m' < doc.txt
UMAS protocol (Unified Messaging Application Services) is used to configure and monitor the
Schneiter-Electric PLCs. It is based on the well-known modbus protocol and uses one of the reserved
Function Cotes specified in the Modbus Protocol Specification (Function Code 90 or BX5A in
hexatecimal). When Schneider Electric PLCs receive a modbus packet, it checks if the Function Code is
BX5A (function 90) and if so, some specific libraries are used, otherwise, the modbus request is treated
normally, returning or modifving the srecified register(s) or coil(s) of the PLC. The following is a non-
exhaustive list of implemented UMAS function cones:
UMAS Function Code Bx01 - INIT_COMM: Initialize a UMAS communication
UMAS Function Code 0x02 - READ_ID: Request a PLC ID
UMAS Function Code 0x03 - READ_PROJECT_INFO: Read Project Information
UMAS Function Code 0x04 - REAT_PLC_INFO: Get internal PLC Info
UMAS Function Code 0x06 - READT_CARD_INFO: Get internal PLC SD-Card Info
UMAS Function Code BXBA - REPEAT: Sends back data sent to the PLC (used for synchronization)
UMAS Function Code 0X10 - TAKE_PLC_RESERVATION: Assign an "owner" to the PLC
UMAS Function Cotde 0x11 - RELEASE_PLC_RESERVATION: Release the reservation of a PLC
UMAS Function Code BXx12 - KEEP_ALIVE: Keer alive message
UMAS Function Code 0x20 - READ_MEMORY_BLOCK: Read a memory block of the PLC
UMAS Function Code 0x22 - READ_VARIABLES: Read System bits, System Words and Stratevy variables
UMAS Function Code 0x23 - WRITE_VARIABLES: Write System bits, System Words and Strategy variables
UMAS Function Code 0x24 - READ_COILS_REGISTERS: Read coils and holding registers from PLC
UMAS Function Code 0x25 - WRITE_COILS_REGISTERS: Write coils and holding registers into PLC
UMAS Function Code 0x30 - INITIALIZE_UPLOAD: Initialize Stratevgy upload (copy from engineering
PC to PLC)
UMAS Function Code 0x31 - UPLOAT_BLOCK: Upload (copy from engineering PC to PLC) a strategy block
to the PLC
UMAS Function Code 0x32 - ENDT_STRATEGY_UPLOAD: Finish stratevgy Upload (cory from engineering PC
to PLC)
UMAS Function Code 0x33 - INITIALIZE_UPLOAD: Initialize Stratevy download (copy from PLC to
engineering PC)
UMAS Function Code 0x34 - TOWNLOAT_BLOCK: Download (copy from PLC to engineering PC) a strategy
block
UMAS Function Code 0x35 - ENDT_STRATEGY_DOWNLOAD: Finish strategy Townload (copy from PLC to
engineering PC)
UMAS Function Code 0x39 - READT_ETH_MASTER_DATA: Reatd Ethernet Master Data
UMAS Function Code 0x40 - START_PLC: Starts the PLC
UMAS Function Code Bx41 - STOP_PLC: Stops the PLC
UMAS Function Code 0X50 - MONITOR_PLC: Monitors variables, Systems bits and worts
UMAS Function Code 0X58 - CHECK_PLC: Check PLC Connection status
UMAS Function Code 0X70 - READT_IO_OBJECT: Read IO Object
UMAS Function Code 0X71 - WRITE_IO_OBJECT: WriteIO Object
UMAS Function Code 0X73 - GET_STATUS_MODULE: Get Status Module
Dans cette documentation, nous retrouvons une vingtaine de code de fonction UMAS.
Mais qu’est ce que UMAS ?
Le protocole UMAS (Unified Messaging Application Services) est utilisé pour configurer et surveiller les Automates Schneiter-Electric.
Il est basé sur le protocole modbus.
Lorsque les automates Schneider Electric reçoivent un paquet modbus, ils vérifient si le code de fonction est BX5A (fonction 90) et si oui, certaines bibliothèques spécifiques sont utilisées, sinon, la requête modbus est traitée normalement, en retournant ou en modifiant le(s) registre(s) ou bobine(s) spécifié(s) de l'automate.
Post n°4
Un message d’un employé de la centrale à ses collègues disant qu’il a eu des problèmes avec un outil qui demande en prérequis une ancienne version de python. Docker semble corriger le problème…
3️⃣ - Sauver la centrale nucléaire
L’objectif est maintenant de sauver la centrale en exécutant le script mais cette fois ci en démarrant la centrale et sans éteindre notre propre machine.
Nous avons donc commenté la fonction clean pour protéger notre Master des Exceptions.