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:

Correo inicial de TrickBot.

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":

Documento de TrickBot.

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:

Cadena de infección inicial de TrickBot.

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:

Macro protegida de TrickBot.

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:

Mensaje de error falso de TrickBot

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:

Extracción de código de TrickBot mediante x64dbg.

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:

Shellcode de TrickBot creando un proceso cmd.exe con la orden pause

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:

Inyección de shellcode de TrickBot en el proceso cmd.exe.

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.

TrickBot reconociendo el sistema.

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:

TrickBot empleando InternetOpenUrlA para descargar.

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:

Sandbox de Advanced Threat Protection de Hornetsecurity haciendo clic en el botón

Detecta los procesos creados por el documento, así como las inyecciones de procesos:

Sandbox de Advanced Threat Protection de Hornetsecurity detectando la inyección 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:

Conexión a Internet en sandbox de Advanced Threat Protection de Hornetsecurity

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

SHA256Nombre de archivoDescripción
d6a44f6460fab8c74628a3dc160b9b0f1c8b91b7d238b6b4c1f83b3b43a0463de-vote_form_1967.docDocumento 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