OpenCyber Academy
Graduação · Capítulo 7 · Português
Código do curso: OCA-114Capítulo 07: OCA-114-C007

Capítulo 7 — Redes e protocolos

Ensino gratuito e aberto para quem deseja proteger pessoas e tecnologias. Não é preciso criar uma conta para estudar ou consultar as respostas.

Mapa da aula

Aula 07 publicada. Mapa, exemplo, EX019.

flowchart TD
  N0["7.1 Modbus/TCP num quadro"]
  N1["7.2 Nenhuma identidade no protocolo"]
  N2["7.3 Lendo a saída"]
  N3["Síntese"]
  N0 --> N1 --> N2 --> N3
  N3 --> EX["Exemplo resolvido"]
  EX --> Q["Exercício EX019"]

Desenho lógico

flowchart LR
  N0["7.1 Modbus/TCP num quadro"]
  N1["7.2 Nenhuma identidade no protocolo"]
  N2["7.3 Lendo a saída"]
  N3["Síntese"]
  N0 --> N1 --> N2 --> N3 --> Q["EX019"]
[7.1 Modbus/TCP num quadro]
    |
    v
[7.2 Nenhuma identidade no protocolo]
    |
    v
[7.3 Lendo a saída]
    |
    v
[Síntese]
    |
    v
[Exemplo resolvido] --> [Exercício EX019]

Objetivos de aprendizagem

Você vai (1) decodificar o cabeçalho MBAP e o código de função do Modbus/TCP a partir de bytes brutos; (2) distinguir códigos de função de leitura e de escrita; (3) explicar por que o Modbus não oferece autenticação; e (4) dizer o que um decodificador de protocolo pode e não pode contar a um analista.

7.1 Modbus/TCP num quadro

O Modbus/TCP carrega um cabeçalho MBAP de sete bytes — identificador de transação (2 bytes), identificador de protocolo (2, sempre zero), comprimento (2) e identificador de unidade (1) —, seguido da unidade de dados de protocolo, que começa com um código de função de um byte. A Modbus Application Protocol Specification V1.1b3 define os códigos: 3 lê holding registers, 6 escreve um único registrador, 16 escreve vários registradores. No laboratório do decodificador, o quadro 2 traz o código de função 6 e o quadro 3, o código de função 16; ambos são escritas, e é por isso que a lista de permissão do Capítulo 27 se preocupa com o código de função antes do endereço.

7.2 Nenhuma identidade no protocolo

Nada no quadro diz quem o enviou. Qualquer host que consiga abrir a porta TCP 502 de um controlador pode emitir uma escrita, se o dispositivo aceitá-la. A segurança precisa, portanto, vir da rede (segmentação, listas de permissão) ou de uma variante protegida como o Modbus/TCP Security, que envolve o protocolo em TLS com papéis baseados em 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}")

Execute com python3 lab_modbus.py. Saída 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 o PLC-H, que não consegue autenticar clientes Modbus, esse é todo o argumento para os controles compensatórios do Capítulo 24: a lista de permissão do firewall que nomeia a HMI-1 e o HIST-1 como as únicas origens permitidas é a verificação de identidade que falta ao protocolo. Um host na VLAN do escritório que alcance a porta 502 é, para o PLC-H, indistinguível da HMI-1.

7.3 Lendo a saída

O quadro 2 escreve o valor 300 no registrador 100; o quadro 3 é uma escrita de vários registradores começando em 200. Observe que o decodificador imprime o endereço inicial e o primeiro argumento, mas não sabe o que o registrador 100 significa — isso vem do mapa de registradores do CLP, que é documentação da planta, e não protocolo. No mapa de registradores da LDHP, o registrador 100 guarda o setpoint de temperatura de ida em décimos de grau, de modo que o valor 300 significa 30,0 °C, muito abaixo do ponto de operação de 90 °C. Essa é a diferença entre "escrever um único registrador" e "possível perda de calor". A nota de Maya acrescenta uma coluna de mapa de registradores exatamente por isso, e marca a escrita de vários registradores do quadro 3, em 200, como inexplicada até que o mapa diga o que os registradores a partir de 200 controlam.

Caso sintético — Lakeside District Heating Plant. Os quadros do laboratório foram compostos à mão; nenhum dispositivo ou rede foi contatado.

Erros e limites

Alguns dispositivos usam endereçamento a partir de zero, e alguns documentos usam a numeração no estilo 40001; misturá-los causa erros de deslocamento de um. Decodificar o tráfego de uma planta que você não está autorizado a monitorar não é uma prática aceitável.

Exercícios

Síntese

Um decodificador de protocolo dá a estrutura; a documentação da planta dá o significado; e a segmentação, não o protocolo, dá a identidade.

Respostas comentadas

EX019. tid=4, protocolo 0, comprimento 6, unidade 1, fc=4 (leitura de input registers), endereço inicial 0x0032 = 50, quantidade 0x0004 = 4 → uma leitura.

EX020. Os bytes não mostram quem o enviou nem se aquele host estava autorizado, e não mostram que o registrador 100 é o setpoint de ida em décimos de grau — as duas coisas vêm do contexto de rede e do mapa de registradores da planta.

EX021. 925 (0x039D), porque o registrador guarda décimos de grau Celsius.