Blog

INDUSTROYER.V2: El viejo malware aprende nuevos trucos

Daniel Kapellmann Zafra, Raymond Leong, Chris Sistrunk, Ken Proska, Corey Hildebrandt, Keith Lunden, Nathan Brubaker
Apr 25, 2022
16 min read
|   Last update Sep 23, 2022

El 12 de abril de 2022, CERT-UA y ESET informaron que un ciberataque físico afectó la tecnología operativa (OT) que respalda las operaciones de la red eléctrica en Ucrania. El ataque aprovechó diferentes piezas de malware, incluida una variante de INDUSTROYER, una conocida pieza de malware ICS orientada a ataques la cual se implementó originalmente en diciembre de 2016 para provocar cortes de energía en Ucrania.

El ataque es significativo no solo porque los ataques dirigidos a OT son raros, sino también porque esta es la primera instancia en la que el código de malware OT, orientado a ataques y ampliamente conocido, se volvió a implementar contra una nueva víctima. A pesar de cinco años de análisis sustancial de INDUSTROYER, por parte de una variedad de investigadores, el actor aún intentó reutilizar la herramienta y personalizarla para alcanzar nuevos objetivos. INDUSTROYER.V2 (el nombre de Mandiant para la nueva variante) refuerza la idea de que el malware OT se puede adaptar para su uso contra múltiples víctimas, lo que tiene serias implicaciones para otras familias de malware OT conocidas públicamente como INCONTROLLER.

Si bien gran parte de la historia que rodea la implementación de INDUSTROYER.V2 ya está disponible públicamente, Mandiant analizó, más a fondo, el malware para compartir información adicional para los defensores y la comunidad OT. En esta publicación de blog, documentamos detalles técnicos adicionales de INDUSTROYER.V2 en función de nuestro análisis de dos muestras diferentes. También proporcionamos reglas de detección para identificar actividades relacionadas.

Si necesita ayuda para responder a una actividad relacionada, comuníquese con el equipo de consultoría de Mandiant. El análisis adicional de las amenazas relacionadas, incluido el malware adicional que se implementó junto con INDUSTROYER.V2, está disponible como parte de Mandiant Advantage Threat Intelligence.

INDUSTROYER.V2 en pocas palabras

INDUSTROYER.V2 es similar a su predecesor, sin embargo, esta variante contiene una funcionalidad más específica. A diferencia del INDUSTROYER original, el cual era un marco que aprovechaba módulos externos para implementar cuatro protocolos OT diferentes, esta variante es autónoma y solo implementa el protocolo de comunicaciones IEC 60870-5-104 (IEC-104). IEC-104 se utiliza para monitorear y controlar el sistema de energía por medio del TCP y se implementa principalmente en Europa y Medio Oriente.

Lo que es más importante, la nueva variante de malware permite al actor incorporar configuraciones personalizadas las cuales modifican el comportamiento del malware en dispositivos electrónicos inteligentes (IED) específicos (por ejemplo, relés de protección, unidades de fusión, etc.) dentro del entorno de destino. El cambio de diseño para incorporar configuraciones personalizadas en INDUSTROYER.V2 reduce el esfuerzo requerido por el actor para reproducir el ataque contra diferentes entornos de víctimas y le permite contener el impacto en IED específicos.

Dos muestras personalizadas de INDUSTROYER.V2 muestran la amplitud del ataque

Para comprender completamente las implicaciones de las nuevas capacidades de personalización en INDUSTROYER.V2, analizamos y comparamos dos muestras diferentes. La segunda muestra, la cual probablemente sea una versión recompilada, está disponible públicamente y en plataformas de escaneo de malware en línea (MD5: 7c05da2e4612fca213430b6c93e76b06).

Creemos que ambas muestras están relacionadas con la misma operación. Los registros de fechas de la compilación tenían minutos de diferencia y aproximadamente dos semanas antes del ataque previsto. Es posible que el actor estuviera modificando la configuración del malware para personalizar la carga útil para diferentes objetivos.

Cada muestra contiene diferentes configuraciones codificadas dentro del binario. Una muestra contiene ocho direcciones IP de destino codificadas de forma rígida únicas, mientras que la otra solo contiene tres.

En ambas muestras, el malware finalizó un proceso específico. Sin embargo, la ruta de archivo definida, utilizada para concatenar con el proceso, difería entre las dos muestras. Esto muestra una comprensión matizada del entorno de la víctima.

La Ilustración 1 muestra un ejemplo de configuración de INDUSTROYER.V2 para la muestra disponible públicamente.

Example INDUSTROYER.V2 configuration for publicly available sample
Ilustración 1: Ejemplo de configuración de INDUSTROYER.V2 para una muestra disponible públicamente

En función de las ligeras diferencias entre ambas muestras, podemos inferir detalles adicionales sobre la escala del ataque, el nivel probable de acceso que tenía el actor dentro de las redes de la víctima y el reconocimiento el cual probablemente realizó el atacante antes de la implementación del malware.

  • Como muestran los detalles embebidos en las configuraciones del malware, el actor realizó al menos un reconocimiento de la red interna para identificar IED específicos en los entornos de las víctimas y comprender cómo acceder a ellos.
  • Las configuraciones de malware atacan a dispositivos por medio de subredes específicas, destacando que el actor logró identificar y penetrar en las redes circundantes.
  • La implementación exitosa de IEC-104, por parte del actor para interactuar con los dispositivos objetivo, indica una comprensión sólida del protocolo y el conocimiento del entorno de la víctima. Por ejemplo, en las muestras que analizamos, el actor manipuló una lista seleccionada de direcciones de objetos de información (IOA), los cuales se utilizan para interactuar con interruptores de línea eléctrica o disyuntores en una unidad terminal remota (RTU) o configuración de relé.
  • Por el contrario, el propio código de malware muestra cierto grado de descuido o posibles limitaciones de tiempo. Por ejemplo, las muestras de INDUSTROYER.V2 contienen métodos limitados de ofuscación y evasión de defensa. La falta de ofuscación en los binarios brinda a los defensores sugerencias rápidas sobre su funcionalidad y capacidad para atacar a los activos de OT.

Panorama

Los marcos extensibles, como INDUSTROYER e INCONTROLLER originales, a menudo son preferidos por los actores de amenazas debido a la flexibilidad de su diseño modular, lo que permite el despliegue de cargas útiles específicas para atacar a diferentes activos de víctimas o protocolos de comunicación. Sin embargo, en el caso de INDUSTROYER.V2, el actor volvió a implementar solo uno de los componentes originales del marco anterior y creó un nuevo ejecutable autónomo.

No está claro por qué el actor de amenazas realizó las modificaciones particulares a INDUSTROYER.V2. Quizás el actor quería desarrollar una versión más simplificada para dirigirse a un entorno muy específico, o no quería exponer herramientas más valiosas o capaces; o simplemente creía que este enfoque sería eficiente ya que no requeriría recursos adicionales para impactar en el objetivo.

Independientemente de las motivaciones, la reutilización de código de malware OT conocido destaca el valor de la caza y las detecciones basadas en indicadores conocidos. Por ejemplo, algunas detecciones que construimos para el INDUSTROYER original identificaron con éxito INDUSTROYER.V2 “in the wild”. Si bien a menudo se cree que es probable que el malware OT no se utilice en más de un entorno, las herramientas que aprovechan las características de OT, inseguras por diseño, como INDUSTROYER.V2 se pueden emplear varias veces para atacar a múltiples víctimas. La comunidad de seguridad de OT debe reconocer estas herramientas como marcos o capacidades y no simplemente como características de incidentes de ciberseguridad aislados y herramientas de un solo uso.

Análisis técnico de INDUSTROYER.V2

INDUSTROYER.V2 está escrito en C++ e implementa el protocolo IEC-104 para modificar el estado de las unidades terminales remotas (RTU) sobre TCP. Los clientes TCP del protocolo IEC-104 se denominan estaciones de control y los servidores TCP se denominan estaciones remotas. El malware crea mensajes configurables de la unidad de datos de servicio de aplicación (ASDU) IEC-104, también conocidos como telegramas, para cambiar el estado de las direcciones de objetos de información (IOA) de una estación remota a ON u OFF. Los IOA identifican un elemento de datos específico en un dispositivo y pueden corresponder a interruptores de línea de alimentación o disyuntores en una RTU o configuración de relé.

El malware es un ejecutable autónomo en el que el operador puede establecer parámetros de configuración para atacar a estaciones remotas específicas, definir opciones de ejecución y crear mensajes ASDU. También acepta los argumentos de línea de comando opcionales (-o) para imprimir mensajes de depuración en un archivo de salida o (-t) para crear un retraso de tiempo antes de la ejecución.

Capacidades de configuración

Después de analizar los argumentos de la interfaz de la línea de comandos, INDUSTROYER.V2 itera por medio de las entradas de configuración embebidas. La ejecución del programa es altamente configurable. Según nuestro análisis de dos muestras de INDUSTROYER.V2, el malware contiene entradas de configuración estructuradas como cadenas en el orden que se muestra en la Tabla 1.

Tabla 1: Estructura de configuración

Posición

Descripción de la entrada de configuración

1

Dirección IP de la estación

2

Puerto de la estación

3

Valor de índice de entrada

4

Habilitar telegramas codificados con un rango específico

5

Habilitar opciones de configuración 6 - 14

5b

Si la entrada 4 está habilitada, rango de inicio de telegrama

6

Habilitar la terminación del proceso

6b

Si la entrada 4 está habilitada, el telegrama finaliza el rango

7

Nombre del proceso para terminar

8

Habilitar cambio de nombre de archivo

9

Ruta de directorio para cambio de nombre de archivo

10

Dormir antes de la funcionalidad IEC-104

11

Valor inicial de la duración del sueño

12

Control de ejecución

13

Valor inicial de la duración del sueño

14

No utilizado

15

Estado del commando -  ON/OFF

16

Cambiar opción - Enviar comandos ON/OFF invertidos

17

Número de entradas de datos de ASDU

18

Primera entrada de datos ASDU

En la Ilustración 2 se presenta un ejemplo de entrada de configuración extraída de la muestra 7c05da2e4612fca213430b6c93e76b06.

Ilustración 2: Ejemplo de entrada de configuración
192.168.XXX.XXX 2404 2 0 1 1 Example StoppedProcess.exe 1 "Example PATH" 0 1 0 0 1 0 0 8 1104 0 0 0 1 1 1105 0 0 0 1 2 1106 0 0 0 1 3 1107 0 0 0 1 4 1108 0 0 0 1 5 1101 0 0 0 1 6 1102 0 0 0 1 7 1103 0 0 0 1 8

Si la entrada de configuración 4 está habilitada, el malware crea telegramas ASDU para enviar comandos Select y Execute y modificar el estado IOA de una estación remota como OFF. Los rangos de IOA a los que se envían estos telegramas se proporcionan en las entradas de configuración 5 y 6. Sin embargo, esta opción no estaba habilitada en las muestras recuperadas. En el Apéndice se incluye una asignación de configuración con el ejemplo de la Ilustración 2.

Todas las configuraciones que examinamos tenían las siguientes opciones habilitadas: Finalización del proceso, cambio de nombre del archivo y uso de entradas de datos ASDU. Las entradas de datos ASDU se utilizan para elaborar mensajes ASDU específicos a la estación remota y la entrada de datos está estructurada en el formato que se muestra en la Tabla 2.

Tabla 2: Estructura de entrada de ASDU

Posición

Descripción de entrada de datos ASDU

1

Dirección de objeto de información de la estación (IOA)

2

Establecer tipo de mensaje - Comando simple o doble

3

Establecer tipo de comando -  Seleccionar o ejecutar

4

Invertir estado predeterminado ON/OFF

5

Control de ejecución

6

Índice de entradas de ASDU

Después de analizar cada entrada de configuración, INDUSTROYER.V2 enlista los procesos en ejecución con el fin de identificar si se está ejecutando un proceso codificado específico y lo finaliza. Una vez que se detiene este proceso, el malware vuelve a enlistar los procesos en ejecución y finaliza cualquier proceso especificado por el operador en la configuración.

Si la opción de cambio de nombre de archivo está habilitada, el malware crea una ruta de archivo utilizando sus datos de configuración y agrega una extensión .MZ a este archivo. Esta puede ser una técnica para evitar que se reinicie el proceso especificado finalizado anteriormente.

Para cada entrada de configuración, se crea un hilo el cual implementa la comunicación IEC-104 con el sistema controlado. IEC-104 utiliza la especificación de la unidad de datos de protocolo de aplicación (APDU).

Una trama de APDU puede estar compuesta simplemente por una trama de información de control de protocolo de aplicación (APCI); o un encabezado APCI y una trama subsiguiente de la unidad de datos de servicio de aplicación (ASDU).

APDU frame format by Brno University of Technology
Ilustración 3: Formato de marco APDU de la Universidad Tecnológica de Brno

Ejecución

INDUSTROYER.V2 primero envía mensajes de función de control, los cuales están contenidos dentro de un marco APCI. El primer mensaje de control es un “Test Frame” (TESTFR). El malware envía un TESTFR ACT a la estación remota la cual verifica una conexión establecida. Si existe, una estación remota responde con un TESTFR CON correspondiente.

A continuación, el malware abre un canal de transferencia de datos con la estación remota utilizando un tipo de mensaje de control posterior “Start Data Transfer” (STARTDT). De manera predeterminada, la transferencia de datos no está habilitada en una conexión activa entre una estación de control y una estación remota. Por lo tanto, el malware envía un STARTDT ACT para activar un canal de transferencia de datos y una estación remota envía un STARTDT CON correspondiente para confirmar una activación exitosa.

Con la transferencia de datos habilitada, el malware utiliza un marco ASDU para enviar comandos posteriores a la estación remota. Los mensajes ASDU, también conocidos como telegramas, son un conjunto de funciones de aplicación definidas por IEC-104 para monitorear y controlar estaciones remotas.

El malware envía un comando General Interrogation, el cual le permite obtener el estado actual de las señales digitales y analógicas monitoreadas de la estación remota. Posteriormente, el malware utiliza entradas de datos ASDU embebidas para crear un comando específico con el fin de modificar el IOA del objetivo a ON u OFF.

Estos comandos se elaboran utilizando opciones definidas dentro de su configuración y la entrada de datos ASDU individual. Por ejemplo, en la configuración que extrajimos de la muestra 7c05da2e4612fca213430b6c93e76b06 (presentada en la Ilustración 2), la primera entrada de datos de ASDU es:

  • 1104 0 0 0 1 1

Según la entrada de configuración 15 (estado OFF), la entrada 16 (opción Disable Change) y sus valores de entrada de ASDU (descritos en la Tabla 2), el malware crea un paquete de ASDU con las siguientes características:

  • Dirección del objeto de información: 1104
  • Tipo de mensaje ASDU: C-DC_NA_1 (comando doble)
  • Tipo de comando ASDU: Ejecutar
  • Establecer valor de estado: OFF

 

El mensaje ASDU se muestra en el tráfico de red decodificado en la Ilustración 4.

Crafted ASDU message
Ilustración 4: Mensaje ASDU elaborado

Para cada estación remota objetivo, en una entrada de configuración, el malware itera por medio de las entradas de datos ASDU correspondientes, elabora telegramas específicos y los envía a la estación remota. Los ajustes de configuración del malware pueden indicarle que elabore un mensaje ASDU adicional, el cual invierte el estado ON/OFF en un comando y envía este mensaje adicional al IOA de la estación remota.

Una descripción de alto nivel de la secuencia de comunicación es la siguiente:

  1. Envíe mensajes Test Frame para verificar una conexión establecida
  2. Envíe mensajes Start Data Transfer para abrir un canal de transferencia de datos
  3. Enviar un comando General Interrogation obteniendo el estado de la estación remota
  4. Envíe tipos de comandos simples o dobles diseñados para modificar el estado del IOA de la estación remota

La Ilustración 5 ilustra la secuencia de mensajes descrita, capturada entre INDUSTROYER.V2 y una estación remota IEC-104 emulada en laboratorio. Muestra los comandos iniciales TESTFR, STARTDT e Interrogation, seguidos de los comandos ASDU elaborados y entregados a los IOA de las estaciones remotas específicas.

INDUSTROYER.V2 message sequence with emulated IEC-104 Remote Station
Ilustración 5: Secuencia de mensajes de INDUSTROYER.V2 con estación remota IEC-104 emulada

La naturaleza detallada de cómo se ataca a una estación remota específica, hasta los IOA únicos y el estado en que cada IOA debe modificarse para crear un efecto previsto, demuestra una comprensión integral o visibilidad del entorno de la víctima.

Notamos que, aunque los IOA atacados por el malware pueden proporcionar un contexto importante para la intención precisa del actor, las asignaciones de IOA a menudo difieren entre fabricantes, dispositivos e incluso usuarios. Por esta razón, la interpretación precisa de las acciones previstas por el actor requiere un conocimiento adicional sobre los activos objetivo.

Si bien en este momento no tenemos dicha información, exploramos posibles coincidencias de IOA en función de la documentación disponible públicamente sobre productos específicos. Por ejemplo, sabiendo que los RTU y los relés de ABB están muy desplegados en la región objetivo, realizamos un análisis de fuente abierta. En nuestro ejemplo anterior, observamos un IOA equivalente a 1104, el cual posteriormente, mapeamos a la documentación pública del producto de un “ABB Distribution Recloser Relay” correspondiente a "50BFT: InStr status".

En este estado, 50 es el número ANSI para el disyuntor, que es como se enumeran los elementos del relé cuando se configura un relé de protección. Entonces 50BFT significa protección contra fallas del interruptor automático. Proporcionamos un apéndice el cual ilustra el mapeo adicional de IOA extraídos de la configuración de la muestra pública INDUSTROYER.V2 contra el mismo “Distribution Recloser Relay”.

Se superpone con la variante INDUSTROYER anterior

Las dos versiones de INDUSTROYER contienen superposiciones en el código y similitudes en el flujo de ejecución y la funcionalidad. Identificamos las siguientes características compartidas en ejecución y funcionalidad:

  • Ambas versiones contienen un código el cual, primero, finaliza un proceso específico en la estación del controlador de la víctima, antes de establecer la comunicación IEC-104.
  • Ambas versiones elaboran mensajes ASDU específicos de acuerdo con los ajustes de configuración proporcionados.
  • Ambas versiones contienen la capacidad de entregar mensajes ASDU predefinidos a un rango IOA específico.
  • Ambas versiones contienen una opción para dirigir el malware para crear un mensaje ASDU adicional el cual invierte el comando ON/OFF anterior y lo envía a la estación remota de destino.

Una diferencia que identificamos entre ambas variantes es que, a diferencia de su predecesor, INDUSTROYER.V2 contiene mensajes de depuración alterados los cuales ofuscan el significado de los resultados. Sin embargo, notamos que estos mensajes de depuración están formateados e impresos en puntos de ejecución similares de funciones clave. Además, la ofuscación no se implementó en partes clave del código IEC-104 los cuales se reutilizan en ambas versiones, lo que nos permite visualizar las superposiciones.

Por ejemplo, ambas versiones de INDUSTROYER utilizan un código muy similar para analizar el tráfico de APDU e imprimir campos analizados específicos. La Ilustración 6 es una captura de pantalla de INDUSTROYER.V2 la cual se muestra a la izquierda y a la derecha una captura de pantalla del INDUSTROYER original.

APDU traffic handling in INDUSTROYER.V2 (Left) and INDUSTROYER.104 (Right)
Ilustración 6: Manejo de tráfico APDU en INDUSTROYER.V2 (izquierda) e INDUSTROYER.104 (derecha)

Existen superposiciones notables y adicionales de código entre las dos versiones en la implementación de la creación de marcos ASDU, el envío de mensajes APDU, la ejecución de opciones de cambio y la configuración de subprocesos para la funcionalidad IEC-104.

Apéndice: Reglas YARA

rule MTI_Hunting_INDUSTROYERv2_Bytes {

    meta:

        author = "Mandiant"

        date = "04-09-2022"

        description = "Searching for executables containing bytecode associated with the INDUSTROYER.V2 malware family."

   

    strings:

        $bytes = {8B [2] 89 [2] 8B 0D [4] 89 [2] 8B 15 [4] 89 [2] A1 [4] 89 [2] 8B 0D [4] 89 [2] 8A 15 [4] 88 [2] 8D [2] 5? 8B [2] E8}

   

    condition:

        filesize < 3MB and

        uint16(0) == 0x5A4D and uint32(uint32(0x3C)) == 0x00004550 and

        $bytes

}

 

rule MTI_Hunting_INDUSTROYERv2_Strings {

    meta:

        author = "Mandiant"

        date = "04-09-2022"

        description = "Searching for executables containing strings associated with the INDUSTROYER.V2 malware family."

 

    strings:

        $a1 = "M%X - %02d:%02d:%02d" nocase ascii wide

        $a2 = "%02hu:%02hu:%02hu:%04hu" nocase ascii wide

        $a3 = "%s M%X " nocase ascii wide

        $a4 = "%s: %d: %d" nocase ascii wide

        $a5 = "%s M%X %d (%s)" nocase ascii wide

        $a6 = "%s M%X SGCNT %d" nocase ascii wide

        $a7 = "%s ST%X %d" nocase ascii wide

        $a8 = "Current operation : %s" nocase ascii wide

        $a9 = "Sent=x%X | Received=x%X" nocase ascii wide

        $a10 = "ASDU:%u | OA:%u | IOA:%u | " nocase ascii wide

        $a11 = "Cause: %s (x%X) | Telegram type: %s (x%X" nocase ascii wide

 

        $b1 = "Length:%u bytes | " nocase ascii wide

        $b2 = "Unknown APDU format !!!" nocase ascii wide

        $b3 = "MSTR ->> SLV" nocase ascii wide

        $b4 = "MSTR <<- SLV" nocase ascii wide

 

    condition:

        filesize < 3MB and

        uint16(0) == 0x5A4D and uint32(uint32(0x3C)) == 0x00004550 and

        (1 of ($a*) and 1 of ($b*))

}

Apéndice: Ejemplo de configuración asignada

Mapped configuration example
Table 3: Mapped configuration example

Apéndice: Ejemplos de IOA del mapeo de muestra disponible públicamente a un ABB Distribution Recloser Relay

IOA

Descripción

1101 

50BFT:InPosCIsA Status 

1102 

50BFT:InPosCIsB Status 

1103 

50BFT:InPosCIsC Status 

1104 

50BFT:InStr status 

1105 

50BFT:InStrA status 

1106 

50BFT:InStrB status 

1107 

50BFT:InStrC status 

1108 

50BFT:general 

1201 

  

1202 

  

1203 

  

1204 

  

1250 

  

1251 

  

1252 

  

1253 

  

1254 

  

1255 

  

1256 

  

1257 

  

1258 

  

1259 

  

1260 

  

1261 

  

1262 

  

1263 

  

1264 

  

1265 

  

1301 

  

1302 

  

1304 

 

1401 

  

1402 

  

1403 

 

1404 

 

130202 

 

160921 

 

160923 

 

160924

 

160925 

  

160927 

  

160928 

  

190202 

  

260202 

  

260901 

  

260902 

  

260903 

  

260904 

  

260905 

  

260906 

  

260907 

  

260908 

  

260909 

  

260910 

  

260911 

  

260912 

  

260914 

  

260915 

  

260916 

  

260918 

  

260920 

  

290202 

  

338501 

  

Agradecimientos

Esta investigación fue posible gracias al arduo trabajo de muchas personas que no figuran en la línea de autor. Muchas gracias a CERT UA y ESET. Un agradecimiento especial a Josh Triplett, Conor Quigley y Wesley Mok.