Color Plant 1+2 (Misc) - FCSC 2022

Color Plant 1+2 (Misc) - FCSC 2022

Fichiers du challenge Principe:
Accéler au système SCADA (virtuel) d'une usine, et utiliser un protocole OT (ModBus) pour manipuler des produits

Le challenge

On doit contacter un automate via netcat pour récupérer un token et accéder à l'interface SCADA d'une usine

Partie 1, Accéder au SCADA

Un contexte est donné, avec des informations pour les deux parties du challenge (qu'on va regarder séparément)
Pour cette première partie, la liste des registres sera l'information la plus utile, dont Holding Register 0-31 qui contient le token que l'on cherche
On cherche d'abord le fonctionnement du protocole ModBus (mentionné et donné par le challenge)
Une lib Python pyModBusTCP va nous aider à directement communiquer avec l'OT, pour lire le registre contenant le token
On lit 32 octets du registre (le code est dans le zip) Holding Register à partie de l'indice zéro (informations données par le contexte du challenge)

Les octets sont alors à transcrire en ASCII. Le sleep est une astuce, très moche, pour garder la connexion ouverte car j'ignorai (à la lecture du contexte du challenge) si l'interface SCADA se coupe en cas de fermeture de la connexion TCP

On se log à l'interface SCADA via le token, et on a le flag:
FCSC{266350f412840c932b29bb095394d318c17c844f70c05f49c9998a8e614be531}

Le token varie au fil du temps, et il faudra donc réutiliser notre code Python pour en récupérer d'autres et résoudre la seconde partie du challenge

Partie 2, pilotage

On doit maintenant piloter l'usine via l'interface SCADA pour créer une couleur (R G B)=(32 126 42) à partir de silots Rouge, Vert et Bleu
Dans le contexte, on nous donne les informations sur le fonctionnement de l'interface SCADA…
…avec différents éléments "OT"
Les valves nous seront cette fois utile

Faire joujou

Le mieux est de faire d'abord joujou avec Modbus pour lire et écrire les différents registres, voir leur effet et planifier les actions à réaliser

N'ayant pas réussi à écrire plusieurs "coils register", j'ai choisi de n'en écrire qu'un à la fois

En pratique, les accès en lecture ne m'ont peu servis: je ne les ai utilisés que pour lire la quantité de Rouge ou de Bleu ou de Vert écoulée. Surveiller une seule des couleurs en ayant correctement piloté les débits de vannes avant suffit.

J'en profite, au passage, pour tester l'interface un peu "en temps réel", histoire de récupérer des informations sur son fonctionnement

Le système étant virtuel, il n'est pas "parfait": si vous ouvrez une vanne avec un débit de 4 alors que le tanker de mélange M est rempli à 98/100, alors l'interface virtuelle coupera immédiatement les vannes (car 98+4 = 102 >100) alors qu'en vrai, le capteur ne couperait la vanne qu'à M=100

Mon plan est de d'abord remplir (16 68 16) soit un total de 100, de vider la cuve de mélange, puis de la remplir avec (16 58 26) et de la vider de nouveau, menant à un total de (32 126 42).

Exécution du plan

On remplit donc le mélangeur d'abord
On vide le mélangeur puis on le re-remplit
Puis on remplit M avec (16 58 26)
On le vide de nouveau
Et on fige la situation, le temps de récupérer le flag dans la zone d'alertes:
FCSC{3518dcd9579b4f2bf4ab32f126aa746e00767d6b130ef6c2e79ae6a313d0ba07}

Je passe sous silence les nombreux essais die & retry pour arriver à ce résultat! L'essentiel est de bien surveiller l'état des conteneurs de couleur, pour comprendre ce qu'il se passe.

Comme vous le verrez dans le code (cf ZIP), j'ai dû ralentir le flux de Vert sur la fin, à cause du comportement irréaliste du simulateur (qui bloque à 98/100 si le débit est de 4 au lieu de bloquer à 100)

De plus, comme le total de couleurs est de 200, que la capacité maximale du mélangeur est de 100 et que l'automate de sécurité vite le mélangeur quand il est plein, je me suis servi des actions automatiques de cet automate de sécurité pour vider le mélangeur!
En vrai, ne faites pas ça, les arrêts d'urgence ne sont pas des features à utiliser

Fichiers du challenge

↩ Retour à la liste des challenges

⇇ Retour à l'accueil