Este blogpost presenta una operación que hemos llamado RoundPress, dirigida a servidores de correo web de alto valor con vulnerabilidades XSS, y que evaluamos con una confianza media que está dirigida por el grupo de ciberespionaje Sednit. El objetivo final de esta operación es robar datos confidenciales de cuentas de correo electrónico específicas.

Puntos clave de este blogpost:
  • En la Operación RoundPress, el vector de compromiso es un correo electrónico de spearphishing que aprovecha una vulnerabilidad XSS para inyectar código JavaScript malicioso en la página web de correo electrónico de la víctima.
  • En 2023, la Operación RoundPress sólo tenía como objetivo Roundcube, pero en 2024 se amplió a otro software de correo web, incluyendo Horde, MDaemon y Zimbra.
  • En el caso de MDaemon, Sednit utilizó una vulnerabilidad XSS de día cero. Informamos de la vulnerabilidad a los desarrolladores el1 de noviembre de 2024 y fue parcheada en la versión 24.5.1.
  • La mayoría de las víctimas son entidades gubernamentales y empresas de defensa de Europa del Este, aunque también hemos observado ataques a gobiernos de África, Europa y Sudamérica.
  • Ofrecemos un análisis de los payloads de JavaScript SpyPress.HORDE, SpyPress.MDAEMON, SpyPress.ROUNDCUBE y SpyPress.ZIMBRA.
  • Estos payloads son capaces de robar credenciales de webmail, y exfiltrar contactos y mensajes de correo electrónico del buzón de la víctima.
  • Además, SpyPress.MDAEMON es capaz de configurar un bypass para la autenticación de dos factores.

Perfil Sednit

El grupo Sednit, también conocido como APT28, Fancy Bear, Forest Blizzard o Sofacy, lleva operando al menos desde 2004. El Departamento de Justicia de Estados Unidos señaló al grupo como uno de los responsables del hackeo del Comité Nacional Demócrata (DNC) justo antes de las elecciones estadounidenses de 2016 y vinculó al grupo con el GRU. También se presume que el grupo está detrás del pirateo de la cadena mundial de televisión TV5Monde, de la filtración de correos electrónicos de la Agencia Mundial Antidopaje (AMA) y de muchos otros incidentes. Sednit tiene un conjunto diversificado de herramientas de malware en su arsenal, varios ejemplos de los cuales hemos documentado anteriormente en nuestro white paper Sednit de 2016.

Enlaces a Sednit

El 29 de septiembre de 2023, detectamos un correo electrónico de spearphishing, parte de la Operación RoundPress, enviado desde katecohen1984@portugalmail[.]pt (dirección envelope-from). El correo electrónico explotaba la CVE-2023-43770 en Roundcube. Esta dirección de correo electrónico es muy similar a las utilizadas en otras campañas de Sednit en 2023, como las documentadas por Unit42, por ejemplo.

Aprovechando un escaneo de red que realizamos en febrero de 2022, encontramos el servidor 45.138.87[.]250 / ceriossl[.]info, que estaba configurado de la misma manera única que 77.243.181[.]238 / global-world-news[.]net. El primero se mencionaba en una entrada del blog de Qianxin en la que se describía una campaña de abuso de CVE-2023-23397 que se atribuía a Sednit. El segundo es un dominio utilizado en la operación RoundPress en 2023.

Teniendo en cuenta estos dos elementos, creemos con una confianza media que la Operación RoundPress es llevada a cabo por Sednit.

Victimología

La Tabla 1 y la Figura 1 detallan los objetivos de la Operación RoundPress en 2024, a partir de la telemetría de ESET y dos muestras en VirusTotal.

La mayoría de los objetivos están relacionados con la actual guerra en Ucrania; son entidades gubernamentales ucranianas o empresas de defensa de Bulgaria y Rumanía. Cabe destacar que algunas de estas empresas de defensa están fabricando armas de la era soviética para enviarlas a Ucrania.

Otros objetivos son gobiernos africanos, de la UE y de Sudamérica.

Tabla 1. Víctimas de la Operación Víctimas de la Operación RoundPress en 2024

Date Country Sector
2024-05 Greece National government.
Romania Unknown (VirusTotal submission).
Ukraine Specialized Prosecutor’s Office in the Field of Defense of the Western Region (VirusTotal submission).
2024-06 Bulgaria Telecommunications for the defense sector.
Cameroon National government.
Ukraine Military.
2024-07 Ecuador Military.
Ukraine Regional government.
Serbia National government.
2024-09 Cyprus An academic in environmental studies.
Romania Defense company.
Ukraine Military.
2024-10 Bulgaria Defense company.
2024-11 Bulgaria Defense company (not the same as in 2024-10).
Ukraine Civil air transport company.
Defense company.
2024-12 Ukraine State company in the transportation sector.

Figure 1. Map of Operation RoundPress victims in 2024
Cuadro 1. Mapa de víctimas de la operación RoundPress en 2024

Cadena de compromiso

Acceso inicial

En 2023, Sednit estaba explotando CVE-2020-35730, una conocida vulnerabilidad XSS en Roundcube (ver este blogpost de CERT-UA y este informe de Recorded Future), que permite la carga de código JavaScript arbitrario en el contexto de la ventana de correo web.

En 2024, observamos que se utilizaban diferentes vulnerabilidades XSS para atacar software de correo web adicional: Horde, MDaemon y Zimbra. Sednit también empezó a utilizar una vulnerabilidad más reciente en Roundcube, CVE-2023-43770. La vulnerabilidad de MDaemon(CVE-2024-11182, ya parcheada) era de día cero, probablemente descubierta por Sednit, mientras que las de Horde, Roundcube y Zimbra ya eran conocidas y estaban parcheadas.

Sednit envía estos exploits XSS por correo electrónico. Los exploits conducen a la ejecución de código JavaScript malicioso en el contexto de la página web del cliente de correo electrónico que se ejecuta en una ventana del navegador. Por lo tanto, sólo los datos accesibles desde la cuenta de la víctima pueden ser leídos y exfiltrados.

Tenga en cuenta que, para que el exploit funcione, se debe convencer al objetivo de que abra el mensaje de correo electrónico en el portal de correo web vulnerable. Esto significa que el mensaje de correo electrónico debe eludir cualquier filtro de spam y la línea de asunto debe ser lo suficientemente convincente como para inducir al objetivo a leer el mensaje de correo electrónico.

La Figura 2 resume la cadena de compromiso utilizada en la Operación RoundPress.

Figure 2. Operation RoundPress compromise chain
Figura 2. Cadena de compromiso de la Operación RoundPress

Por lo general, el mensaje de correo electrónico parece benigno y contiene texto sobre acontecimientos noticiosos. Por ejemplo, el 11 de septiembre de 2024, un objetivo ucraniano recibió un correo electrónico de phishing de kyivinfo24@ukr[.]net con el asunto СБУ схопила банкіра, який працював на ворожу воєнну розвідку в Харкові (traducción automática: El SBU detuvo a un banquero que trabajaba para la inteligencia militar enemiga en Kharkiv). El cuerpo del mensaje -véase la figura 3- contiene extractos (en ucraniano) y enlaces a artículos del Kyiv Post, un conocido periódico de Ucrania. El código malicioso que desencadena la vulnerabilidad XSS está dentro del código HTML del cuerpo del mensaje de correo electrónico y no es directamente visible para el usuario.

Figure 3. Malicious email message sent by Sednit
Figura 3. Mensaje de correo electrónico malicioso enviado por Sednit

Otro ejemplo es un correo electrónico de office@terembg[.]com a un objetivo búlgaro el 8 de noviembre de 2024, con el asunto Путин се стреми Тръмп да приеме руските условия вдвустранните отношения (traducción automática: Putin busca que Trump acepte las condiciones rusas en las relaciones bilaterales). El cuerpo del mensaje -véase la figura 4- contiene de nuevo extractos (en búlgaro) y enlaces a artículos de News.bg, un periódico búlgaro legítimo.

Figure 4. Another malicious email sent by Sednit
Figura 4. Otro correo electrónico malicioso enviado por Sednit

Nótese que algunas de estas vulnerabilidades no son de interés exclusivo para este grupo: GreenCube (también conocido como UNC3707) y Winter Vivern también las han estado explotando.

Horda: Exploit desconocido

En el caso de los objetivos que utilizan el correo web de Horde, hemos visto que Sednit utiliza una vulnerabilidad antigua. No hemos podido encontrar la vulnerabilidad exacta, pero parece ser un fallo XSS que ya estaba solucionado en la primera versión de Xss. php publicada en GitHub, y en Horde Webmail 1.0, que se publicó en 2007.

El exploit utilizado por Sednit se muestra en Figura 5. Colocar código JavaScript malicioso en el atributo onerror de un elemento img es una técnica tomada directamente del libro de jugadas XSS: como el atributo src es x, un valor indefinido, se llama a onerror y el payload es decodificado en base64 y luego evaluado usando window.parent.eval.

Figure 5. Horde webmail exploit
Figura 5. Exploit de Horde webmail

En la versión 1.0 de Horde Webmail, el filtro XSS elimina los elementos de estilo y los atributos on*, como onerror. Por lo tanto, creemos que Sednit cometió un error e intentó utilizar un exploit que no funcionaba.

MDaemon: CVE-2024-11182

El 1 de noviembre de 2024, detectamos un mensaje de correo electrónico enviado a dos empresas de defensa estatales ucranianas y a una empresa de transporte aéreo civil ucraniana.

Este mensaje explotaba una vulnerabilidad XSS de día cero en MDaemon Email Server, en la representación de código HTML no fiable en los mensajes de correo electrónico. Informamos de la vulnerabilidad a los desarrolladores el 1 de noviembre de 2024 y fue parcheada en la versión 24.5.1, que se publicó el 14 de noviembre de 2024; entonces publicamos CVE-2024-11182 para ella.

El exploit utilizado por Sednit se muestra en la figura 6. Al igual que en el caso de Horde, se basa en un elemento img especialmente diseñado, pero utiliza un error en el analizador HTML de MDaemon en el que una etiqueta final noembed insertada dentro del atributo title de un elemento p engaña al analizador para que muestre la etiqueta img inmediatamente posterior.

Figure 6. Exploit for CVE-2024-11182 in MDaemon
Figura 6. Exploit para CVE-2024-11182 en MDaemon

Roundcube: CVE-2023-43770

Para los objetivos que utilizan el correo web Roundcube: en 2023, Sednit utilizó la vulnerabilidad XSS CVE-2020-35730, mientras que en 2024, cambió a CVE-2023-43770.

La vulnerabilidad más reciente fue parcheada el 14 de septiembre de 2023 en este commit de GitHub. La solución se encuentra en una expresión regular del script rcube_string_replacer.php. El exploit utilizado por Sednit es bastante simple y se muestra en la Figura 7.

Figure 7. Exploit for CVE-2023-43770 in Roundcube
Figura 7. Exploit para CVE-2023-43770 en Roundcube

En rcube_string_replacer.php, las URL se convierten en hipervínculos, y el texto del hipervínculo es el que se espera que aparezca entre el conjunto exterior de corchetes. El error radica en que el texto del hipervínculo no se desinfecta correctamente, permitiendo los caracteres < y >. Esto permite a un atacante proporcionar código JavaScript contenido entre <script> y </script>, que se añade directamente a la página cuando el correo electrónico se renderiza en Roundcube.

Zimbra: CVE-2024-27443 / ZBUG-3730

Para Zimbra, Sednit utiliza CVE-2024-27443 (también rastreado como ZBUG-3730). Fue parcheado el 1 de marzo de 2024 en este commit de GitHub, en el archivo ZmInviteMsgView.js. La vulnerabilidad radica en que no se sanea el atributo cif (calendar intended for), en una invitación de calendario enviada por correo electrónico.

El atributo cif se rellena a partir de la cabecera de correo X-Zimbra-Calendar-Intended-For. Antes del parche, el valor se añadía directamente a la página HTML de Zimbra sin desinfectar. Esto permitía la ejecución de código JavaScript malicioso en el contexto de la ventana del navegador de correo web.

El código exploit que encontramos en esta cabecera es el siguiente:

Zimbra Calendar<img/alt=''/src='Zimbra-Calendar'/onerror="window[(function(tmz){ghwa='cxe';return '\\x65'+decodeURI('%76')+'\\x61\x6c'})()](window[(function(jvqka){const kqd=decodeURI('%61')+'\t'+decodeURI('%6F')+'\\x62'; oykbg='doix'; return kqd})()](frames[0].document.getElementById('a-cashed-skinLayout2')['\inn\e\r\T\e\xt']))\">

El código formateado contenido en el atributo onerror es:

window['eval'](window[(function(jvqka){'atob'()](frames[0].document.getElementById('a-cashed-skinLayout2')['innerText']))

Básicamente, esto lee el texto contenido en un elemento div, identificado por ID a-cashed-skinLayout2, que está presente en el cuerpo de la invitación al calendario. Este elemento div utiliza el atributo style con el valor display:none para que no sea visible para el destinatario. El texto interior contiene código JavaScript codificado en base64 que se ejecuta mediante eval.

Persistencia

Los payloads JavaScript (SpyPress) cargadas por las vulnerabilidades XSS no tienen persistencia real, sino que se recargan cada vez que la víctima abre el correo electrónico malicioso.

Además, detectamos algunos payloads SpyPress.ROUNDCUBE que tienen la capacidad de crear reglas Sieve. SpyPress.ROUNDCUBE crea una regla que enviará una copia de cada correo electrónico entrante a una dirección de correo electrónico controlada por el atacante. Las reglas Sieve son una característica de Roundcube y, por lo tanto, la regla se ejecutará incluso si el script malicioso ya no se está ejecutando.

Acceso a credenciales

Todas los payloads de SpyPress tienen la capacidad de robar credenciales de correo web intentando engañar al navegador o al gestor de contraseñas para que rellene las credenciales de correo web en un formulario oculto. Además, algunas muestras también intentan engañar a la víctima cerrando la sesión de su cuenta de correo web y mostrando una página de inicio de sesión falsa.

Recopilación y exfiltración

La mayoría de los payloads de SpyPress recopilan mensajes de correo electrónico e información de contacto del buzón de la víctima. A continuación, los datos se extraen mediante una solicitud HTTP POST a un servidor de C&C codificado.

Conjunto de herramientas

En 2024, hemos observado que Sednit utiliza cuatro payloads en la operación RoundPress: SpyPress.HORDE, SpyPress.MDAEMON, SpyPress.ROUNDCUBE y SpyPress.ZIMBRA. Se inyectan en el contexto de correo web de las víctimas utilizando vulnerabilidades XSS, como se ha explicado anteriormente.

Los cuatro payloads tienen características comunes. Todos están ofuscados de forma similar, con nombres de variables y funciones sustituidos por cadenas de aspecto aleatorio (véase la Figura 8). Además, las cadenas utilizadas por el código, como las URL del correo web y del servidor de C&C, también están ofuscadas y contenidas en una lista cifrada. Cada una de esas cadenas sólo se descifra cuando se utiliza. Nótese que los nombres de las variables y las funciones son aleatorios para cada muestra, por lo que los payloads finales de SpyPress tendrán hashes diferentes.

Figure 8. Obfuscation of the JavaScript code
Figura 8. Ofuscación del código JavaScript

Otra característica común es que no existen mecanismos de persistencia o actualización.  El payload está totalmente contenido en el correo electrónico y sólo se ejecuta cuando el mensaje de correo electrónico se visualiza desde una instancia de correo web vulnerable.

Por último, todos los payloads se comunican con sus servidores de C&C hardcoded a través de peticiones HTTP POST. Hay un pequeño número de servidores de C&C que son compartidos por todas los payloads (no hay separación por víctima o tipo de payload).

SpyPress.HORDE

SpyPress.HORDE es el payload de JavaScript que se inyecta en las instancias vulnerables de correo web de Horde. Una vez desofuscado, y renombradas manualmente las funciones y variables, revela su principal funcionalidad: recopilar y exfiltrar credenciales de usuario.

Capacidades

Para robar credenciales, como se muestra en la Figura 9, SpyPress.HORDE crea dos elementos de entrada HTML: horde_user y horde_pass. Su anchura y opacidad se establecen en 0%, asegurando que no sean visibles para el usuario. El objetivo es engañar a los navegadores y gestores de contraseñas para que rellenen esos valores. Ten en cuenta que se crea una llamada de retorno para el evento de cambio en la entrada horde_pass. Esto llama a la función input_password_on_change tan pronto como el elemento de entrada pierde el foco después de cambiar su valor.

Figure 9. SpyPress.HORDE credential stealer
Figura 9. Robo de credenciales SpyPress.HORDE

A continuación, input_password_on_change exfiltra los datos llamando a C2_POST_Request, como puede verse en la Figura 10.

Protocolo de red

La URL del C&C está codificada en el script (ver Figura 10) y la filtración se realiza a través de una petición HTTPS POST.

El cuerpo de datos tiene un formato específico que se envía codificado en base64. Por ejemplo, bWVAdmljdGltLm9yZyA6OiBweAoKbXl1c2VybmFtZSBteXBhc3N3b3Jk se descodifica como:

me@victim.org :: px
 
minombredeusuario micontraseña

donde px probablemente significa exfiltración de contraseña.

Tenga en cuenta que la solicitud HTTP la realiza el navegador de la víctima, por lo que las cabeceras HTTP, como el User-Agent, variarán de una víctima a otra.

Figure 10. SpyPress.HORDE data exfiltration
Figura 10. Exfiltración de datos de SpyPress.HORDE

SpyPress.MDAEMON

SpyPress.MDAEMON es un payload de JavaScript que se inyecta en instancias vulnerables de correo web MDaemon. Una vez desofuscado, revela más funcionalidad que la implementada en SpyPress.HORDE:

  • robo de credenciales (muy similar a la implementación de SpyPress.HORDE),
  • exfiltración de contactos e historial de inicio de sesión,
  • exfiltración de mensajes de correo electrónico,
  • exfiltración del secreto de autenticación de dos factores, y
  • creación de una App Password, que permite a los atacantes acceder al buzón desde una aplicación de correo y eludir la protección 2FA.

Capacidades

Robo de credenciales

El stealer de credenciales de SpyPress.MDAEMON es casi idéntico al de SpyPress.HORDE (véase la Figura 11). La única diferencia es el nombre de los campos de entrada, que son Usuario y Contraseña, para coincidir con los nombres oficiales utilizados en el software MDaemon.

Figure 11. SpyPress.MDAEMON credential stealer
Figura 11. SpyPress.MDAEMON stealer de credenciales
Contactos e historial de acceso

SpyPress.MDAEMON obtiene el historial de inicio de sesión de la víctima de https://<webmail_URL>/WorldClient.dll?Session=<session_ID>&View=Options-Authentication&GetLoginHistory=Yes, y exfiltra el contenido al servidor de C&C codificado. Utiliza la misma función utilizada en la parte del stealer de credenciales para enviar una petición HTTP POST al servidor de C&C, pero en lugar de px, utiliza ab como tipo de mensaje.

A continuación, como se muestra en la Figura 12, el script obtiene la lista de contactos de la víctima de https://<webmail_URL>/WorldClient.dll?Session=<session_ID>&View=Contacts. Esta lista y las direcciones de correo electrónico asociadas (en la propiedad JavaScript eml ) se filtran al servidor de C&C.

Figure 12. Exfiltration of login history and contacts
Figura 12. Exfiltración del historial de inicio de sesión y contactos
Exfiltración de mensajes de correo electrónico

SpyPress.MDAEMON explora las carpetas del buzón de correo de la víctima, como se muestra en la Figura 13, y filtra una lista codificada de carpetas que no interesan a los atacantes: calendario, notas, documentos, contactos, tareas, remitentes permitidos y remitentes bloqueados.

Figure 13. SpyPress.MDAEMON browses the victim’s mailbox folders
Figura 13. SpyPress.MDAEMON explora las carpetas del buzón de correo de la víctima

Luego, para cada carpeta, como se muestra en la Figura 14, SpyPress.MDAEMON itera sobre las páginas y luego sobre todos los mensajes en cada página, antes de exfiltrar cada correo electrónico al servidor de C&C.

Para obtener una lista de mensajes de correo electrónico en una página de carpeta determinada, SpyPress.MDAEMON busca https://<webmail_URL>/WorldClient.dll?Session=<session_ID>&View=List&ReturnJavaScript=1&FolderID=<folder_ID>&Sort=RevDate&Page=<page>&UTF8=1. A continuación, itera sobre esta lista de mensajes de correo electrónico y, después, sobre todos los mensajes de cada página, antes de filtrar cada mensaje al servidor de C&C.

A continuación, itera sobre esta lista y obtiene https://<webmail_URL>/WorldClient.dll?Session=<session_ID>& View=Message&Source=Yes&Number=<email_ID>&FolderId=<folder_ID> para obtener el origen de cada correo electrónico.

Por último, la fuente del correo electrónico se filtra mediante una solicitud HTTP POST al servidor de C&C, utilizando el tipo de mensaje mail-<folder_name>-<email_ID>. Se realiza una solicitud HTTP POST por cada correo electrónico filtrado, por lo que se generará una gran cantidad de tráfico de red.

Nótese que el script mantiene una lista de correos electrónicos exfiltrados, evitando así la exfiltración varias veces.

Figure 14. SpyPress.MDAEMON exfiltrates all emails
Figura 14. SpyPress.MDAEMON exfiltra todos los correos electrónicos

Observe también que el ofuscador parece haber introducido errores en el script. En la función download_all_messages_from_folder, is_folder_limit es un nombre de variable real que se dejó sin ofuscar. Sin embargo, no se utiliza en ninguna parte del código.

Secreto de autenticación de dos factores

SpyPress.MDAEMON extrae el secreto de autenticación de dos factores de la víctima (véase la figura 15). Primero obtiene https://<webmail_URL>/WorldClient.dll?Session=<session_ID>&View=Options-Authentication&TwoFactorAuth=Yes&GetSecret=Yes para obtener el secreto y, a continuación, lo envía al servidor de C&C utilizando el tipo de mensaje 2fa.

Para ver el secreto, se requiere la contraseña, que SpyPress.MDAEMON obtiene del formulario de inicio de sesión falso que ha creado. Este secreto es equivalente al código QR mencionado en la documentación de MDaemon y puede ser utilizado para registrar la cuenta en una app de autenticación, para luego generar un código 2FA válido para la cuenta de la víctima. Como SpyPress.MDAEMON adquiere la contraseña y el secreto 2FA, los atacantes podrán acceder directamente a la cuenta.

Figure 15. SpyPress.MDAEMON exfiltrates the 2FA secret
Figura 15. SpyPress.MDAEMON exfiltra el secreto 2FA
App Creación de contraseñas

Además de robar el secreto 2FA, SpyPress.MDAEMON crea una App Password (ver la documentación). Esta contraseña puede ser utilizada en un cliente de correo electrónico para enviar y recibir mensajes, sin tener que introducir el código 2FA, incluso si 2FA está activado para la cuenta. Tenga en cuenta que MDaemon webmail no parece requerir un código 2FA para generar una nueva contraseña de aplicación.

Como se muestra en la Figura 16, SpyPress.MDAEMON busca https://<webmail_URL>/WorldClient.dll?Session=<session_ID>&View=Options-Authentication&CreateAppPassword=1s para crear una nueva contraseña de aplicación. La respuesta es esta contraseña, que se exfiltra al servidor C&C con el tipo de mensaje create-app.

En otras palabras, esta contraseña de aplicación permite a los atacantes añadir la cuenta de correo electrónico directamente a su propio cliente de correo electrónico. De este modo, pueden mantener el acceso al buzón incluso si se cambia la contraseña principal de la cuenta de la víctima o si se cambia el código 2FA.

Figure 16. SpyPress.MDAEMON creates an application password
Figura 16. SpyPress.MDAEMON crea una contraseña de aplicación

Protocolo de red

SpyPress.MDAEMON utiliza el mismo protocolo de red que SpyPress.HORDE.

SpyPress.ROUNDCUBE

SpyPress.ROUNDCUBE es el payload de JavaScript que se inyecta en las instancias vulnerables de correo web Roundcube. Una vez desofuscado, revela funcionalidades similares a las implementadas en SpyPress.MDAEMON:

  • robo de credenciales,
  • exfiltración de la libreta de direcciones y de la página "Acerca de",
  • exfiltración de correos electrónicos, y
  • reglas Sieve maliciosas.

Capacidades

Robo de credenciales

El stealer de credenciales de SpyPress.ROUNDCUBE tiene dos características. La primera es casi idéntica al stealer de credenciales de SpyPress.HORDE y SpyPress.MDAEMON. La única diferencia es el nombre de los campos de entrada, que son _user y _pass, para coincidir con los nombres oficiales utilizados en el software Roundcube.

La segunda característica es ligeramente más intrusiva. SpyPress.ROUNDCUBE crea un iframe, como se muestra en la Figura 17, con el atributo src establecido en https://<webmail_URL>/?_task=logout&_token=<CSRF_token>. Esto cierra la sesión de la víctima, obligándola a volver a introducir sus credenciales. SpyPress.ROUNDCUBE añade una llamada de retorno en el botón de envío del formulario de inicio de sesión real. Por último, las credenciales se filtran al servidor de C&C codificado utilizando el tipo de mensaje pax-fish.

Figure 17. SpyPress.ROUNDCUBE creates an iframe to log out the victim
Figura 17. SpyPress.ROUNDCUBE crea un iframe para cerrar la sesión de la víctima

Observe que el token CSRF se recupera de la variable rcmail.env.request_token. La variable global rcmail es gestionada y rellenada por la instancia Roundcube, y accesible en el contexto JavaScript en el que se ejecuta SpyPress.ROUNDCUBE.

Exfiltración de la libreta de direcciones y de la página Acerca de

SpyPress.ROUNDCUBE obtiene la libreta de direcciones en
https://<webmail_URL>/?_task=addressbook&_source=0&_action=export&&_token=<CSRF_token> y envía el resultado sin procesar al servidor de C&C.

Del mismo modo, SpyPress.ROUNDCUBE recupera la página about en https://<webmail_URL>/?_task=settings&_framed=1&_action=about y envía la salida sin procesar al servidor de C&C.

Esa página contiene información sobre la versión de Roundcube y los plugins instalados, como se muestra en la Figura 18.

Figure 18. Example of Roundcube about page
Figura 18. Ejemplo de página Roundcube about
Exfiltración de mensajes de correo electrónico

SpyPress.ROUNDCUBE inicia la rutina de exfiltración de correo electrónico cada 7.200 segundos (dos horas).

En primer lugar, obtiene la lista de buzones de correo de la variable global rcmail.env.mailboxes. Luego, itera sobre todos esos buzones; para cada uno de ellos, itera sobre las páginas para obtener los IDs de los mensajes de correo electrónico buscando https://<webmail_URL>/?_task=mail&_action=list&_mbox=<mailbox_name>&_refresh=1&_remote=1&_page=<current_page>. Observe que SpyPress.ROUNDCUBE añade la cabecera HTTP X-Roundcube-Request, que contiene el token CSRF.

Observe también que hay una hora límite inferior codificada en el script, 6:02:03 am, 1 de octubre de 2024 en la muestra de script específica que analizamos, y sólo se filtran los mensajes de correo electrónico más recientes.

El origen de cada mensaje de correo electrónico se obtiene de
https://<webmail_URL>/?_task=mail&_mbox=<mailbox>&_uid=<email_ID>&_action=viewsource y luego se filtra al servidor de C&C.

Tenga en cuenta que si SpyPress.ROUNDCUBE ha filtrado más de 150 correos electrónicos seguidos, detiene la filtración hasta la siguiente ejecución de la rutina de filtración de correos electrónicos (dos horas después). Esto se hace probablemente para limitar el ruido en la red de la víctima y evitar la detección.

Reglas maliciosas de Sieve

En algunas muestras de SpyPress.ROUNDCUBE, hay una funcionalidad adicional relacionada con las reglas Sieve - ver Figura 19. SpyPress.ROUNDCUBE crea una regla que envía una copia de cada mensaje de correo electrónico entrante a una dirección de correo electrónico controlada por el atacante(srezoska@skiff[.]com en este caso). Skiff era un servicio de correo electrónico orientado a la privacidad que proporcionaba cifrado de extremo a extremo.

Figure 19. SpyPress.ROUNDCUBE creates a malicious Sieve rule
Figura 19. SpyPress.ROUNDCUBE crea una regla Sieve maliciosa

Protocolo de red

SpyPress.ROUNDCUBE utiliza el mismo protocolo de red que SpyPress.HORDE.

SpyPress.ZIMBRA

SpyPress.ZIMBRA es el payload de JavaScript que se inyecta en las instancias vulnerables de correo web de Zimbra. Una vez desofuscado, revela funcionalidades similares a las de los payloads anteriores:

  • robo de credenciales,
  • exfiltración de contactos y configuraciones, y
  • exfiltración de mensajes de correo electrónico.

Funcionalidades

Robo de credenciales

El stealer de credenciales de SpyPress.ZIMBRA es casi idéntico a los de SpyPress.HORDE y SpyPress.MDAEMON. La única diferencia es el nombre de los campos de entrada, que son nombre de usuario y contraseña, para que coincidan con los nombres oficiales utilizados en el software Zimbra.

Exfiltración de contactos y configuraciones

SpyPress.ZIMBRA obtiene la lista de contactos de la víctima realizando una petición SOAP al punto final de la API de Zimbra https://<webmail_URL>/service/soap/SearchRequest. Como se muestra en la Figura 20, la consulta de búsqueda está contenida en un diccionario que se envía al servidor Zimbra en el cuerpo de una petición POST. Finalmente, SpyPress.ZIMBRA exfiltra la salida sin procesar al servidor de C&C.

Figure 20. SpyPress.ZIMBRA gets the victim’s contact list
Figura 20. SpyPress.ZIMBRA obtiene la lista de contactos de la víctima

SpyPress.ZIMBRA también filtra al servidor de C&C el contenido de la variable global ZmSetting, que contiene varios valores de configuración y preferencias. Esto es similar a SpyPress.ROUNDCUBE, que exfiltra la página about.

Exfiltración de correo electrónico

Cada 14.400 segundos (cuatro horas), utilizando la función setInterval, este payload inicia su rutina de exfiltración de correo electrónico.

Al igual que con los payloads anteriores, SpyPress.ZIMBRA primero enumera las carpetas y luego itera sobre los primeros 80 correos electrónicos de cada carpeta a través de una solicitud SOAP a https://<webmail_URL>/service/soap/SearchRequest. Para cada mensaje, la secuencia de comandos obtiene la fuente en https://<webmail_URL>/service/home/~/?auth=co&view=text&id=<email_ID> y, a continuación, extrae la fuente del mensaje de correo electrónico (véase la figura 21).

Figure 21.SpyPress.ZIMBRA exfiltrates email messages
Figura 21. SpyPress.ZIMBRA filtra mensajes de correo electrónico

Protocolo de red

SpyPress.ZIMBRA utiliza el mismo protocolo de red que SpyPress.HORDE.

Conclusión

En los últimos dos años, los servidores de correo web como Roundcube y Zimbra han sido uno de los principales objetivos de varios grupos de espionaje como Sednit, GreenCube y Winter Vivern. Dado que muchas organizaciones no mantienen actualizados sus servidores de correo web y que las vulnerabilidades pueden activarse de forma remota mediante el envío de un mensaje de correo electrónico, resulta muy cómodo para los atacantes apuntar a dichos servidores para el robo de correo electrónico.

Para cualquier consulta sobre nuestra investigación publicada en WeLiveSecurity, póngase en contacto con nosotros en threatintel@eset.com.
ESET Research ofrece informes privados de inteligencia APT y fuentes de datos. Para cualquier consulta sobre este servicio, visite la página de ESET Threat Intelligence.

IoCs

Puede encontrar una lista completa de indicadores de compromiso (IoCs) y muestras en nuestro repositorio GitHub.

Archivos

SHA-1 Filename Detection Description
41FE2EFB38E0C7DD10E6009A68BD26687D6DBF4C N/A JS/Agent.RSO SpyPress.ZIMBRA.
60D592765B0F4E08078D42B2F3DE4F5767F88773 N/A JS/Exploit.Agent.NSH XSS exploit for CVE-2023-43770.
1078C587FE2B246D618AF74D157F941078477579 N/A JS/Exploit.Agent.NSH SpyPress.ROUNDCUBE.
8EBBBC9EB54E216EFFB437A28B9F2C7C9DA3A0FA N/A HTML/Phishing.Agent.GNZ XSS exploit for CVE-2024-11182.
F95F26F1C097D4CA38304ECC692DBAC7424A5E8D N/A HTML/Phishing.Agent.GNZ SpyPress.MDAEMON.
2664593E2F5DCFDA9AAA1A2DF7C4CE7EEB1EDBB6 N/A JS/Agent.SJU Probable XSS exploit for Horde.
B6C340549700470C651031865C2772D3A4C81310 N/A JS/Agent.SJU SpyPress.HORDE.
65A8D221B9ECED76B9C17A3E1992DF9B085CECD7 N/A HTML/Phishing.Gen SpyPress.ROUNDCUBE.
6EF845938F064DE39F4BF6450119A0CDBB61378C N/A N/A Email exploiting CVE-2023-43770, found on VirusTotal.
8E6C07F38EF920B5154FD081BA252B9295E8184D N/A JS/Agent.RSP SpyPress.ROUNDCUBE.
AD3C590D1C0963D62702445E8108DB025EEBEC70 N/A JS/Agent.RSN SpyPress.ZIMBRA.
EBF794E421BE60C9532091EB432C1977517D1BE5 N/A JS/Agent.RTD SpyPress.ROUNDCUBE.
F81DE9584F0BF3E55C6CF1B465F00B2671DAA230 N/A JS/Agent.RWO SpyPress.ROUNDCUBE.
A5948E1E45D50A8DB063D7DFA5B6F6E249F61652 N/A JS/Exploit.Agent.NSG XSS exploit for CVE-2023-43770.

Red

IP Domain Hosting provider First seen Details
185.225.69[.]223 sqj[.]fr 23VNet Kft. 2024‑06‑01 SpyPress C&C server.
193.29.104[.]152 tgh24[.]xyz
tuo[.]world
GLOBALAXS NOC PARIS 2024‑06‑04 SpyPress C&C server.
45.137.222[.]24 lsjb[.]digital Belcloud Administration 2024‑07‑03 SpyPress C&C server.
91.237.124[.]164 jiaw[.]shop HOSTGNOME LTD 2023‑09‑28 SpyPress C&C server.
185.195.237[.]106 hfuu[.]de Network engineer 2024‑06‑03 SpyPress C&C server.
91.237.124[.]153 raxia[.]top Damien Cutler 2024‑06‑03 SpyPress C&C server.
146.70.125[.]79 rnl[.]world GLOBALAXS NOC PARIS 2024‑06‑07 SpyPress C&C server.
89.44.9[.]74 hijx[.]xyz M247 Europe SRL 2024‑07‑05 SpyPress C&C server.
111.90.151[.]167 ikses[.]net Shinjiru Technology Sdn Bhd 2024‑12‑01 SpyPress C&C server.

Técnicas ATT&CK de MITRE

Esta tabla se ha elaborado utilizando la versión 17 del marco MITRE ATT&CK.

Tactic ID Name Description
Resource Development T1583.001 Acquire Infrastructure: Domains Sednit bought domains at various registrars.
T1583.004 Acquire Infrastructure: Server Sednit rented servers at M247 and other hosting providers.
T1587.004 Develop Capabilities: Exploits Sednit developed (or acquired) XSS exploits for Roundcube, Zimbra, Horde, and MDaemon.
T1587.001 Develop Capabilities: Malware Sednit developed JavaScript stealers (SpyPress.HORDE, SpyPress.MDAEMON, SpyPress.ROUNDCUBE, and SpyPress.ZIMBRA) to steal data from webmail servers.
Initial Access T1190 Exploit Public-Facing Application Sednit exploited known and zero-day vulnerabilities in webmail software to execute JavaScript code in the context of the victim’s webmail window.
Execution T1203 Exploitation for Client Execution SpyPress payloads are executed when a victim opens the malicious email in a vulnerable webmail client page.
Defense Evasion T1027 Obfuscated Files or Information SpyPress payloads are obfuscated with an unknown JavaScript obfuscator.
Credential Access T1187 Forced Authentication SpyPress payloads can log out users to entice them into entering their credentials in a fake login form.
T1556.006 Modify Authentication Process: Multi-Factor Authentication SpyPress.MDAEMON can steal the 2FA token and create an application password.
Discovery T1087.003 Account Discovery: Email Account SpyPress payloads get information about the email account, such as the contact list.
Collection T1056.003 Input Capture: Web Portal Capture SpyPress payloads try to steal webmail credentials by creating a hidden login form, to trick the browser and password managers into filling the credentials.
T1119 Automated Collection SpyPress payloads automatically collect credentials and email messages.
T1114.002 Email Collection: Remote Email Collection SpyPress payloads collect and exfiltrate emails, from the victim’s mailbox.
T1114.003 Email Collection: Email Forwarding Rule SpyPress.MDAEMON adds a Sieve rule to forward any incoming email to an attacker-controlled email address.
Command and Control T1071.001 Application Layer Protocol: Web Protocols C&C communication is done via HTTPS.
T1071.003 Application Layer Protocol: Mail Protocols In case of email forwarding rules, the exfiltration is done via email.
T1132.001 Data Encoding: Standard Encoding Data is base64 encoded before being sent to the C&C server.
Exfiltration T1020 Automated Exfiltration SpyPress payloads automatically exfiltrate credentials and email messages to the C&C server.
T1041 Exfiltration Over C2 Channel SpyPress payloads exfiltrate data over the C&C channel.