Descripción principal
QakBot, también conocido como QBot, QuackBot y Pinkslipbot, es un troyano bancario vigente desde hace más de una década. Fue descubierto circulando en Internet en 2007 y desde entonces sus autores no han cesado de mantenerlo y desarrollarlo.
En los últimos años, QakBot se ha convertido en uno de los principales troyanos bancarios del mundo. Su objetivo principal es robar credenciales bancarias, como inicios de sesión, contraseñas, etc. Pero QakBot no se ha limitado a estas funciones, sino que ha adquirido otras para espiar las actividades bancarias de las organizaciones, propagarse e instalar ransomware con el fin de exprimir al máximo a las organizaciones comprometidas.
Hasta el día de hoy, QakBot sigue creciendo en términos de funcionalidad, incrementando sus capacidades y técnicas, como el registro de pulsaciones de teclas, la función de puerta trasera y técnicas para evadir la detección. Entre estas últimas, cabe destacar la detección de entornos virtuales, las auto-actualizaciones periódicas y los cambios de cifrado y empaquetamiento. Además, QakBot intenta protegerse para que ni expertos, ni herramientas automatizadas puedan analizarlo.
Otra funcionalidad interesante es la de robar correos electrónicos, que luego son utilizados por los atacantes para enviar correos electrónicos selectivos a las víctimas, a quienes inducen a abrirlos utilizando como cebo la información obtenida anteriormente.
Cadena de infección de QakBot
QakBot es conocido por infectar a sus víctimas sobre todo mediante campañas de spam. En algunos casos, dichos correos electrónicos llegan junto con documentos de Microsoft Office (Word, Excel) o archivos protegidos por contraseña con dichos documentos adjuntos. Estos documentos contienen macros y afirman contener información importante, como una factura, para inducir a las víctimas a que los abran. En otros casos, los correos electrónicos contienen enlaces a páginas web maliciosas en lugar de archivos adjuntos.
Sin embargo, hay otro vector de infección que incluye la transferencia de una carga útil maliciosa de QakBot a través de otro malware en la máquina infectada.
Los vectores de infección iniciales pueden variar, según la mejor tasa de éxito en la organización objetivo que sus autores consideren tengan. Se sabe que varios actores de amenazas realizan un reconocimiento preliminar (OSINT) de las organizaciones objetivo para decidir qué vector de infección es el más adecuado.
Cadena de infección de QakBot
La cadena de infección de las últimas versiones de QakBot (variantes 2020-2021) es la siguiente:
- El usuario recibe un correo electrónico de phishing, que contiene un archivo adjunto ZIP de un documento de Office con macros incrustadas o un enlace malicioso para descargar el documento malicioso.
- El usuario abre el documento o enlace malicioso y es inducido a hacer clic en “Habilitar contenido”.
- Se ejecuta una macro maliciosa. Algunas variantes envían una petición ‘GET’ a una URL solicitando un archivo ‘PNG ‘. Pero el archivo es en realidad un binario.
- La carga útil que se carga (stager) incluye otro binario que contiene módulos de recursos cifrados. Uno de los recursos cifrados contiene el binario DLL (cargador) que se descifra después, durante el tiempo de ejecución.
- El ‘Stager’ carga el ‘Loader’ en la memoria, que descifra y ejecuta la carga útil durante el tiempo de ejecución. Los ajustes de configuración se reciben de otro recurso.
- La carga útil se comunica con el servidor de administración.
- A partir de ese momento, se pueden introducir en la máquina infectada amenazas adicionales, como el ransomware ‘ProLock’.
Funciones típicas de QakBot
Algunas de las actividades maliciosas típicas de QakBot observadas en el mundo real incluyen:
- Recopilación de información sobre el host infectado;
- Creación de tareas programadas (escalada de privilegios y persistencia);
- Recolección de credenciales:
- Obtención de contraseñas por fuerza bruta;
- Manipulación del registro (persistencia);
- Creación de una copia de sí mismo;
- Inyección de procesos, para ocultar su proceso malicioso.
Comunicación con el servidor de control y comando
El malware QakBot contiene una lista de 150 direcciones IP codificadas en el recurso binario del cargador. La mayoría de estas direcciones pertenecen a otros sistemas infectados, que se utilizan como proxy para reenviar el tráfico a otros proxies o al servidor de control y comando real.
La comunicación con el servidor de control y comando es una petición HTTPS POST con datos codificados en Base64. Los datos se cifran con el algoritmo RC4. Para el cifrado se utiliza la cadena estática “jHxastDcds)oMc=jvh7wdUhxcsdt2” y una secuencia aleatoria de 16 bytes. Los datos están en formato JSON.
Mensaje original en formato JSON
Petición HTTPS POST con JSON cifrado
En general, tras la infección, el bot envía un mensaje ‘PING’, un mensaje ‘SYSTEM INFO’ y un mensaje ‘ASK for COMMAND’. El servidor de control y comando responde con los mensajes ‘ACK’ y ‘COMMAND’. Si los módulos adicionales fueron insertados por el servidor de control y comando, el bot envía un mensaje ‘STOLEN INFO’ que contiene los datos robados por el módulo.
- Mensaje ‘PING’ – mensaje de petición del bot al servidor de control y comando con ‘BOT ID’ para comprobar si el servidor de control y comando está activo
Mensaje ‘PING’
- Mensaje ‘ACK’– Mensaje de respuesta del servidor de control y comando con el único campo valioso “16” – dirección IP externa del sistema infectado
Mensaje ‘ACK’
- Mensaje ‘SYSTEM INFO’ – mensaje de solicitud del bot al servidor de control y comando con la información recopilada sobre el sistema infectado. Además de la información general del sistema, como la versión y el valor de bits del sistema operativo, el nombre del usuario, el nombre del ordenador, el dominio, la resolución de la pantalla, la hora del sistema, el tiempo de actividad del sistema y el tiempo de actividad del bot, también contiene los resultados de las siguientes utilidades y consultas WMI.
- whoami /all
- arp -a
- ipconfig /all
- net view /all
- cmd /c set
- nslookup -querytype=ALL -timeout=10 _ldap._tcp.dc._msdcs.{DOMAIN}
- nltest /domain_trusts /all_trusts
- net share
- route print
- netstat -nao
- net localgroup
- qwinsta
- WMI Query ROOTCIMV2:Win32_BIOS
- WMI Query ROOTCIMV2:Win32_DiskDrive
- WMI Query ROOTCIMV2:Win32_PhysicalMemory
- WMI Query ROOTCIMV2:Win32_Product
- WMI Query ROOTCIMV2:Win32_PnPEntity
Mensaje ‘SYSTEM INFO’
- Mensaje ‘ASK for COMMAND’ – mensaje de solicitud de comando del bot al servidor de control y comando. Tras el envío del mensaje ‘SYSTEM INFO ‘, el bot comienza a pedir al servidor de control y comando un comando para ejecutarlo. Uno de los campos principales es el “14”, SALT. Este campo es único y cambia en cada solicitud. Se utiliza para proteger contra el secuestro o la interceptación del control de un bot. Después de recibir esta solicitud, el servidor de control y comando utiliza este SALT en el procedimiento de firma y coloca el signo en la respuesta, para que el bot pueda comprobar los datos firmados. Solo se ejecutará un comando válido y firmado.
Mensaje ‘ASK for COMMAND’
- Mensaje ‘COMMAND’ – Mensaje de respuesta del servidor de control y comando con el comando a ejecutar. La versión actual del bot admite 24 comandos. La mayoría de ellos están relacionados con la descarga, la ejecución, la caída de módulos adicionales y archivos de configuración de módulos con diferentes opciones, o la configuración/actualización de valores de configuración.
Este tipo de mensaje contiene el valor firmado de la SALT (obtenido del campo de solicitud “14” del bot), el ID del COMANDO y el ID del MÓDULO. Los demás valores del mensaje no están firmados.En versiones anteriores, el bot recibía módulos y comandos inmediatamente después de la infección y el envío de un mensaje ‘SYSTEM INFO’. Ahora, el servidor de control y comando responde con un comando vacío durante una hora. Solo una vez pasado este tiempo, el servidor de control y comando envía algunos comandos y módulos en la respuesta. Creemos que este retraso se utiliza para dificultar la recepción y el análisis de nuevos comandos y módulos en un entorno aislado y controlado.
‘COMMAND’, respuesta del servidor de control y comando con un comando vacío
Si el servidor de control y comando inserta algunos módulos, el binario codificado en Base64 se coloca en el campo “20” del mensaje.
‘COMMAND’, respuesta servidor de control y comando con un módulo adicional para cargar
- Mensaje ‘STOLEN INFO’ – mensaje del bot al servidor de control y comando con información robada, como contraseñas, cuentas, correos electrónicos, etc. La información robada está cifrada en RC4 y codificada en Base64. La clave para el cifrado RC4 se genera de una forma diferente y se basa en los valores del ID del sistema infectado (también conocido como Bot ID), y no se basa en una cadena estática como en el caso del cifrado de tráfico.
Mensaje ‘STOLEN INFO’ (información robada)
Una vez establecida la comunicación con el servidor de control y comando, se sabe que QakBot descarga y utiliza módulos adicionales para realizar sus operaciones maliciosas.
Los módulos adicionales son diferentes de una muestra a otra y pueden incluir ‘Cookie grabber’, ‘Email Collector’, ‘Credentials grabber’, ‘Proxy module’ y muchos más.
Estos módulos pueden ser escritos por los autores de la amenaza o pueden ser tomados prestados de repositorios de terceros y adaptados. Pueden variar de una muestra a otra; por ejemplo, hay muestras más antiguas que pueden utilizar Mimikatz para el volcado de credenciales.
A continuación, se muestran algunos de los módulos que hemos encontrado durante nuestra investigación.
Módulos adicionales
- Cookie Grabber: recoge las cookies de los navegadores más populares (Edge, Firefox, Chrome, Internet Explorer)
- VNC oculto: permite que los actores de la amenaza se conecten a la máquina infectada e interactúen con ella sin dar pistas al usuario real
- Email Collector: intenta encontrar Microsoft Outlook en la máquina infectada, luego itera sobre las carpetas del software y recolecta recursivamente los correos electrónicos. Finalmente, el módulo envía los correos electrónicos recogidos al servidor remoto
Los actores de la amenaza distribuyeron en algún momento la versión de depuración del módulo recolector de correo electrónico
- Módulo de hooking: engancha un conjunto de funciones WinAPI y (si existen) DLL de Mozilla. El hooking se utiliza para realizar inyecciones web, espiar el tráfico y los datos del teclado e incluso impedir la resolución DNS de ciertos dominios. El hooking funciona de la siguiente manera: QakBot inyecta el módulo de hooking en el proceso apropiado, este módulo encuentra las funciones del conjunto codificado y modifica estas funciones para que salten al código personalizado.
El módulo contiene una lista cifrada de DLL y funciones que el bot “hookeará”
- Módulo passgrabber: recoge los inicios de sesión y las contraseñas de varias fuentes: Archivos de Firefox y Chrome, almacenamiento de Microsoft Vault, etc. En lugar de utilizar Mimikatz como en las versiones anteriores, el módulo recoge las contraseñas con sus propios algoritmos.
Procedimiento que recolecta contraseñas de diferentes fuentes
- Módulo proxy: intenta determinar qué puertos están disponibles para escuchar utilizando el reenvío de puertos UPnP y la consulta el servidor de control y comando de nivel 2. La comparación de las versiones actuales y anteriores del cargador de proxy reveló algunas cosas interesantes: los autores de la amenaza decidieron eliminar la dependencia de cURL del binario y realizar todas las comunicaciones HTTP utilizando su propio código. Además de eliminar cURL, también eliminaban las dependencias de OpenSSL e incrustaban todas las funciones en un solo ejecutable: desaparecen los módulos de carga y proxy, siendo ahora un solo archivo.
Construcción de la consulta de reenvío de puertos UPnP
Después de intentar determinar si los puertos están abiertos y si la máquina podría actuar como servidor proxy de control y comando de nivel 2, el módulo proxy también inicia un servidor proxy SOCKS5 de múltiples hilos. El protocolo SOCKS5 está encapsulado en el protocolo proxy QakBot, que tiene el siguiente aspecto Comando proxy QakBot (1 byte), versión (1 byte), id de sesión (4 bytes), longitud total del paquete (dword), datos (longitud total del paquete -10). Los paquetes entrantes y salientes se almacenan en las memorias intermedias y pueden recibirse o transmitirse uno a uno o por varios paquetes en un segmento de datos TCP (streaming).
El flujo habitual de ejecución del módulo proxy es el siguiente:
- Establecer comunicación con el servidor de administración, intentar reenviar puertos con UPnP y determinar los puertos disponibles y enviarlos al servidor de control y comando. El protocolo de comunicación habitual del servidor de control y comando utilizado aquí es el HTTP POST con datos JSON cifrados en RC4.
- Descargar la biblioteca OpenSSL. En lugar de guardar el archivo descargado, QakBot mide la velocidad de descarga y elimina el archivo recibido.
- Configurar la conexión externa PROXY con el servidor de control y comando, que fue recibida con el comando 37 (update config)/módulo 274 (proxy) por el stager.
Comunicación con el servidor PROXY de control y comando externo:
- Enviar la solicitud inicial del módulo proxy. La solicitud inicial contiene el ID del bot, la dirección IP externa de la máquina infectada, la búsqueda DNS inversa de la dirección IP externa, la velocidad de Internet (medida anteriormente) y los segundos transcurridos desde el inicio del módulo proxy.
- Establecer una conexión (secuencia de comandos proxy 1->10->11) con el servidor de control y comando PROXY.
- Iniciar sesiones, realizar autentificación socks5 con inicio de sesión/contraseña (recibidos de del servidor de control y comando PROXY con el comando 10)
- Comenzar la comunicación tipo SOCKS5, envuelta en el protocolo del módulo proxy de QakBot.
Los comandos del proxy de Qakbot son los siguientes:
Comando | Descripción |
1 | Hello (bot->servidor de control y comando) |
10 | Configurar las credenciales de autentificación (servidor de control y comando->bot) |
11 | Confirmar la configuración de las credenciales (bot->servidor de control y comando) |
2 | Crear una nueva sesión proxy (servidor de control y comando->bot) |
3 | SOCKS5 AUTH (bot->servidor de control y comando) |
4 | Procesar solicitudes SOCKS5 (funciona para ambas partes) |
5 | Cerrar la sesión (funciona para ambas partes) |
6 | Actualizar el estado de la sesión/notificación de actualización del estado de la sesión (funciona para ambas partes) |
7 | Actualizar el estado de la sesión/notificación de actualización del estado de la sesión (funciona para ambas partes) |
8 | PING (servidor de control y comando->bot) |
9 | PONG (bot->servidor de control y comando) |
19 | Guardar la hora actual en el registro (servidor de control y comando->bot) |
Paquetes analizados del servidor de control y comando
Seguimiento de un solo proxy
-
Inyección web: archivo de configuración para el módulo de hooking
Una vez entablada la comunicación con el servidor de control y comando, uno de los módulos adicionales que se descarga es el módulo de inyección web. Intercepta el tráfico de la víctima inyectando el módulo en el proceso del navegador y haciendo hooking de la API de la red. El módulo de hooking obtiene el flujo de ejecución de las APIs interceptadas, y una vez que la víctima accede a ciertas páginas del sitio web que están relacionadas con la banca y las finanzas, se inyecta un JavaScript adicional en la página de origen.
JavaScript parcialmente inyectado en la página de origen de la página de inicio de sesión de ‘Wells Fargo’
Estadísticas de QakBot
Analizamos las estadísticas sobre los ataques de QakBot recogidas en nuestra red Kaspersky Security Network (KSN), donde se acumulan y procesan los datos anónimos proporcionados voluntariamente por los usuarios de Kaspersky. En los primeros siete meses de 2021 nuestros productos detectaron 181 869 intentos de descarga o ejecución de QakBot. Esta cifra es inferior a la de detección de enero a julio de 2020; sin embargo, el número de usuarios afectados creció un 65% respecto al año pasado y alcanzó los 17 316 usuarios.
Observamos las mayores campañas el primer trimestre de 2021, cuando 12 704 usuarios se encontraron con QakBot. 8068 usuarios de Kaspersky fueron atacados en enero y 4007 en febrero.Conclusiones
QakBot es un conocido troyano bancario cuyas técnicas pueden variar de un binario a otro (versiones antiguas y nuevas). Se ha desarrollado durante más de una década, sigue activo en la actualidad y no parece que vaya a cesar su actividad en el futuro próximo. Este malware se actualiza continuamente y sus autores le siguen añadiendo nuevas capacidades y actualizando sus módulos, con el fin de maximizar sus ganancias, mientras roban datos e información.
Se sabe que los autores de amenazas pueden diferenciar sus formas de realizar actividades maliciosas, basándose en los proveedores de seguridad y en complejos trucos para pasar desapercibidos. Aunque QakBot utiliza diferentes técnicas para impedir que lo detecten, como enumerar los procesos para encontrar soluciones antimalware en funcionamiento, nuestros productos son capaces de detectar esta amenaza mediante el análisis de comportamiento. Detectamos QakBot con los veredictos:
Backdoor.Win32.QBot
Backdoor.Win64.QBot
Trojan.JS.QBot
Trojan.MSOffice.QBot
Trojan.MSOffice.QbotLoader
Trojan.Win32.QBot
Trojan-Banker.Win32.QBot
Trojan-Banker.Win32.QakBot
Trojan-Banker.Win64.QBot
Trojan-Downloader.JS.QBot
Trojan-PSW.Win32.QBot
Trojan-Proxy.Win32.QBot
IoCs (servidores de control y comando)
* puede realizarse como un comando externo (módulo extendido).
Análisis técnico de Qakbot