Hacking de Sistemas de Control Industrial | TryHackMe | Attacking ICS Plant #1 (Walkthrough)

Aprende a descubrir y atacar plantas ICS usando el protocolo Modbus (Modicon / Schneider Electric).

Aprende a descubrir y atacar plantas ICS usando el protocolo Modbus (Modicon / Schneider Electric).

Task 1: Introducción a OT/ICS

La Tecnología Operativa (OT) se refiere a los sistemas usados para monitorear y controlar operaciones industriales. Dentro de este dominio, los Sistemas de Control Industrial (ICS) automatizan procesos físicos mediante equipos especializados como PLC, RTU y HMI.

A diferencia de los entornos IT tradicionales, donde la seguridad se ha refinado durante décadas, los entornos OT históricamente han priorizado la disponibilidad por encima de la integridad y la confidencialidad. Como resultado, muchos sistemas industriales están diseñados para ser rápidos y fiables, pero suelen ser inseguros por diseño.

Una arquitectura SCADA (Supervisory Control and Data Acquisition) típica incluye los siguientes componentes:

  • Computadoras de supervisión: servidores responsables de gestionar el proceso y comunicarse con los dispositivos de campo (PLC/RTU).
  • Controladores Lógicos Programables (PLC): computadoras industriales que leen continuamente las entradas de sensores y controlan actuadores.
  • Unidades Terminales Remotas (RTU): similares a los PLC, se usan a menudo para telemetría distribuida en grandes áreas geográficas.
  • Red de comunicación: conecta todos los componentes SCADA vía Ethernet, enlaces serie, radio o redes celulares. Se espera que los PLC y RTU sigan operando de forma autónoma si se pierde la comunicación.
  • Interfaz Hombre-Máquina (HMI): ofrece una representación visual de la planta y permite a los operadores modificar parámetros o anular el comportamiento normal.

En términos simples:

  • Los procesos industriales dependen de sistemas SCADA críticos para la misión.
  • La seguridad no es el foco principal del diseño en OT/ICS.
  • Los operadores pueden anular manualmente el comportamiento de la planta en cualquier momento.
  • Un software malicioso podría replicar o manipular estas acciones.

Para una referencia más detallada, consulta la Guía NIST SP 800–82 de seguridad para Sistemas de Control Industrial (ICS).

Task 2: Introducción al protocolo Modbus

Modbus es un protocolo de comunicación industrial usado comúnmente para intercambiar datos entre dispositivos en entornos OT. Fue desarrollado originalmente por Modicon (hoy Schneider Electric) y sigue siendo ampliamente adoptado porque su especificación es abierta y libre de regalías.

Modbus sigue un modelo maestro/esclavo en el que el dispositivo maestro es responsable de leer y escribir los registros expuestos por los dispositivos esclavos.

En su forma tradicional, Modbus RTU, la comunicación ocurre sobre RS-485 y soporta un único maestro con múltiples esclavos, cada uno identificado por una dirección de 8 bits.

El protocolo opera con varios tipos de registros:

  • Discrete Input (1 bit, RO): estados digitales de solo lectura.
  • Coil (1 bit, R/W): salidas digitales que se pueden leer o escribir.
  • Input Register (16 bits, RO): lecturas de sensores o valores de medición.
  • Holding Register (16 bits, R/W): registros de propósito general que soportan tanto lectura como escritura.

Los códigos de función Modbus más comunes incluyen:

Tabla 1. Códigos de función Modbus comunes.

Modbus TCP encapsula los mensajes Modbus RTU dentro de paquetes TCP para transmitirlos por redes Ethernet. El puerto estándar de escucha de Modbus TCP es el 502, que a menudo queda expuesto sin autenticación en los dispositivos industriales.

Antes de empezar el laboratorio, hay que instalar la librería de Python requerida:

pip3 install pymodbus==1.5.2

¿Cuál es la función usada para leer holding registers en la librería pymodbus?

read_holding_registers

En el script discovery.py, el método read_holding_registers del cliente síncrono de pymodbus se usa para recuperar los valores almacenados en los holding registers del dispositivo.

Estos registros son de 16 bits y soportan operaciones de lectura/escritura, comúnmente usados para almacenar valores de sensores o estados internos del proceso.

Figura 1. Script encargado de leer los registros.

¿Cuál es la función usada para escribir holding registers en la librería pymodbus?

write_register

En el script set_registry.py, el cliente Modbus usa el método write_register para modificar el valor de un holding register específico.

Los holding registers soportan operaciones de lectura y escritura, lo que los hace adecuados para controlar actuadores o alterar el estado operativo del proceso.

Figura 2. Script encargado de escribir los registros.

Task 3: Discovery

Tenemos tres fases:

  1. Inicialización: la planta arranca desde cero. El rodillo mueve la primera botella bajo la boquilla.
  2. Llenado: una vez que la botella está bajo la boquilla, esta se abre y el agua fluye hacia la botella.
  3. Movimiento: una vez llena la botella, el rodillo arranca de nuevo para mover la siguiente botella vacía bajo la boquilla.

Cuando termina la fase 3, la planta vuelve a empezar con la fase 2.

A partir de las tres fases descritas, podemos observar:

  • Sensores: usados para leer un estado de la planta.
  • Actuadores: usados para alterar el estado de la planta.

Ejemplo: un sensor puede detectar si hay una botella bajo la boquilla, mientras que un actuador puede abrir o cerrar la boquilla.

¿Cuántas fases podemos observar?

3

La planta sigue un ciclo operativo repetitivo compuesto por tres fases principales: inicialización, llenado y movimiento.

¿Cuántos sensores podemos observar?

2

La interfaz de la planta muestra dos sensores físicos:

  • El sensor de nivel (rojo), que indica cuándo la botella está llena.
  • El sensor de presencia (verde), que detecta si hay una botella posicionada bajo la boquilla.

¿Cuántos actuadores podemos observar?

3

La planta incluye tres actuadores principales:

  • El control de arranque/parada de la planta.
  • El motor del rodillo, que mueve las botellas.
  • La válvula de la boquilla, que se abre durante la fase de llenado.

Usando el script discovery.py, ¿cuántos registros podemos contar?

16

Al ejecutar el script discovery.py, el dispositivo Modbus devuelve un arreglo con 16 valores, lo que confirma que la planta expone 16 holding registers. Aunque todos pueden consultarse, solo un subconjunto se usa activamente para representar sensores y actuadores dentro del proceso de llenado de botellas.

Figura 3. Salida de discovery.py mostrando 16 registros disponibles.

Tras arrancar la planta y cargar una botella, ¿cuántos registros cambian de valor continuamente?

4

Al ejecutar el script discovery.py queda claro que cuatro registros alternan continuamente sus valores mientras la planta está en operación.

Estos registros corresponden a componentes activamente involucrados en el ciclo de producción.

Figura 4. Registros cambiando de estado durante la operación.

¿Cuál es el valor mínimo observado?

0

¿Cuál es el valor máximo observado?

1

¿Cuál registro mantiene su valor?

16

El registro 16 corresponde al control de arranque/parada (Start/Stop) de la planta. Su valor no cambia automáticamente durante el proceso: solo se actualiza cuando el operador (o un atacante) enciende o apaga la planta manualmente. Por eso permanece constante en la salida mientras el sistema está en funcionamiento.

Figura 5. Registro estable identificado en discovery.py.

¿Qué registros se ponen en 1 mientras la boquilla está llenando una botella?

2 4

Durante la fase de llenado, la salida de discovery.py muestra que los registros 2 y 4 cambian a 1 al mismo tiempo.

  • El registro 2 corresponde al sensor de nivel de agua, indicando que la botella se está llenando.
  • El registro 4 es el actuador de la boquilla, que abre la válvula para dejar fluir el agua hacia la botella.

Figura 6. Registros activos durante la fase de llenado.

¿Qué registros se ponen en 1 mientras el rodillo mueve las botellas?

1 3

Durante la fase de movimiento, la salida de discovery.py muestra que los registros 1 y 3 cambian a 1.

  • El registro 1 corresponde al sensor de presencia de botella, que se activa cuando la botella se desplaza por el rodillo.
  • El registro 3 es el actuador del motor del rodillo, encargado de llevar la botella a la siguiente estación.

Figura 7. Registros activos durante el movimiento del rodillo.

¿De qué color es el sensor de nivel de agua?

red

¿De qué color es el sensor de botella?

green

La interfaz de la planta muestra dos sensores: el sensor de nivel de agua, representado como un punto rojo sobre la botella durante el llenado, y el sensor de presencia de botella, representado como un punto verde cerca de la cinta. El sensor rojo se activa cuando la botella alcanza el nivel requerido, mientras que el verde detecta cuándo una botella está correctamente posicionada bajo la boquilla.

Figura 8. Sensor de nivel (rojo) y sensor de botella (verde).

Si observas la planta al inicio, ¿cuál es el registro asociado al rodillo?

3

Al comienzo del ciclo, el registro 3 cambia a 1, señalando que el motor del rodillo se ha activado.

Figura 9. Registro del rodillo activado al inicio del ciclo.

Con base en la respuesta anterior, ¿cuál es el registro asociado al sensor de nivel de agua?

1

El registro 1 se activa cuando la botella está correctamente alineada bajo la boquilla, habilitando la fase de llenado.

Figura 10. Registro asociado al sensor de nivel durante el llenado.

Task 4: Play to learn

¿Cuál es el registro asociado a la boquilla?

4

Al forzar el registro 4 con el script set_registry.py, la boquilla se abre sin importar la posición de la botella. Esta reacción inmediata indica claramente que el registro 4 controla el actuador de la boquilla.

Figura 11. Efecto de forzar el registro asociado a la boquilla.

Task 5: Attack

Apaga la planta y evita que el operador vuelva a encenderla.

No answer needed

El script attack_shutdown.py fuerza el registro 16, que controla el actuador de arranque/parada de la planta, al estado "apagado". Dado que este es el registro responsable de habilitar o deshabilitar todo el proceso, manipularlo directamente provoca que la planta se detenga de inmediato.

El script escribe repetidamente el valor de apagado en el registro, impidiendo que el operador o el sistema de control restauren la operación normal. Como resultado, el ciclo de producción queda completamente detenido.

Figura 12. Ejecución del script de apagado forzado de la planta.

Arranca la planta, abre la boquilla mientras las botellas se mueven.

No answer needed

Arranca la planta, abre la boquilla y detén el rodillo.

No answer needed

Repite el ataque de la pregunta 1 abusando de los registros de sensores.

No answer needed

Repite el ataque de la pregunta 2 abusando de los registros de sensores.

No answer needed

Repite el ataque de la pregunta 3 abusando de los registros de sensores.

No answer needed

El script attack_move_fill.py fuerza el actuador de la boquilla (registro 4) para que permanezca abierto incluso cuando no hay ninguna botella debajo. Esto provoca que el agua se derrame directamente sobre la cinta transportadora mientras el rodillo está en movimiento, rompiendo la secuencia normal del proceso.

Como resultado:

  • La boquilla permanece abierta fuera de su ventana de operación prevista.
  • Se desperdicia agua de forma continua.
  • Se pierde la sincronización entre sensores y actuadores.

Figura 13. Activación forzada de la boquilla.

Conclusión

Este laboratorio demostró cómo un sistema industrial que usa Modbus puede manipularse interactuando directamente con sus registros. Al identificar la relación entre sensores, actuadores y la lógica de control, fue posible alterar la secuencia operativa de la planta, desincronizar procesos y forzar condiciones inseguras con simples escrituras en los holding registers.

Estos hallazgos resaltan una debilidad común en los entornos OT/ICS: la falta de autenticación, validación de comandos y controles de integridad en los protocolos heredados. Como resultado, la capa de control se convierte en una superficie de ataque accesible donde los adversarios pueden impactar tanto la disponibilidad como la seguridad física.

Si te interesa seguir mis próximos artículos sobre OT/ICS, certificaciones, contenido de HTB y experiencias de Red Team, te invito a conectar conmigo en LinkedIn.