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.