5 minutes
Modulo SCADAsploit: 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.
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.