Descripciones de malware

Gootkit: El troyano precavido

Gootkit, descubierto por primera vez por Doctor Web en 2014, es un complicado malware bancario que funciona en varias etapas. En un principio se propagaba a través de spam y paquetes de exploits, como Spelevo y RIG. Más tarde, los delincuentes, junto con las campañas de spam, pasarían a usar sitios web capturados, donde inducían a que los visitantes descarguen el malware.

Gootkit roba datos del navegador, lanza ataques man-in-the-browser (MiTB), registra las actividades en el teclado, toma capturas de pantalla, además de otras acciones maliciosas. Su cargador realiza varias comprobaciones de máquinas virtuales y sandbox, y utiliza sofisticados algoritmos de persistencia. En 2019, Gootkit dejó de funcionar después de experimentar una fuga de datos, pero desde noviembre de 2020 está activo nuevamente.

Las víctimas de Gootkit se encuentran sobre todo en países de la UE, como Alemania e Italia. En este artículo analizamos una de las muestras recientes de Gootkit.

Detalles técnicos

Gootkit consta de dos partes: un (des)cargador escrito en C++ y el cuerpo principal escrito en JS e interpretado por Node.js. El cuerpo principal es un marco modular, que contiene el registro, el software espía, la detección de VMX y otros módulos.

El cargador

La muestra (MD5 97713132e4ea03422d3915bab1c42074) estaba empaquetada por un empaquetador de múltiples etapas, diseñado a este efecto, que descifra la carga útil final paso a paso. La última etapa es un código de shell que descifra el ejecutable del cargador original y lo asigna a la memoria. Una vez hecho esto, llama al punto de entrada original. Como resultado, logramos descomprimir fácilmente el ejecutable original y analizarlo. Detectamos el cargador de Gootkit con los veredictos que aparecen en la siguiente tabla.

MD5 SHA-1 Veredicto
97713132e4ea03422d3915bab1c42074 a90c6e7c5650e73ceb0b329fa8c78045632100ee Trojan-Downloader.Win32.Injecter
27626f2c3667fab9e103f32e2af11e84 6e9e30c699c7111089fe364ce47f1dc05c8bc703 HEUR:Trojan.Win32.Generic

La mayoría de las cadenas se cifran con el cifrado XOR y se descifran en tiempo de ejecución. No utiliza otras técnicas para complicar el análisis estático.

Descifrado de las cadenas

Sin embargo, para dificultar el análisis dinámico, el cargador Gootkit emplea una variedad de distintos métodos para detectar entornos virtuales o depuradores. Si alguna de las comprobaciones de las máquinas virtuales tiene éxito, el cargador entra en un bucle infinito.

Verificación del nombre de la muestra

Lista completa de las técnicas de detección de máquinas virtuales (VM) utilizadas por este malware:

Verificación Valor prohibido
CRC32 del nombre de la muestra 0xBC136B46, 0xD84A20AC, 0xEED889C4, 0x58636143, 0xC0F26006, 0x8606BEDD, 0xE8CBAB78, 0x2AB6E04A, 0x31E6D1EA
GetModuleHandle dbghelp.dll, sbiedll.dll
GetUserName CurrentUser, Sandbox
GetComputerName SANDBOX, 7SILVIA
HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\SystemBiosVersion FTNT1, INTEL-604000, SMCI, QEMU, VBOX, BOCHS, AMI, SONI
HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\VideoBiosVersion VirtualBox
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\SystemBiosVersion 55274-640-2673064-23950 (Joe Sandbox), 76487-644-3177037-23510 (CWSandbox), 76487-337-8429955-22614 (Anubis Sandbox)
HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcess\0\ProcessorNameString Xeon
_MEMORYSTATUSEX. ullTotalPhys Menos de 2100000000
UuidCreateSequential (esta función se basa en la dirección MAC de la computadora, por lo que el valor de retorno determina si el troyano se está ejecutando en la caja de arena o no) 0xF01FAF00 (Dell Inc.), 0x505600 (VMWare, Inc.), 0x8002700 (PCS System Technology GmbH), 0xC2900 VMWare, Inc.), 0x56900 (VMWare, Inc.), 0x3FF00 (Microsoft), 0x1C4200 (Parallels), 0x163E00  (XenSource)
CRC32 de nombres de procesos en ejecución 0xAEA3ED09, 0x2993125A, 0x3D75A3FF, 0x662D9D39,

0x922DF04, 0xC84F40F0, 0xDCFC6E80

Flujo de ejecución

Cuando se inicia la muestra, comprueba los argumentos de la línea de comandos. Los argumentos disponibles son los siguientes:

Argumento Descripción
–client sin controlador
–server sin controlador
–reinstall Itera los procesos en ejecución (donde el proceso es una variable de bucle) y elimina todos los procesos donde process.pid no es igual al PID del proceso actual y process.name es igual al nombre del archivo actual. Después, se copia y ejecuta a través de CreateProcessW
–service Establece la variable de entorno USERNAME_REQUIRED=TRUE
–test Detiene la ejecución
–vwxyz Descarga el cuerpo principal desde el C&C

Una vez procesados los argumentos de la línea de comando, la muestra verifica si se está ejecutando dentro de una máquina virtual o en un entorno de depuración. De lo contrario, descifra la configuración e inicia cuatro hilos.

Rutina de inicio de los hilos

  • Update_from_c2
    El primer hilo que se inicia intenta descargar una actualización del cargador desde <CnC host>/rpersist4 /<crc>, donde <CnC host> es una dirección del servidor de comando y control, y <crc> es el CRC32 de los primeros 0x200 bytes del archivo actual en formato decimal.
  • Browser_inj
    El hilo descifra dos ejecutables MZPE incrustados (DLL x64 y x86), itera sobre los procesos en ejecución e intenta inyectar las DLL descifradas en la memoria del proceso designado utilizando la API NtCreateSection/NtMapViewOfSection. La coincidencia del nombre del proceso se realiza calculando el valor CRC32 del nombre del proceso. La siguiente tabla ofrece una lista de los navegadores compatibles.

    CRC Nombre del navegador
    0xC84F40F0 Chrome
    0x662D9D39 Firefox
    0x922DF04 Internet Explorer
    0x2993125A Microsoft Edge (MicrosoftEdgeCP.exe)
    0x3D75A3FF Opera
    0xDCFC6E80 Safari
    0xEB71057E desconocido

    El código inyectado se llama desde las rutinas del módulo principal, que son responsables de las inyecciones web y del rastreo del tráfico, para lanzar un ataque man-in-the-browser. Para hacerlo, el código aplica parches a las funciones estándar del navegador responsables de la validación de certificados para hacer que se permitan los certificados auto-firmados. Como resultado, los atacantes pueden inyectar códigos JS personalizados y modificar o desviar el tráfico.

  • Persistence_service
    Si una muestra se está ejecutando en la cuenta LOCAL_SYSTEM, el mecanismo de persistencia de Gootkit abusa de la característica pendiente de GPO de Windows. Cuando un usuario modifica los valores del registro de GPO pendientes, debe especificar los siguientes parámetros:

    • count – conteo de GPO pendientes;
    • path1, path2, … – ruta al archivo .inf especial que contiene instrucciones sobre cómo cargar GPO;
    • Section1, Section2, … – nombre de la sección del archivo INF.

    Entonces, Gootkit crea un archivo .inf en el mismo directorio que la muestra y escribe los siguientes valores en la llave de registro Software\Microsoft\IEAK\GroupPolicy\PendingGPOs:

    • count – 0x1
    • path1 – ubicación del archivo .inf
    • Section1 – DefaultInstall

    Contenido del archivo INF

    Ahora, cada vez que se inicia, explorer.exe carga los Objetos de Directiva de Grupo (GPO). Gootkit crea un GPO pendiente para el Kit de Administración de Internet Explorer (IEAK), que apunta directamente al archivo INF. Cuando explorer.exe se carga en tiempo de ejecución, ejecuta [DefaultInstall] dentro del archivo creado, que a su vez ejecuta el ejecutable Gootkit.

    En caso de que la muestra se esté ejecutando con otra cuenta, crea un servicio con un nombre aleatorio elegido de %SystemRoot%, se copia a sí mismo en la carpeta %SystemRoot% con el nombre elegido y se elimina del disco.

  • Stop_switch
    El hilo busca un archivo llamado uqjckeguhl.tmp en las carpetas \AppData\Local\Temp y \Local Settings\Temp. Cuando el malware encuentra el archivo, deja de funcionar.

Descarga del cuerpo principal

Antes de descargar el cuerpo principal desde el servidor de administración, el cargador intenta encontrar llaves de registro con el siguiente formato: HKCU\Software\AppDataLow\<pr_string>_ <i>, donde i es un número que comienza desde 0 y pr_string es una cadena seudoaleatoria generada al inicio del bot. Esta generación se basa en los parámetros de la PC atacada, por lo que cada vez se genera el mismo valor para la misma PC.

Cada llave contiene un fragmento de un máximo de 512 000 bytes (500 KB) de datos cifrados. Si las llaves mencionadas anteriormente se encuentran, su contenido se guarda en un búfer recién asignado (utilizado para descifrar y descomprimir). Luego, el búfer se descifra utilizando la misma función usada para descifrar la configuración, tras lo cual se descomprime el búfer.

Después de la rutina de desempaquetado, el cargador descarga el cuerpo principal del C&C, calcula su CRC32 y lo compara con el CRC de carga útil del registro (si existe). Si los CRC son diferentes, el cargador ejecuta la versión más reciente descargada del C&C. El servidor C&C no envia el módulo DLL sin el encabezado UserAgent apropiado que está codificado en la muestra – el valor codificado actual es: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/21006101 Firefox/25.0.

Función de descifrado

Cuerpo principal

El cuerpo principal (MD5 20279d99ee402186d1e3a16d6ab9398a, veredicto HEUR:Trojan.Win32.Generic) es un intérprete Node.js con archivos JS cifrados incluidos. En el inicio, el cuerpo principal descifra los archivos JavaScript utilizando un algoritmo similar a RC4 con un flujo de llaves codificado.

La información sobre los módulos incrustados se almacena en una matriz de estructuras especiales con el siguiente formato: BYTE* name_pointer, BYTE* encrypted_data, DWORD data_size, DWORD encr_flag. Esta estructura se utiliza dentro de la rutina de descifrado, que lee data_size bytes a partir de encrypted_data. Esta rutina descifra encrypted_data si encr_flag está establecido y escribe el resultado en un archivo con el nombre *name_pointer. La rutina de descifrado itera todas las entradas en la matriz de información del archivo. Después, la ejecución del descifrado se transfiere al intérprete Node.js.

Matriz de información de archivos

Esta matriz contiene 124 archivos cifrados, tanto bibliotecas del sistema Node.js como paquetes de código abierto y módulos del malware. Es bastante raro que el punto de entrada de JS sea un archivo llamado malware.js.

Malware.js inicializa las variables globales del bot, recopila las cookies guardadas (IE, Firefox, Chromium) y recorre una lista de servidores hasta encontrar un C&C disponible.

Cuando el malware encuentra un servidor C&C, lanza un bucle infinito que escucha diferentes eventos internos del malware (algunas rutinas, como la recopilación de cookies, se inician sin la solicitud del C&C en el inicio del bot) y envía los datos recopilados al C&C a través de paquetes formateados especiales. El malware también escucha los comandos del C&C e invoca al controlador apropiado en cada comando. Para comunicarse con los módulos, el malware utiliza los siguientes tipos de paquetes:

Nombre interno Descripción
SLAVE_PACKET_API_TAKESCREEN Envía las capturas de pantalla al C&C
SLAVE_PACKET_MAIL Envía los datos del email recibidos
SLAVE_PACKET_LOGLINE Envía el registro
SLAVE_PACKET_LSAAUTH Envía las credenciales de autenticación
SLAVE_PACKET_PAGE_FRAGMENT Envía los datos de inyecciones web
SLAVE_PACKET_FORM Envía los datos de formularios capturados
SLAVE_PACKET_LOCAL_VARS Envía las variables de bots locales
SLAVE_PACKET_SECDEVICELOG Envía el registro de eventos de dispositivo seguro
SLAVE_PACKET_KEYLOG Envía los datos del keylogger
SLAVE_PACKET_WINSPYLOG Envía la ventana activa actual

Hay seis tipos de controladores de eventos internos y correspondientes formatos de paquetes.

Controladores de eventos

La estructura general del paquete es la siguiente:

  • Longitud + 8 (4 bytes)
  • Número mágico del paquete (0xEDB88320 XOR (longitud + 8))
  • Datos del paquete (diferentes para cada tipo de paquete, serializados usando protobuf)
  • Número mágico del paquete

Rutina de generación de paquetes

Nuestros productos detectan esta amenaza con los siguientes veredictos: Trojan-Downloader.Win32.Injecter, HEUR:Trojan.Win32.Generic, Trojan-Downloader.Win32.Gootkit, Trojan-Banker.Win32.Gootkit. Todos los detalles, indicadores de compromiso, datos del marco MITRE ATT&CK, reglas YARA y hashes relacionados con esta amenaza están disponibles para los usuarios de nuestro servicio de Financial Threat Intelligence. Puede obtener más información sobre el análisis de malware y la investigación de amenazas en las formaciones impartidas por los expertos de GReAT.

Indicadores de infección

Cuerpo principal (el mismo desde 2019)
20279d99ee402186d1e3a16d6ab9398

El cargador
5249c568fb2746786504b049bbd5d9c8
97713132e4ea03422d3915bab1c42074
174A0FED20987D1E2ED5DB9B1019E49B
27626f2c3667fab9e103f32e2af11e84

Dominios e IPs
kvaladrigrosdrom[.]top
scellapreambulus[.]top
lbegardingstorque[.]com
kerymarynicegross[.]top
pillygreamstronh[.]com

Gootkit: El troyano precavido

Su dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

 

Informes

BlindEagle vuela alto en LATAM

Kaspersky proporciona información sobre la actividad y los TTPs del APT BlindEagle. Grupo que apunta a organizaciones e individuos en Colombia, Ecuador, Chile, Panamá y otros países de América Latina.

MosaicRegressor: acechando en las sombras de UEFI

Encontramos una imagen de firmware de la UEFI infectada con un implante malicioso, es el objeto de esta investigación. Hasta donde sabemos, este es el segundo caso conocido en que se ha detectado un firmware malicioso de la UEFI usado por un actor de amenazas.

Suscríbete a nuestros correos electrónicos semanales

Las investigaciones más recientes en tu bandeja de entrada