Resumen

El QakBot ha sido actualizado con más técnicas de evasión. La configuración de QakBot se almacena ahora en una clave de registro en lugar de un archivo. La clave de ejecución para la persistencia no está permanentemente presente en el registro, sino que sólo se escribe justo antes de apagar o reiniciar, y se borra inmediatamente después de que QakBot se ejecuta de nuevo. El ejecutable de QakBot tampoco se almacena ya permanentemente en el sistema de archivos, sino que, de manera similar a la entrada de registro de la clave de ejecución, se deja caer en el sistema de archivos antes de reiniciar y se borra después. De esta manera el software de seguridad sólo puede detectar los artefactos de QakBot en el disco, justo antes de que el sistema se apague, y poco después del arranque del sistema. Sin embargo, en ese momento el software de seguridad en sí mismo se está apagando y arrancando, por lo tanto puede no detectar el nuevo método de persistencia del QakBot.

Otros cambios incluyen la decodificación dinámica justo a tiempo y la destrucción de cadenas en tiempo de ejecución. Así que cualquier cadena utilizada en el malware sólo se decodifica en tiempo de ejecución en la memoria y se destruye justo después.

El método de entrega de las campañas de QakBot observadas identificadas mediante el patrón de expresión regular de abc[0-9]+ sigue siendo documentos macro XLM como se informó anteriormente.

Antedecentes

QakBot (también conocido como QBot, QuakBot, Pinkslipbot) existe desde 2008. Se distribuye a través de Emotet, es decir, Emotet descargará QakBot en las víctimas que ya están infectadas con Emotet pero también se distribuye directamente por correo electrónico. Para ello, utiliza el secuestro de hilos de conversación por correo electrónico en sus campañas1, ej:, responderá a los correos electrónicos que encuentre en los buzones de sus víctimas. Se sabe que el QakBot intensifica las intrusiones descargando el ransomware ProLock2 o recientemente el ransomware Egregor.

Las campañas de QakBot observadas identificadas por el ID de la campañaabc usa documentos macro XLM para la infección. Anteriormente informamos sobre su baja detección.3

Una visión general de la actual cadena de infección utilizada por la campaña QakBot con identificadores que siguen el patrón de expresión regular de abc[0-9]+ se puede ver en el siguiente gráfico de flujo.
QakBot abc cadena de infección

Análisis técnico

En el siguiente análisis analizamos brevemente la cadena de infección del QakBot después de haber sido descargado y lanzado por el documento malicioso de Excel.

QakBot infection process tree

Evasión

QakBot utiliza varias técnicas de evasión para evitar ser detectado por el software antivirus

Manipulación del encabezado de PE

Observamos algunas DLLs de QakBot con un encabezado PE manipulado. El siguiente mensage de texto This program cannot be run in DOS mode. ha sido alterado.

QakBot PE header manipulation

Esto parece un intento de eludir algunas reglas de detección estática que coinciden con este mensaje en el talón de MS-DOS de los binarios PE.

Firma del código

Primero, el DLL inicial descargado y ejecutado se firma con un certificado de firma de código válido (en el momento en que se distribuyó la muestra analizada).

$ chktrust 904400.jpg
Mono CheckTrust - version 6.8.0.123
Verify if an PE executable has a valid Authenticode(tm) signature
Copyright 2002, 2003 Motus Technologies. Copyright 2004-2008 Novell. BSD licensed.

WARNING! 904400.jpg is not timestamped!
SUCCESS: 904400.jpg signature is valid
and can be traced back to a trusted root!

El CA firmante es Sectigo y la organización se da como Aqua Direct s.r.o., que es una empresa ya existente.

$ osslsigncode verify 904400.jpg 
Current PE checksum   : 00091021
Calculated PE checksum: 00091021

Message digest algorithm  : SHA1
Current message digest    : 632DCB214EE9FB08441C640D240F672A7ABA6EB1
Calculated message digest : 632DCB214EE9FB08441C640D240F672A7ABA6EB1

Signature verification: ok

Number of signers: 1
    Signer #0:
        Subject: /C=CZ/postalCode=619 00/L=Brno/street=\xC5\xBDelezn\xC3\xA1 646/8/O=Aqua Direct s.r.o./CN=Aqua Direct s.r.o.
        Issuer : /C=GB/ST=Greater Manchester/L=Salford/O=Sectigo Limited/CN=Sectigo RSA Code Signing CA

Number of certificates: 4
    Cert #0:
        Subject: /C=CZ/postalCode=619 00/L=Brno/street=\xC5\xBDelezn\xC3\xA1 646/8/O=Aqua Direct s.r.o./CN=Aqua Direct s.r.o.
        Issuer : /C=GB/ST=Greater Manchester/L=Salford/O=Sectigo Limited/CN=Sectigo RSA Code Signing CA
    Cert #1:
        Subject: /C=GB/ST=Greater Manchester/L=Salford/O=Comodo CA Limited/CN=AAA Certificate Services
        Issuer : /C=GB/ST=Greater Manchester/L=Salford/O=Comodo CA Limited/CN=AAA Certificate Services
    Cert #2:
        Subject: /C=US/ST=New Jersey/L=Jersey City/O=The USERTRUST Network/CN=USERTrust RSA Certification Authority
        Issuer : /C=GB/ST=Greater Manchester/L=Salford/O=Comodo CA Limited/CN=AAA Certificate Services
    Cert #3:
        Subject: /C=GB/ST=Greater Manchester/L=Salford/O=Sectigo Limited/CN=Sectigo RSA Code Signing CA
        Issuer : /C=US/ST=New Jersey/L=Jersey City/O=The USERTRUST Network/CN=USERTrust RSA Certification Authority

Succeeded

Se desconoce si el certificado se obtuvo de Sectigo dando información falsa, si el certificado fue robado de Aqua Direct s.r.o., o si el certificado se obtuvo de Sectigo dando información robada de Aqua Direct s.r.o..

Se sabe que QakBot roba los correos electrónicos de las víctimas y los utiliza en futuras campañas de malspam. Por lo tanto, es probable que también utilicen los datos de las víctimas robadas para obtener certificados de firma de código. Sin embargo, los actores detrás de QakBot también pueden comprar el certificado de firma de código de un tercero (malicioso).

Las cadenas sólo se decodifican en tiempo de ejecución

QakBot decodificará sus cuerdas sólo en tiempo de ejecución en la memoria. Después de su uso, las cadenas decodificadas son removidas de la memoria nuevamente.

Procesos

QakBot usa CreateToolhelp32SnapshotProcess32{First,Next}W y enumera los procesos que están ocurriendo.

QakBot enumerating processes API log

Comprueba los siguientes procesos:

  • CcSvcHst.exe
  • avgcsrvx.exe
  • avgsvcx.exe
  • avgcsrva.exe
  • MsMpEng.exe
  • mcshield.exe
  • avp.exe
  • kavtray.exe
  • egui.exe
  • ekrn.exe
  • bdagent.exe
  • vsserv.exe
  • vsservppl.exe
  • AvastSvc.exe
  • coreServiceShell.exe
  • PccNTMon.exe
  • NTRTScan.exe
  • SAVAdminService.exe
  • SavService.exe
  • fshoster32.exe
  • WRSA.exe
  • vkise.exe
  • iserv.exe
  • cmdagent.exe
  • ByteFence.exe
  • MBAMService.exe
  • mbamgui.exe
  • fmon.exe

QakBot pondrá bits específicos en una máscara de bits para cada proceso en ejecución que encuentre. Dependiendo de la máscara de bits resultante, la ruta de infección posterior se altera, por ejemplo, si avp.exe  se ha encontrado. QakBot inyectará posteriormente el código mobsync.exe en vez de explorer.exe.  Debido a que los nombres de los procesos buscados están relacionados con soluciones de seguridad, creemos que de esta manera QakBot adapta su camino de ejecución para evadir la detección por parte de proveedores específicos.

Luego en otro bucle, de nuevo usando CreateToolhelp32SnapshotProcess32{First,Next}W, comprueba:

  • srvpost.exe
  • frida-winjector-helper-32.exe
  • frida-winjector-helper-64.exe

Si detecta alguno de esos procesos, el flujo de ejecución se ejecutará en un bucle que llamará continuamenteWaitForSingleObject(handle, 0x1fa) a handle generados previamente CreateEvent(NULL, FALSE, FALSE, ...), ejemplo: se ejecuta en un bucle infinito.

Controladores del dispositivo

A continuación, QakBot utiliza SetupDiGetDeviceRegistryPropertyA (consultando propiedades SPDRP_DEVICEDESCSPDRP_SERVICE) para comprobar los controladores de los dispositivos que contienen las siguientes cadenas:

  • VBoxVideo
  • Red Hat VirtIO
  • QEMU
  • A3E64E55_pr

Creemos que la búsqueda der A3E64E55_pr se utiliza para detectar un artefacto del arenero ANY.RUN.4 Alternativamente, pero poco probable, podría utilizarse para detectar un artefacto de la desaparecida solución AV de protección compleja xCore, utilizando un controlador similar con el nombre  A3E64E55_pr.sys.

Si detecta cualquiera de esos controladores de dispositivos, el flujo de ejecución se ejecutará en el mismo bucle infinito llamando continuamenteWaitForSingleObject(handle, 0x1fa)handle generado previamente via CreateEvent(NULL, FALSE, FALSE, ...), como se ha mencionado previamente.

Proceso de inyección

QakBot comienza C:\Windows\SysWOW64\explorer.exe en estado suspendido e inyecta un DLL en él usandoCreateProcessInternalW, NtMapViewOfSection, NtAllocateVirtualMemory, WriteProcessMemory, memcpy, NtProtectVirtualMemory and NtResumeThread.

QakBot process injection into explorer.exe API log

El DLL inyectado se puede extraer via PE-sieve5 u otras herramientas para un análisis posterior simplificado.

Injected QakBot DLL extracted with PE-sieve

Dependiendo de si la enumeración del proceso anterior dio resultados en la lista, QakBot inyectará  mobsync.exe (ejemplo en vcaso avp.exe el proceso siga en funcionamiento ) en vez de  explorer.exe. Pero por simplificar usamos explorer.exe proceso de inyección que observamos en nuestro entorno de análisis.

Comunicación C2 

Después de evitar la detección, el código QakBot inyectado dentro  explorer.exe comenzará a comunicarse con los servidores C2.

QakBot DLL in explorer.exe C2 communication

Como en versiones anteriores de QakBot la lista de IP de C2 se almacena RC4 cifrado en la sección de recursos311. Los primeros 20 bytes de la sección contienen la clave RC4 con la que se descifra el resto de la sección. Los primeros 20 bytes de los datos descifrados contendrán la suma SHA1 calculada sobre el resto de los datos descifrados. Se utiliza como verificación para el descifrado correcto. A diferencia de la versión anterior, la lista C2 ahora se almacena en forma binaria y ya no como texto ASCII.

QakBot C2 list storage

Para detalles sobre cómo extraer la lista de C2 y la configuración de QakBot ver el script Python3 en el apéndice. La entrada al script es el camino al DLL que QakBot inyectó en el explorer.exe, que previamente extraímos a través de PE-sieve5.

QakBot configuration extraction with Python3 script

La configuración se almacena usando el mismo esquema de cifrado RC4 en la sección de recursos 308. En ella podemos ver el bot y/o el ID de campaña abc103 que está asociado a la muestra analizada. Todavía está almacenado en texto plano de ACSII. Para cada campaña el número se incrementa en uno. Esto permite a los operadores detrás del QakBot llevar un registro de a qué campaña pertenece cada víctima que se conecta a su servidor C2. Otro identificador actualmente observado es  tr02. Este identificador, sin embargo, permaneció igual durante múltiples campañas de malspam.

A través de la conexión C2, los operadores detrás de QakBot pueden controlar remotamente el malware y desplegar módulos maliciosos adicionales.

El QakBot ya no almacenará su configuración y su lista C2 en el disco. Usará el registro para el almacenamiento. i

QakBot using registry for configuration storage

Borrado

La versión anterior de QakBot solía sobreescribir su ejecutable inicial con una copia decmd.exe. Esta versión sobrescribirá con ceros la parte de la DLL descargada inicialmente después del encabezado PE.

Aquí está la entropía del QakBot DLL tal como fue descargada.

QakBot DLL entropy before being overwritten

La puesta a cero de los datos después del encabezado puede verse claramente cuando se compara el trazado anterior con un trazado del archivo DLL después del borrado.

QakBot DLL entropy after being overwritten

Persistencia

El mecanismo de persistencia del QakBot también ha cambiado. Mientras que todavía utiliza una entrada de registro de clave de ejecución en HKCU\Software\Microsoft\Windows\CurrentVersion\Run, esta llave sólo se pone justo antes de que el sistema se apague, reinicie o se ponga a dormir. La DLL correspondiente también sólo se deja caer en el disco justo antes de que el sistema se apague, reinicie o se duerma

Después de que el sistema arranque de nuevo, el QakBot se inicia a través de la tecla de ejecución. El árbol de ejecución también se inicia mediante regsvr32.exe -s ... como la ejecución inicial de Excel. QakBot sigue los mismos pasos que se han descrito anteriormente, lo que resulta en la inyección del proceso enexplorer.exe.

QakBot process tree after reboot

QakBot entonces borrará la entrada del registro de la llave de ejecución y eliminará la DLL que dejó caer en el disco antes del reinicio.gistry entry and delete the DLL it dropped to disk prior to the reboot.

QakBot cleaning persistence

De esta manera la persistencia del QakBot no puede ser detectada en tiempo de ejecución.

Egregor

Aunque ya hemos informado anteriormente de que QakBot entregó el ransomware ProLock ,2 los últimos informes indicaron que el QakBot se utiliza ahora para entregar el ransomware de Egregor. Anteriormente informamos sobre el ransomware Egregor como parte de un artículo sobre ransomware leaksites6 en la que explicamos la práctica de los operadores de ransomware que roban los datos de sus víctimas antes de cifrarlos para extorsionarlas no sólo con el descifrado sino también con la divulgación pública de los datos robados.

Conclusión y contramedidas

De nuestro análisis podemos concluir que QakBot está tratando de evitar los artefactos de archivos persistentes. En la versión anterior, la configuración y el ejecutable de QakBot se almacenaban permanentemente en el disco. Esto facilitó que las herramientas de seguridad los detectaran. La nueva versión trata de evitar dejar permanentemente sus artefactos en el disco. Aunque el QakBot no se queda sin archivos, sus nuevas tácticas seguramente disminuirán su detección.

Pero aunque el QakBot ha cambiado, el mecanismo de entrega detrás de la campaña QakBot «abc[A-Z]+» no lo hizo.

El servicio Spam and Malware Protection, con las tasas de detección más altas del mercado, ya detecta y bloquea la amenaza esbozada.

El servicio  Advanced Threat Protection amplía esta protección detectando también amenazas aún desconocidas.

Referencias

Indicadores de compromiso (IOCs)

Hashes

Los hashes de las muestras de QakBot analizadas son:

MD5 Nombre del archivo Descripción
6bc0584f6cbb74714add1718b0322655 904400.jpg QakBot DLL as downloaded by XLM macro
e23bc27212f61520cfb130185d74cfb1 26e0000.dll Extracted QakBot DLL

MITRE ATT&CK

Las tácticas y técnicas utilizadas por QakBot, tal como se definen en el marco de MITRE ATT&CK, son las siguientes:

Apéndice

Extracción de la configuración de Qakbot Script de Python

import sys
import pefile
from arc4 import ARC4

pe = pefile.PE(sys.argv[1])
c2list = []
for entry in pe.DIRECTORY_ENTRY_RESOURCE.entries:
    for e in entry.directory.entries:
        n = e.name.string.decode()
        data = pe.get_data(e.directory.entries[0].data.struct.OffsetToData, e.directory.entries[0].data.struct.Size)
        data = ARC4(data[:20]).decrypt(data[20:])[20:]
        if n == '311':
            for i in range(1,len(data),7):
                c2 = list(data[i:i+6])
                c2list.append("%d.%d.%d.%d:%d" % (c2[0],c2[1],c2[2],c2[3],(c2[4]<<8)+c2[5]))
        elif n == '308':
            config = data.decode().split()
print("# QakBot Config\n\n```\n" + "\n".join(config) + "\n```\n")
print("# QakBot C2\n\n```\n" + "\n".join(c2list) + "\n```\n")