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.
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.
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.
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 CreateToolhelp32Snapshot
y Process32{First,Next}W
y enumera los procesos que están ocurriendo.
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 CreateToolhelp32Snapshot
y Process32{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_DEVICEDESC
y SPDRP_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)
o 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
.
El DLL inyectado se puede extraer via PE-sieve5 u otras herramientas para un análisis posterior simplificado.
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.
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.
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.
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
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.
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.
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 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.
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
- 1 https://www.hornetsecurity.com/en/security-information/email-conversation-thread-hijacking/
- 2 https://www.hornetsecurity.com/en/security-information/qakbot-malspam-leading-to-prolock/
- 3 https://www.hornetsecurity.com/en/threat-research/qakbot-distributed-by-xlsb-files/
- 4 https://app.any.run/tasks/2d4eb3c8-6670-4c25-a96b-0cd46c3b6d7c/
- 5 https://github.com/hasherezade/pe-sieve
- 6 https://www.hornetsecurity.com/en/security-informationen-en/leakware-ransomware-hybrid-attacks/
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")