Jia Yu ChanSalim BitamDaniel StepanicSeth Goodwin

Bajo SADBRIDGE con GOSAR: QUASAR obtiene una reescritura de Golang

Elastic Security Labs comparte detalles sobre el cargador SADBRIDGE y la puerta trasera GOSAR, malware empleado en campañas dirigidas a víctimas de habla china.

30 minutos de lecturaAnálisis de malware
Bajo el SADBRIDGE con GOSAR: QUASAR recibe una reescritura en Golang

Introducción

Elastic Security Labs observó recientemente un nuevo conjunto de intrusiones dirigidas a regiones de habla china, rastreadas como REF3864. Estas campañas organizadas se dirigen a las víctimas hacer pasar por software legítimo, como navegadores sitio web o servicios de mensajería en redes sociales. El grupo de amenazas detrás de estas campañas muestra un grado moderado de versatilidad al distribuir malware en múltiples plataformas como Linux, Windows y Android. Durante esta investigación, nuestro equipo descubrió una cadena de infección única de Windows con un cargador personalizado que llamamos SADBRIDGE. Este cargador implementa una reimplementación de QUASAR basada en Golang, a la que nos referimos como GOSAR. Esta es la primera vez que nuestro equipo observa una reescritura de QUASAR en el lenguaje de programación Golang.

Conclusiones clave

  • Campañas en curso dirigidas a hablantes de chino con instaladores maliciosos que se hacen pasar por software legítimo como Telegram y el navegador sitio web Opera.
  • Las cadenas de infección emplean inyección y carga lateral de DLL mediante un cargador personalizado (SADBRIDGE)
  • SADBRIDGE implementa una variante recién descubierta de la puerta trasera QUASAR escrita en Golang (GOSAR)
  • GOSAR es una puerta trasera multifuncional en desarrollo activo con funciones incompletas e iteraciones de funciones mejoradas observadas a lo largo del tiempo.
  • Elastic Security proporciona capacidades integrales de prevención y detección contra esta cadena de ataques.

Descripción general de la campaña REF3864

En noviembre, el equipo de Elastic Security Labs observó una cadena de infección única al detonar varias muestras diferentes cargadas en VirusTotal. Estas diferentes muestras fueron alojadas a través de páginas de destino que se hacían pasar por software legítimo, como Telegram o el navegador Opera GX.

Durante esta investigación, descubrimos múltiples cadenas de infección que involucraban técnicas similares:

  • Instaladores MSI troyanizados con bajas detecciones
  • Enmascaramiento mediante software legítimo incluido con DLL maliciosas
  • Cargador SADBRIDGE personalizado implementado
  • Etapa final GOSAR cargado

Creemos que estas campañas pasaron desapercibidas debido a múltiples niveles de abstracción. Normalmente, la primera fase implica abrir un archivo comprimido (ZIP) que incluye un instalador MSI. Se emplea software legítimo como la aplicación de depuración de Windows x64dbg.exe en segundo plano para cargar una DLL maliciosa y parcheada (x64bridge.dll). Esta DLL inicia un nuevo programa legítimo (MonitoringHost.exe) donde carga de forma lateral otra DLL maliciosa (HealthServiceRuntime.dll), realizando en última instancia la inyección y cargando el implante GOSAR en la memoria a través de la inyección.

Los investigadores de malware extrajeron configuraciones de SADBRIDGE que revelan fechas de campaña designadas por el adversario e indican que se llevaron a cabo operaciones con TTP similares desde al menos diciembre de 2023. La infraestructura de comando y control (C2) de GOSAR a menudo se disfraza de servicios o software confiables para parecer benigna y ajustar a las expectativas de las víctimas respecto de los instaladores de software. A lo largo de la cadena de ejecución, hay un enfoque centrado en enumerar productos AV chinos como 360tray.exe, junto con nombres de reglas de firewall y descripciones en chino. Debido a estas personalizaciones, creemos que esta amenaza está dirigida a los hablantes del idioma chino. Además, el uso extensivo de registros en idioma chino indica que los atacantes también hablan ese idioma.

QUASAR se empleó anteriormente en espionaje patrocinado por estados, hacktivismo no estatal y ataques criminales con motivaciones financieras desde 2017 (Qualys, Evolution of Quasar RAT), incluido APT10 vinculado a China. Una reescritura en Golang podría aprovechar el conocimiento institucional adquirido durante este periodo, permitiendo capacidades adicionales sin tener que volver a capacitar extensamente a los TTP que anteriormente eran efectivos.

GOSAR amplía QUASAR con capacidades adicionales de recopilación de información, compatibilidad con múltiples sistemas operativos y evasión mejorada contra productos antivirus y clasificadores de malware. Sin embargo, los sitios web de señuelos genéricos y la falta de información adicional sobre la orientación o las acciones en función del objetivo nos dejan con evidencia insuficiente para identificar las motivaciones de los atacantes.

Introducción a SADBRIDGE

El cargador de malware SADBRIDGE está empaquetado como un ejecutable MSI para su distribución y emplea carga lateral de DLL con varias técnicas de inyección para ejecutar cargas útiles maliciosas. SADBRIDGE abusa de aplicaciones legítimas como x64dbg.exe y MonitoringHost.exe para cargar DLL maliciosas como x64bridge.dll y HealthServiceRuntime.dll, lo que conduce a etapas y códigos de shell posteriores.

La persistencia se logra mediante la creación de servicios y modificaciones de registros. La escalada de privilegios al Administrador se produce de forma silenciosa mediante una técnica de omisión de UAC que abusa de la interfaz COM ICMLuaUtil . Además, SADBRIDGE incorpora una función para evitar la escalada de privilegios a través del Programador de tareas de Windows para ejecutar su carga principal con privilegios de nivel de SISTEMA.

La configuración de SADBRIDGE se cifra mediante una simple resta de 0x1 en cada byte de la cadena de configuración. A todas las etapas cifradas se les agrega una extensión .log y se descifran durante el tiempo de ejecución empleando XOR y el algoritmo de descompresión LZNT1.

SADBRIDGE emplea PoolParty, colas APC y técnicas de manipulación de tokens para la inyección de procesos. Para evitar el análisis de sandbox, emplea llamadas API Sleep largas. Otra técnica de evasión de defensa implica aplicar parches a la API para deshabilitar los mecanismos de seguridad de Windows, como la Interfaz de escaneo antimalware (AMSI) y el Seguimiento de eventos para Windows (ETW).

El siguiente análisis profundo está estructurado para explorar la cadena de ejecución, proporcionando un recorrido paso a paso de las capacidades y funcionalidades de archivos y etapas importantes, según la configuración de la muestra analizada. El análisis tiene como objetivo resaltar la interacción entre cada componente y sus funciones para alcanzar la carga útil final.

Análisis del código SADBRIDGE

Análisis MSI

Los archivos iniciales se empaquetan en un MSI mediante Advanced Installer, los principales archivos de interés son x64dbg.exe y x64bridge.dll.

Al usar herramientas MSI (lessmsi), podemos ver que el punto de entrada LaunchApp en aicustact.dll está configurado para ejecutar la ruta de archivo especificada en la propiedad AI_APP_FILE .

Si navegamos a esta propiedad AI_APP_FILE , podemos ver que el archivo vinculado a esta configuración es x64dbg.exe. Esto representa el archivo que se ejecutará una vez completada la instalación, el legítimo NetFxRepairTool.exe nunca se ejecuta.

Carga lateral de x64bridge.dll

Cuando se ejecuta x64dbg.exe , llama a la exportación BridgeInit desde x64bridge.dll. BridgeInit es un contenedor para la función BridgeStart .

De manera similar a las técnicas observadas con BLISTER, SADBRIDGE repara la exportación de una DLL legítima.

Durante la rutina de inicialización del malware, SADBRIDGE comienza generando un hash empleando el nombre de host y una semilla mágica 0x4E67C6A7. Este hash se emplea como nombre de directorio para almacenar el archivo de configuración cifrado. La configuración cifrada se escribe en C:\Users\Public\Documents\<hostname_hash>\edbtmp.log. Este archivo contiene los atributos FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_READONLY, FILE_ATTRIBUTE_HIDDEN para ocultar de una lista de directorio normal.

Descifrar la configuración es sencillo, los fragmentos cifrados están separados por bytes nulos. Para cada byte dentro de los fragmentos cifrados, podemos incrementarlos en 0x1.

La configuración consta de:

  • Posible fecha de campaña
  • Cadenas que se emplearán para crear servicios
  • Nuevo nombre para MonitoringHost.exe (DevQueryBroker.exe)
  • Nombre de la DLL que se va a cargar lateralmente mediante MonitoringHost.exe (HealthServiceRuntime.dll)
  • Rutas absolutas para etapas adicionales (archivos .log )
  • El objetivo de inyección principal para alojar GOSAR (svchost.exe)

El directorio DevQueryBroker (C:\ProgramData\Microsoft\DeviceSync\Device\Stage\Data\DevQueryBroker\) contiene todas las etapas cifradas (archivos .log ) que se descifran en tiempo de ejecución. El archivo (DevQueryBroker.exe) es una copia renombrada de la aplicación legítima de Microsoft (MonitoringHost.exe).

Finalmente, crea un proceso para ejecutar DevQueryBroker.exe que carga el HealthServiceRuntime.dll malicioso en la misma carpeta.

HealthServiceRuntime.dll

Este módulo coloca un shellcode cifrado y parcialmente descifrado en el directorio %TEMP% del usuario. El nombre del archivo para el shellcode sigue el formato: log<random_string>.tmp. Luego, cada byte del shellcode parcialmente descifrado se decrementa en 0x10 para descifrarlo completamente. El shellcode se ejecuta en un nuevo hilo del mismo proceso.

El malware aprovecha el hash API empleando el mismo algoritmo que aparece en la investigación publicada por SonicWall; el algoritmo hash aparece en la sección Apéndice. El shellcode descifra DevQueryBroker.log en un archivo PE y luego realiza una operación XOR simple con un solo byte (0x42) en el primer tercio del archivo donde luego descomprime el resultado empleando el algoritmo LZNT1.

Luego, el shellcode desasigna cualquier asignación existente en la dirección base preferida del archivo PE usando NtUnmapViewOfSection, lo que garantiza que una llamada a VirtualAlloc asignará memoria comenzando en la dirección base preferida. Finalmente, asigna el archivo PE descifrado a esta memoria asignada y transfiere la ejecución a su punto de entrada. Todos los códigos shell identificados y ejecutados por SADBRIDGE comparten una estructura de código idéntica, diferenciar únicamente en los archivos .log específicos a los que hacen referencia para su descifrado y ejecución.

Registro de DevQueryBroker

El malware carga dinámicamente amsi.dll para deshabilitar mecanismos de seguridad críticos en Windows. Parchea AmsiScanBuffer en amsi.dll insertando instrucciones para modificar el valor de retorno a 0x80070057, el código de error estandarizado de Microsoft E_INVALIDARG que indica argumentos no válidos y regresa prematuramente para evitar efectivamente la lógica de escaneo. De manera similar, parchea AmsiOpenSession para que siempre devuelva el mismo código de error E_INVALIDARG. Además, parchea EtwEventWrite en ntdll.dll, reemplazando la primera instrucción con una instrucción ret para deshabilitar el Seguimiento de eventos para Windows (ETW), suprimiendo cualquier registro de actividad maliciosa.

Luego de aplicar el parche, se escribe un código shell cifrado en temp.ini en la ruta (C:\ProgramData\Microsoft\DeviceSync\Device\Stage\Data\DevQueryBroker\temp.ini).
El malware verifica la membresía del grupo del token del proceso actual para determinar su nivel de privilegio. Verifica si el proceso pertenece a la cuenta LocalSystem inicializando un SID con SECURITY_LOCAL_SYSTEM_RID y llamando CheckTokenMembership. En caso contrario, intenta verificar la membresía en el grupo Administradores creando un SID usando SECURITY_BUILTIN_DOMAIN_RID y DOMAIN_ALIAS_RID_ADMINS y realizando una verificación de membresía de token similar.

Si el proceso actual no tiene privilegios de Sistema local o Administrador, los privilegios se elevan primero a Administrador a través de un mecanismo de omisión de UAC aprovechando la interfaz COM ICMLuaUtil . Crea una cadena de nombre "Elevation:Administrator!new:{3E5FC7F9-9A51-4367-9063-A120244FBEC7}" para crear una instancia del objeto CMSTPLUA con privilegios de administrador. Una vez que se crea el objeto y se obtiene la interfaz ICMLuaUtil , el malware emplea el método ShellExec expuesto de la interfaz para ejecutar DevQueryBroker.exe.

Si una tarea o un servicio no se crea para ejecutar DevQueryBroker.exe de forma rutinaria, el malware verifica si el proceso antivirus 360tray.exe se está ejecutando. Si no se está ejecutando, se crea un servicio para la escalada de privilegios a SISTEMA, con las siguientes propiedades:

  • Nombre del servicio: DevQueryBrokerService
    Nombre de ruta binaria: “C:\ProgramData\Microsoft\DeviceSync\Device\Stage\Data\DevQueryBroker\DevQueryBroker.exe -svc”.
  • Nombre para mostrar: Servicio de agente de descubrimiento en segundo plano de DevQuery
  • Descripción: Permite que las aplicaciones descubran dispositivos con una tarea en segundo plano.
  • Tipo de inicio: Automáticamente al arrancar el sistema
  • Privilegios: Sistema local

Si se detecta que 360tray.exe está ejecutar, el malware escribe un archivo PE cifrado en DevQueryBrokerService.log y luego asigna un archivo PE de la siguiente etapa (Etapa 1) a la memoria del proceso actual y le transfiere la ejecución.

Una vez que DevQueryBroker.exe se vuelve a activar con privilegios de nivel de SISTEMA y llega a esta parte de la cadena, el malware verifica la versión de Windows. Para los sistemas que ejecutan Vista o posterior (excluyendo Windows 7), asigna otra etapa siguiente (Etapa 2) a la memoria y transfiere la ejecución allí.

Sin embargo, en Windows 7, ejecuta un código shell que descifra y ejecuta el archivo DevQueryBrokerPre.log .

Inyección de etapa 1 (explorer.exe)

SADBRIDGE emplea la variante 7 de PoolParty para inyectar código shell en explorer.exe apuntando a la cola de finalización de E/S de su grupo de subprocesos. Primero duplica un identificador para la cola de finalización de E/S del proceso de destino. Luego asigna memoria dentro de explorer.exe para almacenar el shellcode. Se asigna memoria adicional para almacenar una estructura TP_DIRECT diseñada, que incluye la dirección base del shellcode como dirección de devolución de llamada. Finalmente, llama a ZwSetIoCompletion y pasa un puntero a la estructura TP_DIRECT para poner en cola un paquete en la cola de finalización de E/S de la fábrica de trabajadores del proceso de destino (administrador de subprocesos de trabajo), activando efectivamente la ejecución del shellcode inyectado.

Este código shell descifra el archivo DevQueryBrokerService.log , desasigna cualquier región de memoria que ocupe su dirección base preferida, asigna el archivo PE a esa dirección y luego ejecuta su punto de entrada. Este comportamiento refleja el código shell observado anteriormente.

Inyección de etapa 2 (spoolsv.exe/lsass.exe)

Para la Etapa 2, SADBRIDGE inyecta código shell en spoolsv.exe, o lsass.exe si spoolsv.exe no está disponible, empleando la misma técnica de inyección que en la Etapa 1. El shellcode exhibe un comportamiento similar a las etapas anteriores: descifra DevQueryBrokerPre.log en un archivo PE, desasigna cualquier región que ocupe su dirección base preferida, asigna el archivo PE y luego transfiere la ejecución a su punto de entrada.

DevQueryBrokerService.log

El código shell descifrado de DevQueryBrokerService.log como se mencionó en la sección anterior aprovecha una técnica de escalada de privilegios mediante el Programador de tareas de Windows. SADBRIDGE integra una técnica de omisión de UAC pública empleando el objeto COM IElevatedFactorySever para crear indirectamente la tarea programada. Esta tarea está configurada para ejecutar DevQueryBroker.exe diariamente con privilegios de nivel de SISTEMA empleando el nombre de tarea DevQueryBrokerService.

Para ocultar sus huellas, el malware falsifica la ruta de la imagen y la línea de comandos modificando directamente el bloque de entorno de proceso (PEB), probablemente en un intento de disfrazar el servicio COM como si viniera de explorer.exe.

Registro DevQueryBrokerPre

SADBRIDGE crea un servicio llamado DevQueryBrokerServiceSvc bajo la subclave de registro SYSTEM\CurrentControlSet\Services\DevQueryBrokerServiceSvc con los siguientes atributos:

  • Descripción: Permite que las aplicaciones descubran dispositivos con una tarea en segundo plano.
  • Nombre para mostrar: Servicio de agente de descubrimiento en segundo plano de DevQuery
  • Control de errores: 1
  • Ruta de la imagen: %systemRoot%\system32\svchost.exe -k netsvcs
  • Nombre del objeto: Sistema local
  • Inicio: 2 (inicio automático)
  • Tipo: 16.
  • Acciones en caso de fallo:
    • Restablece el recuento de fallas cada 24 horas.
    • Ejecuta tres intentos de resetear: un retraso de 20 ms para el primero y un retraso de 1 minuto para el segundo y el tercero.

Los parámetros del servicio especifican el ServiceDll ubicado en C:\Program Files (x86)\Common Files\Microsoft Shared\Stationery\<hostname_hash>\DevQueryBrokerService.dll. Si el archivo DLL no existe, se colocará en el disco inmediatamente después.

DevQueryBrokerService.dll tiene una estructura de código similar a HealthServiceRuntime.dll, que se ve en las primeras etapas de la cadena de ejecución. Es responsable de descifrar DevQueryBroker.log y ejecutarlo. El ServiceDll será cargado y ejecutado por svchost.exe cuando se inicie el servicio.

Además, modifica la clave SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost\netsvcs para incluir una entrada para DevQueryBrokerServiceSvc para integrar el servicio recién creado en el grupo de servicios gestionados por el grupo de host de servicios netsvcs .

Luego, SADBRIDGE elimina la tarea programada y el servicio creado previamente eliminando las subclaves de registro SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Schedule\\TaskCache\\Tree\\DevQueryBrokerService y SYSTEM\\CurrentControlSet\\Services\\DevQueryBrokerService.

Finalmente, elimina los archivos DevQueryBroker.exe y HealthServiceRuntime.dll en la carpeta C:\ProgramData\Microsoft\DeviceSync\Device\Stage\Data\DevQueryBroker , ya que el nuevo mecanismo de persistencia está en su lugar.

Inyección de GOSAR

En la segunda mitad del código, SADBRIDGE enumera todas las sesiones activas en la máquina local empleando la API WTSEnumerateSessionsA .

Si se encuentran sesiones, se itera a través de cada sesión:

  • Para cada sesión, intenta recuperar el nombre de usuario (WTSUserName) empleando WTSQuerySessionInformationA. Si la consulta falla, pasa a la siguiente sesión.
  • Si WTSUserName no está vacío, el código apunta a svchost.exe y pasa su ruta, el ID de sesión y el contenido de la configuración del cargador a una subrutina que inyecta la etapa final.
  • Si WTSUserName está vacío pero el WinStationName de la sesión es "Services" (lo que indica una sesión de servicio), apunta a dllhost.exe en su lugar y pasa los mismos parámetros a la subrutina de inyección de la etapa final.

Si no se encuentran sesiones, entra en un bucle infinito para enumerar sesiones repetidamente e invocar la subrutina para inyectar la etapa final, mientras realiza verificaciones para evitar inyecciones redundantes.

Las sesiones iniciadas con sesión iniciada tienen como objetivo svchost.exe, mientras que las sesiones de servicio o las sesiones sin un usuario iniciado con sesión iniciada tienen como objetivo dllhost.exe.

Si hay un ID de sesión disponible, el código intenta duplicar el token de usuario para esa sesión y elevar el nivel de integridad del token duplicado a S-1-16-12288 (integridad del sistema). Luego emplea el token elevado para crear un proceso secundario (svchost.exe o dllhost.exe) a través de CreateProcessAsUserA.

Si la manipulación del token falla o no hay ninguna ID de sesión disponible (los procesos del sistema pueden tener una ID de sesión de 0), se recurre a la creación de un proceso sin un token usando CreateProcessA.

El código shell cifrado C:\ProgramData\Microsoft\DeviceSync\Device\Stage\Data\DevQueryBroker\temp.ini se descifra empleando la misma técnica de descompresión XOR y LZNT1 vista anteriormente para descifrar archivos .log , y se emplea la inyección APC para poner en cola el código shell para su ejecución en el hilo del proceso recién creado.

Finalmente, el shellcode inyectado descifra DevQueryBrokerCore.log a GOSAR y lo ejecuta en la memoria del proceso recién creado.

Introducción a GOSAR

GOSAR es un troyano de acceso remoto multifuncional que ataca sistemas Windows y Linux. Esta puerta trasera incluye capacidades como recuperar información del sistema, tomar capturas de pantalla, ejecutar comandos, registrar teclas y mucho más. La puerta trasera GOSAR conserva gran parte de la funcionalidad y el comportamiento principales de QUASAR, aunque incorpora varias modificaciones que la diferencian de la versión original.

Al reescribir el malware en lenguajes modernos como Go, se pueden ofrecer tasas de detección reducidas, ya que muchas soluciones antivirus y clasificadores de malware tienen dificultades para identificar características/cadenas maliciosas en estas nuevas construcciones de programación. A continuación se muestra un buen ejemplo de un GOSAR descomprimido que recibe solo 5 detecciones al cargar.

En individuo, esta variante admite múltiples plataformas, incluidos binarios ELF para sistemas Linux y archivos PE tradicionales para Windows. Esta capacidad multiplataforma se alinea con la adaptabilidad de Go, haciéndolo más versátil que el QUASAR original basado en .NET. En la siguiente sección, nos centraremos en destacar la estructura del código de GOSAR, las nuevas características y las adiciones en comparación con la versión de código abierto (QUASAR).

Descripción general del análisis del código GOSAR

Estructura del código de GOSAR

Como el binario conservó todos sus símbolos, pudimos reconstruir la estructura del código fuente, que se extrajo de una muestra de la versión 0.12.01

  • vibrante/config: contiene los archivos de configuración del malware.
  • vibrante/proto: Alberga todas las declaraciones de Google Protocol Buffers (proto).
  • vibrante/red: incluye funciones relacionadas con la red, como el bucle de conexión principal, el manejo del proxy y también el subproceso para configurar el firewall y configurar un oyente.
  • vibrante/msgs/resolvers: define los comandos manejados por el malware. Estos comandos se asignan a un objeto dentro de las funciones vibrant_msgs_init* .
  • vibrante/msgs/servicios: introduce nuevas funcionalidades, como la ejecución de servicios como keyloggers, registradores del portapapeles, estos servicios se inician en la función vibrant_network._ptr_Connection.Start .
  • vibrante/logs: responsable de registrar la ejecución del malware. Los registros se cifran con una clave AES almacenada en la configuración. El malware descifra los registros en fragmentos empleando AES.
  • vibrante/pkg/helpers: contiene funciones auxiliares empleadas en varios comandos y servicios de malware.
  • vibrante/pkg/screenshot: maneja la funcionalidad de captura de pantalla en el sistema infectado.
  • vibrante/pkg/utils: incluye funciones de utilidad, como la generación de valores aleatorios.
  • vibrante/pkg/native: proporciona funciones para llamar a funciones de la API de Windows (WINAPI).

Nuevas incorporaciones a GOSAR

Comunicación y recopilación de información

Esta nueva variante continúa empleando el mismo método de comunicación que el original, basado en TCP TLS. Al conectarse, primero envía información del sistema al C2, con 4 campos nuevos agregados:

  • Dirección IP
  • Antivirus
  • Configuración del portapapeles
  • Carteras

La lista de antivirus y billeteras digitales se inicializa en la función vibrant_pkg_helpers_init y se puede encontrar al final de este documento.

Servicios

El malware maneja 3 servicios que se inician durante la conexión inicial del cliente al C2:

  • vibrant_services_KeyLogger
  • vibrant_services_ClipboardLogger
  • vibrant_services_TickWriteFile

KeyLogger

La funcionalidad de registro de teclas en GOSAR se implementa en la función vibrant_services_KeyLogger . Esta función se basa en las API de Windows para interceptar y registrar las pulsaciones de teclas en el sistema infectado mediante la configuración de un gancho global de Windows con SetWindowsHookEx con el parámetro WH_KEYBOARD_LL para monitorear eventos de teclado de bajo nivel. La función de gancho se llama vibrant_services_KeyLogger_func1.

ClipboardLogger

La funcionalidad de registro del portapapeles es sencilla y se basa en las API de Windows. Primero verifica la disponibilidad de los datos del portapapeles usando IsClipboardFormatAvailable y luego los recupera usando la API GetClipboardData .

TickWriteFile

Los servicios ClipboardLogger y KeyLogger recopilan datos que TickWriteFile escribe periódicamente en el directorio (C:\ProgramData\Microsoft\Windows\Start Menu\Programs\diagnostics) bajo un archivo de la fecha actual, ejemplo 2024-11-27.
Se puede descifrar restando primero el valor 0x1f y luego aplicando el xor al valor 0x18 como se muestra en la receta de CyberChef.

Configuración de red

Luego de inicializar sus servicios, el malware genera tres subprocesos dedicados a su configuración de red.

  • vibrant_network_ConfigFirewallRule
  • vibrant_network_ConfigHosts
  • vibrant_network_ConfigAutoListener

Subprocesos que gestionan la configuración de la red

Regla de configuración del firewall

El malware crea una regla de firewall entrante para el rango de puertos 51756-51776 bajo un nombre chino que se traduce como Distributed Transaction Coordinator (LAN) , permite todos los programas y direcciones IP entrantes, la descripción está configurada como:Inbound rules for the core transaction manager of the Distributed Transaction Coordinator service are managed remotely through RPC/TCP.

Hosts de configuración

Esta función agrega una entrada a c:\Windows\System32\Drivers\etc\hosts el siguiente 127.0.0.1 micrornetworks.com. El motivo para agregar esta entrada no está claro, pero es probable que se deba a funcionalidades faltantes o características incompletas en la etapa de desarrollo actual del malware.

ConfigAutoListener

Esta funcionalidad del malware ejecuta un escucha de servidor HTTP en el primer puerto disponible dentro del rango 51756-51776, que previamente estaba permitido por una regla de firewall. Curiosamente, el servidor no maneja ningún comando, lo que demuestra que el malware aún está en desarrollo. La versión actual que tenemos solo procesa una solicitud GET a la URI /security.js, respondiendo con la cadena callback();, cualquier otra solicitud devuelve un código de error 404 . Esta respuesta mínima podría indicar que el servidor es un marcador de posición o parte de una etapa de desarrollo temprana, con el potencial de que se agreguen funcionalidades más complejas más adelante.

Logs

El malware almacena sus registros de tiempo de ejecución en el directorio: %APPDATA%\Roaming\Microsoft\Logs bajo el nombre de archivo formateado como: windows-update-log-<YearMonthDay>.log.
Cada entrada de registro está cifrada con el algoritmo HMAC-AES; la clave está codificada en la función vibrant_config , el siguiente es un ejemplo:

El atacante puede recuperar de forma remota los registros de ejecución del malware emitiendo el comando ResolveGetRunLogs.

Plugins

El malware tiene la capacidad de ejecutar complementos, que son archivos PE descargados del C2 y almacenados en un disco cifrado con un algoritmo XOR. Estos complementos se almacenan en la ruta: C:\ProgramData\policy-err.log. Para ejecutar un complemento, se llama al comando ResolveDoExecutePlugin , primero verifica si hay un complemento disponible.

Luego, carga de forma reflexiva una DLL nativa que se almacena en formato base64 en el binario llamado plugins.dll y ejecuta su función de exportación ExecPlugin.

ExecPlugin crea un proceso suspendido de C:\Windows\System32\msiexec.exe con los argumentos /package /quiet. Luego, pone en cola llamadas a procedimientos asincrónicos (APC) en el hilo principal del proceso. Cuando se reanuda el hilo, se ejecuta el shellcode en cola.

El código shell lee el complemento encriptado almacenado en C:\ProgramData\policy-err.log, lo desencripta empleando una clave XOR de 1 byte codificada y lo carga y ejecuta de manera reflexiva.

HVNC

El malware admite VNC oculto (HVNC) a través del socket existente y expone comandos 5

  • Resolver comando HVNC
  • ResolverGetHVNCScreen
  • ResolverDetenerHVNC
  • ResolveDoHVNCKeyboardEvent
  • ResolveDoHVNCMouseEvent

El primer comando que se ejecuta es ResolveGetHVNCScreen que primero lo inicializará y configurará una vista, emplea una DLL nativa incorporada HiddenDesktop.dll en formato base64, la DLL se carga de forma reflexiva en la memoria y se ejecuta.

La DLL es responsable de ejecutar API de bajo nivel para configurar el HVNC, con un total de 7 funciones exportadas:

  • Comando de ejecución
  • Desplazar el mouse
  • Hacer clic derecho con el mouse
  • HacerModoDeModo
  • Hacer clic izquierdo del mouse
  • Presionar tecla
  • Captura de pantalla

La primera función de exportación llamada es Initialise para inicializar un escritorio con API CreateDesktopA . Esta implementación de HVNC maneja 17 comandos en total que se pueden encontrar en la exportación ExcuteCommand , como se señaló, tiene un error tipográfico en el nombre, el ID del comando se reenvía desde el comando ResolveHVNCCommand del malware que llamará ExcuteCommand.

ID de comandoDescripción
0x401La función primero deshabilita la agrupación de botones de la barra de tareas estableciendo la clave de registro TaskbarGlomLevel en 2 en Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced. A continuación, garantiza que la barra de tareas esté siempre visible y en la parte superior empleando SHAppBarMessage con el comando ABM_SETSTATE y estableciendo el estado en ABS_ALWAYSONTOP.
0x402Genera un cuadro de diálogo EJECUTAR al ejecutar la función de exportación número 61 de shell32.dll.C:\Windows\system32\rundll32.exe shell32.dll,#61
0x403Ejecuta una instancia de powershell.exe
0x404Ejecuta un archivo PE almacenado en C:\\ProgramData\\shell.log
0x405Ejecuta una instancia de chrome.exe
0x406Ejecuta una instancia de msedge.exe
0x407Ejecuta una instancia de firefox.exe
0x408Ejecuta una instancia de iexplore.exe
0x409Ejecuta una instancia de 360se.exe
0x40AEjecuta una instancia de 360ChromeX.exe.
0x40BEjecuta una instancia de SogouExplorer.exe
0x40CCerrar la ventana actual
0x40DMinimiza la ventana especificada
0x40EActiva la ventana y la muestra como una ventana maximizada.
0x40FMata el proceso de una ventana.
0x410Establece el portapapeles
0x411Limpia el portapapeles

Captura de pantalla

El malware carga de forma refleja la tercera y última DLL PE incrustada en formato base64 denominada Capture.dll, tiene 5 funciones de exportación:

  • Capturar la primera pantalla
  • Capturar siguiente pantalla
  • GetBitmapInfo
  • GetBitmapInfoSize
  • Establecer calidad

La biblioteca se inicializa primero llamando a resolvers_ResolveGetBitmapInfo que carga y ejecuta de forma reflexiva su DllEntryPoint que configurará las estructuras de captura de pantalla empleando API comunes de Windows como CreateCompatibleDC, CreateCompatibleBitmap y CreateDIBSection. Las funciones de exportación 2 CaptureFirstScreen y CaptureNextScreen se emplean para capturar una captura de pantalla del escritorio de la víctima como una imagen JPEG.

Observación

Curiosamente, el servidor .NET QUASAR original todavía puede emplear para recibir señales de muestras GOSAR, ya que conservaron el mismo protocolo de comunicación. Sin embargo, su uso operativo requeriría modificaciones significativas para soportar las funcionalidades de GOSAR.

No está claro si los autores actualizaron o ampliaron el servidor .NET QUASAR de código abierto o desarrollaron uno completamente nuevo. Vale la pena mencionar que mantuvieron el puerto de escucha predeterminado, 1080, consistente con la implementación original.

Nueva funcionalidad

La siguiente tabla proporciona una descripción de todos los comandos recién agregados:

Nuevos comandos
ResolverCopiaRoboEjecuta el comando RoboCopy para copiar archivos
ResolverComprimirArchivosComprimir archivos en formato zip
ResolverExtraerArchivoExtraer un archivo zip
ResolverCopiarArchivosCopia un directorio o archivo en la máquina infectada
ResolverGetRunLogsObtener registros disponibles
Resolver comando HVNCEjecutar un comando HVNC
ResolverGetHVNCScreenIniciar HVNC
ResolverDetenerHVNCDetener la sesión HVNC
ResolveDoHVNCKeyboardEventEnviar evento de teclado al HVNC
ResolveDoHVNCMouseEventEnviar evento del mouse al HVNC
ResolveDoExecutePluginEjecutar un complemento
ResolverObtenerProcesosObtener una lista de procesos en ejecución
ResolveDoProcessStartIniciar un proceso
ResolverFinProcesoMatar un proceso
ResolverGetBitmapInfoRecuperar la estructura BITMAPINFO para la configuración de visualización de la pantalla actual
ResolverObtenerMonitoresEnumerar los monitores de pantalla de la víctima con la API EnumDisplayMonitors
ResolverGetDesktopIniciar la función de captura de pantalla
ResolveStopGetDesktopDetener la función de captura de pantalla
ResolveNewShellExecuteAbre tuberías a un proceso cmd.exe generado y le envía comandos
ResolverGetSchTasksObtenga tareas programadas ejecutando el comando schtasks /query /fo list /v
ResolverObtenerCapturaDePantallaCapturar una captura de pantalla del escritorio de la víctima
ResolverObtenerServiciosObtenga la lista de servicios con una consulta WMI : select * from Win32_Service
ResolveDoServiceOperationIniciar o detener un servicio
ResolveDoDisableMultiLogonDeshabilite la sesión múltiple por usuario estableciendo el valor fSingleSessionPerUser en 1 bajo la clave HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\TerminalServer
ResolverRestaurarNLARestaura la configuración de seguridad del Protocolo de Escritorio Remoto (RDP), habilita la Autenticación a Nivel de Red (NLA) y aplica el cifrado SSL/TLS para una comunicación segura.
ResolveGetRemoteClientInformationObtenga una lista de todos los usuarios locales que están habilitados, el puerto RDPy la IP de LAN e información específica del sistema operativo: DisplayVersion, SystemRoot y CurrentBuildNumber extraídos de la clave de registro HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
ResolveDoInstallWrapperConfigurar un protocolo de escritorio remoto oculto (HRDP)
ResolveDoUninstallWrapperDesinstalar HRDP
ResolveDoRecoverPrivilegesRestaura el registro HKEY_LOCAL_MACHINE\\SAM\\SAM original antes de que se realizaran los cambios durante la instalación de HRDP
ResolveGetRemoteSessionsRecupere información sobre las sesiones RDP en la máquina.
ResolveDoLogoffSessionCerrar sesión en RDP con **WTSLogoffSession** API
ResolverObtenerInformaciónDelSistemaObtener información del sistema
ResolveGetConnectionsObtenga todas las conexiones en la máquina
ResolveDoCloseConnectionNo implementado

Malware y MITRE ATT&CK

Elastic usa el marco MITRE ATT&CK para documentar tácticas, técnicas y procedimientos comunes que las amenazas emplean contra las redes empresariales.

Táctica

La táctica representa el porqué de una técnica o subtécnica. Es el objetivo táctico del adversario: la razón para realizar una acción.

Técnicas

Las técnicas representan cómo un adversario logra un objetivo táctico mediante la realización de una acción.

Mitigación de REF3864

Detección

Prevención

YARA

Elastic Security creó reglas YARA para identificar esta actividad.

Observaciones

En esta investigación se discutieron los siguientes observables:

ObservableTipoNombreReferencia
opera-x[.]netnombre-de-dominioPágina de destino
teledown-cn[.]comnombre-de-dominioPágina de destino
15af8c34e25268b79022d3434aa4b823ad9d34f3efc6a8124ecf0276700ecc39SHA-256NetFxRepairTools.msiMSI
accd651f58dd3f7eaaa06df051e4c09d2edac67bb046a2dcb262aa6db4291de7SHA-256x64bridge.dllSADBRIDGE
7964a9f1732911e9e9b9e05cd7e997b0e4e2e14709490a1b657673011bc54210SHA-256GOSAR
ferp.googledns[.]ionombre-de-dominioServidor GOSAR C2
hk-dns.secssl[.]comnombre-de-dominioServidor GOSAR C2
hk-dns.winsiked[.]comnombre-de-dominioServidor GOSAR C2
hk-dns.wkossclsaleklddeff[.]isnombre-de-dominioServidor GOSAR C2
hk-dns.wkossclsaleklddeff[.]ionombre-de-dominioServidor GOSAR C2

Referencias

A lo largo de la investigación anterior se hizo referencia a lo siguiente:

Apéndice

Algoritmo hash (SADBRIDGE)

def ror(x, n, max_bits=32) -> int:
    """Rotate right within a max bit limit, default 32-bit."""
    n %= max_bits
    return ((x >> n) | (x << (max_bits - n))) & (2**max_bits - 1)

def ror_13(data) -> int:
    data = data.encode('ascii')
    hash_value = 0

    for byte in data:
        hash_value = ror(hash_value, 13)
        
        if byte >= 0x61:
            byte -= 32  # Convert to uppercase
        hash_value = (hash_value + byte) & 0xFFFFFFFF

    return hash_value


def generate_hash(data, dll) -> int:
    dll_hash = ror_13(dll)
    result = (dll_hash + ror_13(data)) & 0xFFFFFFFF
    
    return hex(result)

Productos AV revisados en GOSAR

360sd.exekswebshield.exe
360tray.exekvmonxp.exe
a2guard.exekxetray.exe
ad-watch.exemcshield.exe
arcatasksservice.exemcshield.exe
ashdisp.exeminer.exe
avcenter.exemongoosagui.exe
avg.exempmon.exe
avgaurd.exemsmpeng.exe
avgwdsvc.exemssecess.exe
avk.exenspupsvc.exe
avp.exentrtscan.exe
avp.exepatray.exe
avwatchservice.exepccntmon.exe
ayagent.ayepsafesystray.exe
baidusdsvc.exeqqpcrtp.exe
bkavservice.exequhlpsvc.EXE
ccapp.exeravmond.exe
ccSetMgr.exeremupd.exe
ccsvchst.exerfwmain.exe
cksoftshiedantivirus4.exertvscan.exe
cleaner8.exesafedog.exe
cmctrayicon.exesavprogress.exe
coranticontrolcenter32.exesbamsvc.exe
cpf.exespidernt.exe
egui.exespywareterminatorshield.exe
f-prot.EXEtmbmsrv.exe
f-prot.exeunthreat.exe
f-secure.exeusysdiag.exe
fortitray.exev3svc.exe
hipstray.exevba32lder.exe
iptray.exevsmon.exe
k7tsecurity.exevsserv.exe
knsdtray.exewsctrl.exe
kpfwtray.exeyunsuo_agent_daemon.exe
ksafe.exeyunsuo_agent_service.exe