Esta es una historia en desarrollo y el blog se actualizará a medida que haya nueva información disponible.
Resumen ejecutivo
Este artículo presenta el análisis de un ciberataque dirigido a un proveedor de energía ucraniano.
Hallazgos clave:
- Investigadores de ESET colaboraron con CERT-UA para analizar el ataque contra la empresa energética ucraniana
- Las acciones destructivas estaban programadas para el 08-04-2022, pero algunos elementos sugieren que el ataque había sido planeado durante al menos dos semanas.
- El ataque utilizó un malware compatible con Sistemas de Control Industrial (ICS, por sus siglas en inglés) y wipers que eliminan información de discos en sistemas operativos Windows, Linux y Solaris.
- Consideramos con mucha confianza que los atacantes usaron una nueva versión de Industroyer, un malware que se usó en 2016 y que provocó un corte de suministro eléctrico en Ucrania.
- Consideramos también y con mucha confianza que el grupo de APT Sandworm es el responsable de este nuevo ataque
Industroyer2: Industroyer recargado
Investigadores de ESET respondieron a un incidente de seguridad que afectó a un proveedor de energía en Ucrania. Trabajamos en estrecha colaboración con el CERT-UA (Centro de respuesta a incidentes de Ucrania) para remediar y proteger la red de esta infraestructura crítica.
El trabajo dio como resultado el descubrimiento de una nueva variante del malware Industroyer, que junto con el CERT-UA llamamos Industroyer2; consulte la publicación de CERT-UA aquí. Industroyer es un malware que fue utilizada en 2016 por el grupo de APT Sandworm para cortar el suministro eléctrico en Ucrania.
Los atacantes detrás de Sandworm intentaron implementar el malware Industroyer2 contra subestaciones eléctricas de alto voltaje en Ucrania.
Además de Industroyer2, Sandworm utilizó varias familias de malware destructivas, incluidas CaddyWiper, ORCSHRED, SOLOSHRED y AWFULSHRED. Descubrimos por primera vez a CaddyWiper el 14 de marzo de 2022 cuando se usó contra un banco ucraniano y se usó nuevamente una variante de este malware el 08/04/2022 a las 14:58 contra el proveedor de energía ucraniano mencionado anteriormente.
En este punto, no sabemos cómo los atacantes lograron el compromiso inicial ni cómo fue que se movieron de la red de TI a la red del Sistema de control industrial (ICS). La figura 1 muestra una descripción general de los diferentes malware del tipo wiper que fueron utilizados en este ataque.
La Figura 2 resume la cadena de eventos.
- 24-02-2022: Comienzo de la actual invasión rusa en Ucrania
- 14-03-2022: Despliegue de CaddyWiper contra un banco ucraniano
- 01-04-2022: Despliegue de CaddyWiper contra una entidad gubernamental ucraniana
- 08-04-2022 (14:58 UTC): Despliegue de CaddyWiper en algunas máquinas del proveedor de energía con Windows y de malware destructivo en máquinas con Linux y Solaris
- 08-04-2022 (15:02:22 UTC): operador de Sandworm crea la tarea programada para iniciar Industroyer2
- 08-04-2022 (16:10 UTC): Ejecución de Industroyer2 para cortar el suministro eléctrico en una región de Ucrania
- 08-04-2022 (16:20 UTC): Ejecución de CaddyWiper en la misma máquina para borrar los rastros de Industroyer2
Figura 2. Línea de tiempo de los eventos.
En 2017, los investigadores de ESET revelaron que una pieza de malware llamada Industroyer que fue responsable de un apagón que afectó a la capital de Ucrania, Kiev, en diciembre de 2016.
Como explicamos en nuestro whitepaper sobre Industroyer en el cual detallamos cómo funciona esta amenaza para sistemas de control industrial, este malware es capaz de interactuar con sistemas de control industrial que normalmente se utilizan en los sistemas de energía eléctrica. Esto incluye las siguientes tecnologías IEC-101, IEC-104, IEC 61850 y OPC DA.
En aquel momento dijimos que "era muy poco probable que alguien pueda escribir y probar un malware como ese sin tener acceso al equipamiento especializado que se utiliza en el entorno industrial específico". Esto fue confirmado en 2020 por el gobierno de los Estados Unidos cuando seis oficiales de la Unidad Militar Rusa 74455 de la Dirección General de Inteligencia (GRU) fueron acusados por su papel en múltiples ataques cibernéticos, incluidos Industroyer y NotPetya. Para más información consulte la acusación en Justice.gov y nuestro reseña histórica de las operaciones de Sandworm.
El malware descubierto recientemente es una nueva variante de Industroyer, de ahí el nombre Industroyer2.
Industroyer2
Industroyer2 se desplegó como un único ejecutable de Windows llamado 108_100.exe y se ejecutó mediante una tarea programada el 2022-04-08 a las 16:10:00 UTC. Se compiló el 23 de marzo de 2022, según el timestamp del PE, lo que sugiere que los atacantes habían planeado su ataque durante más de dos semanas.
Industroyer2 solo implementa el protocolo IEC-104 (también conocido como IEC 60870-5-104) para comunicarse con equipos industriales. Esto incluye protección de relés utilizados en subestaciones eléctricas. Este es un ligero cambio con respecto a la variante Industroyer de 2016, que es una plataforma completamente modular con payloads para múltiples protocolos de sistemas de control industrial.
Industroyer2 comparte varias similitudes de código con el payload 104.dll de Industroyer. Consideramos con mucha confianza que la nueva variante se creó utilizando el mismo código fuente.
Industroyer2 es altamente configurable. Contiene una configuración detallada hardcodeada en su cuerpo, que impulsa las acciones del malware. Esto es diferente de Industroyer que almacena la configuración en un archivo .INI separado. Por lo tanto, los atacantes deben volver a compilar Industroyer2 para cada nueva víctima o entorno. Sin embargo, dado que la familia de malware Industroyer* solo se desplegó dos veces, con un lapso de cinco años entre cada versión, esto probablemente no sea una limitación para los operadores de Sandworm.
El nuevo formato de configuración se almacena como una string que luego se suministra a la rutina de comunicación IEC-104 del malware. Industroyer2 puede comunicarse con múltiples dispositivos a la vez. Específicamente, la muestra analizada contiene ocho direcciones IP diferentes de dispositivos; consulte la Figura 4.
La configuración contiene valores que se utilizan durante la comunicación a través del protocolo IEC-104, como la dirección ASDU, que se refiere a Unidad de Datos de Servicios de Aplicación (Application Service Data Unit), así como direcciones de Objetos de Información (IOA), tiempos de espera, etc.
Antes de conectarse a los dispositivos apuntados, el malware finaliza un proceso legítimo que se utiliza en las operaciones diarias estándar. Además de eso, cambia el nombre de esta aplicación agregando .MZ al nombre del archivo. Lo hace para evitar el reinicio automático de este proceso legítimo.
El análisis aún está en curso para determinar cuáles son las acciones exactas tomadas para cada dispositivo. Creemos que este componente puede controlar sistemas de control industrial específicos para provocar un corte de energía.
Industroyer2 puede producir un archivo de registro o enviar su progreso a la ventana de la consola. Sin embargo, en lugar de mensajes de texto significativos como en la versión anterior, el malware escribe varios códigos de error; consulte la Figura 5. Creemos que es un intento de ofuscación por parte de los desarrolladores de Sandworm para dificultar el análisis.
CaddyWiper
En coordinación con el despliegue de Industroyer2 en la red de un Sistema de Control Industrial (ICS), los atacantes desplegaron una nueva versión del malware destructivo CaddyWiper. Creemos que la intención era hacer más lento el proceso de recuperación y evitar que los operadores de la compañía de energía recuperaran el control de las consolas ICS. También se desplegó en la máquina donde se ejecutó Industroyer2, probablemente para borrar cualquier rastro del malware.
La primera versión de CaddyWiper fue descubierta por investigadores de ESET en Ucrania el 14 de marzo de 2022 cuando se desplegó en la red de un banco. Se desplegó a través de un objeto de política de grupo (GPO, por sus siglas en inglés), lo que indica que los atacantes tenían control previo de la red de la víctima. El wiper borra datos del usuario y la información almacenada en las particiones de las unidades conectadas, lo que hace que el sistema quede inoperable e irrecuperable.
Nueva cadena para la carga CaddyWiper
En la red del proveedor de energía, los atacantes implementaron una nueva versión de CaddyWiper que utiliza un nuevo loader, denominado ARGUEPATCH por el CERT-UA. Se trata de una versión parcheada de un componente legítimo del software Hex-Rays de IDA Pro, específicamente el debugger de servidor remoto de IDA win32_remote.exe. No se supone que IDA Pro se use en un entorno ICS, ya que su objetivo principal es la ingeniería inversa de software, incluido el análisis de malware. No sabemos por qué los atacantes eligieron troyanizar esta pieza de software, podría ser un troll para los defensores.
ARGUEPATCH fue ejecutado por una tarea programada que estaba destinada a ser lanzada una vez el 2022-04-08 a las 14:58 UTC en una máquina y a las 16:20 UTC en la máquina donde se implementó Industroyer2.
El binario parcheado carga un shellcode cifrado de un archivo y lo descifra con una clave, ambos son proporcionados a través de la línea de comandos. Una clave XOR de un solo byte es derivada de la clave de entrada y se utiliza para descifrar el shellcode.
El shellcode descifrado es una versión ligeramente modificada de CaddyWiper. En la Figura 6 y la Figura 7 se proporciona una comparación de sus principales rutinas. Tenga en cuenta que no borran el controlador de dominio y borran C:\Users\ y los discos de D:\ a [:\. La rutina de borrado también es casi idéntica: llena todos los archivos con 0.
Finalmente, CaddyWiper llama a DeviceIoControl con IOCTL_DISK_SET_DRIVE_LAYOUT_EX y un InputBuffer puesto a cero para todos los discos desde \\PHYSICALDRIVE9 a \\PHYSICALDRIVE0. Esto borra la información extendida de las particiones de la unidad: el Master boot record (MBR) o la Tabla de Particiones GUID (GPT, por sus siglas en inglés). La máquina no podrá volver a arrancar.
Enumeración de Active Directory
Junto con CaddyWiper se encontró un script de PowerShell, tanto en la red del proveedor de energía como en el banco que había sido comprometido anteriormente con este malware.
Este script enumera objetos de política de grupo (GPO) utilizando la interfaz de servicio de Active Directory (ADSI). El script, que puede observarse en la Figura 8, es casi idéntico a un fragmento que fue compartido en una publicación en Medium.
Creemos que los atacantes implementaron CaddyWiper a través de un GPO y usaron el script para verificar la existencia de este GPO.
Malware destructivo de Linux y Solaris (ORCSHRED, SOLOSHRED, AWFULSHRED)
En la red de la compañía de energía apuntada también se encontró malware destructivo dirigido a sistemas que corren Linux y Solaris. Son dos los componentes principales que se utilizan para llevar adelante este ataque: un gusano y un wiper. Este último se encontró en dos variantes, una para cada uno de los sistemas operativos de destino. Todo el malware se implementó en Bash.
El gusano
El primer componente lanzado por el atacante fue un gusano (también conocido en inglés como worm) cuyo archivo se llamaba sc.sh. Este script de Bash comienza agregando una tarea programada (cron job) para iniciar el componente que borra datos (wiper) a las 2:58pm UTC (asumiendo que el sistema está configurado en la hora local, UTC+3), a menos que haya sido lanzado con el argumento “owner”. Esta es probablemente una forma de evitar la autodestrucción del sistema inicial utilizado para lanzar el gusano.
Luego, la secuencia de comandos itera sobre las redes a las que puede acceder el sistema al observar el resultado de ip route o ifconfig -a. Siempre asume que se puede acceder a una red de clase C (/24) para cada dirección IP que recopila. Intentará conectarse a todos los hosts en esas redes usando desde SSH a los puertos TCP 22, 2468, 24687 y 522. Una vez que encuentra un servidor SSH accesible, prueba credenciales de una lista provista con el script malicioso. Creemos que el atacante tenía credenciales antes del ataque para permitir la propagación del wiper.
Si el sistema aún no ha sido comprometido, el malware se copia en el nuevo objetivo y se lanza el gusano. El gusano no se inicia con el argumento owner, por lo que el wiper está programado para iniciarse a las 2:58 p. m. UTC y destruir todos los datos. Si esos sistemas se configuraron en la zona horaria local, la destrucción debe haber comenzado al mismo tiempo que el sistema comprometido con CaddyWiper.
El wiper para Linux
La variante para Linux del wiper tiene variables ligeramente ofuscadas y los nombres de las funciones se reemplazaron con una palabra de 8 letras sin sentido. La mayoría de los valores literales también se reemplazaron con variables al principio del archivo.
En última instancia, el wiper de Linux destruye todo el contenido de los discos conectados al sistema usando shred si está disponible o de lo contrario simplemente dd (con if=/dev/random). Si se conectan varios discos, la eliminación de datos se realiza en paralelo para acelerar el proceso.
Dependiendo del tamaño, el disco completo puede tardar horas en borrarse por completo. Para que el sistema deje de funcionar más rápido, primero intenta detener y deshabilitar los servicios HTTP y SSH. Los servicios se deshabilitan usando systemctl disabled. Para garantizar que el servicio no se vuelva a habilitar, el archivo de la unidad systemd responsable de cargar el servicio se elimina del disco.
Los archivos de /boot, /home y /var/log también, se eliminan antes de destruir las unidades totalmente. Esto hace que el sistema quede inoperable más rápido, elimina los datos del usuario y quizás elimine registros incriminatorios.
La última acción del script malicioso es iniciar a la fuerza un reinicio usando SysRq. Dado que todas las unidades están llenas de datos aleatorios, ningún sistema operativo se iniciará.
El wiper para Solaris
A diferencia del wiper para Linux, la variante para Solaris no está ofuscada.
Al igual que la variante para Linux, el script malicioso itera sobre todos los servicios para detenerlos y deshabilitarlos si contienen la palabra clave ssh, http, apache y, además, ora_ u oracle. Es muy probable que esos servicios sean utilizados por aplicaciones utilizadas para manejar sistemas de control industrial. Eliminarlos evitaría que los operadores de la empresa energética puedan recuperar el control de las subestaciones y reviertan las acciones de Industroyer2.
Utiliza systemctl o svcadm dependiendo de lo que esté disponible. Lo último es lo más probable ya que Solaris no está ejecutando systemd.
La destrucción de archivos comienza con la eliminación de bases de datos. Elimina, usando shred y luego rm, todos los archivos y directorios contenidos en las variables de entorno que comienzan con ORA. Oracle Database utiliza las siguientes variables para definir la ubicación de los archivos y el software de la base de datos: ORACLE_BASE, ORACLE_HOME y ORACLE_PATH. Tenga en cuenta que shred se asegura de que la recuperación de los datos (sin una copia de seguridad) no sea posible.
Al igual que la variante de Linux, los archivos en /boot, /home y /var/log se eliminan con prioridad.
Luego, el script itera sobre los discos conectados al sistema, que se encuentran en /dev/dsk/. Ignora los segmentos (particiones) y funciona solo en discos completos. Para cada uno de ellos, el script malicioso sobrescribe el contenido completo mediante shred. Para minimizar el tiempo necesario para realizar el borrado, todos los discos se borran en paralelo.
Por último, el script se autodestruye.
Conclusion
Ucrania vuelve a estar en el centro de los ciberataques dirigidos a su infraestructura crítica. Esta nueva campaña de Industroyer surge luego de múltiples oleadas de wipers que han sido utilizados en ataques dirigidos a varios sectores en Ucrania. Los investigadores de ESET continuarán monitoreando el panorama de amenazas para proteger mejor a las organizaciones de este tipo de ataques destructivos.
Y muchas gracias a @_CERT_UA que trabajó con nosotros en este caso y proporcionó muestras. Puede leer su aviso sobre esta campaña aquí.
Por cualquier consulta sobre esta y otra investigación publicada en WeLIveSecurity, comuníquese vía threatintel@eset.com.
ESET Research ahora ofrece también reportes de inteligencia de APT privados y feeds de datos. Por cualqjuier consulta acerca de este servicio, visite la página ESET Threat Intelligence.
Indicadores de Compromiso
SHA-1 | Filename | ESET detection name | Description |
---|---|---|---|
FD9C17C35A68FC505235E20C6E50C622AED8DEA0 | 108_100.exe | Win32/Industroyer.B | Industroyer2 |
6FA04992C0624C7AA3CA80DA6A30E6DE91226A16 | zrada.exe | Win32/Agent.AECG | ArguePatch |
9CE1491CE69809F92AE1FE8D4C0783BD1D11FBE7 | pa.pay | N/A | TailJump (Encrypted CaddyWiper) |
0090CB4DE31D2D3BCA55FD4A36859921B5FC5DAE | link.ps1 | PowerShell/HackTool.Agent.AH | Script which enumerates GPO |
D27D0B9BB57B2BAB881E0EFB97C740B7E81405DF | sc.sh | Linux/Agent.PC trojan | OrcShred (Linux worm) |
3CDBC19BC4F12D8D00B81380F7A2504D08074C15 | wobf.sh | Linux/KillFiles.C trojan | AwfulShred (Linux wiper) |
8FC7646FA14667D07E3110FE754F61A78CFDE6BC | wsol.sh | Linux/KillFiles.B trojan | SoloShred (Solaris wiper) |