Actualizar
Esta investigación cubre una actualización de la etapa 2 de GHOSTPULSE, divulgada originalmente por Elastic Security Labs en octubre de 2023.
Conclusiones clave
- GHOSTPULSE pasó de usar el fragmento IDAT de archivos PNG a incrustar su configuración cifrada y carga útil dentro de la estructura de pixeles.
- Las campañas recientes implican engañar a las víctimas con técnicas creativas de ingeniería social, como validaciones CAPTCHA que activan comandos maliciosos a través de atajos de teclado de Windows.
- Elastic Security mejoró sus reglas de YARA y actualizó la herramienta de extracción de configuración para detectar y analizar tanto la versión antigua como la nueva de GHOSTPULSE.
Preámbulo
La familia de malware GHOSTPULSE (también conocida como HIJACKLOADER o IDATLOADER) evolucionó continuamente desde su descubrimiento en 2023, evadiendo la detección con técnicas cada vez más desarrolladas.
En sus iteraciones anteriores, GHOSTPULSE abusó del fragmento IDAT de archivos PNG para ocultar cargas útiles maliciosas, como se detalla en un artículo anterior de Elastic Security Labs. Sin embargo, un análisis reciente descubrió un cambio significativo en su algoritmo. En lugar de extraer la carga útil del fragmento IDAT, la última versión de GHOSTPULSE ahora analiza los pixeles de la imagen para recuperar su configuración y carga útil. Este nuevo enfoque implica incrustar datos maliciosos directamente dentro de la estructura de pixeles.
En esta publicación de investigación, exploraremos este nuevo algoritmo basado en pixeles y lo compararemos con la técnica de fragmentación IDAT anterior con reglas de detección actualizadas.
Introducción
Recientemente, observamos varias campañas que involucran a LUMMA STEALER usando GHOSTPULSE como cargador, un tema también explorado por HarfangLab. Estas campañas se destacan por sus tácticas creativas de ingeniería social. Las víctimas son engañadas para validar un CAPTCHA, pero el sitio web les indica que ejecuten un serial de atajos de teclado de Windows en lugar del proceso habitual. Estos atajos activan un comando copiado en el portapapeles por JavaScript malicioso. Esto lleva a que se ejecute un script de PowerShell, iniciando la cadena de infección descargando y ejecutando una carga útil de GHOSTPULSE.
En versiones anteriores de GHOSTPULSE, se entregaba como parte de un paquete de varios archivos. Este paquete normalmente contenía un ejecutable benigno, una DLL infectada cargada por el ejecutable y un archivo PNG que almacenaba la configuración cifrada.
Sin embargo, en la última versión, GHOSTPULSE simplificó su implementación. Ahora, todo el paquete consta de un solo archivo, un ejecutable benigno pero comprometido que incluye el archivo PNG dentro de su sección de recursos.
Análisis técnico
La segunda etapa actualizada del malware conserva gran parte de su estructura anterior, incluido el uso del mismo algoritmo hash para resolver los nombres de las API de Windows. Sin embargo, el cambio más significativo está en la forma en que el malware ahora ubica su configuración, que contiene tanto la carga útil como las instrucciones críticas para su implementación.
A continuación se muestra una captura de pantalla que muestra el pseudocódigo de ambas implementaciones:
En versiones anteriores, GHOSTPULSE analizaba un archivo PNG en busca de un blob de datos cifrado, que se dividía en fragmentos y se almacenaba secuencialmente. El proceso de análisis del malware era sencillo: buscaría un marcador específico dentro del archivo, en este caso, la cadena IDAT. Una vez encontrado, el malware buscaría una etiqueta de 4 bytes que siguiera a la cadena. El fragmento cifrado se extraería si esta etiqueta coincidiera con el valor esperado. Este proceso continúa para cada aparición de la cadena IDAT que viene después hasta que se recopila la carga cifrada completa.
En la nueva versión, la configuración cifrada se almacena en los pixeles de la imagen. El malware construye una matriz de bytes extrayendo los valores RED, GREENy BLUE (RGB) de cada pixel secuencialmente empleando las API estándar de Windows de la biblioteca GdiPlus (GDI + ). Una vez que se construye la matriz de bytes, el malware busca el inicio de una estructura que contiene la configuración cifrada de GHOSTPULSE, incluida la clave XOR necesaria para el descifrado. Lo hace recorriendo la matriz de bytes en bloques de 16 bytes. Para cada bloque, los primeros 4 bytes representan un hash CRC32 y los siguientes 12 bytes son los datos que se van a cifrar. El malware calcula el CRC32 de los 12 bytes y comprueba si coincide con el hash. Si se encuentra una coincidencia, extrae el desplazamiento de la configuración cifrada de GHOSTPULSE, su tamaño y la clave XOR de 4 bytes, y luego XOR la descifra.
El siguiente diagrama proporciona un desglose visual de este proceso:
Extractor de configuración actualizado
En base a estos hallazgos, actualizamos nuestro extractor de configuración para admitir ambas versiones de GHOSTPULSE. Esta herramienta toma un archivo PNG como entrada y genera la carga útil incrustada. Puede encontrar la herramienta actualizada en nuestro repositorio labs-releases.
Detección de GHOSTPULSE con YARA
La regla original de GHOSTPULSE YARA aún previene la etapa final de una infección y está integrada en Elastic Defend. La muestra actualizada se puede detectar mediante las siguientes reglas de YARA y se incluirá con Elastic Defend en una versión futura.
Elastic Security actualizó las reglas de GHOSTPULSE YARA para identificar esta actividad:
rule Windows_Trojan_GHOSTPULSE_1 {
meta:
author = "Elastic Security"
creation_date = "2024-10-15"
last_modified = "2024-10-15"
os = "Windows"
arch = "x86"
category_type = "Trojan"
family = "GHOSTPULSE"
threat_name = "Windows.Trojan.GHOSTPULSE"
license = "Elastic License v2"
strings:
$stage_1 = { 49 63 D0 42 8B 0C 0A 41 03 CA 89 0C 1A 8B 05 ?? ?? ?? ?? 44 03 C0 8B 05 ?? ?? ?? ?? 44 3B C0 }
$stage_2 = { 48 89 01 48 8B 84 24 D8 00 00 00 48 8B 4C 24 78 8B 49 0C 89 08 C7 44 24 44 00 00 00 00 }
condition:
any of them
}
rule Windows_Trojan_GHOSTPULSE_2 {
meta:
author = "Elastic Security"
creation_date = "2024-10-10"
last_modified = "2024-10-10"
os = "Windows"
arch = "x86"
category_type = "Trojan"
family = "GHOSTPULSE"
threat_name = "Windows.Trojan.GHOSTPULSE"
license = "Elastic License v2"
strings:
$a1 = { 48 83 EC 18 C7 04 24 00 00 00 00 8B 04 24 48 8B 4C 24 20 0F B7 04 41 85 C0 74 0A 8B 04 24 FF C0 89 04 24 EB E6 C7 44 24 08 00 00 00 00 8B 04 24 FF C8 8B C0 48 8B 4C 24 20 0F B7 04 41 83 F8 5C }
condition:
all of them
}
Conclusión
En resumen, la familia de malware GHOSTPULSE evolucionó desde su lanzamiento en 2023, y esta reciente actualización marca uno de los cambios más significativos.
A medida que los atacantes continúan innovando, los defensores deben adaptar empleando herramientas y técnicas actualizadas para mitigar estas amenazas de manera efectiva. Nos complace compartir nuestra herramienta de extracción de configuración recientemente desarrollada, diseñada para analizar las versiones más antiguas y nuevas de GHOSTPULSE. Esta herramienta empodera a los investigadores y profesionales de la ciberseguridad al proporcionar capacidades mejoradas para comprender y combatir estas amenazas en evolución. A medida que cambia el panorama de las amenazas cibernéticas, la colaboración y la innovación siguen siendo esenciales para una protección eficaz.
Observaciones
Todos los observables también están disponibles para su descarga tanto en formato ECS como en STIX.
En esta investigación se discutieron los siguientes observables.
| Observable | Tipo | Nombre | Referencia |
|---|---|---|---|
57ebf79c384366162cb0f13de0de4fc1300ebb733584e2d8887505f22f877077 | SHA-256 | Setup.exe | Muestra GHOSTPULSE |
b54d9db283e6c958697bfc4f97a5dd0ba585bc1d05267569264a2d700f0799ae | SHA-256 | Setup_light.exe | Muestra GHOSTPULSE |
winrar01.b-cdn[.]net | nombre-de-dominio | Ejemplo de infraestructura que aloja GHOSTPULSE | |
reinforcenh[.]shop | nombre-de-dominio | LUMMASTEALER C2 | |
stogeneratmns[.]shop | nombre-de-dominio | LUMMASTEALER C2 | |
fragnantbui[.]shop | nombre-de-dominio | LUMMASTEALER C2 | |
drawzhotdog[.]shop | nombre-de-dominio | LUMMASTEALER C2 | |
vozmeatillu[.]shop | nombre-de-dominio | LUMMASTEALER C2 | |
offensivedzvju[.]shop | nombre-de-dominio | LUMMASTEALER C2 | |
ghostreedmnu[.]shop | nombre-de-dominio | LUMMASTEALER C2 | |
gutterydhowi[.]shop | nombre-de-dominio | LUMMASTEALER C2 | |
riderratttinow[.]shop | nombre-de-dominio | LUMMASTEALER C2 |
