Modulo: Modbus Scan
Last updated
Last updated
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.
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.
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:
Tutte le risposte seguono invece questo schema:
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:
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.
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.
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.
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