Dans ce volet de notre série, nous vous présentons Mekotio, un cheval de Troie bancaire latino-américain qui vise principalement le Brésil, le Chili, le Mexique, l'Espagne, le Pérou et le Portugal. La caractéristique la plus notable des dernières variantes de cette famille de logiciels malveillants est l'utilisation d'une base de données SQL comme serveur C&C.

Figure 1. Pays touchés par Mekotio

Comme de nombreux autres chevaux de Troie bancaires latino-américains que nous avons décrits plus haut dans cette série, Mekotio a suivi un chemin de développement assez chaotique, ses caractéristiques étant très souvent modifiées. Sur la base de sa gestion à l’interne des versions, nous pensons que de multiples variantes sont développées simultanément. Cependant, comme pour Casbaneiro, ces variantes sont pratiquement impossibles à séparer les unes des autres, c'est pourquoi nous les appellerons toutes Mekotio.

Caractéristiques

Mekotio est un cheval de Troie bancaire latino-américain typique qui est actif depuis au moins 2015. En tant que tel, il attaque en affichant de fausses fenêtres contextuelles à ses victimes, en essayant de les inciter à divulguer des informations sensibles. Ces fenêtres sont soigneusement conçues pour cibler les banques et autres institutions financières latino-américaines.

Mekotio recueille les informations suivantes sur ses victimes :

  • Configuration du pare-feu
  • Si la victime a des privilèges administratifs
  • Version du système d'exploitation Windows installé
  • Si des produits de protection anti-fraude (GAS Tecnologia Warsaw et IBM Trusteer[1]) sont installés
  • Liste des solutions anti-logiciels malveillants installées.

Mekotio assure la persistance soit en utilisant une clé Run, soit en créant un fichier LNK dans le dossier de démarrage.

Comme c'est le cas pour la plupart des chevaux de Troie bancaires d'Amérique latine, Mekotio dispose de plusieurs fonctionnalités de porte dérobée typiques. Il peut prendre des captures d'écran, manipuler des fenêtres, simuler des actions de la souris et du clavier, redémarrer la machine, restreindre l'accès à divers sites web bancaires et se mettre à jour. Certaines variantes sont également capables de voler des bitcoins en remplaçant un portefeuille de bitcoins dans le presse-papiers et d'exfiltrer les informations d'identification stockées par le navigateur Google Chrome. Il est intéressant de noter qu'une commande est apparemment destinée à paralyser la machine de la victime en essayant de supprimer tous les fichiers et dossiers dans C:\Windows tree.

Une façon d'identifier Mekotio est une boîte de message spécifique que le cheval de Troie affiche à plusieurs reprises (voir figure 2).

Figure 2. Boîte d’avis utilisée par toutes les variantes de Mekotio
(Traduction : « Nous effectuons actuellement des mises à jour de sécurité sur le site! Veuillez réessayer plus tard! De nouvelles mesures de sécurité sont en cours d'adoption : (1) nouveau plugin de sécurité et (2) nouvel aspect visuel du site. Votre système sera redémarré pour terminer l'opération »)

Pour faciliter le vol des mots de passe grâce à sa fonction d'enregistrement des frappes, Mekotio désactive l'option « AutoComplete » dans Internet Explorer. Cette fonction, lorsqu'elle est activée, permet aux utilisateurs d'Internet Explorer de gagner du temps en se souvenant des entrées sur différents types de champs qui ont été remplis précédemment. Mekotio la désactive en modifiant les valeurs suivantes du registre 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”

Pour une analyse approfondie d'une variante spécifique de Mekotio ciblant le Chili, consultez notre récent article sur ce sujet.

Distribution

Nous croyons que la principale méthode de distribution de Mekotio est le spam (voir la figure 3 pour un exemple). Depuis 2018, nous avons observé 38 chaînes de distribution différentes utilisées par cette famille. La plupart de ces chaînes se composent de plusieurs étapes et finissent par télécharger une archive ZIP, comme c'est le cas pour les chevaux de Troie bancaires d'Amérique latine. Nous disséquons les deux chaînes les plus utilisées dans les sections suivantes.

Figure 3. Exemple d'un courrier électronique distribuant Mekotio
(Traduction : « Cher citoyen, Votre demande de reçu : ... Télécharger le reçu »)

Chaîne 1 : Contexte de passage

La première chaîne se compose de quatre étapes consécutives, comme l'illustre la figure 4. Un simple compte-gouttes BAT dépose un téléchargeur VBScript et l'exécute en utilisant deux paramètres de ligne de commande - un verbe HTTP personnalisé[2] (« 111SA »), et une URL à partir de laquelle télécharger l'étape suivante. Le téléchargeur télécharge l'étape suivante (encore un autre téléchargeur) à partir de l'URL fournie tout en utilisant une valeur User-Agent personnalisée (« MyCustomUser » et ses variations). La troisième étape consiste à télécharger un script PowerShell, en corrigeant l'URL à partir de laquelle télécharger Mekotio dans le corps du script, avant de l'exécuter. Le script PowerShell télécharge ensuite Mekotio à partir de l'URL corrigée, puis l'installe et l'exécute (le processus d'exécution est décrit en détail plus loin).

Figure 4. Une chaîne de distribution utilisée par Mekotio qui fait passer le contexte entre les étapes

Il y a deux choses intéressantes à propos de cette chaîne. La première est l'utilisation de valeurs personnalisées pour l'en-tête User-Agent et le verbe HTTP. Celles-ci peuvent être utilisées pour identifier une partie de l'activité du réseau de Mekotio.

L'autre aspect intéressant est le passage du contexte (soit sous forme d'arguments de ligne de commande, soit en modifiant le corps de l'étape suivante). Il s'agit d'une forme simple, mais efficace, de technique d'anti-analyse, car si vous disposez du Downloader 1 sans le Dropper correspondant, vous n'aurez ni l'URL ni le verbe HTTP personnalisé nécessaires pour obtenir l'étape suivante du malware. De même, il est inutile d'avoir le Downloader 3 sans le Downloader 2, car l'URL est manquante. Cette approche rend l'analyse plus difficile sans la connaissance du contexte.

Chaîne 2 : MSI avec JavaScript intégré

Comme pour beaucoup d'autres chevaux de Troie bancaires d'Amérique latine : Mekotio utilise MSI dans certaines de ses dernières chaînes de distribution. Dans ce cas, la chaîne est beaucoup plus courte et moins robuste, car un seul JavaScript, servant d'étape finale, est intégré dans le MSI et exécuté.

Par rapport à l'étape finale PowerShell de la chaîne précédente, il existe des similitudes visibles. La principale (illustrée à la figure 5) est la routine d'installation, appelée après le téléchargement et l'extraction de l'archive ZIP, qui renomme le contenu de l'archive ZIP extraite en fonction de la taille du fichier. Cela est étroitement lié à la méthode d'exécution décrite dans la section suivante.

Figure 5. Comparaison de la routine d'installation dans les scripts JavaScript et PowerShell utilisés par Mekotio, mettant en évidence la similitude dans le fait de fonder la décision sur

Exécution par l’abus de l'interprète AutoIt

Mekotio est le plus souvent exécuté en abusant de l'interprète AutoIt légitime. Dans ce scénario, l'archive ZIP contient (outre le cheval de Troie bancaire Mekotio) un interprète AutoIt légitime et un petit script de chargement ou d'injection AutoIt. L'étape finale de la chaîne de distribution exécute l'interpréteur AutoIt et lui transmet le script de chargement ou d'injection pour qu'il l'interprète. Ce script exécute ensuite le cheval de Troie bancaire. La figure 6 illustre l'ensemble du processus.

Figure 6. La méthode d'exécution la plus couramment utilisée par Mekotio

Mekotio n'est pas le seul cheval de Troie bancaire latino-américain à utiliser cette méthode, mais il la privilégie nettement plus que ses concurrents.

Cryptographie

L'algorithme utilisé pour chiffrer les chaînes de caractères dans les binaires de Mekotio est essentiellement le même que celui utilisé par Casbaneiro. Cependant, de nombreuses variantes de Mekotio modifient la façon dont les données sont traitées avant d'être déchiffrées. Les premiers octets de la clé de déchiffrement codée en dur peuvent être ignorés, tout comme certains octets de la chaîne chiffrée. Certaines variantes codent en outre les chaînes chiffrées avec base64. Les spécificités de ces méthodes varient.

Communication du serveur C&C

Base de données SQL comme serveur C&C

Certaines variantes de Mekotio basent leur protocole réseau sur Delphi_Remote_Access_PC, tout comme Casbaneiro. Lorsque ce n'est pas le cas, Mekotio utilise une base de données SQL comme une sorte de serveur C&C. Cette technique n'est pas inédite en ce qui a trait aux chevaux de Troie bancaires d'Amérique latine. Au lieu d'une commande SELECT, Mekotio semble s'appuyer sur l'exécution de procédures SQL. De cette façon, on ne sait pas immédiatement à quoi ressemble la base de données sous-jacente. Cependant, la chaîne de connexion est toujours codée en dur dans le binaire.

Génération de l'adresse du serveur C&C

Nous avons observé trois algorithmes différents pour la façon dont Mekotio obtient l'adresse de son serveur C&C. Nous les décrivons ci-dessous dans l'ordre chronologique où nous les avons rencontrés.

Sur la base de listes codées en dur de « faux domaines »

La première méthode repose sur deux listes de domaines codées en dur - l'une pour générer le domaine C&C et l'autre pour le port. Un domaine aléatoire est choisi dans les deux listes et résolu. L'adresse IP est ensuite modifiée. Lors de la génération du domaine C&C, un nombre codé en dur est soustrait du dernier octet de l'adresse IP résolue. Lors de la génération du port C&C, les octets sont réunis et traités comme un nombre. Pour plus de clarté, nous avons implémenté les deux algorithmes en Python, comme le montre la figure 7. Remarquez que cette approche est étonnamment similaire à celle utilisée par Casbaneiro (marquée comme méthode 5 de cette analyse – voir l’hyperlien).

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(""))

Figure 7. Code pour la génération du domaine C&C et du port à partir de listes de domaines codées en dur

Sur la base de l'heure actuelle

La seconde approche utilise une DGA basée sur l'heure locale actuelle (par conséquent, le fuseau horaire de la victime affecte le résultat). L'algorithme prend le jour de la semaine, le jour du mois et l'heure actuels et les utilise pour générer une seule chaîne. Il calcule ensuite le MD5 de cette chaîne, représenté sous la forme d'une chaîne hexadécimale. Le résultat joint à un suffixe codé en dur est le domaine du serveur C&C (son port est codé en dur dans le binaire). La figure 8 montre notre implémentation Python de cet algorithme.

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

Figure 8. Code pour la génération du domaine C&C basé sur l'heure actuelle

Basé sur la journée en cours

Le troisième algorithme est quelque peu similaire au deuxième. Il diffère par le format de la chaîne créée à partir de l'heure locale et par le fait qu'il utilise un suffixe différent chaque jour. En outre, il génère le port C&C de manière similaire. Une fois de plus, la réimplémentation du code en Python est illustrée dans la figure 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))

Figure 9. Code de génération du domaine et du port C&C basé sur le jour courant

Plusieurs variantes concurrentes?

Nous avons déjà mentionné que, comme d'autres chevaux de Troie bancaires d'Amérique latine, Mekotio suit un cycle de développement plutôt chaotique. Cependant, à part cela, il y a des indicateurs qui montrent que de multiples variantes de Mekotio sont développées simultanément.

Les deux principaux indicateurs sont la nomenclature interne des versions et le format de la chaîne utilisée pour exfiltrer les informations sur la machine de la victime ayant été recueillies par Mekotio. Nous avons identifié quatre schémas différents de désignation des versions :

  • Numérique (001, 002, 072, 39A, …)
  • Selon la date (01-07, 15-06, 17-10, 20-09, …)
  • Selon la date complète (02_03_20, 13_03_20, 26_05_20, …)
  • Combinaison de numérotation et par date (103–30-09, 279–07-05, 293–25-05, …)

Chacun de ces schémas est associé à un format spécifique de la chaîne de données exfiltrées. Comme nous voyons plusieurs de ces schémas simultanément, nous pensons qu'il peut y avoir plusieurs acteurs de la menace utilisant différentes variantes de Mekotio.

Conclusion

Dans cet article de blog, nous avons analysé Mekotio, un cheval de Troie bancaire latino-américain actif depuis au moins 2015. Comme les autres chevaux de Troie bancaires décrits dans cette série, Mekotio partage des caractéristiques communes pour ce type de malware, comme le fait d'être écrit en Delphi, d'utiliser de fausses fenêtres pop-up, de contenir des fonctionnalités de porte dérobée et de cibler les pays hispanophones et lusophones.

Nous nous sommes concentrés sur les caractéristiques les plus intéressantes de ce cheval de Troie bancaire, comme sa principale méthode d'exécution en abusant de l'interpréteur AutoIt légitime, l'utilisation de la base de données SQL comme serveur C&C ou les différentes méthodes utilisées par Mekotio pour générer l'adresse de son serveur C&C.

Nous avons également mentionné plusieurs caractéristiques qui sont étonnamment similaires à celles observées avec Casbaneiro.

Pour toute question, contactez-nous à l'adresse suivante : threatintel@eset.com. Les indicateurs de compromis se trouvent également dans notre dépôt GitHub

Indicateurs de compromission (IoCs)

Hashes

Échantillons 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

Abus d’un interprète AutoIt légitime

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

Communication du réseau

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

Portefeuilles Bitcoin

  • 1PkVmYNiT6mobnDgq8M6YLXWqFraW2jdAk
  • 159cFxcSSpup2D4NSZiuBXgsGfgxWCHppv
  • 1H35EiMsXDeDJif2fTC98i81n4JBVFfru6

Techniques MITRE ATT&CK

Note : Ce tableau a été construit en utilisant la version 7 du cadre 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]  Les solutions anti-fraude sont très fréquemment utilisées en Amérique latine.

[2] Les verbes HTTP courants sont GET et POST.