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