[OT] - Sauvez la centrale nucléaire !

Présentation
Quelques mots sur l’épreuve
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
On remarque dans la code de app.js, une fonction qui renvoie vers une page /home
2️⃣ - L’intranet de la centrale nucléaire
Grace à l’URL /home, nous accédons à un intranet contenant les post de plusieurs utilisateurs.
Post n°1
Un administrateur informatique qui informe qu’un malware circule sur internet et qu’il est important d’appliquer une mise à jour “KB923080”.

Le fichier de mise à jour à télécharger est au format .pyc, il pèse 4Ko et contient quelques strings intéressantes :
une adresse ip → 192.168.95.2
Plusieurs chaines hexadécimal :
7265626F6F74 → reboot
E2 00 00 00 14 00 5A 00 10 73 1F 00 00 0B 57 4F 52 4B 53 54 41 54 49 4F 4E → ?
00 77 00 00 00 04 00 5A %02x 04 → ?
Des appels de fonctions vers du modbus et umas
Il est temps de décompiler ce binaire python (nous avons utlisé uncompyle6) :
Que fait ce script ?
Nous avons donc un script qui :
Si il fonctionne
Arrête le PLC Schneider
Si il ne fonctionne pas
Arrête le Master (la machine qui exécute le script) :troll:
Post n°2
Le schéma du prototype d’un réacteur, sans réel intérêt 😀

Post n°3
Une documentation technique qui est devenu illisible…

Pour travailler sur cette image, nous avons transformé le texte contenu dans l’image en fichier .txt via l’outil : https://www.ocr2edit.com.
Cet outil nous a permis de récupérer le contenu suivant.
Il semble être encodé via un système simple, du ROT.
Il s’agissait en effet de ROT13, puisqu’après décodage on retrouve la documentation originale.
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.
Puis nous avons cherché dans la documentation le code de fonction pour démarrer le PLC :
Il suffisait alors de remplacer “41” par “40”
Après avoir executé le script sur le PLC Schneider, on récupère le flag :

FLAG{251AE793494B6347E00E94265A0586D3}
Mis à jour
Ce contenu vous a-t-il été utile ?