FlokiBot: ¿Una flota de bots?

A principios de octubre, Flashpoint publicó un análisis sobre un anuncio de un foro clandestino acerca de una nueva familia de malware conocida como FlokiBot. Llevó algo de tiempo encontrar una muestra en circulación, pero una investigadora conocida como hasherezade identificó una en VirusTotal a principios de Noviembre. También escribió un análisis de su instalador de malware aquí. Este artículo expone nuestro análisis de FlokiBot hasta el momento.

La variante Zeus

Como dice el anuncio del foro, FlokiBot es otra variante de troyano bancario basado en Zeus desarrollada con el código fuente filtrado Zeus 2.0.8.9. Un rápido vistazo del código binario lo confirma y esta muestra incluso contiene algunas instrucciones de depuración para ayudar a obtener la ingeniería inversa iniciada:

  • Core::init() called.
  • initOsBasic() failed.
  • initBaseConfig() failed.

Además, el inicio de sesión por panel de conexiones a “command and control” (C2) es muy similar al de Zeus:

 

Versión

El malware basado en Zeus tiende a tener un fragmento de código fácilmente identificable que identifica su número de versión.

Esta versión particular es la 12. Las versiones de FlokiBot difieren de otras variantes, ya que no coincide con el formato a.b.c.d tradicional, por ejemplo, 0x02000809 a 2.0.8.9.

Configuración básica

En términos de Zeus, la “configuración básica” de una muestra es la configuración estática incorporada en cada binario. Es una estructura cifrada que comúnmente contiene varios elementos, pero en el caso de FlokiBot solo contiene una clave de cifrado y una URL C2. Utiliza el método tradicional de Zeus para descifrar la configuración básica, que es simplemente un XOR:

La configuración básica de esta muestra es de 1076 bytes de largo y se ve de la siguiente manera:

C2 está resaltado en rojo y la otra porción de datos no \x00 es una clave de cifrado de 258 bytes que se utilizará para proteger las comunicaciones C2.

Revisión de las comunicaciones C2 de Zeus

Zeus utiliza una estructura de datos llamada “binstorage” en sus comunicaciones C2. Está compuesta por un encabezado y un número variable de secciones. El encabezado posee 48 bytes de largo y se puede representar en esta estructura:

  • 20 bytes aleatorios
  • Longitud (DWORD)
  • Marcas (DWORD)
  • Número de secciones (DWORD)
  • Síntesis de MD5 de 16 bytes de datos de sección

Una sección tiene una longitud variable y se puede representar en esta estructura:

  • Tipo (DWORD)
  • Marcas (DWORD)
  • Tamaño comprimido (DWORD)
  • Tamaño descomprimido (DWORD)
  • Datos (longitud variable)

Para las comunicaciones C2, los datos de binstorage se cifran dos veces, primero con un algoritmo basado en XOR que Zeus denomina “cifrado visual”:

La segunda ronda de cifrado utiliza la clave de 258 bytes de la configuración básica. Esta clave es en realidad un valor “S” generado por el algoritmo programado con clave (KSA) de RC4. Se utiliza con un algoritmo de generación seudoaleatorio (PRGA) de RC4 para cifrar los datos del cifrado visual.

Tradicionalmente, Zeus enviaría este binstorage cifrado a través de solicitudes HTTP POST a C2, pero FlokiBot cambia un poco las cosas.

Comunicaciones entre C2 y FlokiBot

Según su anuncio, esperábamos algunos cambios en el protocolo de comunicación:

“La carga utiliza un protocolo de comunicación diferente que no se puede detectar mediante la inspección profunda de paquete, a diferencia de Zeus (los paquetes no se parecen a Zeus). La configuración se transfiere al bot directamente a través de gate.php cifrado. Todos los informes se escriben en HDD y, luego, se transfieren en una única solicitud al centro de conexiones a “command and control”.

A partir de nuestro análisis, podemos decir que los cambios se reducen a dos cosas: añadir un encabezado adicional y, según el tipo de comunicación, codificar los datos como base64. Así de básicos como suenan los cambios, implementan las funciones mencionadas arriba, específicamente algo que “no se parece a Zeus” y que se puede “transferir en una única solicitud”.

El encabezado adicional se puede dividir en un subencabezado y un número variable de secciones binstorage. A continuación, se muestra el subencabezado:

  • Cinco bytes mágicos: \x00\x08\x00\x00\x00

  • Número aleatorio entre 111111 y 999999 (DWORD)

  • Número de secciones binstorage (DWORD)

Cada sección de binstorage incluye dos subencabezados. A continuación, se muestra el primer subencabezado:

  • No modificable 1 (BYTE)

  • Longitud de los datos de binstorage + longitud del segundo subencabezado (12 bytes)

A continuación, se muestra el segundo subencabezado:

  • Mismo número aleatorio que arriba

  • Número de índice que el grupo binstorage, basado en cero (DWORD)

  • Longitud de los datos de binstorage

  • Datos de binstorage como se describió arriba

Luego, este nuevo binstorage comprimido se cifra con cifrado visual y RC4 tal como se mostró anteriormente. Según el tipo de comunicación, los datos cifrados también se codifican con base64 antes de ser enviados a C2 mediante una solicitud HTTP POST. También según el tipo de comunicación, la respuesta de C2 se maneja de manera diferente (abajo se muestra más sobre esto).

En el momento de la escritura, todas las URL de C2 que hemos visto han utilizado HTTPS. Asimismo, también hay un código para comprobar URL de C2 basadas en .onion y, si ese es el caso, dirige el tráfico de C2 a través de un proxy TOR local.

Configuración dinámica

En términos de Zeus, la “configuración dinámica” es un archivo de configuración tomado del servidor C2. Entre otros datos, normalmente contiene URL de C2 adicionales y webinjects (fundamental para los troyanos bancarios). FlokiBot posee dos rutas de código para tomar la configuración dinámica. La primera ruta elige un método más tradicional para solicitar la configuración enviando información del sistema al servidor C2. Descripción general de la información recopilada y los tipos de secciones de binstorage utilizados:

  • SBCID_BOT_ID (10001) – Id. de bot
  • 10021 – dimensiones de la ventana del escritorio
  • 10022 – Síntesis hexadecimal de MD5 de la muestra de malware original
  • 10023 – Valor hexadecimal de 16 bytes codificado desconocido del registro
  • SBCID_BOT_VERSION (10003) – versión de bot
  • SBCID_TIME_SYSTEM (10009) – hora del sistema
  • SBCID_TIME_LOCALBIAS (10011) – Diferencia GMT
  • SBCID_TIME_TICK (10010) – recuento de marcas
  • SBCID_OS_INFO (10012) – Versión de Windows
  • SBCID_LANGUAGE_ID (10013) – Id. de idioma
  • SBCID_IPV4_ADDRESSES (10016) – Dirección IPv4
  • SBCID_IPV6_ADDRESSES (10017) – Dirección IPv6
  • SBCID_NET_LATENCY (10005) – latencia
  • SBCID_TCPPORT_S1 (10006) – Puerto SOCKS

La mayoría de estos (SBCID_Xs) son tipos genéricos de Zeus. Se puede encontrar más información en el código fuente filtrado. Estos datos se comprimen como se describió arriba y se envían a C2 sin codificación base64 adicional.

En respuesta a esto, los datos primero son descifrados con RC4 y descifrado visual. A continuación, se descomprime un grupo de datos del encabezado añadido recientemente (como se describió arriba). Estos datos se pueden separar en dos partes: byte de comando y datos de comando.

Un byte de comando de cero indica una configuración dinámica actualizada. Los datos de comando restantes se descifran con RC4 y descifrado visual, y el texto simple es una estructura binstorage que contiene la configuración dinámica. Un ejemplo y un análisis más legible para el humano de la configuración dinámica se ven de la siguiente manera:

Hay una segunda ruta de código en FlokiBot hacia la función DynamicConfig::updateConfig de Zeus (vea el código fuente filtrado), pero parece un trabajo en curso, es posible que aún haya algo en desarrollo. Crea una sección binstorage del tipo 11003 que almacena un “1” en una DWORD. Se comprime y cifra como arriba, pero codifica los datos cifrados con base64 antes de enviarlos al servidor C2.

Como respuesta desde C2, los datos son descifrados y descomprimidos como arriba. En el momento de la escritura, la única respuesta que hemos observado es un byte de comando de “2” y un binstorage de texto simple vacío como datos de comando.

Webinjects

Los webinjects están visiblemente ausentes en el ejemplo de configuración dinámica anterior. Si bien no se llevó a cabo una exploración profunda de la implementación man-in-the-browser (MITB) para este análisis, un repaso del código sugiere que es la implementación estándar de Zeus. La ausencia de webinjects en este ejemplo posiblemente se debe a que aún no se utilizan en el ataque/la versión específicos que analizamos. Con base en las tendencias de otras variantes de Zeus, no obstante, esperamos ver webinjects cuando haya nuevos ataques/versiones de FlokiBot en circulación.

Comandos del bot

FlokiBot contiene cadenas cifradas. Utiliza el método tradicional de Zeus para descifrarlas:

Habrá una lista completa de cadenas descifradas disponible aquí. Entre ellas hay 26 comandos del bot que proporcionan una descripción general de algunas otras funcionalidades disponibles en FlokiBot:

  • os_shutdown
  • os_reboot
  • bot_uninstall
  • bot_update
  • bot_update_exe
  • bot_bc_add
  • bot_bc_remove
  • bot_httpinject_disable
  • bot_httpinject_enable
  • bot_ddos_start
  • bot_ddos_stop
  • fs_path_get
  • fs_search_add
  • fs_search_remove
  • user_destroy
  • user_logoff
  • user_execute
  • user_cookies_get
  • user_cookies_remove
  • user_certs_get
  • user_certs_remove
  • user_url_block
  • user_url_unblock
  • user_homepage_set
  • user_flashplayer_get
  • user_flashplayer_remove

Funcionalidad DDoS

Los comandos ot_ddos_start y bot_ddos_stop son interesantes. Si bien otras variantes de Zeus han incluido la funcionalidad DDoS, en particular Zeus Gameover, no es una función común. Hay tres ataques DDoS básicos implementados:

  • Inundación de UDP
  • Inundación de la conexión de TCP
  • Inundación de HTTP GET

Investigaciones pasadas acerca de Zeus Gameover sugieren que sus operadores utilizaban la funcionalidad DDoS para atacar bancos mientras les robaban dinero como una manera de distraerlos del asalto. Es demasiado pronto para determinar si esta es la misma idea detrás de la funcionalidad DDoS de FlokiBot. De todas formas, los clientes de Arbor tienen a disposición medidas de defensa contra estos ataques.

Extracción de memoria de Track 2 de tarjetas de crédito

Como se indica en el anuncio y puede observarse en las cadenas descifradas, FlokiBot también contiene una funcionalidad para extraer datos de la memoria de Track 2 de tarjetas de crédito. Al igual que la funcionalidad DDoS, la implementación es bastante básica. Escanea la memoria de procesos infectados en busca de datos que tengan el formato de datos de track 2. Lo hace principalmente buscando si el posible número de identificación bancaria (BIN) del número de cuenta principal (PAN) comienza con 3, 4, 5 o 6 y lo relaciona con los siguientes tipos de tarjeta:

  • Amex, Dinners, JP
  • VISA
  • Mastercard
  • Discovery (sic)

Ejecuta algunas comprobaciones adicionales en los datos para asegurarse de que los dígitos estén donde se supone que deben estar y que el separador de campos “=” esté en el lugar correcto. Si se encuentran datos potenciales de track 2, se exfiltran nuevamente a C2 con la función Report::writeStringFormat de Zeus (vea el código fuente filtrado) y la siguiente cadena de formato:

Keylogger: %s
Track 2: %s

Conclusión

FlokiBot es una nueva variante de troyano bancario basado en Zeus que se está vendiendo en foros clandestinos por un precio considerable ($1000) y, recientemente, comenzó a aparecer en circulación. Sus “funciones fatales” parecen consistir en un protocolo de C2 ligeramente modificado, una funcionalidad de ataque DDoS básico y un extractor de memoria de tarjetas de crédito básico. Es demasiado pronto para evaluar cuán activa está la familia y cuál será el alcance de esta nueva variante, pero, coincidentemente con la redacción de este artículo, apareció una nueva versión (13) en circulación. ASERT continuará monitoreando esta amenaza para determinar si FlokiBot se convertirá en una flota de bots.

  • Posted in ASERT Blog
  • Comentarios desactivados en FlokiBot: ¿Una flota de bots?