◇ OpenCyber Academy
Grado · Capítulo 7 · Español

Capítulo 7 — Redes y protocolos

Aprendizaje gratuito y abierto para quienes desean proteger a las personas y la tecnología. No se necesita una cuenta para estudiar ni consultar las respuestas.

Capítulo 7 — Redes y protocolos

Mapa de la lección

Lección 07 publicada. Mapa, ejemplo, EX019.

flowchart TD
  N0["Resultados de aprendizaje"]
  N1["7.1 Modbus/TCP en una trama"]
  N2["7.2 Sin identidad en el protocolo"]
  N3["7.3 Leer la salida"]
  N4["Síntesis del capítulo"]
  N0 --> N1 --> N2 --> N3 --> N4
  N4 --> EX["Ejemplo resuelto"]
  EX --> Q["Ejercicio EX019"]

Dibujo lógico

flowchart LR
  N0["Resultados de aprendizaje"]
  N1["7.1 Modbus/TCP en una trama"]
  N2["7.2 Sin identidad en el protocolo"]
  N3["7.3 Leer la salida"]
  N4["Síntesis del capítulo"]
  N0 --> N1 --> N2 --> N3 --> N4 --> Q["EX019"]
[Resultados de aprendizaje]
    |
    v
[7.1 Modbus/TCP en una trama]
    |
    v
[7.2 Sin identidad en el protocolo]
    |
    v
[7.3 Leer la salida]
    |
    v
[Síntesis del capítulo]
    |
    v
[Ejemplo resuelto] --> [Ejercicio EX019]

Resultados de aprendizaje

Usted podrá (1) decodificar la cabecera MBAP de Modbus/TCP y el código de función a partir de bytes en bruto; (2) distinguir los códigos de función de lectura y de escritura; (3) explicar por qué Modbus no ofrece autenticación; y (4) enunciar lo que un decodificador de protocolos puede y no puede decirle a un analista.

7.1 Modbus/TCP en una trama

Modbus/TCP lleva una cabecera MBAP de siete bytes —identificador de transacción (2 bytes), identificador de protocolo (2, siempre cero), longitud (2) e identificador de unidad (1)— seguida de la unidad de datos del protocolo, que empieza con un código de función de un byte. La Modbus Application Protocol Specification V1.1b3 define los códigos: el 3 lee registros de retención, el 6 escribe un único registro y el 16 escribe varios registros. En el laboratorio del decodificador, la trama 2 lleva el código de función 6 y la trama 3 el código de función 16; ambas son escrituras, y por eso la lista de permitidos del capítulo 27 se fija en el código de función antes que en la dirección.

7.2 Sin identidad en el protocolo

Nada en la trama dice quién la envió. Cualquier equipo que pueda abrir el puerto TCP 502 de un controlador puede emitir una escritura si el dispositivo la acepta. La seguridad debe venir, por tanto, de la red (segmentación, listas de permitidos) o de una variante protegida como Modbus/TCP Security, que envuelve el protocolo en TLS con roles basados en certificados.

"""Lab 07: decode synthetic Modbus/TCP request headers (offline bytes only)."""
import struct
FC = {1: "read coils", 3: "read holding registers", 4: "read input registers",
      5: "write single coil", 6: "write single register", 16: "write multiple registers"}
frames = ["000100000006010300640002", "00020000000601060064012c", "000300000006011000c80001"]
for h in frames:
    b = bytes.fromhex(h)
    tid, pid, length, unit, fc = struct.unpack(">HHHBB", b[:8])
    addr, val = struct.unpack(">HH", b[8:12])
    kind = "WRITE" if fc in (5, 6, 15, 16) else "read"
    print(f"tid={tid} unit={unit} fc={fc} ({FC[fc]}) addr={addr} arg={val} -> {kind}")

Ejecútelo con python3 lab_modbus.py. Salida verificada:

tid=1 unit=1 fc=3 (read holding registers) addr=100 arg=2 -> read
tid=2 unit=1 fc=6 (write single register) addr=100 arg=300 -> WRITE
tid=3 unit=1 fc=16 (write multiple registers) addr=200 arg=1 -> WRITE

Para PLC-H, que no puede autenticar a los clientes Modbus, este es todo el argumento de los controles compensatorios del capítulo 24: la lista de permitidos del cortafuegos que nombra a HMI-1 y HIST-1 como únicos orígenes autorizados es la comprobación de identidad que le falta al protocolo. Un equipo de la VLAN de oficina que alcanza el puerto 502 es, para PLC-H, indistinguible de HMI-1.

7.3 Leer la salida

La trama 2 escribe el valor 300 en el registro 100; la trama 3 es una escritura de varios registros que empieza en el 200. Observe que el decodificador imprime la dirección inicial y el primer argumento, pero no sabe qué significa el registro 100: eso proviene del mapa de registros del PLC, que es documentación de la planta, no del protocolo. En el mapa de registros de LDHP, el registro 100 contiene el punto de consigna de la temperatura de impulsión en décimas de grado, así que el valor 300 significa 30,0 °C, muy por debajo del punto de funcionamiento de 90 °C. Esa es la diferencia entre «escribir un único registro» y «posible pérdida de calefacción». La nota de Maya añade una columna del mapa de registros precisamente por esta razón, y marca la escritura de varios registros de la trama 3 en el 200 como no explicada hasta que el mapa diga qué controlan los registros a partir del 200.

Caso sintético — Lakeside District Heating Plant. Las tramas del laboratorio se compusieron a mano; no se contactó con ningún dispositivo ni red.

Errores y límites

Algunos dispositivos usan direccionamiento desde cero y algunos documentos usan la numeración de estilo 40001; mezclarlos provoca errores de desfase en uno. Decodificar tráfico de una planta que usted no está autorizado a supervisar no es una práctica aceptable.

Ejercicios — capítulo 7

Síntesis del capítulo

Un decodificador de protocolos le da la estructura; la documentación de la planta le da el significado; y la segmentación, no el protocolo, le da la identidad.

Siga estudiando — capítulo 07 de 40

← Capítulo 06 (borrador) · Índice de capítulos del curso · Capítulo 08 (borrador) →

Respuestas desarrolladas

EX019. tid=4, protocolo 0, longitud 6, unidad 1, fc=4 (lectura de registros de entrada), dirección inicial 0x0032 = 50, cantidad 0x0004 = 4 → una lectura.

EX020. Los bytes no muestran quién la envió ni si ese equipo estaba autorizado, y no muestran que el registro 100 sea el punto de consigna de impulsión en décimas de grado: ambas cosas provienen del contexto de red y del mapa de registros de la planta.

EX021. 925 (0x039D), porque el registro contiene décimas de grado Celsius.