Milum: un troyano que apunta al sector industrial

Milum un troyano que apunta a los sensores remotos

Milum un troyano que apunta a los sensores remotos

En agosto de 2019, Kaspersky descubrió una campaña maliciosa que distribuía un troyano C++ completo que llamamos Milum.

Todas las víctimas de Milum que registramos fueron organizaciones de Medio Oriente.

Al menos algunos de ellos están relacionados con el sector industrial.

Nuestro motor de atribución de amenazas de Kaspersky (KTAE) no muestra similitudes de código con campañas conocidas.

Tampoco hemos visto ninguna intersección objetivo.

De hecho, encontramos solo tres muestras casi únicas, todas en un solo país.

Por lo tanto, consideramos que los ataques están dirigidos y actualmente hemos llamado a esta operación WildPressure.

Las marcas de tiempo de compilación para todos estos archivos son las mismas: marzo de 2019.

Esto es consistente con el hecho de que no registramos infecciones antes del 31 de mayo de 2019, por lo que las fechas de compilación no parecen ser falsas.

Para su infraestructura de campaña, los operadores utilizaron servidores privados virtuales (VPS) OVH y Netzbetrieb alquilados y un dominio registrado en los Dominios por el servicio de anonimización Proxy.

El malware utiliza el formato JSON para los datos de configuración y también como protocolo de comunicación C2 a través de HTTP.

Dentro de las comunicaciones encriptadas dentro de las solicitudes HTTP POST, encontramos varios campos interesantes.

Uno de ellos muestra la versión de malware: 1.0.1. Un número de versión como este indica una etapa temprana de desarrollo.

Otros campos sugieren la existencia de, como mínimo, planes para versiones que no sean C ++.

El único cifrado implementado es el algoritmo RC4 con diferentes claves de 64 bytes para diferentes víctimas.

Además, los desarrolladores tuvieron la amabilidad de dejar los datos RTTI dentro de los archivos.

Los productos de Kaspersky detectan este malware como Backdoor.Win32.Agent.

Por qué lo llamamos Milum y por qué es de interés

Todos los troyanos C ++ mencionados anteriormente se compilan como archivos PE independientes, originalmente llamados Milum46_Win32.exe.

La palabra ‘milum’ se usa en los nombres de clase C ++ dentro del malware, por lo que le pusimos el nombre de troyano.

Otra característica distintiva es que el malware exporta muchas funciones de compresión zlib, como zlibVersion (), inflate () o deflate ().

Esta compresión es necesaria para la comunicación C2, pero en realidad no es necesario exportarlos en el caso de una aplicación independiente.

Los campos de configuración JSON no se limitan solo a la versión y al lenguaje de programación; los operadores de campaña también usan ID de objetivos que se encuentran en las muestras.

Entre ellos, encontramos HatLandM30 y HatLandid3, ninguno de los cuales estamos familiarizados.

La siguiente tabla proporciona ejemplos de Milum que tienen marcas de tiempo de compilación de encabezado PE similares pero diferentes ID de destino:

Milum46_Win32.exe muestra hash MD5 Marca de tiempo (GMT) Identificación del cliente
0C5B15D89FDA9BAF446B286C6F97F535 2019.03.09 06:17:19 839ttttttt
17B1A05FC367E52AADA7BDE07714666B 2019.03.09 06:17:19 SombreroLandid3
A76991F15D6B4F43FBA419ECA1A8E741 2019.03.09 06:17:19 HatLandM30

En lugar de describir todos los campos de configuración uno por uno, los hemos reunido en la siguiente tabla, con todas las características principales de esta familia de malware:

Lenguaje de programación C ++ con funciones STL utilizadas principalmente para analizar datos JSON y manejo de excepciones.
Datos de configuración Datos JSON codificados en Base64 en recursos PE. Incluye tiempos de espera, URL de C2 y claves para la comunicación, incluida la clave RC4 de 64 bytes.
Protocolo de red Trojan transmite datos JSON comprimidos en solicitudes HTTP POST con gzip, codificado en base64 y cifrado con RC4.
Datos de baliza JSON cifrado contiene la versión de malware “1.0.1”, la marca de tiempo de Epoch y la identificación del cliente. También tiene campos específicos como “vt” y “ext” que corresponden al lenguaje de programación “c ++” y la extensión de archivo “exe”. Si nuestra hipótesis es correcta, esto sugiere que se pueden planificar versiones de troyanos que no sean C ++, si aún no se han implementado.
Persistencia Claves de registro del sistema de ejecución automática HKCU Run y ​​RunOnce.
Cifrado El cifrado de comunicación utilizado es RC4 con la clave de 64 bytes almacenada en los datos de configuración.
Compresión Para la compresión, el troyano utiliza un código gzip incrustado. Por alguna razón, las funciones de gzip se exportan desde PE, aunque las muestras son ejecutables independientes, no DLL.

Profundicemos un poco más adentro

La muestra más popular en nuestra telemetría fue:

MD5 0c5b15d89fda9baf446b286c6f97f535
Compilado 2019.03.09 06:17:19 (GMT)
Talla 520704
Nombre interno Milum46_Win32.exe

Esta aplicación existe como una ventana invisible de la barra de herramientas. Las principales funciones maliciosas se implementan en un hilo separado. Milum decodifica sus datos de configuración y, además de los tiempos de espera, obtiene los parámetros “clientid” y “encrypt_key” para usar en el cifrado RC4.

Ejemplo de los datos de configuración decodificados y embellecidos. El campo “clientid” difiere en cada muestra observada

La siguiente tabla describe los diferentes parámetros de configuración:

Parámetro de configuración Características de los parámetros
shortwait Pausa en milisegundos entre ciclos de trabajo de comunicación C2
Identificación del cliente Nombre de objetivo ASCII exclusivo
encrypt_key Clave de cifrado RC4 para comunicaciones C2 basadas en JSON
relés – url URL completa para enviar balizas HTTP POST y comandos GET
relés – llave Clave ASCII única para que cada C2 se comunique con ella

Los operadores pueden ejecutar el troyano utilizando la clave (“b” o “B”) como primer argumento y el nombre del archivo como segundo.

En este caso, Milum eliminará el archivo enviado como parámetro.

Luego, el troyano creará el directorio C: \ ProgramData \ Micapp \ Windows \ y analizará sus datos de configuración para formar la baliza para enviar a su C2.

Para enviar la baliza, Milum usa la solicitud HTTP POST con tres parámetros que se enumeran en la tabla a continuación.

Parámetro de baliza Valores paramétricos
Maryland Clientid de config, con prefijo 01011 y sufijo ASCII aleatorio de cinco caracteres
nk La clave de la configuración para comunicarse con C2 difiere para cada servidor
val Datos JSON de comandos comprimidos, cifrados y codificados

Los dos primeros parámetros se toman de los datos de configuración. El tercero está encriptado y después de descifrar, descomprimir, decodificar y embellecer, se ve así:

Decodificado y embellecido baliza JSON a C2. En este caso, la conexión al primer servidor no tuvo éxito

Hay varios campos que vale la pena mencionar aquí.

Nos referimos anteriormente a diferentes lenguajes de programación además de C ++: “vt” parece hacer referencia a un lenguaje de programación y “ext” a una extensión de archivo.

La única razón por la que podríamos pensar para mantenerlos es si los atacantes tienen varios troyanos, escritos en diferentes idiomas, para trabajar con el mismo servidor de control.

Con respecto al campo “comando”, los servidores de control eran inaccesibles en el momento del análisis, por lo que no tenemos comandos de ellos.

Sin embargo, analizamos los controladores de comandos en el código de Milum como se describe a continuación:

Código Sentido Caracteristicas
1 Ejecución Ejecute en silencio el comando del intérprete recibido y devuelva el resultado a través de la tubería
2 Servidor a cliente Decodifique el contenido recibido en el campo JSON de “datos” y colóquelo en el archivo mencionado en el campo “ruta”
3 Cliente a servidor Codifique el archivo mencionado en el campo “ruta” del comando recibido para enviarlo
4 Información del archivo Obtenga atributos de archivo: oculto, solo lectura, archivo, sistema o ejecutable
5 Limpiar Genere y ejecute script por lotes para eliminarse
6 Resultado del comando Obtener el estado de ejecución del comando
7 Información del sistema Valide el destino con la versión de Windows, la arquitectura (32 o 64 bits), el host y el nombre de usuario, los productos de seguridad instalados (con la solicitud WQL “Seleccione de AntiVirusProduct WHERE displayName <> ‘Windows Defender'”)
8 Lista de directorio Obtenga información sobre los archivos en el directorio: oculto, solo lectura, archivo, sistema o ejecutable
9 Actualizar Obtenga la nueva versión y elimine la anterior

¿Quién fue atacado?

Según nuestra telemetría, el troyano Milum se usó exclusivamente para atacar objetivos en el Medio Oriente desde al menos finales de mayo de 2019.

Número de detecciones para una de las muestras desde septiembre de 2019

Pudimos hundir uno de los dominios WildPressure C2 (upiserversys1212 [.] Com) en septiembre de 2019.

Además la gran mayoría de las IP de los visitantes también eran del Medio Oriente, y creemos que el resto eran escáneres de red, nodos de salida TOR o conexiones VPN .

El hundimiento del dominio C2 también muestra infecciones activas principalmente del Medio Oriente

¿Y quién está detrás?

Hasta la fecha, no hemos observado ninguna similitud fuerte basada en códigos o víctimas con ningún actor o conjunto de actividades conocido.

Su código C ++ es bastante común, con respecto a los datos de configuración y el protocolo de comunicación, el malware utiliza datos de configuración con formato JSON codificados en base64 almacenados en la sección de recursos del binario y los analiza con las funciones de la Biblioteca de plantillas estándar (STL).

Además, estos puntos en común no son lo suficientemente concluyentes para la atribución y nuestra hipótesis es que son meras coincidencias. Continuaremos monitoreando esta actividad

Para resumir

Hasta la fecha, no tenemos datos sobre el mecanismo de propagación de Milum.

Una campaña que, aparentemente, se dirige exclusivamente a entidades en el Medio Oriente (al menos algunas de ellas están relacionadas con la industria) es algo que automáticamente llama la atención de cualquier analista.

Además cualquier similitud debe considerarse débil en términos de atribución, y puede ser simplemente una técnica copiada de casos conocidos anteriores.

De hecho, este ciclo de “aprender de atacantes más experimentados” ha sido adoptado por algunos actores nuevos e interesantes en los últimos años.

También debemos ser cautelosos con respecto a la verdadera focalización de este nuevo conjunto de actividades, ya que probablemente sea demasiado pronto para llegar a conclusiones.

La naturaleza objetivo parece ser clara, pero el objetivo en sí podría estar limitado por nuestra propia visibilidad.

Además el malware no está diseñado exclusivamente contra ningún tipo de víctima en particular y podría reutilizarse en otras operaciones.

Indicadores de compromiso

Archivos MD5
0C5B15D89FDA9BAF446B286C6F97F535
17B1A05FC367E52AADA7BDE07714666B
A76991F15D6B4F43FBA419ECA1A8E741
Los nombres de archivo originales son Milum46_Win32.exe; en el lado de destino existen como system32.exe

URL
upiserversys1212 [.] Com / rl.php
37.59.87 [.] 172 / page / view.php
80.255.3 [.] 86 / page / view.php

 

 

Por Marcelo Lozano – General Publisher IT Connect Latam