Cientos de URL dentro de Microsoft Excel difunden la nueva variante del troyano Dridex

Plataformas afectadas: Microsoft Windows
Partes afectadas: Usuarios de Windows
Impacto: Recopila información confidencial de las computadoras de las víctimas
Nivel de gravedad: Crítico

Hace solo unos días, FortiGuard Labs capturó una campaña de phishing en la que un documento malicioso de Microsoft Excel entregado como un archivo adjunto de correo electrónico estaba difundiendo una nueva variante de Dridex. Dridex es un malware troyano, también conocido como Bugat y Cridex, que es capaz de robar la información bancaria y del sistema en línea de una víctima de una máquina infectada.

Analicé profundamente el documento de Excel, así como el archivo de carga útil Dridex descargado por la macro maliciosa en el documento de Excel. En esta publicación, proporciono la siguiente información: cómo se descarga la carga útil de Dridex mediante la macro, cómo se inicia el archivo de carga útil de Dridex, qué técnicas utiliza para realizar el antianálisis, qué información recopila de la máquina de la víctima y cómo se recopila. la información se envía a su servidor C2. 

La campaña de phishing incluye un documento de Microsoft Excel con cientos de URL de descarga

El correo electrónico de phishing incluido en la campaña de phishing detectada, en la Figura 1.1, se muestra después de que se abrió en mi cliente de correo electrónico local. Se disfrazó como un correo electrónico de solicitud de pago con un archivo de factura de Excel falso adjunto. Si una víctima hace doble clic en el archivo adjunto, Microsoft Office Excel lo abre. 

Figura 1.1. Contenido de correo electrónico de phishingFigura 1.1. Contenido de correo electrónico de phishing

Además del archivo adjunto, hay un hipervínculo incluido en el cuerpo del correo electrónico. Al hacer clic en él, se descarga el mismo archivo de Excel. 

Como puede ver en la Figura 1.2, Microsoft Excel muestra una barra amarilla con un mensaje de Advertencia de seguridad, lo que significa que el archivo abierto contiene contenido activo de riesgo como una macro VBA. Sin embargo, una vez que la víctima presiona el botón «Habilitar contenido», el contenido de riesgo se carga e incluso se ejecuta automáticamente. El documento de Excel muestra deliberadamente una factura vaga en el archivo para que la víctima haga clic en el botón para ver la factura con más claridad.

Figura 1.2. Abrir el archivo adjunto en el proceso de Office ExcelFigura 1.2. Abrir el archivo adjunto en el proceso de Office Excel

Según mi análisis, este archivo contiene una macro maliciosa (código VBA) que se puede ejecutar de dos maneras. La primera es hacer clic en el botón verde «Abrir y pagar» para ejecutar el código VBA malicioso. La otra forma es cuando ocurre un evento Layout, tiene una función privada Formsa_Layout () para manejar tal evento que ejecuta el código VBA malicioso. Tal evento de Layout ocurre muchas veces mientras la víctima está trabajando en el archivo.

Figura 1.3. Ventana emergente al abrir el proyecto VBA protegidoFigura 1.3. Ventana emergente al abrir el proyecto VBA protegido

El código VBA está protegido con contraseñas y propiedades especiales. Una vez que el usuario intenta ver el proyecto VBA, aparece un mensaje de advertencia, como se muestra en la Figura 1.3. Modificar su archivo binario puede saltar sobre la detección de protección. Al revisar el código VBA, descubrí que puede decodificar y ejecutar un fragmento de código VBA dinámico que contiene una URL seleccionada al azar de alrededor de 290 URL de descarga codificadas. Estas URL de descarga están codificadas y ocultas (su color de fuente se estableció en blanco, el mismo que el color de fondo) en la primera hoja del documento de Excel.

La Figura 1.4 muestra una lista parcial de las URL codificadas, comenzando por la celda número A720, donde configuré su color de fuente en negro.

Figura 1.4. Cientos de URL de descarga codificadasFigura 1.4. Cientos de URL de descarga codificadas

Existe una función de trabajo llamada printerSave () que decodifica el código VBA dinámico en cadena, que luego se ejecuta en la función API ExecuteExcel4Macro ().

Como puede ver en la Figura 1.5, ExecuteExcel4Macro () recibe un parámetro de cadena, que es el código VBA decodificado, después de llamar a la función repl (). Para que comprenda mejor el código, imprimí todo el código VBA dinámico decodificado en la subventana «Inmediato».

Figura 1.5. Descarga de código decodificado y ejecución de la carga útil de DridexFigura 1.5. Descarga de código decodificado y ejecución de la carga útil de Dridex

Si está familiarizado con el código VBA, sabrá que se crean dos carpetas con nombres de cadenas aleatorios («J1fljSfQ» y «QVluls2»). A continuación, descarga una de las 290 URL «https [:] // umeskin [.] Com / 4i1sgz [.] Pdf» al archivo local «bLAZ6Ji». en la carpeta «C: \ J1fljSfQ \ QVluls2 \». El nombre de este archivo local también es aleatorio.

La última línea inicia el archivo descargado mediante el proceso «regsvr32.exe» con el parámetro «-s». El archivo descargado es el archivo de carga útil de Dridex. Por lo tanto, el documento de Excel se utiliza como descargador de Dridex. 

Desembalaje de Dridex en Regsvr32.exe y funciones de exportación

Dridex se ejecuta en el proceso regsvr32.exe, que es un proceso de utilidad de línea de comandos de Microsoft Windows que se utiliza para registrar y anular el registro de DLL y controles ActiveX en el Registro del sistema operativo. El archivo de carga útil Dridex descargado es uno de estos archivos DLL. La Figura 2.1 es una captura de pantalla del árbol de procesos que ejecuta Dridex en “regsvr32.exe”.

Figura 2.1. Árbol de procesos que ejecuta Dridex en regsrv32.exeFigura 2.1. Árbol de procesos que ejecuta Dridex en regsrv32.exe

Regsvr32.exe carga el archivo de carga de Dridex y llama a su función DllEntryPoint () para realizar el trabajo de inicialización. 

Tiene un bloque de datos encriptados de tamaño 7B600H, con datos y código. Se descifra y se extrae en un búfer de memoria recién creado. Luego salta al código descifrado, cuya dirección se cargó en EAX. Todo el proceso parece un procedimiento de desempaquetado. La Figura 2.2 muestra el contexto del código cuando está a punto de saltar al código extraído.

Figura 2.2. El código antes de ejecutar el código extraídoFigura 2.2. El código antes de ejecutar el código extraído

La ejecución del código puede descifrar y extraer un archivo PE completo, que es el módulo principal de Dridex, en la memoria. Luego, implementa el archivo PE en un espacio ejecutable. El proceso es como la forma en que el sistema operativo Windows carga un archivo EXE para ejecutar, que incluye, entre otros, copiar secciones en direcciones virtuales relativas (RVA), cargar API importadas, ajustar datos de reubicación, etc.

Una vez realizado todo el trabajo anterior, la función de punto de entrada del PE extraído es finalmente llamada por un fragmento de código ASM, como se muestra en la Figura 2.3. Utiliza el código ASM «push edx» y «retn», que es similar a «jmp edx» aquí.

Figura 2.3. Ir al punto de entrada del módulo principal de Dridex extraídoFigura 2.3. Ir al punto de entrada del módulo principal de Dridex extraído

 Después del doble desembalaje anterior, el módulo central Dridex ya está disponible.

Al revisar el núcleo de Dridex, encontrará que hay dos funciones de exportación en él: “DllEntryPoint ()” y “DllRegisterServer ()”. “DllEntryPoint ()” es el que se llama en la Figura 2.3.  

Cada archivo DLL que se puede registrar a través de «regsvr32.exe» tiene que proporcionar una función de exportación denominada «DllRegisterServer ()». MSDN (Microsoft Developer Network) dice que esta función «Indica a un servidor en proceso que cree sus entradas de registro para todas las clases admitidas en este módulo de servidor».

Recuerde que todavía estamos dentro de la función DllEntryPoint () que originalmente llamó “regsvr32.exe”. En la función Entry Point del núcleo Dridex, realiza algunos trabajos de inicialización. Cuando «regsvr32.exe» recibe un «1» de esta función, significa que el trabajo de inicialización ha finalizado correctamente. “Regsvr32.exe” luego llama a la API GetProcAddress () para averiguar la dirección de la función de exportación de “DllRegisterServer ()” con su nombre. La Figura 2.4 es una captura de pantalla tomada cuando «regsvr32.exe» llama a la API GetProcAddress () para obtener la función de exportación «DllRegisterServer ()» del núcleo Dridex.

Figura 2.4. "Regsvr32.exe" llama a GetProcAddress () para obtener DllRegisterServer ()Figura 2.4. «Regsvr32.exe» llama a GetProcAddress () para obtener DllRegisterServer ()

Técnicas anti-análisis utilizadas en Dridex

El desarrollador de Dridex pone todo su trabajo malicioso en la función DllRegisterServer (), que puede considerarse como la función Main () de otros procesos normales.

Se observan muchas técnicas de anti-análisis en el núcleo de Dridex para evitar que se analice su código. En esta sección, presentaré algunos de ellos.

API oculta 

La mayoría de las funciones de la API de Windows están ocultas y se recuperarán antes de llamar. Esto crea más dificultades para el análisis estático. Una función (denominada GetAPIByHash () en esta publicación) recupera la API por su código hash. 

Figura 3.1 Ejemplo de recuperación de API RegEnumKeyW ()Figura 3.1 Ejemplo de recuperación de API RegEnumKeyW ()

La Figura 3.1 muestra un ejemplo de cómo recuperar la API RegEnumKeyW () usando GetAPIByHash () que requiere dos argumentos. El primero es un valor hash (68EFDF75h) del código CRC32 XORed del módulo llamado “ADVAPI32.DLL” (todo en mayúsculas) con la constante 6AECC489h. El segundo es el valor hash (0A7373679h) del código XORed CRC32 de la API denominada “RegEnumKeyW” con la constante 6AECC489h. 

En este caso, el código CRC32 de “RegEnumKeyW” es CDDBF2F0H, que al ser XORed con la constante 6AECC489h es igual a 0A7373679h.

GetAPIByHash () enumera todas las API en un módulo especificado para descubrir una API comparando el código hash pasado en el parámetro. Devuelve la dirección de API en EAX cuando coincide.

Las cadenas están cifradas

Las cadenas de claves están encriptadas en todo el núcleo de Dridex. Por lo tanto, los analistas no pueden encontrar sus comportamientos simplemente buscando cadenas clave en su espacio de memoria. Al igual que la API oculta, las cadenas se descifran antes de su uso. La Figura 3.2 es un ejemplo de cómo descifrar una cadena Unicode «POST». La función 813B00 es la función de descifrado que toma tres argumentos. ECX era el índice (0 para «GET», 1 para «POST») de la cadena a descifrar. 8296D0 apunta al búfer de la cadena cifrada.

Figura 3.2 Ejemplo de descifrado de "POST"Figura 3.2 Ejemplo de descifrado de «POST»

Generando una excepción a la API de llamadas

Este malware no solo tiene API ocultas, como se explicó anteriormente, sino que también usa un truco al llamar a estas API ocultas. Volviendo a la Figura 3.1, tiene el código ASM “int 3” en la parte inferior, lo que genera una excepción con el código 80000003 (la trampa BREAKPOINT). Interrumpe la ejecución y espera hasta que se procese la excepción.

Dridex logró configurar un controlador de excepciones (una función local como un bloque Try… Catch) en su función de punto de entrada. Para hacer esto, llama a la API RtlAddVectoredExceptionHandler () para agregar una función local como manejador de excepciones. De esta forma, siempre que Dridex cause alguna excepción, esta función local se llama primero para manejarla. 

Mientras se llama al manejador de excepciones local, en el argumento hay un _EXCEPTION_RECORD de datos que contiene la información de la excepción y una estructura de contexto con valores de todos los registros en la excepción, donde el registro EAX contiene la API que se llama. Luego inserta el valor EAX en la pila y modifica los valores de otros registros, como EIP y ESP. Al final de la función, devuelve 0FFFFFFFFh (-1), que significa EXCEPTION_CONTINUE_EXECUTION, indicando al sistema que restaure todos los registros con valores modificados. Finalmente, ejecuta el proceso desde la siguiente línea de la línea de excepción, donde se llamará a la API desde la pila con los argumentos, todos los cuales se enviaron a la pila antes de que ocurriera la excepción.

Este es el mecanismo completo de cómo Dridex usa una excepción para llamar a una API. La Figura 3.3 muestra la función del manejador de excepciones local.

Figura 3.3 Vista de la función del manejador de excepciones localFigura 3.3 Vista de la función del manejador de excepciones local

Aparte de esto, si Dridex es adjuntado por un depurador que realiza un seguimiento de un solo paso, puede generar una excepción EXCEPTION_SINGLE_STEP (código 80000004). El controlador de excepciones local puede identificar esta excepción y modificar el valor del registro para que Dridex se bloquee para protegerse de ser analizado y depurado. 

Envío de información recopilada al servidor C2

En la función DllRegisterServer (), Dridex recopila información de la máquina de la víctima y luego envía la información a sus servidores C2. En esta sección, explicaré cómo Dridex hace esto.

Primero, obtiene el nombre de usuario de la víctima y el nombre completo de la computadora. Luego lee el tiempo de instalación de Windows del registro del sistema. Los valores anteriores se juntan y se hace un valor MD5 con ellos. La primera parte (2Fh de largo) del paquete consta de la longitud de los datos + el nombre de la computadora + el valor MD5. A continuación, se adjuntan al búfer de paquetes los datos VolumeInformation (valor hexadecimal de 20 horas de duración) obtenidos llamando a la API GetVolumeInformationW (). Los siguientes datos son un valor de palabra constante «29 3B» y una palabra clave de las versiones del sistema combinadas de API GetVersion (). “18F8C844h” es el ID de paquete adjunto al paquete. Para obtener más información, puede consultar la Figura 4.2.

Dridex recopila toda la información del software instalado del registro del sistema de la víctima. Navega a la subclave “HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall” y enumera todas las subclaves, de las cuales lee sus valores DisplayName y DisplayVersion. En «Desinstalar» tiene toda la información de registro del software instalado para usar en la desinstalación.

Por ejemplo, la información de lectura para 7-Zip es “7-Zip 18.05 (18.05)”, como se muestra en la Figura 4.1.

Figura 4.1 Información de la subclave 7-Zip instaladaFigura 4.1 Información de la subclave 7-Zip instalada

La longitud (una palabra en orden de bytes de la red) y toda la información recopilada del software se agregarán al paquete.

La última parte del paquete proviene de las variables de entorno del sistema de la víctima. Para hacer esto, Dridex llama a la API GetEnvironmentStringsW (), que devuelve un puntero a un bloque de memoria que contiene las variables de entorno. A continuación, se formatean y se adjuntan al paquete después de la información de software recopilada. 

La Figura 4.2 muestra el esquema del paquete, donde los valores subrayados en rojo son la longitud de los datos seguidos en el orden de bytes de la red, y los valores divididos con la barra vertical azul son campos de datos que he explicado anteriormente.

Figura 4.2. Dridex recopiló datos de mi máquina de pruebaFigura 4.2. Dridex recopiló datos de mi máquina de prueba

Todos los datos recopilados se cifrarán mediante un algoritmo RC4 para protegerlos durante la transmisión. Esto significa que el paquete final comenzará con un valor dword CRC32 de todos los datos del texto cifrado, y el texto cifrado seguirá.

Figura 4.3 Visualización de la IP del servidor C2 codificada y los puertos en binarioFigura 4.3 Visualización de la IP del servidor C2 codificada y los puertos en binario

Esta variante de Dridex tiene cuatro servidores C2 que están codificados en binario, tal como se muestra en la Figura 4.3. Dridex repite el envío del paquete final hasta que se recibe un paquete de respuesta con el estado HTTP «200 OK».

Para hacerlo, llama a estas API: InternetOpenA (), InternetConnectW (), HttpOpenRequestW (), HttpSendRequestW () e InternetReadFile (), todas las cuales son recuperadas por GetAPIByHash ().

Hasta ahora, todavía no hemos recibido la respuesta «200 OK» de esos servidores C2. Por lo tanto, no sabemos qué otras tareas nos esperan para esta campaña de Dridex. Seguiremos monitoreándolo.

Conclusión

En esta publicación, ha aprendido cómo esta variante de Dridex se estaba difundiendo a través de un correo electrónico de phishing, cómo la macro maliciosa en su documento de Excel adjunto descargó la carga útil de Dridex de cientos de URL. También expliqué el proceso de carga del archivo de carga útil en regsvr32.exe y qué tipo de técnicas usa Dridex para protegerse de ser analizado. Y finalmente, demostré qué información se puede recopilar de la máquina de la víctima y cómo la obtiene, así como cómo se procesan y envían los datos a sus servidores C2.

Fuente: https://www.fortinet.com/blog/threat-research/hundreds-of-urls-inside-microsoft-excel-spreads-new-dridex-trojan-variant

Daniel Perez

Daniel Perez

Dejar un comentario

Este sitio web utiliza cookies para garantizar que obtenga la mejor experiencia. Más información