Cabecera blog ciberseguridad

PLCTool, la navaja suiza de los contadores inteligentes

placa de desarrollo para PLCtool

El siguiente artículo es una introducción y descripción del proyecto PLCTool, junto con una guía de uso para empezar a investigar las redes PRIME/DLMS y los contadores inteligentes

PLCTool es una herramienta desarrollada por Tarlogic Security para la investigación de redes PRIME y DLMS y su seguridad, utilizadas principalmente por contadores inteligentes de energía eléctrica. Tras terminar el artículo, el lector será capaz de navegar el repositorio, compilar y configurar la herramienta y empezar a usarla para investigar la implementación de las redes de su entorno.

Como material de apoyo a los investigadores interesados y como continuación a la serie de artículos publicada por Tarlogic Security en su investigación de la seguridad en contadores inteligentes y redes PRIME, en el presente artículo se describe la herramienta PLCTool. Esta fue presentada en la charla Hacking Smart Meters de la Rooted CON 2022, durante la cual se demostró su uso con el kit de evaluación ATPL360-EK para enviar y recibir datos en redes PLC.

Las siguientes secciones describen el proyecto PLCTool, compuesto por dos repositorios: la propia aplicación PLCTool y Candleblow, el firmware desarrollado para el kit de evaluación. Junto con la descripción del proyecto, se ofrece una guía de instalación y uso, en especial para los ganadores de los kits de desarrollo sorteados durante la charla.

Disclaimer: La herramienta liberada tiene como objetivo analizar el tráfico PRIME, capturar credenciales y realizar envío y recepción de mensajes PRIME y DLMS, documentados en el estándar, como el de desconexión del ICP. Tarlogic no apoya ni directa ni indirectamente la comisión de un fraude en las redes eléctricas. Podemos entender el malestar que esta investigación ha causado en el sector, pero creemos que tras la notificación a los afectados hace más de dos años y nuestra vocación de compartir nuestro trabajo y ayudar a las empresas han sido un tiempo suficiente para empezar a dar pasos hacia la protección de estas infraestructuras. Ha sido esto lo que nos ha llevado finalmente a divulgar la investigación en un ejercicio de responsible disclosure, ayudando a otros investigadores y analistas de seguridad a continuar nuestro trabajo.

Dónde encontrar PLCTool

El código fuente y versiones pre-compiladas de las herramientas se pueden encontrar en el Github de Tarlogic. Concretamente, las herramientas se encuentran en los siguientes repositorios:

En ellos se podrá descargar todo lo necesario y abrir reportes o incidencias en caso de que se encuentre algún problema o se soliciten nuevas funcionalidades.

Estructura del repositorio

Navegar un repositorio desconocido puede ser un reto para un desarrollador o un entusiasta, por lo que a continuación se describen brevemente la estructura del repositorio de PLCTool.

La clase principal es Application, que inicia la aplicación y contiene referencias tanto a la interfaz gráfica como al resto de componentes de la herramienta. Los archivos de la clase se encuentran en el directorio App, junto con otros elementos auxiliares. Los elementos necesarios para recibir y enviar datos a la red PRIME se encuentran en el directorio PRIME, donde la clase principal es PrimeAdapter, que contiene la lógica de lectura y escritura desde el puerto serie conectado al kit de evaluación.

La interfaz gráfica se encuentra alojada en el directorio Ui, donde la clase QtUi es el componente central, que contiene el resto de ventanas y diálogos y que se comunica con el resto de la aplicación a través de Application. Los elementos para describir la topología de la red se encuentran en las clases del directorio Topology, que contiene clases para cada elemento que se puede encontrar.

La implementación de los ataques se encuentra en el directorio Attacks, dentro del cual, además de las clases generales necesarias para implementar nuevos ataques, se encuentran segmentados en directorios cada uno de los ataques finales implementados. Actualmente se está trabajando en separar completamente la implementación de los ataques para crear plug-ins independientes del resto del código y facilitar la implementación de nuevas funciones.

Por último, otros directorios, como ber, dlms o útil contienen funciones y clases auxiliares para el resto de la aplicación.

Descripción del kit de evaluación ATPL360-EK y dónde encontrarlo

El kit de desarrollo ATPL360-EK se trata de un producto de Microchip para aquellos que planean usar el dispositivo PL360, un chip para comunicaciones PLC.

Se trata de una placa genérica que sirve para probar el chip y verificar que cumple con las capacidades de lo que un desarrollador de hardware necesita, pero sin tener que invertir tiempo y dinero en fabricar un prototipo inicial. Este kit está pensado para desarrollar productos que se comuniquen entre sí y por ello en el kit se suministran 2 placas juntas.

Además, se trata de un producto orientado a probar dispositivos con la intención de que el desarrollador tenga que modificar o añadir el mínimo hardware posible, por lo que las placas incluyen más elementos de los que PLCTool usa.

Por los motivos anteriores, los kits de desarrollo suelen ser una buena alternativa para probar hardware, pero normalmente son soluciones caras para el usuario.

Podéis comprar las placas en la propia web del fabricante. Pero por si las moscas, existen otros distribuidores:

Programación del kit de evaluación ATPL360-EK

Como se ha comentado anteriormente, el kit de desarrollo ATPL360-EK de Microchip ha de ser programado antes de usarse. Si has conseguido tu placa en el sorteo de la RootedCON 2022 puedes saltarte este paso, ya que tu placa ya se encuentra programada.

Para programar la placa es necesario compilar el proyecto Candleblow, que se puede descargar desde este repositorio e instalar el IDE Microchip Studio 7.

Una vez descargado el código fuente e instalado Microchip Studio, se abre la solución con el archivo Candleblow.atsln dentro del código fuente. Se lanzará Microchip Studio donde podremos pulsar F7 para compilar o hacer clic en “Build” > “Build Solution” como se aprecia en la imagen.

El desarrollo de la herramienta PLCTool para investigar los contadores inteligentes ha llevado varios años

Una vez compilada la solución, si no ha habido ningún problema, se puede continuar escribiendo el código en el kit de evaluación, para lo cual será necesario un programador JTAG de 20 pines para ARM como este.

Para escribir el código en el kit de evaluación es necesario un programador JTAG de 20 pines

En primer lugar, se conecta el programador a la placa y al PC y se comprueba si se ha detectado correctamente en el menú Tools > Device Programming. Para ello, se selecciona el dispositivo programador de la lista desplegable en Device, se pulsa el botón Apply y luego el botón Read en Device Signature o en Target Voltage.

programando el firmware de PLCTool

Si ambos parámetros se leen correctamente, el programador se encuentra conectado y se puede escribir la memoria pulsando F5 o el botón Start Debugging.

Una vez programado el kit de evaluación, está listo para ser utilizado con PLCTool

Una vez programado el kit de evaluación, está listo para ser utilizado con PLCTool.

Compilación e instalación de PLCTool

La herramienta ha sido desarrollada con Qt y C/C++ y se trata de una herramienta pequeña con pocas dependencias, principalmente:

  • Un compilador C++ (gcc 8.3.1 o posterior)
  • Los archivos de desarrollo de Qt 5, versión 5.9.1

Para compilar la herramienta, simplemente se descargan los archivos fuente desde el repositorio de Github de Tarlogic destinado a PLCTool y se ejecutan los siguientes mandatos:

% cd PLCTool

% qmake PLCTool.pro

% make

Con la herramienta compilada, puede ejecutarse con:

% ./PLCTool

También se puede utilizar el IDE de Qt, QtCreator, abriendo el proyecto con el archivo PLCTool.pro, para compilar y ejecutar la herramienta.

Funcionamiento de la herramienta PLCTool

Uso con el kit de evaluación ATPL360-EK

Como se indica en la introducción y en la sección de programación del kit de desarrollo para conectar el host a una red PLC es necesario un adaptador como el kit de desarrollo ATPL360-EK y el propio firmware desarrollado para este propósito: Candleblow.

Al conectar el kit de desarrollo a un puerto USB del host, aparecerá en la máquina Linux un dispositivo serie /dev/ttyACMX, donde X será un número representando el orden del dispositivo según cuantos hayan sido conectados previamente. Este número nos permitirá identificar e interactuar con la herramienta (kit de desarrollo).

Si no hay más dispositivos del mismo tipo conectados, será el /dev/ttyACM0. Para conectar PLCTool al dispositivo simplemente se utiliza el botón Connect, en la esquina superior izquierda, y se abrirá un diálogo para indicar el dispositivo y la velocidad de transmisión, en baudios o bits por segundo, para la comunicación serie. En la configuración por defecto, el firmware utiliza una velocidad de transmisión de 921.600 baudios.

seleccionando puerto con plctool

iniciando la captura de tramas con plctool

Si la conexión con el dispositivo serie ha sido correcta, aparecerá una ventana llamada Frame logger, donde se registrarán los frames PRIME a medida que se vayan capturando. A partir de este punto, se puede dejar la herramienta capturando. En muchos casos con una captura de 24h, si la instalación de PRIME no es particularmente segura, se encontrarán mensajes DLMS y contraseñas en la pestaña de credenciales.

Al volver a pulsar sobre el botón de Connect, se desconectará el adaptador. También pueden modificarse los parámetros de conexión (la ubicación del dispositivo y la velocidad de transmisión) haciendo click sobre el botón de Settings.

configurar puerto serie

Topología de red

topología de red prime en plctool

En el lateral de la ventana principal puede verse la topología de la red de la que se han capturado paquetes:

  • La dirección de la red, el SNA, se corresponde con la dirección EUI-48 (dirección MAC) del concentrador.
  • Los identificadores de nodo, los NID, son asignados por el concentrador cuando un contador se registra en la red y pueden variar entre registros.
  • Junto con el SNA de la red y el NID de cada contador aparece la dirección EUI-48 del nodo si esta ha sido capturada, de manera que se puedan identificar unívocamente los contadores.

Además, de los contadores destacados en amarillo, se han capturado contraseñas en claro, que pueden ser consultadas en la ventana de credenciales o en la de información del contador.

Datos sobre las métricas

ventana del contador inteligente en plctool

Al hacer click sobre el NID de un contador inteligente se abre la ventana Meter Information, que contiene información sobre el nodo y diferentes pestañas que contienen los frames de prime, así como los mensajes DLMS y las contraseñas capturadas.

Se muestra la información capturada acerca de cada contador, lo que quiere decir que pueden encontrarse en la topología y en la ventana de información contadores con información parcial. En muchos casos, sólo se observa la dirección MAC del contador cuando se lee un mensaje de registro REG, por lo que para los contadores que ya estén registrados no se mostrará el mensaje hasta que vuelvan a registrarse.

información del contador en plctool

contraseñas PRIME DLMS en plctool

Tramas y mensajes

Las palabras trama o frame se utilizan para referirse a PDUs de PRIME, mientras que la palabra mensaje se utiliza para referirse a PDUs de DLMS.

tramas PDUS en plctool

En la ventana Frames se puede obtener una lista cronológica de las tramas de prime capturadas. Por cada mensaje se muestran los siguientes campos:

  • Un ID de la trama, asignado por PLCTool al capturarla.
  • El timestamp.
  • La dirección de la trama: D o downlink indica la dirección del concentrador al contador y U o upstream indica que el mensaje se envía del contador al concentrador.
  • El tipo de trama de PRIME.
  • El LNID (identificador de nodo local) del contador que envía o recibe la trama.
  • ElSNA (dirección de subred) de la red en la que se envía la trama.
  • El tamaño total de la trama.
  • Una representación hexadecimal de los bytes del mensaje.

Visor hexadecimal de trama PRIME en plctool

Además, en la pestaña de PRIME headers, se pueden obtener los valores de los campos de la cabecera de PRIME, mientras que en la pestaña Hexdump muestra una representación hexadecimal de la trama.

mensajes PLCTool

En la ventana Messages se puede obtener una lista de los mensajes DLMS capturados. Los campos son los siguientes:

  • Un identificador del orden de recepción del mensaje.
  • Un timestamp.
  • La dirección del mensaje: D o downlink y U o uplink.
  • El tipo de mensaje DLMS.
  • El LNID del contador que recibe o envía el mensaje.
  • La dirección SNA de la red
  • El tamaño del mensaje en bytes
  • Una representación hexadecimal de los bytes del mensaje.

En la pestaña inferior de la ventana, se muestra una representación en XML de los campos del mensaje, de manera que se facilita su lectura.

trama DLMS en XML en PLCtool

Credenciales

credenciales capturadas por plctool

En la ventana de credenciales se pueden consultar las contraseñas que se han obtenido durante la captura, indicando el NID del contador y el SNA de la red en la que se utilizó.

Traductor DLMS

traducción DLMS a XML

La ventana del traductor permite traducir un mensaje DLMS en hexadecimal a formato XML para visualizar los campos. Esta herramienta utiliza la biblioteca gurux para hacer la traducción y es de gran utilidad para estudiar los paquetes que se reciben por la red, ya que el estándar del protocolo DLMS es parcialmente de pago y, en muchos casos, se utiliza este servicio para estudiar el contenido de los mensajes.

Ejecución de ataques a contadores inteligentes

ataque de apagar contador con PLCTOOL

Junto al botón del traductor, se encuentran los accionadores de los ataques. En la versión actual se ha implementado un ataque de prueba para la conexión y desconexión de un contador: BlinkAttack.

Para la ejecución de este ataque sólo es necesario conocer el SNA de la red, el NID del contador, el LCID, el nivel de switch y la contraseña.

ataque a contador inteligente en proceso

Los parámetros del ataque pueden obtenerse de los mensajes capturados:

  • El SNA y el NID se obtienen de cualquier trama PRIME o de la topología de la red.
  • El LCID es un identificador de conexión dentro de un nodo y suele tener el valor 0x100 para tramas con mensajes DLMS. En cualquier caso, se puede comprobar el LCID entre un contador y un concentrador comprobando una trama con datos (DLMS) enviada entre ellos. Otros tipos de trama, como BEACON y REG pueden tener valores LCID diferentes, pero no nos son útiles para tramas con mensajes DLMS.
  • El nivel de switch se refiere al número de nodos switch o repetidores entre el contador y el concentrador. Habitualmente este valor es 0, ya que no hay nodos switch, aunque puede comprobarse leyendo las tramas recibidas para un contador.

Mensajes capturados por plctool al apagar el contador

  • Por último, la contraseña puede haber sido capturada durante un intercambio de mensajes DLMS entre el concentrador y el contador. Por lo que se ha comprobado durante la investigación, en muchos casos, la contraseña utilizada para solicitar acciones sobre los contadores, como la conexión y la desconexión, es 00000002.

También se puede especificar un timeout en minutos, en caso de que la ejecución del ataque se demore más de este tiempo.

Al pulsar sobre el botón Start, se inicia el ataque, que consiste en inyectar mensajes DLMS que solicitan la desconexión y la conexión del contador alternativamente. De esta forma se inicia la secuencia de conexión y desconexión de un contador demostrada durante la charla.

Conclusiones

Con esta guía un investigador particular será capaz de comenzar su propia investigación de la infraestructura de contadores inteligentes y auditar la seguridad existente.

El proyecto PLCTool cuenta con funcionalidades de escucha y análisis, junto con una infraestructura ataques sobre la que se pueden implementar otros nuevos y más características. El ataque implementado en la versión actual está diseñado para demostrar el potencial daño que puede suponer las implementaciones inseguras de las redes PRIME y debe ser ejecutado con precaución en entornos controlados.

Los interesados pueden continuar leyendo los posts anteriores de la investigación y colaborar en el desarrollo del proyecto.

Descubre nuestro trabajo y nuestros servicios de ciberseguridad.

Más artículos de la serie Contadores Inteligentes

Este artículo forma parte de una serie de articulos sobre Contadores Inteligentes

  1. Contadores Inteligentes – El escenario español y el sistema de Telegestión.
  2. Contadores Inteligentes – Amenazas a los contadores y ataques PRIME
  3. Contadores Inteligentes – Una prueba de concepto: secuestrando un contador
  4. Contadores Inteligentes – Evaluando el riesgo del concentrador
  5. Seguridad en las redes PRIME – Estado actual
  6. PLCTool, la navaja suiza de los contadores inteligentes
  7. Soporte para plugins en PLCTool