Modulo: Modbus Scan

Iniziamo a conoscere un po' meglio ScadaSploit partendo da uno dei moduli ausiliari presenti: Modbus Scan.

Posizioniamoci nella cartella dove abbiamo installato ScadaSploit e avviamolo tramite il comando $ ./scadasploit.py. Seguendo la stessa filosofia di approccio di Metasploit, possiamo cercare tutti i moduli che contengono una parola chiave usando il comando search <keyword> oppure visualizzare l'elenco completo dei moduli presenti con il comando show modules.

Nel nostro caso useremo search modbus per individuare i moduli di ScadaSploit che possono aiutarci durante il nostro lavoro di pentesting su una rete Modbus TCP.

L'elenco comprende sia i moduli ausiliari sia gli exploit, riconoscibili tramite la colonna "Path". Per il nostro primo test decidiamo di eseguire la scansione di una rete Modbus TCP, quindi selezioniamo il modulo Modbus Scan tramite il comando use auxiliary/schneider/modbus_scan e visualizziamo l'elenco dei parametri tramite il comando show options. Come possiamo notare il modulo appartiene alla categoria degli "auxiliary".

Modbus Scan è un modulo per la scansione di dispositivi connessi a una rete Modbus TCP. Può essere utilizzato per eseguire lo scanning di tutti i devices alla ricerca di informazioni sulla scheda di comunicazione, la versione del firmware, il MAC address.

La scansione della rete può avvenire specificando l'indirizzo IP di un singolo dispositivo o un range di indirizzi usando la notazione CIDR (es. 10.43.10.0/23). In alternativa, è possibile inserire il nome di un file di testo che contiene l'elenco degli indirizzi IP degli hosts, seguendo un semplice formato che specifica l'indirizzo e l'eventuale porta non standard.

10.43.10.100
10.40.11.58:5020
10.0.1.1/24

Nel nostro caso facciamo lo scanning di un singolo device.

Ed ecco che in un attimo siamo in grado di riconoscere il nostro dispositivo, la versione del firmware installato e il MAC address, tutte informazioni utili per una successiva azione di exploit.

PLC Schneider Modicon e UMAS

I PLC della serie Schneider Modicon programmati con UnityPro e basati su Unity OS a partire dalla versione 2.6 utilizzano il protocollo UMAS. Si tratta di un protocollo a livello di kernel che prevede anche un livello di controllo amministrativo.

La struttura di UMAS sfrutta quella del Modbus ed è un derivato del vecchio protocollo Xway utilizzato sin dalle prime serie di PLC Telemechanique. La caratteristica principale è che utilizza il codice funzione 90 (0x5a) del protocollo Modbus per inviare e ricevere un set molto più ricco di informazioni. L'impacchettamento del payload è little-endian, il che può sembrare strano dal momento che Modbus è big-endian.

Il pacchetto UMAS inizia con un campo a 16 bit che specifica un "UMAS Function Subcode", seguito da un numero variabile di byte che compongono il payload.

Le richieste UMAS hanno quindi una struttura di questo tipo:

[TCP Packet] [Modbus Header] [5A] [UMAS CODE (16 bit)] [UMAS PAYLOAD (Variable)]

Tutte le risposte seguono invece questo schema:

[TCP Packet] [Modbus Header] [5A] [RETURN CODE (16 bit)] [UMAS PAYLOAD (Variable)]
0x01 0xFE - OK
0x01 0xFD - Error

Quando un PLC Schneider riceve un pacchetto Modbus controlla se il codice funzione è 0x5A e, in tal caso, utilizza alcune librerie specifiche per la gestione dell'estensione UMAS. Esistono diversi "UMAS codes" in grado di eseguire numerose operazioni sul PLC, di seguito ne elenco alcuni:

UMAS code

Function

Description

0x01

INIT_COMM

Initialize a UMAS communication

0x02

READ_ID

Request a PLC ID

0x03

READ_PROJECT_INFO

Read Project Information

0x04

READ_PLC_INFO

Get internal PLC Info

0x06

READ_CARD_INFO

Get internal PLC SD-Card Info

0x0A

REPEAT

Sends back data sent to PLC (used for synchronization)

0x10

TAKE_PLC_RESERVATION

Assign an owner to the PLC

0x11

RELEASE_PLC_RESERVATION

Release the reservation of a PLC

0x12

KEEP_ALIVE

Keep alive message

0x20

READ_MEMORY_BLOCK

Read a memory block of the PLC

0x22

READ_VARIABLES

Read system bits, system words and strategy variables

0x23

WRITE_VARIABLES

Write system bits, system words and strategy variables

0x24

READ_COILS_REGISTERS

Read coils and holding registers from PLC

0x25

WRITE_COILS_REGISTERS

Write coils and holding registers into PLC

0x30

INITIALIZE_UPLOAD

Initialize strategy upload (copy from PC to PLC)

0x31

UPLOAD_BLOCK

Upload a strategy block to the PLC

0x32

END_STRATEGY_UPLOAD

Finish strategy upload

0x33

INITIALIZE_DOWNLOAD

Initialize strategy download (copy from PLC to PC)

0x34

DOWNLOAD_BLOCK

Download a strategy block from the PLC

0x35

END_STRATEGY_DOWNLOAD

Finish strategy download

0x39

READ_ETH_MASTER_DATA

Read Ethernet master data

0x40

START_PLC

Starts the PLC

0x41

STOP_PLC

Stops the PLC

0x50

MONITOR_PLC

Monitors variables, systems bits and words

0x58

CHECK_PLC

Check PLC connection status

0x70

READ_IO_OBJECT

Read IO Object

0x71

WRITE_IO_OBJECT

Write IO Object

0x73

GET_STATUS_MODULE

Get status module

Modbus Scan di ScadaSploit

Il modulo Modbus Scan di ScadaSploit supporta l'estensione UMAS e questo ci permette di recuperare ulteriori dettagli quando abbiamo a che fare con un PLC programmato con UnityPro, come ad es. il nome del modulo CPU, il modello di scheda di memoria e alcuni dati sul file di progetto che è stato caricato.

La natura del protocollo Modbus che non prevede alcuna autenticazione facilita il gathering delle informazioni.

Scanning di un PLC Modicon M580

Come possiamo vedere, oltre ai dati standard siamo in grado di raccogliere dettagli importanti anche sul progetto. Facendo un esempio pratico di come utilizzare queste informazioni, la data dell'ultima modifica ci fa capire da quando tempo il PLC è in funzione senza interventi di manutenzione al software. Questo può voler dire che potrebbe essere esposto a vulnerabilità note riscontrate in data successiva e che magari non sono state affrontate.

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 comprendere 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.