Introducción
En un reciente caso de respuesta a incidentes, descubrimos una nueva y notable familia de ransomware que los atacantes han estado usando de forma activa y a la que bautizamos “Ymir”. Este artefacto tiene funciones interesantes, que incluyen un gran conjunto de operaciones que se realizan en memoria con la ayuda de las llamadas a funciones malloc, memmove y memcmp.
En el caso que analizamos, el atacante logró obtener acceso al sistema a través de comandos de control remoto de PowerShell. Después, instaló varios instrumentos para llevar a cabo acciones maliciosas, como Process Hacker y Advanced IP Scanner. Y como paso final, después de debilitar la seguridad del sistema, el adversario ejecutó Ymir para alcanzar sus objetivos.
En esta publicación, proporcionamos un análisis detallado del ransomware Ymir, así como las tácticas, técnicas y procedimientos (TTP) que los atacantes emplean.
Análisis
Análisis estático
Nuestro análisis comenzó con una inspección básica del artefacto. Comenzamos analizando sus propiedades, como el tipo de archivo, y cadenas y capacidades pertinentes, como se muestra en la tabla e imágenes a continuación.
Hash | Valor |
MD5 | 12acbb05741a218a1c83eaa1cfc2401f |
SHA-1 | 3648359ebae8ce7cacae1e631103659f5a8c630e |
SHA-256 | cb88edd192d49db12f444f764c3bdc287703666167a4ca8d533d51f86ba428d8 |
MD5 | 12acbb05741a218a1c83eaa1cfc2401f |
SHA-1 | 3648359ebae8ce7cacae1e631103659f5a8c630e |
SHA-256 | cb88edd192d49db12f444f764c3bdc287703666167a4ca8d533d51f86ba428d8 |
Aunque el binario no levanta sospechas de estar empaquetado, ya que su entropía no es lo suficientemente alta, la presencia de llamadas API a funciones como malloc, memmove y memcmp indica que puede asignar memoria para ejecutar funciones maliciosas.
El binario también es sospechoso porque importa funciones, como CryptAcquireContextA, CryptReleaseContext, CryptGenRandom, TerminateProcess y WinExec, de las bibliotecas del sistema operativo. Estas llamadas a la API suelen encontrarse en diversas muestras de ransomware.
Aunque la mayoría de la información de la muestra se desempaqueta en la memoria durante el tiempo de ejecución, pudimos encontrar algunos indicadores útiles en las cadenas binarias, entre ellas el nombre del archivo de la nota de rescate y contenidos en un archivo PDF, la extensión de cifrado, comandos de PowerShell, y algunas claves utilizadas por los algoritmos de cifrado, como se muestra en las siguientes imágenes.
El atacante utilizó el compilador MinGW, una versión nativa de Windows del Conjunto de Compiladores GNU (GCC, GNU Compiler Collection).
La siguiente tabla muestra otros indicadores de cadena útiles que encontramos en el curso de nuestro análisis.
Tipo | Valor | Descripción |
Cadena (comando) | powershell -w h -c Start-Sleep -Seconds 5; Remove-Item -Force -Path | Ejecución del comando de autoeliminación a través de PowerShell. |
Cadena (URL) | hxxps://github[.]com/qTox/qTox/releases/download/v1.17.6/setup-qtox-x86_64-release.exe | Presente en el PDF y el software (cliente qTox) para contactar a los atacantes. |
Cadena | 6C5oy2dVr6 | Extensión de cifrado. |
Cadena (nombre del archivo) | INCIDENT_REPORT.pdf | Nombre del archivo PDF que contenía la nota de rescate. Los PDF se colocaban en varios directorios. |
Cadena (fecha) | D:20240831154833-06’00’ | Fecha de creación de los metadatos del PDF. |
Cadena | x64dbg | Nombre del depurador. |
Un hecho interesante es que la fecha de creación del PDF fue el 31 de agosto de 2024, que coincide con la fecha de compilación binaria (2024-08-31), como se muestra en la imagen a continuación.
El análisis estático también muestra que el PDF utilizado como nota de rescate está presente en la sección .data del binario. La información codificada en este tipo de archivo es muy útil para crear reglas de detección e indicadores de compromiso.
Después de llegar a la función principal, el malware ejecuta otra función con llamadas a otras funciones para obtener información del sistema. Para agilizar nuestro análisis, cambiamos el nombre de esta función a Get_System_Information:
El malware también contiene algunas restricciones de ejecución que se activan cuando están establecidos ciertos parámetros. Por ejemplo, el parámetro --path desactiva la autoeliminación, permitiendo al atacante reutilizar el binario para otros directorios.
Mientras realizábamos la ingeniería inversa de la muestra, descubrimos que tomaba código de funciones relacionadas con CryptoPP, una biblioteca criptográfica de código abierto escrita en C++.
El malware también tiene una lista explícita inmodificable de extensiones de nombre de archivo que se deben excluir del cifrado.
Extensiones de nombre de archivo que se deben ignorar
Análisis dinámico
Al ejecutar el ransomware, detectamos cientos de llamadas a la función memmove. Después de analizar los datos, encontramos que cargaba pequeñas piezas de instrucciones en la memoria para realizar funciones maliciosas. La siguiente imagen muestra un fragmento del malware cargando variables de entorno después de hacer una llamada a memmove.
El malware utiliza constantemente la función memmove al enumerar subdirectorios y archivos dentro del sistema afectado, para poder cifrarlos más adelante.
También utiliza memmove para cargar cadenas que contienen ubicaciones en el sistema de archivos de la víctima y que usa para comparar con nombres de directorios comunes durante la ejecución.
Durante la ejecución del malware se cargan algunas bibliotecas adicionales, como CRYPTSP.dll, rsaenh.dll, bcrypt.dll y kernelbase.dll.
El artefacto utiliza el algoritmo de cifrado de flujo ChaCha20 para cifrar archivos, que agrega la extensión .6C5oy2dVr6 a cada archivo cifrado.
Además, copia el contenido del PDF de la sección .data y utiliza las funciones _write y _fsopen para generar una nota de rescate en formato PDF dentro de cada directorio en el sistema afectado.
La nota de rescate informa a la víctima sobre lo que sucedió con el sistema afectado e instruye contactar a los atacantes para negociar un acuerdo. Aunque la nota menciona que los atacantes robaron los datos de la máquina afectada, el malware no tiene ninguna capacidad de red para la exfiltración de datos. Esto nos lleva a creer que los adversarios robarían datos con otros medios una vez que lograran el acceso a la computadora, como a través de HTTP, FTP o cargándoos a almacenamiento en la nube.
Detectamos una cadena extraña, un comentario escrito en el idioma Lingala. Este idioma se utiliza en la República Democrática del Congo, la República del Congo, Angola y la República Centroafricana.
Otro hecho interesante es que la muestra busca PowerShell en cada subdirectorio. Una vez que encuentra PowerShell, el malware lo utiliza para autoeliminarse. En nuestra investigación, copiamos powershell.exe en nuestra carpeta de Escritorio, así que se lo utilizó para eliminar la muestra.
El siguiente diagrama muestra un resumen de la ejecución de la muestra. Hay que tener en cuenta que el único proceso secundario creado fue powershell.exe, ya que el malware crea una instancia de PowerShell incluso si encuentra una en el sistema. Más adelante, PowerShell llama a conhost.exe, que se utiliza para ejecutar servicios en segundo plano.
El malware llama a PowerShell con el cmdlet Start-Sleep para que espere 5 segundos, y finalmente, utiliza el comando Remove-Item para autoeliminarse de la máquina, como se muestra en la imagen a continuación.
Regla YARA
A partir de nuestro análisis de la muestra, desarrollamos la siguiente regla YARA para detectar la amenaza en tiempo real. La regla toma en cuenta el tipo de archivo, las cadenas pertinentes y las importaciones de funciones de la biblioteca.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
importar "pe" rule Ymir { meta: author = "Kaspersky - GERT" description = "Yara rule for detecting the Ymir ransomware." target_entity = "file" strings: $s1 = "powershell -w h -c Start-Sleep -Seconds 5; Remove-Item -Force -Path" wide ascii nocase $s2 = "setup-qtox-x86_64-release.exe" wide ascii nocase $s3 = "6C5oy2dVr6" wide ascii nocase $s4 = "INCIDENT_REPORT.pdf" wide ascii nocase $s5 = "D:20240831154833-06" wide ascii nocase $s6 = "ChaCha" wide ascii nocase $s7 = "x64dbg" wide ascii nocase condition: (3 of ($s*)) and pe.imports("msvcrt.dll", "memmove") } |
Telemetría
Usando la regla anterior, pudimos consultar los portales de inteligencia de amenazas y encontrar una muestra similar originada en Pakistán. Creemos que el atacante utilizó una red VPN o Tor para ocultar su IP. El artefacto que descubrimos parece ser un binario de prueba enviado por el atacante para verificar si sería detectado por los proveedores de seguridad. La muestra recibe un parámetro --path desde la línea de comandos, que le indica qué directorio cifrar. Sin embargo, ni cifra los archivos ni genera una nota de rescate.
Lo que nos llamó la atención fue que esta versión de prueba del ejecutable, al igual que la versión completa, no se eliminaba tras ejecutarse con el parámetro --path. Esto resultaba lógico, ya que el atacante podría elegir ciertos directorios durante el ataque.
Al comparar ambas detecciones, concluimos que la muestra final, con las funciones de cifrado totalmente activadas, a diferencia de la variante de prueba, incorporaba capacidades ampliadas mediante cadenas adicionales. Entre ellas, la extensión adjunta al nombre de los archivos encriptados ( .6C5oy2dVr6) y la información presente en el archivo PDF generado como nota de rescate.
Al momento de nuestra investigación, 12 proveedores de seguridad, incluyendo Kaspersky, ya habían detectado la amenaza.
El incidente de ransomware
Además de analizar el malware, logramos investigar un incidente en Colombia, país donde se obtuvo la muestra de Ymir. Nuestro análisis forense reveló que se había perdido evidencia crucial debido a los esfuerzos del atacante para cubrir sus huellas. En Kaspersky GERT pudimos identificar que dos días antes de la implementación del ransomware, se detectó una nueva amenaza de RustyStealer en múltiples sistemas, que permitía a los atacantes controlar las máquinas, enviar comandos y recopilar información de la infraestructura afectada. Poco después se detectó actividad maliciosa en un controlador de dominio, que incluía el acceso en nombre de usuarios legítimos, entre ellos uno con altos privilegios. La muestra inicial de RustyStealer era un archivo PE compilado con Rust y desplegado en Windows\Temp bajo el nombre AudioDriver2.0.exe.
Nombre del archivo | AudioDriver2.0.exe |
Tamaño | 3334144 bytes (3.2 MB) |
MD5 | 5ee1befc69d120976a60a97d3254e9eb |
SHA-1 | e6c4d3e360a705e272ae0b505e58e3d928fb1387 |
Esta muestra, que Kaspersky denominó Trojan.Win32.Sheller.ey, tiene la capacidad de recopilar información sobre el sistema de archivos. Esta muestra tiene contenido ofuscado para obstruir el análisis e incluye módulos compartidos que indican que el artefacto puede invocar funciones de APIs, como las DLL nativas de Windows.
Esta muestra también se conecta al servidor C2 74.50.84[.]181 en el puerto 443, que Kaspersky detectó como un anfitrión para archivos maliciosos desde agosto de 2024.
Los atacantes comprometieron el controlador de dominio y lo utilizaron para continuar infiltrándose en los sistemas de la infraestructura objetivo. Abusaron de las credenciales comprometidas recopiladas por el ladrón para saltar entre sistemas utilizando las capacidades de control remoto de WinRM y PowerShell, y luego ejecutaron un conjunto de dos scripts que se confirmó que eran parte de la amenaza de malware proxy SystemBC.
Nombre del archivo | 1.ps1 | 1.ps1 |
Tamaño | 16239 bytes (15 KiB) | 4209 bytes (4 KiB) |
MD5 | 5384d704fadf229d08eab696404cbba6 | 39df773139f505657d11749804953be5 |
Ruta | %windir%\temp\ | HKCU\Software\Microsoft\Windows\CurrentVersion\Run |
Ambos scripts utilizan PowerShell para establecer un canal encubierto a la dirección IP 94.158.244[.]69 en el puerto 443. Basándonos en las cadenas de los scripts que pudimos obtener, implementamos reglas de Yara para identificar otras muestras y servidores C2 configurados con la misma codificación y detectados fuera de condiciones de laboratorio.
SHA256 | Visto por primera vez | Reportado por primera vez desde | Servidor C2 | Veredicto |
8287d54c83db03b8adcdf1409f5d1c9abb1693ac 8d000b5ae75b3a296cb3061c |
2024-09-16 03:24:06 UTC | Australia | 94.158.244[.]69 | |
51ffc0b7358b7611492ef458fdf9b97f121e49e70f 86a6b53b93ed923b707a03 |
2024-08-18 18:59:01 UTC | Ucrania | 85.239.61[.]60 | UDS:Trojan.PowerShell. Dnoper.posh |
b087e1309f3eab6302d7503079af1ad6af06d70a9 32f7a6ae1421b942048e28a |
2024-08-17 02:43:55 UTC | Ucrania | 85.239.61[.]60 | Trojan.MSIL.Dnoper.sb |
Uno de estos scripts fue detectado en múltiples sistemas, recopilado como un bloque de script para PowerShell que incluía un enfoque diferente y un sistema C2 diferente (5.255.117[.]134 en el puerto 80). Probablemente se lo utilizó para exfiltrar información de la infraestructura de acuerdo con las siguientes funciones explicitas y sus instrucciones.
- GetServerByFilename,
- SendFile,
- SearchRoot.
El script establece comunicación con el servidor C2 y envía información, incluyendo una clave específica que permite al atacante identificar a la empresa afectada.
La función SearchRoot contiene un bucle que busca todos los archivos que están incluidos en la carpeta solicitada y aplica un filtro específico: el malware sólo sube archivos con un tamaño mayor a 40 KB que fueron creados después de una fecha especificada.
El script está codificado en Base64 y se lo pasa al siguiente comando para su ejecución.
1 |
$selfpath\powershell.exe -Version 5.1 -s -NoLogo -NoProfile -EncodedCommand <B64CMD> |
De acuerdo con nuestro análisis GERT, en el momento de la investigación, había un servicio configurado en esta dirección IP (5.255.117[.]134) para subir los archivos recopilados por los scripts de SystemBC.
Al mismo tiempo, se alertó sobre múltiples creaciones y ejecuciones de los conocidos programas Advanced IP Scanner y Process Hacker en varios sistemas.
- advanced_ip_scanner.exe
- processhacker-2.39-configuracion.exe
Finalmente, dos días después de la intrusión inicial de RustyStealer, los atacantes desplegaron el ransomware Ymir ejecutando conexiones remotas y subiendo la carga útil. Se detectaron algunos rastros de la ejecución, en particular aquellos asociados con el script de autodestrucción de PowerShell. Además, una parte de la nota de rescate estaba configurada en el campo de la clave del registro legalnoticecaption, ubicado en HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System, que invita al usuario a buscar detalles adicionales en la nota de rescate, llamada “INCIDENT_REPORT.pdf”:
Conclusión
Existe un vínculo evidente entre los botnets de malware que actúan como intermediarios de acceso y la ejecución de ransomware. El desarrollo de Ymir representa una amenaza para todo tipo de empresas y confirma la existencia de grupos emergentes que pueden impactar a los negocios y organizaciones con un malware configurable, potente y bien desarrollado. Hemos visto que los intermediarios de acceso inicial invadían una organización y aseguraban la persistencia del malware. Poco después, Ymir se desplegaba en el sistema objetivo. Esta nueva familia de ransomware estaba configurada en un esquema protegido, que hace imposible descifrar los archivos del sistema objetivo. El grupo detrás de esta amenaza aún no ha presentado un sitio dedicado a filtraciones ni ninguna información adicional, pero continuaremos monitoreando sus actividades. Se activaron alertas dos días antes del incidente de ransomware, y la falta de acción ante las advertencias críticas del sistema permitió a los atacantes lanzar el ransomware. Esto subraya la importancia de contar con estrategias de respuesta más robustas, que vayan más allá de las plataformas de protección en los puntos finales (EPP).
Los productos de Kaspersky detectan esta nueva amenaza como Trojan-Ransom.Win64.Ymir.gen.
Tácticas, técnicas y procedimientos
En la siguiente tabla se detallan los TTPs de Ymir identificados a partir de nuestro análisis de malware.
Táctica | Técnica | Id. |
Discovery | File and Directory Discovery | T1083 |
Discovery | System Information Discovery | T1082 |
Execution | Command and Scripting Interpreter: PowerShell | T1059.001 |
Impact | Data Encrypted for Impact | T1486 |
Defense evasion | Virtualization/Sandbox Evasion: Time Based Evasion | T1497.003 |
Defense evasion | Indicator Removal: File Deletion | T1070.004 |
TTP de RustyStealer:
Táctica | Técnica | Id. |
Discovery | File and Directory Discovery | T1083 |
Discovery | Process Discovery | T1057 |
Execution | Shared Modules | T1129 |
Defense evasion | Obfuscated Files or Information | T1027 |
Indicadores de compromiso
File Hashes
3648359ebae8ce7cacae1e631103659f5a8c630e
fe6de75d6042de714c28c0a3c0816b37e0fa4bb3
f954d1b1d13a5e4f62f108c9965707a2aa2a3c89 (INCIDENT_REPORT.pdf)
5ee1befc69d120976a60a97d3254e9eb
5384d704fadf229d08eab696404cbba6
39df773139f505657d11749804953be5
8287d54c83db03b8adcdf1409f5d1c9abb1693ac8d000b5ae75b3a296cb3061c
51ffc0b7358b7611492ef458fdf9b97f121e49e70f86a6b53b93ed923b707a03
b087e1309f3eab6302d7503079af1ad6af06d70a932f7a6ae1421b942048e28a
IPs
74.50.84[.]181:443
94.158.244[.]69:443
5.255.117[.]134:80
85.239.61[.]60
Ymir: nuevo ransomware furtivo en libertad