Hacking: simulazione Modbus TCP in Linux

I sistemi ICS utilizzano molti protocolli diversi per comunicare rispetto ai sistemi IT standard. Lo standard più utilizzato è il protocollo Modbus. Sviluppato per la prima volta da Modicon (ora Schneider Electric) nel 1979 come protocollo seriale, è stato modificato e aggiornato per funzionare su rete Ethernet TCP, assumendo il nome di Modbus TCP. Di seguito puoi vedere un diagramma che riassume la struttura del pacchetto RTU (seriale) e quella TCP.

Se vuoi approfondire l'argomento ti suggerisco di leggere la guida che ho scritto "Hacking: Modbus".

In questo tutorial simuleremo una configurazione master e slave Modbus per illustrare come questo protocollo ormai quasi onnipresente nei sistemi OT funzioni in un ambiente industriale. Lo scopo è di capire meglio come funziona il protocollo e come può essere hackerato, manipolato e protetto.

Installazione

Modbus utilizza un'architettura master/slave (client/server) in cui solo un dispositivo può inviare le richieste. Gli slave/server forniscono i dati richiesti al master o eseguono l'azione richiesta dal master stesso. Uno slave è qualsiasi dispositivo periferico (trasduttore, valvola, unità di rete o altro ancora) che elabora le informazioni e invia il suo output al master tramite il protocollo Modbus.

Nel nostro caso useremo due software di simulazione disponibili in forma gratuita, uno con funzionalità di master chiamato QModMaster e l'altro in versione slave, dal nome ModbusPal.

QModMaster è un'applicazione open source basata sul framework Qt che implementa le funzioni di un master Modbus. E' dotata di una GUI che consente una facile configurazione delle modalità di comunicazione (RTU, TCP) e di un bus monitor per analizzare il traffico dei pacchetti di comunicazione. Nel caso si utilizzi Windows è disponibile la versione binaria pre-compilata. Nel nostro caso, faremo il download del codice sorgente e ne eseguiremo la compilazione su una macchina Linux.

QModMuster in esecuzione su Linux

ModbusPal è un'applicazione scritta in Java, quindi non necessita di alcuna compilazione in quanto indipendente dall'host di esecuzione. Simula un dispositivo slave Modbus, con alcune funzioni avanzate come gli scripts Python.

ModbusPal con la tipica interfaccia "Java style"

Come detto, dobbiamo compilare QModBus in modo che possa essere eseguito su sistemi Linux, nel mio caso Kubuntu 19.10. Scarichiamo il coside sorgente qModMaster-code-0.5.2-3.zip e salviamolo in una cartella di lavoro, nel mio caso ~/Develop/Projects/Modbus/qModMaster-code-0.5.2-3.

Se listiamo i files presenti nella cartella vediamo che è presente il file qModMaster.pro, tipico di un progetto sviluppato con Qt. Per la compilazione è necessario disporre di una versione minima Qt 5.2.1 o superiore, scaricabile da questo link.

A questo punto possiamo usare il comando qmake per convertire il file .pro in Makefile, compilabile con il più classico make.

$ qmake -o Makefile qModMaster.pro
$ make

Dopo alcuni secondi di elaborazione abbiamo il nostro eseguibile pronto!

Utilizzo del simulatore

Per prima cosa dobbiamo configurare lo slave, in modo che metta a disposizione le proprie risorse da far leggere al master, in questo caso configuriamo dei registri "Holding Registers".

Entrambe le applicazioni richiedono privilegi sudo per poter accedere alla porta 502/TCP, per cui occorre avviarle con sudo ./ModbusPal e sudo ./qModMaster nelle rispettive cartelle di lavoro.

Configurazione del modulo slave ModbusPal

Link settings Selezioniamo "TCP Port 502". Il protocollo Modbus TCP usa di default la porta 502 per la comunicazione TCP

Modbus slaves Aggiungiamo un nodo slave premendo il pulsante "Add", selezioniamo il numero dello slave e inseriamo un nome, nel nostro caso "Slave1".

A questo punto dobbiamo configurare i parametri che rendiamo disponibili nel nostro slave. Click sull'icona con l'occhio per aprire la schermata delle proprietà. Successivamente, click su "Add" e inseriamo il numero di registri che vogliamo aggiungere, nel nostro caso da 1 a 8.

Ed ecco che compare la lista degli holding registers che abbiamo creato, con valori di default a 0. Possiamo già modificare il loro valore a piacimento, oppure farlo quando anche il master è attivo per vederne la lettura aggiornata in tempo reale.

Siamo pronti per avviare lo slave, premiamo il pulsante "Run" della schermata principale e passiamo a configurare il master.

Configurazione del modulo master QModMaster

La configurazione del modulo master è altrettanto semplice, occorre tener presente alcuni parametri coerenti con lo slave che abbiamo creato:

Mobbus Mode: TCP Unit ID: 1 (corrisponde al numero dello slave che abbiamo dichiarato prima) Function Code: Read Holding Registers (0x03) Number of Registers: 8

I "Function Code" e "Mumber of Registers" corrispondono al tipo e alla quantità di dati che abbiamo dichiarato nel modulo slave.

Di fault l'app master è configurata in modo che comunichi con indirizzp IP 127.0.0.1 e porta 502 (come anche lo slave). Possiamo cambiare questi valori selezionando la schermata dal menù "Options" e poi "Modbus TCP".

A questo punto non ci resta che attivare la connessione e l'aggiornamento continuo dei dati tramite i pulsanti "Connect" e "Scan". Il tempo di aggiornamento continuo dei dati è determinano dal parametro "Scan Rate (ms)", che nel nostro caso corrisponde a un intervallo di 1 secondo.

Aggiornamento dei dati

Ed ecco che se andiamo a modificare i dati dei registri del nostro slave avremo il corrispondente aggiornamento sul master.

Proviamo a scrivere col master

Ora che abbiamo visto come sia possibile leggere i dati dallo slave proviamo a modificare i valori dei registri dal master. Interrompiamo lo scan continuo e scegliamo "Write Multiple Registers" nel parametro "Function Code" della schermata principale di QModMaster.

Selezioniamo Write Multiple Registers

Riattiviamo lo scan continuo, ora possiamo fare un doppio click su ciascun campo del registro per modificarne il valore, che vedremo aggiornarsi sul modulo slave.

Nota importante

Lo scopo di questo articolo è unicamente didattico e informativo. Ogni azione non autorizzata verso qualunque sistema di controllo presente su una rete pubblica o privata è illegale! Le informazioni contenute in questo ed altri articoli hanno lo scopo di far com‌prendere quanto sia necessario migliorare i sistemi di difesa, e non di fornire strumenti per effettuarne l'attacco. Violare un sistema informatico è perseguibile penalmente e può causare gravi danni a cose e persone, in modo particolare se si parla di ICS. Tutti i test che vengono illustrati nei tutorials sono stati effettuati in laboratori isolati, sicuri, o autorizzati dal produttore.

Stay safe, stay free.