Hoy en día, cada vez más desarrolladores de malware utilizan lenguajes de programación no convencionales para eludir los sistemas de detección avanzados. El malware Node.js Lu0Bot es un testimonio de esta tendencia.
Al apuntar a un entorno de ejecución independiente de la plataforma común en las aplicaciones web modernas y emplear ofuscación multicapa, Lu0Bot es una seria amenaza para organizaciones e individuos.
Aunque actualmente el malware tiene poca actividad, es probable que los atacantes estén esperando el momento adecuado para atacar.
Para estar preparados para cualquier escenario futuro, un equipo de analistas realizó un análisis técnico en profundidad de una de las muestras recientes de Lu0Bot y publicó un artículo documentando su proceso.
Aquí hay una descripción general de su investigación.
Análisis estático de la muestra Lu0Bot.
El muestra bajo investigación utilizó un empaquetador SFX, un archivo autoextraíble que se puede abrir con cualquier utilidad de archivo. Su contenido fue explorado individualmente.
Contenidos del archivo |
1. archivo BAT
El contenido del archivo BAT. |
La primera línea del archivo contenía un comentario que no estaba claro y no se hizo referencia a él más adelante.
A continuación, el archivo EXE incluía varios archivos, incluido un intérprete de Node llamado fjlpexyjauf.exe.
Luego, el intérprete recibió un archivo con bytes y un número (%1% en la captura de pantalla) que probablemente sirvió como clave de cifrado para el archivo de bytes.
2. archivos eqnyiodbs.dat
El archivo se dividió en bloques de bytes, que luego se fusionaron para crear el intérprete de Node.
Contenido de los archivos eqnyiodbs |
3. Archivo lknidtnqmg.dat
Este archivo tenía bytes cifrados en Base64, que podían descifrarse utilizando el número de entrada proporcionado.
Contenido del archivo lknidtnqmg.dat |
4. Archivo gyvdcniwvlu.dat
Este controlador permitía que los programas de 32 bits en sistemas x64 convirtieran códigos de escaneo de claves en caracteres Unicode, probablemente utilizados para la funcionalidad de registro de teclas en el proceso principal.
Análisis dinámico de malware de Lu0Bot en ANY.RUN
El siguiente paso implicó investigar el archivo EXE y lknidtnqmg.dat en el malware interactivo ANY.RUN sandbox para monitorear su comportamiento y descifrar los bytes o ubicarlos descifrados en la memoria del proceso.
El análisis reveló que, tras la ejecución, el proceso principal inició un archivo BAT que lanzó un archivo EXE. El código aceptó entradas JS cifradas y recopiló datos del sistema utilizando WMIC, incluida información sobre la ubicación de ejecución del proceso, que se alineó con la técnica MITRE T1047.
El árbol de procesos durante la ejecución de la muestra. |
Se descubrió que el intérprete se copió en la carpeta de inicio. La conexión al dominio continuó después de que se reinició el sistema, lo que permitió que el bot siguiera operativo.
Además, el malware demostró un enfoque único para la conexión de dominios al ensamblar varias partes en una sola entidad dentro del código JS.
Solicitudes DNS |
Utilice una prueba gratuita de 14 días para analizar malware en el entorno limitado interactivo de ANY.RUN.
Trabaja junto con tu equipo en modo privado. Interactúe con archivos y enlaces en una máquina virtual dedicada para exponer su comportamiento malicioso. Recopile IOC y configuraciones nuevas en segundos.
Análisis técnico del malware Lu0Bot mediante un desensamblador y depurador
Para acceder al código JS principal, el equipo:
- Desempaquetado el archivo SFX
- Ejecuté un comando para recopilar el archivo Node.js
- Se lanzó fjlpexyjauf.exe en x32dbg, ingresando los datos entrantes en la línea de comando
- Llegué al punto donde comenzó la ejecución del código JS.
- Localizó el código en la memoria y guardó un volcado.
Para ver cómo se llevaron a cabo los procesos de desembalaje y extracción de volcados, consultar el artículo original. Para esta descripción general, centrémonos en el análisis del código.
Analizando el código JS
El código JavaScript inicialmente ininteligible se aclaró eliminando bytes innecesarios y utilizando un desofuscador de JavaScript.
Resultado de la transformación del código. |
El código comenzaba con una serie de cadenas cifradas. Luego, elementos específicos se movieron al final de la matriz mediante manipulación. Después de eso, se implementó una función para descifrar las cadenas de la matriz utilizando una forma alternativa de BASE64 (T1132.002), seguida de codificación-decodificación de URL y, finalmente, RC4.
Esta función fue llamada usando dos variables:
1. Un elemento de la matriz.
2. La llave RC4.
Con la ayuda de un guión especiallas líneas se descifraron, lo que reveló que partes de los dominios estaban codificadas en la muestra.
Después de la desofuscación del código |
A continuación, se descubrió la sección del código responsable de ensamblar el dominio.
Construcción de dominio |
Depurando el código JavaScript
Para depurar, el equipo utilizó Node.js con su parámetro inspect-brk (node.exe –inspect-brk *ofuscar volcado sin bytes basura*), colocando un punto de interrupción en la palabra clave “var” y observando el resultado generado por cada línea.
Se encontró que la primera función (ginebra) recopiló información del sistema y produjo una matriz de 15 elementos con detalles del sistema.
Una matriz que contiene la salida de la función ginf. |
La segunda función (hwco) utilizó la matriz de 15 elementos de la ginebra funciona como entrada, lo que genera una salida que comprende el final del dominio hasta el punto. Un análisis más detallado reveló que este resultado era un hash de los datos recopilados del sistema.
Salida de cadena de la función hwco |
El puerto, el número y el segmento de dominio después del punto se extrajeron de la matriz acc y luego se asignaron a variables.
Extrayendo elementos de la matriz acc |
Se agregó un número aleatorio al segmento de dominio después del punto. La siguiente línea seleccionó un dominio alternativo si se cumplían ciertas condiciones.
Elija dominio después del punto |
Después de varias operaciones más, el dominio quedó completamente ensamblado y todos los elementos necesarios se empaquetaron en un objeto JSON.
Después de ejecutarse, el malware buscó una dirección para la transmisión de datos. Una vez que el servidor recibió el tráfico, envió el código JS.
Detección de Lu0bot
Como parte de su esfuerzo, el equipo logró descubrir una gran cantidad de inteligencia y COI, además de escribir reglas YARA, Sigma y Suricata. Puedes acceder a él en el artículo.
Todos los hallazgos se incorporaron a ANY.RUN, lo que permitió al servicio identificar rápidamente cualquier muestra de Lu0Bot y revelar dominios C2 después de descifrar cadenas.
Conclusión
Lu0bot es un malware inusual que combina Node.js y código JS ejecutable. Posee una estructura de dominio única y utiliza métodos de cifrado personalizados para cadenas.
Aunque actualmente muestra un bajo nivel de actividad, Lu0bot puede representar un riesgo significativo si su campaña escala y el servidor C2 comienza a responder activamente.
Proteja su organización de este y otro malware mediante el uso CUALQUIER EJECUCIÓN para analizar rápidamente cualquier archivo o enlace sospechoso y obtener un veredicto concluyente en segundos.