Trojan.TrickBot ha estado presente en el panorama de amenazas desde hace bastante tiempo. Escribimos sobre su primera versión en octubre de 2016 . Desde el principio, era un malware modular bien organizado, escrito por desarrolladores con habilidades maduras. A menudo se le llama banquero, sin embargo, su estructura modular permite agregar libremente nuevas funcionalidades sin modificar el robot de núcleo. De hecho, la funcionalidad de un banquero está representada solo por uno de muchos de sus módulos .

Con el tiempo, los desarrolladores ampliaron las capacidades de TrickBot mediante la implementación de nuevos módulos, por ejemplo, el que roba las credenciales de Outlook . Pero la evolución del bot del núcleo, que se usó para el despliegue de esos módulos, fue bastante lenta. Los scripts escritos para descodificar módulos de la primera versión funcionaron hasta hace unos meses, lo que demuestra que el esquema de cifrado utilizado para protegerlos permaneció sin cambios.

Octubre de 2018 marca el final del segundo año desde la aparición de TrickBot. Posiblemente los autores decidieron celebrar el aniversario con un cambio de imagen de algunos elementos significativos del núcleo .

Esta publicación será un análisis de la ofuscación actualizada utilizada por el módulo principal de TrickBot.

Analisis de comportamiento

El último TrickBot comienza sus acciones desde la desactivación de la supervisión en tiempo real de Windows Defender. Se realiza mediante la implementación de un comando de PowerShell:

Después de eso, podemos observar comportamientos típicos de TrickBot.

Como antes, el bot principal implementa múltiples instancias de svchost, donde inyecta los módulos.

La persistencia se logra agregando una tarea programada:

Se instala solo en% APPDATA%, en una carpeta con un nombre que depende de la versión del bot.

Los módulos cifrados se almacenan en la carpeta de Datos (nombre antiguo: Módulos), junto con su configuración:

Resulta que, recientemente, el cifrado de los módulos ha cambiado (y tuvimos que actualizar los scripts para decodificar ).

El nuevo elemento en la carpeta de instalación principal es el archivo de configuración, que viene con varios nombres, que parece ser elegido al azar de un grupo codificado. Es el nombre que aparece con mayor frecuencia es settings.ini (codificado), pero hay otras variantes, como: profiles.ini, SecurityPreloadState.txt, pkcs11.txt. El formato del archivo parece nuevo para TrickBot:

Podemos ver muchas cadenas, que a primera vista parecen codificadas / encriptadas. Pero como resultado, son entradas basura que se agregan para ofuscación. La configuración real se almacena entre ellos, en una cadena que parece codificada en base64. Su significado se explicará en la parte posterior de este post.

Dentro

Para comprender mejor los cambios, necesitamos profundizar en el código. Como siempre, la muestra original viene empaquetada, esta vez hay dos capas de protección que deben eliminarse antes de que obtengamos el robot principal .

El bot principal viene con 2 recursos: RES y DIAL, que son analógicos a los recursos utilizados anteriormente.

RES – es un archivo de configuración encriptado, en formato XML. Está cifrado de la misma manera que antes (usando AES, con clave derivada mediante rondas de hashing), y podemos decodificarlo usando un script antiguo: trickbot_config_decoder.py . (Tenga en cuenta que el primer DWORD en el recurso es un tamaño y no una parte de los datos cifrados, por lo que debe eliminarse antes de usar el script).

DIAL: es una clave pública de curva elíptica (curva ECC p-384), que se utiliza para verificar la firma de la configuración cifrada mencionada, después de que se descifre.

Ofuscación

En la primera edición , TrickBot no estaba del todo confuso, incluso podíamos encontrar todas las cadenas claras. Durante los dos años de evolución, ha cambiado lentamente. Hace varios meses, los autores decidieron ofuscar todas las cadenas, utilizando un algoritmo personalizado (basado en base64). Todas las cadenas ofuscadas se agregan a partir de una única lista codificada:

Cuando se necesita alguno de ellos, se selecciona por su índice y se pasa a la función de decodificación:

Ejemplo – cadena buscada por el índice 162 :

El proceso de deofuscación, junto con la utilidad utilizada , se describió aquí . Debido al hecho de que la API de las funciones de decodificación no cambió desde entonces, se puede utilizar el mismo método hasta hoy. La lista de cadenas deofuscado, extraída de la muestra analizada actualmente se puede encontrar aquí .

Además, podemos encontrar otros métodos más populares de ofuscación de cuerdas. Por ejemplo, algunas de las cadenas que se dividen en trozos, un DWORD por cada uno:

El mismo método fue utilizado por GandCrab, y se puede desenfocar con el siguiente script t.

Del mismo modo, las cadenas de Unicode se dividen:

La mayoría de las importaciones utilizadas por TrickBot se cargan dinámicamente. Eso hace que el análisis estático sea más difícil, porque no podemos ver directamente la imagen completa: los punteros se recuperan justo antes de que se usen.

Podemos resolver este problema de varias maneras, es decir, agregando etiquetas mediante un trazador automático . El archivo CSV / tags creado para una de las muestras analizadas está disponible aquí (se puede cargar en la base de datos de IDA con la ayuda del complemento IFL ).

La imagen que se muestra a continuación muestra el fragmento del código de TrickBot después de cargar las etiquetas. Como podemos ver, las direcciones de las funciones importadas se recuperan de la estructura interna en lugar de la Tabla de importación estándar, y luego se llaman a través de registros.

Aparte de los métodos de ofuscación mencionados, en el camino de su evolución, TrickBot va en la dirección de aleatorización de cadenas. Muchas cadenas codificadas en las versiones iniciales ahora son aleatorias o generadas por máquina víctima. Por ejemplo, el nombre de exclusión mutua:

Cifrado utilizado

En el pasado, los módulos estaban encriptados por AES en modo CBC . La clave utilizada para el cifrado se derivó del hashing de bytes iniciales del búfer . Una vez que conocemos el algoritmo, podríamos descifrar fácilmente los módulos almacenados junto con su configuración.

En la reciente actualización los autores decidieron complicarlo un poco. Sin embargo, no cambiaron el algoritmo principal, solo introdujeron una capa XOR adicional . Antes de pasar los datos a AES, primero se XORed con una cadena de 64 caracteres de longitud generada dinámicamente, a la que nos referiremos como la clave del bot:

La clave bot mencionada se genera por máquina víctima. Primero, se usa la función GetAdapterInfo:

La estructura recuperada (194 bytes) es procesada por SHA256 y luego el hash se convierte en cadena:

El algoritmo reconstruido para generar la clave del bot (y la utilidad para generar las claves) se puede encontrar aquí .

Esta clave se almacena en el archivo de configuración que se ha caído

Configuraciones de codificación

Como se mencionó anteriormente, las nuevas ediciones de TrickBot eliminan un nuevo archivo de configuración, que contiene información codificada. Ejemplo de la información que se almacena en la configuración:

0441772F66559A1C71F4559DC4405438FC9B8383CE1229139257A7FE6D7B8DE9 1085117245 5 6 13

Los elementos:

1. El BotKey (generado por máquina)

2. una suma de comprobación de una cadena de prueba: (0-256 bytes codificados con el mismo conjunto de caracteres): se utiliza para la validación de un conjunto de caracteres

3. tres números aleatorios

La línea completa está codificada en base64 mediante un conjunto de caracteres personalizado, que se genera basándose en el código codificado: «HJIA / CB + FGKLNOP3RSlUVWXYZfbcdeaghi5kmn0pqrstuvwx89o12467MEDyzQjT».

Sin embargo, incluso en este punto podemos ver el esfuerzo de los autores para evitar el uso de patrones repetibles. Los últimos 8 caracteres del conjunto de caracteres se intercambian aleatoriamente. El pseudocódigo del algoritmo de generación:

Aleatorización de los n caracteres:

Ejemplo de la transformación:

inp: “HJIA / CB + FGKLNOP3RSlUVWXYZfbcdeaghi5kmn0pqrstuvwx89o12467 M E Dyz Q jT ”

fuera: “HJIA / CB + FGKLNOP3RSlUVWXYZfbcdeaghi5kmn0pqrstuvwx89o12467 jD E zTy Q M ”

El decodificador se puede encontrar aquí:  trick_settings_decoder.py

Poco a poco mejorando la ofuscación

A los autores de TrickBot nunca les importó mucho la ofuscación. Con el tiempo, lentamente comenzaron a introducir sus elementos, pero, aparte de algunos giros, todavía no es nada complejo. Podemos esperar que esta tendencia no cambie rápidamente, y después de actualizar los scripts para nuevas adiciones, descodificar los elementos de Trick Bot será tan fácil para los analistas como lo fue antes.

Parece que los autores creen en un éxito basado en la cantidad de distribución, en lugar de en intentos de ser sigilosos en el sistema. También se enfocan en agregar constantemente nuevos módulos, para diversificar la funcionalidad (es decir, recientemente, agregaron un nuevo módulo para atacar los sistemas de Punto de Venta ).

Guiones

Scripts actualizados para decodificar módulos TrickBot para analistas de malware: 
https://github.com/hasherezade/malware_analysis/tree/master/trickbot

Indicadores de compromiso

Muestra de hash:

9b6ff6f6f45a18bf3d05bba18945a83da2adfbe6e340a68d3f629c4b88b243a8