
Exploit PoC Modbus TCP démontrant des écritures usurpées sur des bobines en lecture seule dans des automates programmables simulés, soulignant les failles de contrôle d'accès SCADA/ICS.
# modbus_plc_sim.py - Simulated Modbus PLC with read‑only coils
from pymodbus.server.sync import StartTcpServer
from pymodbus.device import ModbusDeviceIdentification
from pymodbus.datastore import ModbusSequentialDataBlock
from pymodbus.datastore import ModbusSlaveContext, ModbusServerContext
store = ModbusSlaveContext(
di=ModbusSequentialDataBlock(0, [1]*100), # coils – should be read‑only
co=ModbusSequentialDataBlock(0, [0]*100), # discrete inputs
hr=ModbusSequentialDataBlock(0, [0]*100),
ir=ModbusSequentialDataBlock(0, [0]*100)
)
# Vulnerability: coil block (di) is writable via function code 5 (Write Single Coil) normally, but maybe misconfigured.
# To simulate a flaw, we'll allow writing to coils using function code 15 (Write Multiple Coils) even though they should be read‑only.
# The pymodbus default allows writing to coils. We'll just demo writing to a coil that is supposed to be safety‑critical.
context = ModbusServerContext(slaves=store, single=True)
StartTcpServer(context, address=("0.0.0.0", 5020))
Un automate industriel (PLC) expose des bobines censées être en lecture seule (par exemple, des états d’alarme). Cependant, en raison d’une erreur de configuration, le serveur Modbus accepte des commandes d’écriture (code de fonction 5 ou 15) sur ces bobines, permettant à un attaquant de manipuler les systèmes de sécurité.
pip install pymodbus
python modbus_plc_sim.py
python exploit_modbus_write.py