Como parte de nuestra serie sobre troyanos bancarios de América Latina, en esta oportunidad presentamos Mekotio, un troyano bancario que apunta principalmente a Brasil, Chile, México, España, Perú y Portugal cuya característica más notable en las variantes más recientes es el uso de una base de datos SQL como servidor de C&C. Si bien recientemente publicamos un artículo sobre Mekotio, el mismo es un análisis de una variante en particular de este troyano que en ese caso apunta principalmente a usuarios de Chile. Sin embargo, en esta publicación el objetivo es brindar panorama general a partir del análisis del comportamiento de un conjunto de variantes de Mekotio y destacar las principales características de este troyano bancario, así como su desempeño a lo largo del tiempo.

Figura 1. Países afectados por Mekotio, donde Brasil es el país más afectado por este troyano bancario.

Al igual que ha ocurrido con muchos de los otros troyanos bancarios latinoamericanos que hemos descrito anteriormente en esta serie, el desarrollo de Mekotio a lo largo del tiempo ha seguido un camino bastante caótico y sus características han sido modificadas con mucha frecuencia. Según su versión interna, creemos que se están desarrollando múltiples variantes de este código malicioso de manera simultánea. Sin embargo, al igual que ocurre con Casbaneiro, estas variantes son prácticamente imposibles de separar entre sí, por lo que nos referiremos a todas ellas como Mekotio.

Características de Mekotio

Mekotio es un típico troyano bancario latinoamericano que ha estado activo desde al menos 2015. Como tal, su forma de atacar es desplegando a la víctima ventanas emergentes falsas con el objetivo de convencerla para que divulguen información confidencial. Estas ventanas emergentes están cuidadosamente diseñadas para suplantar la identidad de diferentes entidades bancarias latinoamericanos, así como otras instituciones financieras.

Mekotio recopila la siguiente información sobre sus víctimas:

  • Configuración del firewall
  • Si la víctima tiene privilegios de administrador
  • Versión del sistema operativo Windows instalado
  • Si están instalados productos de protección antifraude, más específicamente GAS Tecnologia Warsaw e IBM Trusteer [1]
  • Lista de soluciones antimalware instaladas en el equipo

Mekotio garantiza la persistencia en el equipo de la víctima mediante el uso de una llave Run o creando un archivo LNK en la carpeta de inicio.

Como es común en la mayoría de los troyanos bancarios latinoamericanos que hemos analizado en esta serie, Mekotio cuenta con varias capacidades que son típicas de un backdoor. En este sentido, puede tomar capturas de pantalla, manipular ventanas, simular acciones del mouse y del teclado, reiniciar la máquina, restringir el acceso a varios sitios web bancarios y actualizarse. Algunas variantes también pueden robar bitcoins reemplazando una billetera bitcoin en el portapapeles y exfiltrar las credenciales almacenadas por el navegador Google Chrome. Curiosamente, uno de los comandos parece tener como objetivo paralizar la máquina de la víctima al intentar eliminar todos los archivos y carpetas en C:\Windows tree.

Una forma de identificar Mekotio es un cuadro de mensaje específico que el troyano muestra en varias ocasiones (consulte la Figura 2).

Figura 2. Cuadro de mensaje utilizado por todas las variantes de Mekotio (traducción del portugués: “¡Actualmente estamos realizando actualizaciones de seguridad en el sitio! ¡Inténtelo de nuevo más tarde! Se están adoptando nuevas medidas de seguridad: (1) nuevo complemento de seguridad y (2) nuevo diseño del sitio. Su sistema se reiniciará para completar la operación").

Para facilitar el robo de contraseñas mediante su función de keylogger, Mekotio desactiva la opción "Autocompletar" en Internet Explorer. Esta función, cuando está habilitada, ahorra tiempo a los usuarios de Internet Explorer al recordar campos que se han completado previamente. Mekotio desactiva esta función cambiando los siguientes valores del Registro de Windows:

  • HKCU\Software\Microsoft\windows\CurrentVersion\Explorer\AutoComplete\
    • AutoSuggest = “No”
  • HKCU\Software\Microsoft\Internet Explorer\Main\
    • Use FormSuggest = “No”
    • FormSuggest Passwords = “No”
    • FormSuggest PW Ask = “No”

Como mencionamos al comienzo de este artículo, para un análisis en profundidad de una variante en particular de Mekotio que apunta principalmente a Chile, lea este artículo publicado recientemente por ESET.

Distribución de Mekotio

Creemos que el principal método de distribución de Mekotio es el spam (consulte la Figura 3 para ver un ejemplo). Desde 2018, hemos observado 38 cadenas de distribución diferentes utilizadas por esta familia. La mayoría de estas cadenas constan de varias etapas y terminan descargando un archivo ZIP, lo cual es típico en los troyanos bancarios latinoamericanos. En las siguientes secciones analizamos las dos cadenas más utilizadas.

Figura 3. Ejemplo de un correo spam que distribuye Mekotio.

 

Cadena 1: pasando contexto

La primera cadena consta de cuatro etapas consecutivas, como se ilustra en la Figura 4. Un simple BAT droppea un downloader en VBScript y lo ejecuta usando dos parámetros de línea de comando: un verbo HTTP personalizado [2] ("111SA") y una URL desde la cual descarga la siguiente etapa. El downloader descarga la siguiente etapa (otro downloader) desde la URL proporcionada mientras usa un valor de User-Agent personalizado ("MyCustomUser" y sus variaciones). La tercera etapa descarga un script de PowerShell, corrigiendo la URL desde la cual descargar Mekotio dentro del cuerpo del script, antes de ejecutarlo. Luego, el script de PowerShell descarga Mekotio desde la URL corregida y lo instala y ejecuta (el proceso de ejecución se describe en detalle más adelante).

Figura 4. Una cadena de distribución utilizada por Mekotio que pasa contexto entre etapas

Hay dos cosas interesantes sobre esta cadena. La primera es el uso de valores personalizados tanto para el encabezado User-Agent como para el verbo HTTP. Estos se pueden utilizar para identificar parte de la actividad de la red de Mekotio.

El otro aspecto interesante es el paso de contexto (ya sea como argumentos de línea de comando o modificando el cuerpo de la siguiente etapa). Esta es una forma simple, pero efectiva, de antianálisis, porque si tiene el Downloader 1 sin el Dropper correspondiente, no tendrá ni la URL ni el verbo HTTP personalizado necesario para obtener la siguiente etapa del malware. Asimismo, tener Downloader 3 sin Downloader 2 es inútil, porque falta la URL. Este enfoque dificulta el análisis si no se tiene conocimiento del contexto.

Cadena 2: MSI con JavaScript embebido

Como ocurre con muchos otros troyanos bancarios latinoamericanos: Mekotio utiliza MSI en algunas de sus últimas cadenas de distribución. En este caso, la cadena es mucho más corta y menos robusta, ya que solo un único JavaScript, que sirve como etapa final, se integra en el MSI y se ejecuta.

En comparación con la etapa final de PowerShell de la cadena anterior, existen algunas similitudes visibles. La principal (que se muestra en la Figura 5) es la rutina de instalación, llamada después de descargar y extraer el archivo ZIP, que cambia el nombre de los contenidos del archivo ZIP extraído según el tamaño del archivo. Eso está estrechamente relacionado con el método de ejecución que se describe en la siguiente sección.

Figura 5. Comparación de la rutina de instalación en JavaScript y scripts de PowerShell utilizados por Mekotio, destacando la similitud al basar la decisión en el tamaño del archivo

Ejecución mediante el abuso del intérprete de AutoIt

Mekotio se ejecuta más comúnmente abusando del intérprete legítimo de AutoIt. En este escenario, el archivo ZIP contiene (además del troyano bancario Mekotio) un intérprete legítimo de AutoIt y un pequeño script de injector o loader de AutoIt. La etapa final de la cadena de distribución ejecuta el intérprete de AutoIt y le pasa el script del loader o injector para que lo interprete. Ese script luego ejecuta el troyano bancario. La figura 6 ilustra todo el proceso.

Figura 6. El método de ejecución más utilizado por Mekotio

Mekotio no es el único troyano bancario latinoamericano que utiliza este método, pero lo favorece significativamente más que sus competidores.

Criptografía

El algoritmo utilizado para cifrar strings en los binarios de Mekotio es esencialmente el mismo que utiliza Casbaneiro. Sin embargo, muchas variantes de Mekotio modifican cómo se procesan los datos antes de ser descifrados. Los primeros bytes de la llave de descifrado hardcodeada pueden ignorarse, al igual que algunos bytes de la string cifrada. Algunas variantes codifican aún más strings cifradas con base64. Los detalles de estos métodos varían.

Comunicación con el servidor de C&C

Base de datos SQL como servidor C&C

Algunas variantes de Mekotio basan su protocolo de red en Delphi_Remote_Access_PC , al igual que Casbaneiro. Cuando ese no es el caso, Mekotio utiliza una base de datos SQL como una especie de servidor C&C. Esta técnica no es desconocida en relación a los troyanos bancarios latinoamericanos. En lugar de un comando SELECT, Mekotio parece depender de la ejecución de procedimientos SQL. De esa forma, no queda claro de inmediato cómo se ve la base de datos subyacente. Sin embargo, la string de inicio de sesión todavía está hardcodeada en el binario.

Generación de direcciones de servidor C&C

Hemos observado tres algoritmos utilizados por Mekotio para obtener la dirección de su servidor C&C. Los describimos a continuación en el orden cronológico en que los encontramos.

Basado en listas hardcodeadas de "dominios falsos"

El primer método se basa en dos listas de dominios hardcodeadas: una para generar el dominio del C&C y la otra para el puerto. Se elige un dominio aleatorio de ambas listas y se resuelve. La dirección IP se modifica aún más. Al generar el dominio de C&C, se resta un número hardcodeado del último octeto de la dirección IP resuelta. Al generar el puerto de C&C, los octetos se unen y se tratan como un número. Para mayor claridad, hemos implementado ambos algoritmos en Python, como se observa en la Figura 7. Nótese que este enfoque es sorprendentemente similar al utilizado por Casbaneiro (método número 5).

def generate_domain(base_domains, num):
	domain = to_ip(random.choice(base_domains))
	octets = domain.split(".")
	octets[3] = chr(int(octets[3]) - num)
	return octets.join(".")

def generate_port(base_domains):
	domain = to_ip(random.choice(base_domains))
	return int(domain.split(".").join(""))

Figura 7. Código para generar dominio y puerto del C&C a partir de listas de dominios hardcodeadas

Basado en la hora actual

El segundo enfoque utiliza un DGA basado en la hora local actual (por lo tanto, la zona horaria de la víctima afecta el resultado). El algoritmo toma el día actual de la semana, el día del mes y la hora y los usa para generar una única string. Luego calcula el MD5 de esa string, representada como una string hexadecimal. El resultado unido con un sufijo hardcodeado es el dominio del servidor de C&C (su puerto está hardcodeado en el binario). La Figura 8 muestra nuestra implementación en Python de este algoritmo.

day_names = {
	0: "MON",
	1: "TUE",
	2: "WED",
	3: "THU",
	4: "FRI",
	5: "SAT",
	6: "SUN",
}

hour_names = {
	7: "AM02",
	8: "AM03",
	9: "AM04",
	10: "AM05",
	11: "AM06",
	12: "PM01",
	13: "PM02",
	14: "PM03",
	15: "PM04",
	16: "PM05",
	17: "PM06"
}

def get_hour_name(hour):
	if hour <= 6 or hour >= 18:
		return "AM01"
	else
		return hour_names[hour]

def generate_domain(suffix):
	time = get_current_time()
	dga_data = "%s%02d%s" % (day_names[time.dayOfWeek], time.day, hour_names[time.hour])
	dga_data = hexlify(md5(dga_data))
	return dga_data.lower() + suffix

Figura 8. Código para generar dominio de C&C basado en la hora actual

Basado en el día actual

El tercer algoritmo es algo similar al segundo. Se diferencia en el formato de la string creada a partir de la hora local y en el hecho de que utiliza un sufijo diferente cada día. Además, genera el puerto de C&C de manera similar. Una vez más, la reimplementación del código en Python se ilustra en la Figura 9.

def generate_domain(domains_list, subdomain):
	time = get_current_time()
	dga_data = "%02d%02d%s" % (time.day, time.month, subdomain)
	dga_data = hexlify(md5(dga_data))
	return dga_data[:20] + "." + domains_list[time.day - 1]

def generate_port(portstring):
	time = get_current_time()
	return int("%d%02d%d" % (time.day, time.dayOfWeek, time.month))

Figura 9. Código para generar puerto y dominio de C&C basado en el día actual

¿Múltiples variantes concurrentes?

Ya mencionamos que, al igual que otros troyanos bancarios latinoamericanos, Mekotio sigue un ciclo de desarrollo bastante caótico. Sin embargo, además de eso, hay indicadores de que hay múltiples variantes de Mekotio siendo desarrolladas de manera simultánea.

Los dos indicadores principales son el versionado interno y el formato de la string utilizada para extraer información sobre la máquina de la víctima recopilada por Mekotio. Hemos identificado cuatro esquemas de versiones diferentes:

  • Numeración (001, 002, 072, 39A,…)
  • Versión por fecha (01-07, 15-06, 17-10, 20-09,…)
  • Versión por fecha completa (02_03_20, 13_03_20, 26_05_20,…)
  • Numeración y fecha combinadas (103–30-09, 279–07-05, 293–25-05,…)

Cada uno de estos esquemas está asociado con un formato específico de la string de datos exfiltrados. Dado que vemos varios de estos esquemas simultáneamente, creemos que puede haber múltiples actores maliciosos utilizando diferentes variantes de Mekotio.

Conclusión

En esta publicación hemos analizado a Mekotio, un troyano bancario latinoamericano activo desde al menos 2015. Al igual que sucede con otros troyanos bancarios descritos en esta serie, Mekotio presenta características comunes con otros malware de este tipo, como es el hecho de estar escrito en Delphi, usar ventanas emergentes falsas, contar con una funcionalidad de backdoor y dirigirse a países de habla hispana y portuguesa.

Nos hemos centrado en las características más interesantes de este troyano bancario, como su principal método de ejecución al abusar del intérprete legítimo de AutoIt, utilizar la base de datos SQL como servidor de C&C o los diferentes métodos que utiliza Mekotio para generar la dirección de su servidor de C&C.

También hemos mencionado varias características que son sorprendentemente similares a Casbaneiro.

Para cualquier consulta, contáctenos en threatintel@eset.com. Los indicadores de compromiso también se pueden encontrar en nuestro repositorio de GitHub.

Indicadores de Compromiso (IoCs)

Hashes

Muestras de Mekotio

SHA-1 Description ESET detection name
AEA1FD2062CD6E1C0430CA36967D359F922A2EC3 Mekotio banking trojan (SQL variant) Win32/Spy.Mekotio.CQ
8CBD4BE36646E98C9D8C18DA954942620E515F32 Mekotio banking trojan Win32/Spy.Mekotio.O
297C2EDE67AE6F4C27858DCB0E84C495A57A7677 Mekotio banking trojan Win32/Spy.Mekotio.DD
511C7CFC2B942ED9FD7F99E309A81CEBD1228B50 Mekotio banking trojan Win32/Spy.Mekotio.T
47C3C058B651A04CA7C0FF54F883A05E2A3D0B90 Mekotio banking trojan Win32/Spy.Mekotio.CD

Intérprete de AutoIt legítimo siendo abusado

SHA-1 Description ESET detection name
ACC07666F4C1D4461D3E1C263CF6A194A8DD1544 AutoIt v3 Script interpreter clean

Comunicación de red

  • User-Agent: “MyCustomUser”, “4M5yC6u4stom5U8se3r” (and other variations)
  • HTTP verb: “111SA”

Billeteras de bitcoin

  • 1PkVmYNiT6mobnDgq8M6YLXWqFraW2jdAk
  • 159cFxcSSpup2D4NSZiuBXgsGfgxWCHppv
  • 1H35EiMsXDeDJif2fTC98i81n4JBVFfru6

Técnicas de MITRE ATT&CK

Esta tabla fue creada utilizando la versión 7 del framework de MITRE ATT&CK .

Tactic ID Name Description
Initial Access T1566.002 Phishing: Spearphishing Link Mekotio distribution chains start with a malicious link in an email.
Execution T1059 Command and Scripting Interpreter Mekotio is most commonly executed by abusing the legitimate AutoIt interpreter.
T1059.001 Command and Scripting Interpreter: PowerShell Mekotio uses PowerShell to execute its distribution chain stages.
T1059.005 Command and Scripting Interpreter: Visual Basic Mekotio uses VBScript to execute its distribution chain stages.
Persistence T1547.001 Boot or Logon Autostart Execution: Registry Run Keys / Startup Folder Mekotio ensures persistence by using a Run key or creating a LNK file in the startup folder.
Defense Evasion T1218 Signed Binary Proxy Execution Mekotio is executed by running a legitimate AutoIt interpreter and passing a loader script for it to interpret.
Credential Access T1555.003 Credentials from Password Stores: Credentials from Web Browsers Mekotio steals credentials from the Google Chrome browser.
Discovery T1010 Application Window Discovery Mekotio discovers various security tools and banking applications based on window names.
T1083 File and Directory Discovery Mekotio discovers banking protection software based on file system paths.
T1518.001 Software Discovery: Security Software Discovery Mekotio detects the presence of banking protection products.
T1082 System Information Discovery Mekotio collects information about the victim's machine, such as firewall status and Windows version.
Collection T1056.001 Input Capture: Keylogging Mekotio is capable of capturing keystrokes.
Command and Control T1568.002 Dynamic Resolution: Domain Generation Algorithms Mekotio generates its C&C domain using a DGA.
T1568.003 Dynamic Resolution: DNS Calculation Mekotio uses an algorithm to modify the resolved IP address to obtain the actual C&C address.
T1095 Non-Application Layer Protocol Mekotio’s network protocol in variants not using SQL is based on Remote_Delphi_Access_PC.
Exfiltration T1041 Exfiltration Over C2 Channel Mekotio sends the data it retrieves to its C&C server.

[1] Soluciones anti fraude utilizadas frecuente en América Latina.
[2] Verbos HTTP comunes son GET y POST.