Modulo: Modbus Payload Transfer

Il secondo modulo che andiamo ad esplorare si chiama "Modbus Payload Transfer" e appartiene alla categoria degli auxiliary.

A cosa serve

Il modulo "Modbus Payload Transfer" è uno script che permette di memorizzare e recuperare un payload/shellcode negli "holding registers" di un PLC tramite il protocollo Modbus TCP. Esistono numerosissimi PLC esposti a Internet, con questo modulo è possibile sfruttare la loro memoria per fare un upload di un payload (shellcode/malware) in modo che possa essere recuperato in un secondo momento.

Uno scenario di utilizzo potrebbe prevedere i seguenti steps:

  1. Un attaccante individua un PLC esposto su Internet con spazio sufficiente per memorizzare un determinato payload.

  2. L'attaccante carica il payload nella memoria del PLC.

  3. L'attaccante infetta un host in grado di comunicare in Modbus TCP recuperando il payload dal PLC per poi eseguirlo.

La stessa cosa ovviamente potrebbe avvenire anche con un PLC non esposto su Internet ma presente in una rete locale. I principali vantaggi di questo metodo sono:

  1. L'uso di PLC di terze parti fornisce l'anonimato e rende difficile la tracciabilità. Non è necessario caricare il payload su un server.

  2. Il payload è archiviato nella memoria del PLC, rendendo difficile l'analisi forense. Inoltre, una volta recuperato il payload il suo contenuto potrebbe essere sovrascritto facilmente (anche dall'host stesso).

Questo approccio potrebbe essere utile anche in alcuni ambienti ICS in cui protocolli diversi da Modbus potrebbero mettere in allerta sistemi IDS/IPS. In un contesto di questo tipo hai solo bisogno di un device Modbus o anche semplicemente di un emulatore che può fungere da server quando il target host si connette ad esso. Esistono poi dei PLC direttamente esposti in Internet e gestiti da remoto che possono diventare un buon posto dove despositare un payload/malware.

Nota importante: non eseguire nessuna di queste azioni su PLC di terze parti. Qualsiasi scrittura sui registri dei PLC può interrompere la strategia di controllo del processo per cui è stata programmata.

Come funziona

Per prima cosa possiamo cercare il modulo interessato usando il comando search modbus, che presenterà l'elenco dei moduli ausiliari e gli exploits che fanno uso di questo protocollo. Una volta individuato ciò che cerchiamo lo selezioniamo col comando use auxiliary/modbus/modbus_payload_transfer. Il comando show info ci fornisce alcuni dettagli sul funzionamento del modulo.

A questo punto passiamo a configurare il modulo. Il comando show options visualizza la lista dei parametri, in questo caso troviamo:

  • ADDRESS: indirizzo di partenza dell'holding register per l'upload/download del payload

  • FILENAME: il nostro file contenente il payload (si raccomandano dimensioni di qualche Kb)

  • MODE: per selezionare se eseguire un upload o un download dal PLC

  • NBYTES: il numero di bytes che dobbiamo scaricare durante un download (non necessario per l'upload)

  • RHOST ed RPORT per impostare l'indirizzo IP e la porta TCP del nostro PLC

Quando abbiamo configurato correttamente la lista dei parametri non ci resta che eseguire il nostro modulo ausiliario, usando il comando run. In questo caso stiamo eseguendo un upload di un file chiamato payload.bin della dimensione di 300 bytes, su un PLC con indirizzo 10.43.10.58 a partire dall'holding register 200.

Per la caratteristica del protocollo Modbus il file viene suddiviso in pacchetti da 250 bytes. Se il payload ha un numero dispari di byte verrà aggiunto un carattere "0x90" per evitare problemi durante il recupero.

A seconda del tipo di PLC in uso avremo a disposizione una quantità maggiore o minore di memoria accessibile, pertanto lo script verificherà prima che vi sia spazio sufficiente per il payload. Per verificare le dimensioni viene inviata una richiesta Modbus con un ID operazione 03 (Read Holding Register), tentando di leggere un determinato record a partire dall'indirizzo che abbiamo impostato come parametro (ogni record è di 16 bit). Se si ottiene un'eccezione 0x83 significa che il PLC non è in grado di contenere il nostro payload e l'operazione fallisce.

Il recupero del payload avviene usando lo stesso modulo "Modbus Payload Transfer", andando semplicemente a selezionare la modalità MODE = DOWN e la quantità di bytes che dobbiamo scaricare tramite il parametro NBYTES.

Anche in questo caso il download avviene a blocchi di 250 bytes (125 holding registers) per volta. Il file viene poi ricomposto e salvato integralmente.

Attenzione alla perdita dei dati

Oltre a utilizzare lo script per caricare un determinato payload come ad esempio un malware o una shellcode, è ovvio che può essere utilizzato anche per caricare qualsiasi tipo di file di dimensioni contenute. Penso che sia un modo interessante per esfiltrare e condividere informazioni. Chi sospetterebbe che gli holding registers di un determinato PLC memorizzino un file .docx o .zip?

È importante notare che gli holding registers in cui viene caricato il payload possono essere modificati dal PLC stesso. Dato che non conosciamo la gestione della memoria e la strategia di controllo del processo è probabile che dobbiamo cercare un intervallo di memoria che non sia suscettibile di modifiche. L'idea potrebbe essere quella di caricare il payload in una determinata sezione dei registri e quindi verificare, per qualche tempo, che il payload non subisca alcuna modifica.

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.