Como parte de nossa série sobre trojans bancários na América Latina, desta vez apresentamos o Mekotio, um trojan bancário direcionado principalmente ao Brasil, Chile, México, Espanha, Peru e Portugal, no qual o recurso mais notável nas variantes mais recentes é o uso de um banco de dados SQL como servidor C&C. Embora tenhamos publicado recentemente um artigo sobre o Mekotio, o texto é uma análise de uma variante particular desse trojan que, nesse caso, está direcionado principalmente a usuários no Chile. No entanto, o objetivo deste post é fornecer uma visão geral com base na análise do comportamento de um conjunto de variantes do Mekotio e destacar as principais características deste trojan bancário, bem como o seu desempenho ao longo do tempo.

Figura 1. Países afetados pelo Mekotio.

Assim como acontece com outros trojans bancários na América Latina que descrevemos anteriormente nesta série, o desenvolvimento do Mekotio seguiu um caminho bastante caótico e seus recursos foram frequentemente modificadas. Com base em sua versão interna, acreditamos que múltiplas variantes deste código malicioso estão sendo desenvolvidas simultaneamente. No entanto, como no caso do Casbaneiro, essas variantes são praticamente impossíveis de serem separadas, por isso vamos nos referir a todas elas como Mekotio.

Recursos do Mekotio

O Mekotio é um típico trojan bancário latino-americano que está ativo pelo menos desde 2015. A ameaça ataca as vítimas através da exibição de pop-ups falsos com o objetivo de convencê-las a informar dados confidenciais. Esses pop-ups são cuidadosamente projetados para personificar diferentes entidades bancárias na América Latina, bem como outras instituições financeiras.

Mekotio coleta as seguintes informações sobre as vítimas:

  • Configurações do firewall
  • Se a vítima conta com privilégios de administrador
  • Versão do sistema operacional Windows instalada
  • Se estão instalados produtos de produtos antifraude, mais especificamente GAS Tecnologia Warsaw e IBM Trusteer [1]
  • Lista de soluções antimalware instaladas no computador

O Mekotio garante a persistência no dispositivo da vítima usando uma chave Run ou criando um arquivo LNK na pasta de inicialização.

Como é comum com a maioria dos trojans bancários na América Latina que analisamos nesta série, o Mekotio conta com vários recursos que são típicos de um backdoor.  A ameaça pode produzir capturas de tela, manipular janelas, simular ações do mouse e do teclado, reinicializar a máquina, restringir o acesso a vários sites de bancos e se atualizar. Algumas variantes também podem roubar bitcoins substituindo uma carteira de bitcoins na área de transferência e exfiltrar as credenciais armazenadas pelo navegador Google Chrome. Curiosamente, um dos comandos parece ter como objetivo paralisar a máquina da vítima, tentando excluir todos os arquivos e pastas no C:\Windows tree.

É possível identificar o Mekotio através de uma caixa de mensagem específica exibida pelo trojan repetidamente (veja a Figura 2).

Figura 2. Caixa de mensagem usada por todas as variantes do Mekotio.

Para facilitar o roubo de senhas através de sua função de keylogger, o Mekotio desabilita a opção "Autocomplete" no Internet Explorer. Esse recurso, quando habilitado, economiza tempo dos usuários do Internet Explorer, lembrando os campos que foram preenchidos anteriormente. O Mekotio desativa esse recurso alterando os seguintes valores do Registro do 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 no início deste artigo, para uma análise mais profunda de uma variante em particular do Mekotio que tem como alvo principal o Chile, leia este post publicado recentemente pela ESET.

Propagação do Mekotio

Acreditamos que o principal método de propagação do Mekotio seja o spam (veja um exemplo na Figura 3). Desde 2018, observamos 38 diferentes cadeias de propagação utilizadas por essa família. A maioria dessas cadeias consiste em várias etapas e acaba baixando um arquivo ZIP, algo que é típico dos trojans bancários latino-americanos. Nas seções a seguir, analisamos as duas cadeias mais utilizadas.

 

Figura 3. Exemplo de um e-mail de spam propagado pelo Mekotio.

Cadeia 1: Passando contexto

A primeira cadeia consiste em quatro estágios consecutivos, conforme ilustrado na Figura 4. Um BAT simples droppea um downloader no VBScript e o executa usando dois parâmetros de linha de comando: um verbo HTTP personalizado [2] ("111SA") e uma URL a partir da qual realiza o download do próximo estágio. O downloader baixa o próximo estágio (outro downloader) da URL fornecida enquanto usa um valor de User-Agent personalizado (“MyCustomUser” e suas variações). O terceiro estágio baixa um script PowerShell, corrigindo a URL a partir da qual realiza o download do Mekotio dentro do corpo do script, antes de executá-lo. O script do PowerShell baixa o Mekotio da URL corrigida e o instala e executa (o processo de execução está descrito a seguir).

Figura 4. Uma cadeia de propagação usada pelo Mekotio que passa contexto entre os estágios.

Podemos destacar dois detalhes interessantes sobre essa cadeia. O primeiro é o uso de valores personalizados para o cabeçalho tanta para o User-Agent como para o verbo HTTP. Eles podem ser usados ​​para identificar parte da atividade da rede do Mekotio.

O outro aspecto interessante é a passagem de contexto (como argumentos de linha de comando ou modificando o corpo do próximo estágio). Esta é uma forma simples, mas eficaz de anti-análise, porque caso tenha o Downloader 1 sem o Dropper correspondente, não será possível ter a URL ou o verbo HTTP personalizado necessário para chegar ao próximo estágio do malware. Além disso, ter o Downloader 3 sem o Downloader 2 é inútil, já que falta a URL. Esta abordagem torna a análise difícil se o contexto não for conhecido.

Cadeia 2: MSI com JavaScript incorporado

Assim como acontece com muitos outros trojans bancários latino-americanos: o Mekotio usa MSI em algumas de suas cadeias de distribuição mais recentes. Nesse caso, a cadeia é muito mais curta e menos robusta, já que apenas um único JavaScript, que serve como estágio final, é integrado ao MSI e executado.

Em comparação com o estágio final do PowerShell da cadeia anterior, existem algumas semelhanças visíveis. A principal (mostrada na Figura 5) é a rotina de instalação, chamada após o download e extração do arquivo ZIP, que renomeia o conteúdo do arquivo ZIP extraído com base no tamanho do arquivo. Isso está intimamente relacionado ao método de execução descrito na próxima seção.

Figura 5. Comparação da rotina de instalação em JavaScript e scripts do PowerShell usados pelo Mekotio, destacando a semelhança ao basear a decisão no tamanho do arquivo.

Execução através do intérprete do AutoIt

O Mekotio é mais comumente executado ao utilizar o intérprete legítimo do AutoIt. Neste contexto, o arquivo ZIP contém (além do trojan bancário Mekotio) um intérprete AutoIt legítimo e um pequeno script de injetor ou loader do AutoIt. O estágio final da cadeia de distribuição executa o intérprete do AutoIt e passa o script do carregador ou injetor para ele faça a interpretação. Esse script então executa o trojan bancário. A Figura 6 ilustra todo o processo.

Figura 6. O método de execução mais usado pelo Mekotio.

O Mekotio não é o único trojan bancário latino-americano a usar esse método, mas o favorece significativamente mais do que seus concorrentes.

Criptografia

O algoritmo usado para criptografar strings nos binários do Mekotio é essencialmente o mesmo usado pelo Casbaneiro. No entanto, muitas variantes do Mekotio modificam a forma como os dados são processados ​​antes de serem descriptografados. Os primeiros bytes da chave de descriptografia embutida no código podem ser ignorados, assim como alguns bytes da string criptografada. Algumas variantes codificam ainda mais strings criptografadas em base64. Os detalhes desses métodos variam.

Comunicação com o servidor C&C

Banco de dados SQL como servidor C&C

Algumas variantes do Mekotio baseiam seu protocolo de rede em Delphi_Remote_Access_PC, assim como o Casbaneiro. Do contrário, o Mekotio usa um banco de dados SQL como uma espécie de servidor C&C. Esta técnica não é desconhecida em relação aos trojans bancários latino-americanos. Em vez de um comando SELECT, o Mekotio parece depender da execução de procedimentos SQL. Dessa forma, não fica imediatamente claro a aparência do banco de dados subjacente. No entanto, a string de login ainda está codificada no binário.

Geração de endereços de servidor C&C

Observamos três algoritmos usados pelo Mekotio para obter o endereço de seu servidor C&C. Os algoritmos foram descritos na ordem cronológica em que os encontramos.

Com base em listas hardcodeadas de "domínios falsos"

O primeiro método se baseia em duas listas de domínio hardcodeadas: uma para gerar o domínio C&C e a outra para a porta. Um domínio aleatório é escolhido de ambas as listas e resolvido. O endereço IP é modificado posteriormente. Ao gerar o domínio C&C, um número hardcodeado é subtraído do último octeto do endereço IP resolvido. Ao gerar a porta C&C, os octetos são unidos e tratados como um número. Para maior clareza, implementamos ambos os algoritmos em Python, como visto na Figura 7. Observe que esta abordagem é surpreendentemente semelhante a usada pelo 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 gerar domínio e porta C&C a partir de listas de domínio hardcodeadas.

Baseado na hora atual

A segunda abordagem usa um DGA baseado na hora local atual (portanto, o fuso horário da vítima afeta o resultado). O algoritmo absorve o dia da semana atual, o dia do mês e a hora e os usa para gerar uma única string. Em seguida, ele calcula o MD5 dessa string, representado como uma string hexadecimal. O resultado associado a um sufixo hardcodeado é o domínio do servidor C&C (sua porta é hardcodeada permanentemente no binário). A Figura 8 mostra nossa implementação em Python desse 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 gerar domínio C&C com baseado na hora atual.

Baseado no dia atual

O terceiro algoritmo é um tanto semelhante ao segundo. Ele difere no formato da string criada na hora local e no fato de usar um sufixo diferente todos os dias. Além disso, ele gera a porta C&C de forma semelhante. Mais uma vez, a reimplementação do código em Python é ilustrada na 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 gerar porta e domínio C&C baseados no dia atual.

Múltiplas variantes simultâneas?

Já mencionamos que, assim como outros trojans bancários latino-americanos, o Mekotio segue um ciclo de desenvolvimento bastante caótico. No entanto, além disso, há indicadores de que existem várias variantes do Mekotio sendo desenvolvidas simultaneamente.

Os dois indicadores principais são o controle de versão interno e o formato da string usada para extrair informações sobre a máquina da vítima coletadas pelo Mekotio. Temos quatro esquemas de versão diferentes:

  • Numeração (001, 002, 072, 39A,…)
  • Versão por data (01-07, 15-06, 17-10, 20-09,…)
  • Versão por data completa (02_03_20, 13_03_20, 26_05_20,…)
  • Numeração e data combinadas (103–30-09, 279–07-05, 293–25-05,…)

Cada um desses esquemas está associado a um formato específico da string de dados filtrada. Como vemos vários desses esquemas simultaneamente, acreditamos que pode haver vários agentes maliciosos usando diferentes variantes do Mekotio.

Conclusão

Nesta publicação, analisamos o Mekotio, um trojan bancário latino-americano ativo desde pelo menos 2015. Assim como outros trojans bancários descritos nesta série, o Mekotio tem recursos comuns a outros malwares desse tipo, como o fato de ser escrito em Delphi, usar pop-ups falsos, contar com funcionalidades de backdoor e ter países de língua portuguesa e espanhola como alvos.

Nos enfocamos nos recursos mais interessantes desse trojan bancário, como seu principal método de execução usando o intérprete legítimo AutoIt, o banco de dados SQL como um servidor C&C ou os diferentes métodos que o Mekotio usa para gerar o endereço do servidor C&C.

Também mencionamos vários recursos que são notavelmente semelhantes aos do Casbaneiro.

Para qualquer dúvida, entre em contato conosco pelo e-mail fearintel@eset.com. Os indicadores de comprometimento também podem ser encontrados em nosso repositório GitHub.

Indicadores de Comprometimento (IoCs)

Hashes

Amostras do 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 do AutoIt legítimo sendo utilizado

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

Comunicação de rede

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

Carteira de bitcoin

  • 1PkVmYNiT6mobnDgq8M6YLXWqFraW2jdAk
  • 159cFxcSSpup2D4NSZiuBXgsGfgxWCHppv
  • 1H35EiMsXDeDJif2fTC98i81n4JBVFfru6

Técnicas de MITRE ATT&CK

Esta tabela foi criada usando a versão 7 do framework do MITER ATT & CK

[1] Soluções antifraude frequentemente utilizadas na América Latina.

[2] Verbos HTTP comuns são GET e POST.