
Trickbot Malspam se aprovecha del movimiento “Black Lives Matter”
Resumen
El Security Lab de Hornetsecurity ha observado una campaña de malspam distribuyendo TrickBot [1] que se sirve del movimento Black Lives Matter como señuelo para que sus víctimas abran un archivo adjunto malicioso. El documento de descarga de TrickBot comienza inyectando shellcode en el Proceso WINWORD.EXE
. Este shellcode crea un proceso cmd.exe
en el que, posteriormente, se inyectan más partes del mismo shellcode. A continuación, el proceso cmd.exe
descarga la DLL de TrickBot y la ejecuta mediante rundll32.exe
.
Detalles
El correo inicial declara haber sido enviado por un organismo denominado State office
, Country authority
, o Country administration
:
Dicho correo informa a su destinatario de que puede votar o expresar su opinión sobre Black Lives Matter confidencialmente, utilizando frases como Vote confidentially about "Black Lives Matter"
,Tell your government your opinion
, Give your opinion
, o Speak out confidentially
about "Black Lives Matter"
en el asunto o el cuerpo del mensaje.
Adjunto al correo se envía el archivo e-vote_form_0000.doc
, un nombre que sugiere al destinatario que debe tratarse de algún método oficial de votación.
Sin embargo, el documento tan solo contiene una imagen anunciando una falsa actualización de Office junto con instrucciones para "Habilitar la edición" o "Activar contenido":
Si el destinatario sigue las instrucciones, la macro de VBA maliciosa contenida en el documento se ejecuta y descarga el malware TrickBox.
Análisis técnico
La primera parte de la cadena de infección (antes de emplearse el malware TrickBot) se muestra en el siguiente diagrama de flujo:
En el siguiente análisis recorreremos todos los pasos de esta cadena.
La macro de VBA
La macro de VBA está protegida contra su visualización en Word:
Sin embargo, esta "protección" solo evita que Word muestre la macro de VBA sin contraseña. El código de la macro sigue siendo accesible.
Lo primero que hace la macro de VBA es mostrar un falso mensaje de error.
Private Sub Document_Open()
MsgBox "Error #80013123"
Esto provoca el siguiente mensaje emergente:
Esto probablemente constituya un intento de solicitar la interacción del usuario para evitar la detección mediante sandboxes. También podría tratarse de un intento de ocultar el hecho de que no haya documento. La víctima podría darse por satisfecha al recibir este error y asumir que el documento está corrupto.
La macro se vale de las funciones VirtualProtectEx
y CreateThread
para inyectar shellcode en el proceso WINWORD.EXE
. Para hacerlo, el código genera una gran cadena de texto:
uriSubscriber = "i-j-[...]-a-a-a-"
uriSubscriber = uriSubscriber & "i-l-[...]-a-a-"
uriSubscriber = uriSubscriber & "g-k-a-a-p-p-h-f-p-i-[...]-o-g-c-c-p-k-h-c-g-j-h-d"
Esta cadena contiene el shellcode codificado. A continuación, se utiliza la siguiente función para descodificarla:
Dim f() As Byte
ReDim f(0 To Len(uriSubscriber) / 2 - 1) As Byte
Dim sSmart As Long, regOptimize As Long
For Each destEnd In Split(uriSubscriber, "-")
If sSmart Mod 2 Then
regOptimize = sSmart - 1
regOptimize = regOptimize / 2
f(regOptimize) = (CByte(Asc(destEnd)) - CByte(Asc("a"))) + f((sSmart - 1) / 2)
Else
regOptimize = sSmart / 2
f(regOptimize) = (CByte(Asc(destEnd)) - CByte(Asc("a"))) * 16
End If
sSmart = sSmart + 1
Next
Por último, el shellcode descodificado se marca con PAGE_EXECUTE_READWRITE
mediante la función VirtualProtectEx
, renombrada previamente a extensionsComment
, y luego se inicia un hilo con la dirección del shellcode como su dirección inicial, empleando CreateThread
previamente renombrada a sMail
:
Private Declare Function extensionsComment Lib "kernel32" Alias "VirtualProtectEx" ( _
iMail As Long, _
bConsole As Long, _
regFunction As Long, _
tablePosition As Long, _
colMail As Long) As Long
Private Declare Function sMail Lib "kernel32" Alias "CreateThread" ( _
textTimer As Long, _
uriMail As Long, _
m As Long, _
dateMembers As Long, _
textTimer0 As Long, _
lServer As Long) As Long
[...]
sConsole = destN_ - angleTexture + UBound(f)
q = extensionsComment(ByVal ipFunction, ByVal angleTexture, ByVal sConsole, ByVal PAGE_EXECUTE_READWRITE, ByVal VarPtr(extensionsComment0))
adsLogon = sMail(ByVal 0&, ByVal 0&, ByVal destN_, ByVal 2&, ByVal 0, ByVal 0&)
adsScr 5000
El modo más sencillo de extraer el shellcode es analizar CreateThread
en un depurador:
Shellcode en WINWORD.EXE
El shellcode ejecutado en el proceso WINWORD.EXE
empieza por determinar la dirección de determinadas funciones de biblioteca. A continuación, utiliza CreateProcessA
para ejecutar un cmd.exe
con la orden pause
, de modo que cmd.exe
quede en espera:
A continuación, el shellcode emplea la clásica secuencia OpenProcess
, VirtualAllocEx
, WriteProcessMemory
y CreateRemoteThread
para efectuar una inyección de shellcode en el proceso cmd.exe
pausado:
El proceso cmd.exe /c pause
probablemente se esté empleando para evitar la detección. Una técnica empleada habitualmente para inyectar shellcode es crear un proceso suspendido (es decir, pausado) marcándolo con la bandera CREATE_SUSPENDED
durante su creación para, a continuación, inyectar código en el proceso creado y reanudarlo después. En el caso del TrickBot que nos ocupa, por el contrario, el código se inyecta a modo de hilo en el proceso cmd.exe
pausado.
El shellcode inyectado es el mismo que se inyectó anteriormente en el proceso WINWORD.EXE
. Sin embargo, el punto de entrada enviado a CreateRemoteThread
es distinto, lo que provoca un flujo de ejecución distinto para el shellcode inyectado en el proceso cmd.exe
.
Shellcode en cmd.exe
El shellcode inyectado en el proceso cmd.exe
también localiza varias funciones de librería. Además, descodifica las URLs de descarga de TrickBot.
A continuación, el shellcode ejecuta GetSystemMetrics(SM_CXSCREEN)
y GetSystemMetrics(SM_CYSCREEN)
para obtener la resolución de la pantalla. Seguidamente, se ejecuta dos veces GetCursorPos
, con una orden Sleep(0x1388)
entre medias para provocar un retraso de 5 segundos.
Esto probablemente se haga para comprobar que haya movimiento de ratón y, de este modo, burlar a las sandboxes.
A continuación, los datos se codifican en forma de cadena de consulta HTTP del siguiente modo: &scr=1280x1024&cur1=604x250&cur2=622x310
Después de esto, la cadena de consulta de ID &id=00000000
y cadena de consulta de las métricas de sistema mencionadas se añaden a una URL para formar la URL de descarga final que, a continuación, se abrirá con InternetOpenUrlA
:
Si la descarga se efectúa con éxito, el archivo descargado se guarda en C:\\Users\\<username>\\AppData\\Local\\system.rre
y ejecuta mediante rundll32.exe %userprofile%/system.rre,Initialize
empleando la función ShellExecuteA
. El archivo system.rre
es la DLL de TrickBot.
Si la descarga no se efectúa con éxito, el descargador espera para, más adelante, probar una segunda URL de descarga.
Conclusión y soluciones
La doble inyección de shellcode probablemente se emplee para evitar la detección en base al comportamiento, pues WINWORD.EXE
no suele descargar archivos de Internet ni ejecutar rundll32.exe
. Por tanto, es más probable que se detecte antes un comportamiento tan anómalo que el hecho de que cmd.exe
inicie el proceso rundll32.exe
. La consulta de la resolución de pantalla del sistema, así como la doble consulta de la posición del cursor, probablemente se efectúen para evitar el envío de la DLL de TrickBot a sistemas de sandboxing.
El servicio Spam and Malware Protection de Hornetsecurity, con las tasas de detección más elevadas del mercado, ya ha detectado y bloqueado el documento malicioso de TrickBot en base a una firma de detección.
Con todo, si las firmas de detección básicas no hubiesen bloqueado los correos, Advanced Threat Protection (ATP) de Hornetsecurity no se habría visto afectado por los diversos mecanismos antisandboxing. La simulación de interacción humana de la sandbox de ATP es capaz de hacer clic en el falso mensaje de error para permitir la ejecución completa del documento malicioso:
Detecta los procesos creados por el documento, así como las inyecciones de procesos:
La simulación de interacción humana también provoca que las posiciones de cursores consultadas y enviadas como cur1
y cur2
al servidor de descarga de TrickBot sean distintas:
De este modo, la sandbox de ATP de Hornetsecurity no se deja engañar por las diversas técnicas antisandboxing.
Bibliografía
Indicadores de Compromiso (IOCs)
Hashes
SHA256 | Nombre de archivo | Descripción |
---|---|---|
d6a44f6460fab8c74628a3dc160b9b0f1c8b91b7d238b6b4c1f83b3b43a0463d |
e-vote_form_1967.doc |
Documento de descarga de TrickBot |
URLs
hxxps[:]//ppid.indramayukab.go[.]id/may.php?omz=1&pic=b&id=[0-9]{8}&scr=[0-9]{3,4}x[0-9]{3,4}&cur1=[0-9]{3,4}x[0-9]{3,4}&cur2=[0-9]{3,4}x[0-9]{3,4}
hxxps[:]//www.inspeclabeling[.]com/wp-content/themes/processing/may.php?omz=1&pic=b&id=[0-9]{8}&scr=[0-9]{3,4}x[0-9]{3,4}&cur1=[0-9]{3,4}x[0-9]{3,4}&cur2=[0-9]{3,4}x[0-9]{3,4}
DNSs
ppid.indramayukab.go.id
www.inspeclabeling.com