Análisis de malware

Ataque de malware de informe de errores de Windows (WER) sin archivos: descripción técnica y tutorial

18 de marzo de por Pedro Tavares

En octubre de, se observó en estado salvaje un malware recién descubierto llamado Kraken. Este malware malicioso abusa del servicio Informe de errores de Windows para evadir la detección.

Este artículo cubre los detalles principales del ataque Kraken: cómo funciona, detalles detallados sobre cómo se inyecta el código shell en la memoria y algunas medidas preventivas para mitigar este tipo de amenaza.

¡Conviértete en un ingeniero inverso certificado!

Obtenga capacitación práctica en vivo sobre análisis de malware desde cualquier lugar y conviértase en un analista certificado de ingeniería inversa. Comienza a aprender

Del archivo de macro a la inyección de memoria

Los expertos de Malwarebytes han identificado una nueva cadena de ataque llamada Kraken, una inyección sin archivos en el servicio de Informe de errores de Windows.

La amenaza probablemente se difunde mediante ingeniería social y el archivo malicioso se encuentra dentro de un archivo ZIP distribuido junto con el correo electrónico malicioso. El archivo malicioso es un documento de Word denominado “Compensation manual.doc” que contiene contenido falso para atraer a las víctimas. El documento pretende incluir información sobre los derechos de compensación de los trabajadores.

1: Documento de Word con el contenido malicioso del ataque Kraken

Dentro del documento malicioso, está disponible una versión modificada de CactusTorch (lanzador de shellcode). En detalle, el módulo VBA utiliza la técnica DotNetToJscript para cargar un binario compilado en .NET en la memoria y ejecutarlo desde VBScript.

Al analizar las macros codificadas en él, podemos observar dos desencadenantes iniciales: llamadas AutoOpen() y AutoClose(). AutoOpen() solo muestra un mensaje de error, mientras que AutoClose() es la función que realiza toda la actividad.

Como se observa en la 2, podemos encontrar una función que decodifica la carga útil codificada en hexadecimal.

2: Primera etapa del ataque Kraken.

Al analizar el código, podemos comprender que la carga útil hexadecimal es un objeto serializado .NET después de decodificarlo. El objeto serializado contiene una DLL llamada “kraken.dll” que se inyecta en la memoria mediante una técnica conocida como inyección de DLL.

Si observa la 3 a continuación, podemos ver algunas llamadas relacionadas con objetos serializados y el comienzo de la DLL maliciosa ( encabezado MZ ).

3: Identificación de funciones de serialización y inicio de la DLL maliciosa: carga útil de Kraken

Analicemos la carga maliciosa y busquemos el nombre de la DLL de destino: Kraken.dll.

4: El nombre de la DLL de destino se puede encontrar recorriendo la carga útil

Durante esta tarea, la carga útil crea un objeto BinaryFormatter de serialización y luego utiliza las funciones de deserialización para “recuperar” la carga útil original deserializar. Después de eso, la DLL final se construye dentro de un objeto MemoryStream llamado stm y se inyecta byte a byte. Finalmente, la DLL completa (un objeto .NET) se inyecta en la memoria mediante la función DynamicInvoke.

5: Proceso de construcción del objeto inyectado en la memoria mediante una llamada DynamicInvoke y que contiene la DLL maliciosa

Profundizando en el cargador Kraken (Kraken.dll)

Después de ejecutarse en la memoria, Kraken.dll ejecuta una carga útil incrustada en la memoria utilizando un identificador del proceso WerFault.exe. Esta no es la primera vez que se inyecta shellcode en el proceso WerFault.exe; Anteriormente se vio a NetWire RAT y Cerber ransomware utilizando este proceso específico para realizar sus tareas.

En detalle, WerFault.exe es un servicio que muestra algún error ocurrido con el sistema operativo, las funciones o aplicaciones de Windows. Las víctimas asumirían que se produce algún error, pero los atacantes ejecutan malware de forma sigilosa utilizando el proceso.

Como se puede observar en la 6, el cargador contiene dos clases principales: “Kraken” y “Loader”.

6: Clases principales de Kraken.dll

La clase Kraken contiene en su interior una carga útil especialmente diseñada que luego se inyecta en el proceso WerFault.exe, como se mencionó anteriormente. El código shell es una variante de una carga útil de Cobalt Strike y pretende evadir su detección mediante el uso de este proceso legítimo de Windows.

7: Shellcode de Kraken y el proceso de destino utilizado durante la inyección del shellcode

Según Malwarebytes, “la clase Loader es responsable de inyectar código shell en el proceso de destino mediante llamadas a la API de Windows”.

8 : Función de carga: donde el código shell se inyecta en la memoria

Al analizar este fragmento de código, podemos concluir que la técnica de inyección de proceso se realiza utilizando un controlador de una sección creada. Luego, el código shell de destino se agrega mediante la función CopyShellcode y finalmente se ejecuta en la memoria mediante las llamadas WriteProcessMemory y ResumeThread (una técnica bien documentada aquí ).

El análisis del código shell

Después de ejecutar el shellcode en memoria en el contexto del proceso WerFault.exe, algunas tareas se realizan en múltiples subprocesos para dificultar su análisis.

Una de las operaciones ejecutadas es si el proceso se está depurando. En detalle, esta tarea se realiza comprobando la existencia de un depurador que llama a la llamada nativa GetTickCount desde Windows.

9: Técnica antianálisis utilizada por el cargador Kraken ( fuente ).

También se utilizan otras técnicas para realizar antidepuración y antianálisis, incluida la verificación de las siguientes llamadas: IsProcessorFeaturePresent(), NtGlobalFlag() e isDebuggerPresent().

Después de realizar estas comprobaciones para garantizar que la carga útil se ejecuta en una máquina real y no dentro de un entorno virtualizado, la tabla de direcciones de importación (IAT) se resuelve dinámicamente y se ejecuta un código de shell final en un nuevo hilo.

Lista de llamadas resueltas:

Asignación virtual

Protección virtual

Crear hilo

AllocEx virtual

VirtualProtectEx

Memoria de proceso de escritura

ObtenerEnvironmentVariableW

CrearProcesoW

Crear hilo remoto

ObtenerThreadContext

Establecer contexto de subproceso

Reanudar hilo

En detalle: después de resolver el IAT, se crea una nueva región en la memoria usando la llamada nativa VirtualAlloc, que llama a la función DecryptContent_And_WriteToAllocatedMemory codificada dentro del shellcode y responsable de descifrar el shellcode que se inyectará.

A continuación, se utiliza la llamada VirtualProtect para cambiar la protección de la memoria recién asignada para hacerla ejecutable. Luego se crea un nuevo hilo que utiliza la llamada CreateThread en el contexto del proceso inicial para ejecutar el código shell.

10: Shellcode final ejecutado en un nuevo hilo

Después de ejecutar este nuevo código shell en la memoria, ejecuta una solicitud HTTP para obtener otra carga útil, probablemente la última etapa de Kraken. Como menciona Malwarebytes, la etapa final no se obtuvo, ya que la URL externa estaba inactiva en el momento de la investigación.

Pensamientos finales

Aunque las técnicas, tácticas y procedimientos utilizados por Kraken no son nuevos, abusar del proceso WerFault puede traer ventajas a los adversarios para evadir la detección, ya que este proceso no suele ser analizado ni analizado por antivirus y EDR.

Además, el servicio de informe de errores de Windows werfault.exe es un proceso que permite a Microsoft rastrear y solucionar errores relacionados con el sistema operativo, las funciones y aplicaciones de Windows.

Volviendo a esta amenaza, no existe ninguna medida de mitigación eficaz para combatirla. Sin embargo, existen algunos pasos para hacer que su sistema sea lo más resistente posible contra el malware:

Por último, pero no menos importante, si nota algo extraño o poco común, comparta sus sospechas con alguien y, si es posible, con el equipo de ciberseguridad de su empresa.

Fuentes

Análisis Kraken , Malwarebytes

Noticias de última hora Kraken , ZDNet

Agregue un comentario

Su dirección de correo no se hará público. Los campos requeridos están marcados *