Solution de tiphergane pour Tunnel Routier 1/2

misc protocole industriel

14 mai 2026

Dans cette première partie de l’épreuve, vous devez retrouver un token caché dans les données d’identification de l’automate pour vous permettre d’accéder à la deuxième partie de l’épreuve. Note: La description du système est disponible sur une page dédiée
nc tunnel-routier.fcsc.fr 502

La page dédiée nous donne les informations sur la SCADA, le context et sur les conditions de victoire. Pour ne pas rendre le writeup trop lourd, je ne les détailles pas mais elles sont disponible ici (jusqu’au déménagement sur Hackropole).

Dans la partie 1, on nous demande de récupérer le token qui servira à la connexion à l’automate, car l’interface web est une version en lecture seule. Pour cela, nous allons utiliser la librairie python pyModbus.
Si on lis bien ce qui est demandé, ils disent bien où est situé le token, pour ceux qui auraient fait Color Plant en 2022, le token était dans la mémoire de l’automate. Cette année nous allons chercher les données d’identification, pour cela, on va devoir chercher un peu sur internet et trouver l’option read_device_information dans la doc de pyModbus. Nous allons donc pouvoir faire le code suivant pour allez récupérer le 1er flag:

from pymodbus.client import ModbusTcpClient
from pymodbus.constants import DeviceInformation
import webbrowser
import re

from pwn import *

host, port = "tunnel-routier.fcsc.fr", 502
c = ModbusTcpClient(host,port=port)

def connectToScada():
    c.connect()
    if c.connected:
        success(f"successfully connected to {host}:{port}")
    else:
        warn(f"can't connect to {host}:{port}")
        raise systemExit

def getToken():
    token = read_device_information()
    site = "https://"+ host + "/" + token
    return site

def readDeviceInformation():
    r = c.read_device_information(read_code=DeviceInformation.BASIC)
    i = r.information[1].decode("ascii")
    token = re.search(r"Your token is : ([a-f0-9]+)",i).group(1)
    info(f"{token=}")
    return token

if __name__ == "__main__":
    connectToScada()
    site = getToken()
    openWebsite(site)
    c.close()

La page web s’ouvre, et le premier flag apparait en haut à droite.

FCSC{d7e9eb1227eed29c5afc9344bc5733931b511f0faf6d1de2d3c74800688f8180}