Por temas relacionados con un máster de ciberseguridad industrial que estoy cursando he tenido que preparar una serie de ejercicios para el mismo, entre los que se encuentra la realización de un hacking lab. La idea de un hacking lab es preparar un entorno controlado en el que poder hacer ataques a un sistema para aprender posibles vulnerabilidades, técnicas para desvelarlas, y herramientas que se pueden utilizar para ello, a fin de ser capaz en un futuro de proteger un entorno real con las lecciones aprendidas en el entorno de pruebas.
Para la realización de este hacking lab opté por preparar un escenario en el que se pudiera realizar un ataque a un entorno de control industrial que hiciera uso de comunicaciones basadas en Modbus sobre TCP. Modbus es un protocolo de comunicación industrial desarrollado en 1979, y que constituye un estándar de facto en los sistemas de producción industrial. El objetivo general es perturbar el funcionamiento de un sistema de iluminación LED cuyo sistema de control está implementado empleando Modbus sobre TCP. El mismo consta de los siguientes elementos:
El siguiente diagrama de red muestra el sistema desarrollado:
En siguientes artículos iré dando mayor detalle de los dispositivos del entorno, así como de los pasos dados en el hacking lab, además de las conclusiones obtenidas de la puesta en marcha del mismo.
Etiquetas: arduino, esp8266, hacking lab, kali, led, modbus, nodemcu, raspberry pi, tcp
En el artículo anterior se hacía referencia al objeto del hacking lab y se daba una visión general de la arquitectura implementada. En este artículo se va a entrar en un mayor detalle de los elementos que forman parte de dicha arquitectura: HMI, PLC, actuador TCP y plataforma de ataque.
HMI de control de luces LED
El HMI de control simula un sistema SCADA. Está implementado mediante Node-Red, sistema software que permite la programación basada en flujos para desarrollar sistemas para Internet de las Cosas. A fin de poder realizar la implementación del sistema de control industrial, se ha hecho uso de las siguientes librerías:
El sistema desarrollado consta de dos partes:
PLC de control de luces
El PLC que actúa como Master MODBUS se ha desarrollado igualmente haciendo uso de Node-Red con la librería MODBUS. En este caso se ha implementado la funcionalidad de Master Modbus, escuchando en el puerto 1502/TCP (frente al habitual 502/TCP por razones de permisos) de la Raspberry Pi que despliega los servicios de Node-Red.
El flujo Node-Red definido es el siguiente:
Este flujo realiza dos funciones: la primera es levantar el servidor Master MODBUS, que escucha en la IP 192.168.0.39 por el puerto 1502/TCP. La segunda inyecta los valores por defecto en las 3 bobinas (posiciones de memoria 1 a 3) que se han definido para almacenar los valores de la iluminación LED RGB. En este caso, las tres bobinas se inicializan a cero (FALSE lógico).
Actuador TCP
El actuador TCP se ha implementado como un esclavo Modbus que consulta al PLC el estado de las tres bobinas que controlan el estado de los LED RGB. En función de la lectura realizada del valor de dichas bobinas, enciende o apaga la iluminación LED. Al ser tres las bobinas implementadas, la iluminación puede tomar un máximo de 8 valores combinados (considerando “apagado” como uno de los estados posibles).
La implementación del actuador se ha realizado mediante un dispositivo NodeMCU, que permite su programación mediante el IDE Arduino, con capacidades de conectarse a una red WiFi. Se ha hecho uso de la librería Modbus-Arduino para la implementación del cliente.
Kali Linux
Para simular la intrusión de un atacante externo se ha hecho uso de una Raspberry Pi con la distribución Kali Linux instalada. Kali Linux es una distribución de Linux especialmente pensada para servir de herramienta para realizar tests de intrusión en el ámbito del hacking ético y auditorías de seguridad de sistems de información.
Se ha realizado el siguiente flujo de ataque:
En el siguiente artículo se detallarán los resultados obtenidos en el laboratorio.
Etiquetas: kali, linux, modbus, nmap, node-red, nodemcu, tcp
El tercer capítulo de esta serie describe el proceso a seguir para lograr una intrusión en el sistema. Para realizar este proceso, se han seguido los pasos descritos en la metodología de hacking ético desarrollados por el Centro de Ciberseguridad Industrial. En concreto, las fases realizadas son las siguientes:
Fase de Reconocimiento
La fase de reconocimiento consistió en determinar qué equipo de la red de sistema escuchaba tráfico MODBUS. Para ello, se hizo uso de ZenMap, interfaz gráfica para NMAP. Se realizó un escaneo a la red entre los puertos 1 y 2000, para el segmento 192.168.0.0/24, determinándose que el equipo con IP 192.168.0.39 escuchaba en el puerto 1502/TCP. Ninguno de los demás equipos descubiertos en la red escuchaba en dicho puerto.
Comando ejecutado: nmap -p 1-2000 -T4 -A -v 192.168.0.0/24
El resultado de nmap para dicho servidor fue el siguiente:
Initiating SYN Stealth Scan at 23:24
Scanning 192.168.0.39 [1 port]
Discovered open port 1502/tcp on 192.168.0.39
Completed SYN Stealth Scan at 23:24, 0.30s elapsed (1 total ports)
Initiating Service scan at 23:24
Scanning 1 service on 192.168.0.39
Completed Service scan at 23:25, 68.99s elapsed (1 service on 1 host)
Initiating OS detection (try #1) against 192.168.0.39
WARNING: RST from 192.168.0.39 port 1502 -- is this port really open?
WARNING: RST from 192.168.0.39 port 1502 -- is this port really open?
WARNING: RST from 192.168.0.39 port 1502 -- is this port really open?
WARNING: RST from 192.168.0.39 port 1502 -- is this port really open?
WARNING: RST from 192.168.0.39 port 1502 -- is this port really open?
WARNING: RST from 192.168.0.39 port 1502 -- is this port really open?
NSE: Script scanning 192.168.0.39.
Initiating NSE at 23:25
Completed NSE at 23:25, 0.04s elapsed
Initiating NSE at 23:25
Completed NSE at 23:25, 0.04s elapsed
Nmap scan report for 192.168.0.39
Host is up (0.00023s latency).
PORT STATE SERVICE VERSION
1502/tcp open shivadiscovery?
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Device type: general purpose
Running: Linux 2.4.X
OS CPE: cpe:/o:linux:linux_kernel:2.4.21
OS details: Linux 2.4.21
Network Distance: 0 hops
Se puede apreciar cómo se ha encontrado abierto el puerto 1502/tcp en el elemento de red 192.168.0.39, que según nuestro diagrama, corresponder al PLC simulado que recibe los comandos para encender y apagar las luces.
Fase de escaneo
Una vez determinado el equipo que actúa como PLC recibiendo comunicaciones Modbus, se utilizó la herramienta modbus-cli disponible en Kali con el fin de intentar determinar las bobinas que controlaban el sistema de iluminación. Se hizo una lectura de las 20 primeras direcciones de memoria del PLC identificado. Tras sucesivas pruebas, se pudo determinar que los valores que variaban eran las relativas a las direcciones de memoria 2 a 4:
De acuerdo a la especificación del protocolo Modbus, los primeros 9999 registros de memoria corresponden a bobinas con valores TRUE o FALSE (1 o 0):
Una vez determinados estos valores, pudo pasarse a la siguiente fase del ataque.
Fase de ganado de acceso
En el caso de protocolo Modbus, al ser un protocolo que no tuvo en cuenta en su fase de desarrollo ninguna medida en especial de seguridad, es tremendamente sencillo acceder al sistema para realizar cambios. Se trata tan sólo de inyectar los valores correspondientes mediante las oportunas señales de control, ya que no se hace verificación alguna de origen, identidad, permisos, ni se realiza autenticación alguna. En este caso, basta con ejecutar el mismo modbus-cli en modo escritura para alterar los valores registrados en el PLC:
# modbus write -p 1502 192.168.0.39 2 0 0 0
El resultado de dichos comandos fue, en primer lugar, el apagado completo de la iluminación, y posteriormente, el encendido de la iluminación en verde, controlada por la bobina 3. Estos cambios se vieron reflejados en la interfaz HMI del sistema, por lo que un operador podría haber determinado la existencia de un comportamiento anómalo del sistema.
Sin embargo, no es tan sencillo introducir valores fuera de rango. Al intentar inyectar valores distintos de 0 o 1 en las bobinas, la herramienta devolvió un mensaje de error, y no se alteró el funcionamiento del sistema:
root@raspberrypi:/home/pi# modbus write -p 1502 192.168.0.39 2 10 10 10
ERROR: parameter 'VALUES ...': Value should be in the range 0..1
See: 'modbus write --help'
En lo referente a las dos últimas fases (Mantener Accesso y Borrar Huellas) excedía el ámbito de lo buscado en este piloto, por lo que no se han desarrollado de manera explícita.
Etiquetas: bobina, centro de ciberseguridad industrial, coil, kali, modbus, modbus-cli, nmap, zenmap
A modo de finalización de esta serie de artículos, a continuación se describen las lecciones aprendidas de esta práctica, que fueron las siguientes:
Etiquetas: cortafuegos, hacking, hmi, modbus, tcp