La dernière attaque TeleBots liée à une variante de Petya a fait l’objet d’une vaste couverture médiatique. Il convient toutefois de noter qu’il ne s’agissait pas d’un incident isolé : c’est la dernière d’une série d’attaques similaires en Ukraine. Le présent billet de blogue révèle de nombreux détails sur la menace Diskcoder.C (également appelée ExPetr, PetrWrap, Petya ou NotPetya), ainsi que des renseignements connexes au sujet d’attaques peu médiatisées.

Figure 1 – Chronologie des attaques ayant ciblé les chaînes d’approvisionnement de l’Ukraine

Figure 1 – Chronologie des attaques ayant ciblé les chaînes d’approvisionnement de l’Ukraine

TeleBots

En décembre 2016, nous avons publié deux billets de blogue relatant en détail les attaques perturbatrices menées par un groupe que les chercheurs d’ESET ont baptisé TeleBots. Nous nous étions notamment penchés sur les attaques ciblant les institutions financières ainsi que sur la conception d’une version Linux du maliciel KillDisk utilisé par ce groupe. TeleBots a lancé des cyberattaques contre divers systèmes informatiques en Ukraine, systèmes que l’on pourrait considérer comme faisant partie de l’infrastructure essentielle. Par ailleurs, TeleBots entretient des liens avec le groupe BlackEnergy, jugé responsable des pannes de courant qui ont touché l’Ukraine en décembre 2015.

À la phase finale de ses attaques, le groupe TeleBots a toujours utilisé le maliciel KillDisk pour réécrire les extensions des fichiers sur les disques de ses victimes. Allons-y d’une hypothèse éclairée : l’objectif principal de TeleBots n’a jamais été de récolter de l’argent. Le maliciel KillDisk utilisé lors de la première vague d’attaques en décembre 2016 ne chiffrait pas les fichiers cibles, mais les réécrivait, tout simplement. En outre, il ne présentait pas les coordonnées de l’attaquant. Il affichait tout bonnement une image de la série télévisée Mr. Robot.

Figure 2 – Image affichée par le maliciel KillDisk lors de la première vague d’attaques en décembre 2016

Figure 2 – Image affichée par le maliciel KillDisk lors de la première vague d’attaques en décembre 2016

Lors de la deuxième vague d’attaques, les cybersaboteurs à l’origine de KillDisk ont ajouté leurs coordonnées au maliciel, de sorte que le tout ressemble à une attaque par rançongiciel typique. Toutefois, les attaquants demandaient un montant extraordinaire en cryptomonnaie : 222 BTC (soit environ 250 000 $ à cette date). Ce chiffre pourrait indiquer que les attaquants ne souhaitent pas vraiment extorquer de l’argent : ils cherchent seulement à infliger des dommages à leurs victimes.

Figure 3 – Demande de rançon affichée par KillDisk lors de la deuxième vague d’attaques en décembre 2016

Figure 3 – Demande de rançon affichée par KillDisk lors de la deuxième vague d’attaques en décembre 2016

En 2017, le groupe TeleBots n’a pas cessé ses cyberattaques; en fait, ces dernières sont devenues plus sophistiquées. Entre janvier et mars 2017, TeleBots a compromis une société d’édition de logiciels en Ukraine (sans lien avec M.E.Doc), ce qui lui a permis d’utiliser des tunnels RPV pour accéder aux réseaux internes de plusieurs institutions financières.

Au cours de cette attaque, les cybercriminels de TeleBots ont utilisé un arsenal d’outils enrichi par deux nouveaux rançongiciels, ainsi que par la mise à jour d’éléments déjà mentionnés dans des billets précédents (voir les liens ci-dessus).

La première porte dérobée qu’a largement utilisée le groupe TeleBots était Python/TeleBot.A, laquelle a été réécrite dans le langage de programmation Rust. Toutefois, sa fonction demeure la même toutefois : il s’agit d’une porte dérobée standard qui emploie l’API Telegram Bot afin de recevoir des commandes de l’opérateur du maliciel et de lui envoyer des réponses.

Figure 4 – Code désassemblé du cheval de Troie Win32/TeleBot.AB

Figure 4 – Code désassemblé du cheval de Troie Win32/TeleBot.AB

La deuxième porte dérobée, qui était écrite en langage VBScript et empaquetée à l’aide du programme script2exe, a été fortement obscurcie, mais elle exerçait la même fonction qu’aux attaques précédentes.

Figure 5 – Version obscurcie de la porte dérobée VBScript

Figure 5 – Version obscurcie de la porte dérobée VBScript

Cette fois, la porte dérobée VBScript a utilisé le serveur de commande et de contrôle à l’adresse IP 130.185.250[.]171. Pour éviter d’éveiller les soupçons des personnes chargées de surveiller les journaux des pare-feu, les attaquants ont enregistré le domaine transfinance.com[.]ua et l’ont hébergé sur cette adresse IP. Comme en témoigne la figure 6, ce serveur exécutait également le relais Tor nommé severalwdadwajunior.

Figure 6 – Renseignements sur le relais Tor exécuté par le groupe TeleBots

Figure 6 – Renseignements sur le relais Tor exécuté par le groupe TeleBots

En outre, les attaquants ont utilisé les outils suivants :

  • CredRaptor (voleur de mot de passe);
  • Plainpwd (version modifiée de Mimikatz utilisée pour récupérer des justificatifs d’identité Windows de la mémoire);
  • SysInternals’ PsExec (utilitaire servant à se déplacer dans le système infecté).

Comme nous l’avons mentionné plus haut, à la phase finale de ses attaques, TeleBots introduisait son rançongiciel dans les systèmes ciblés au moyen de justificatifs Windows volés et de SysInternals’ PsExec. Ce nouveau rançongiciel a été détecté par les produits d’ESET comme Win32/Filecoder.NKH. Lorsqu’il s’exécute, le rançongiciel chiffre tous les fichiers (à l’exception de ceux situés dans le répertoire C:\Windows) à l’aide des algorithmes AES-128 et RSA-1024. Le maliciel ajoute l’extension .xcrypted aux fichiers déjà chiffrés.

Après le chiffrement, il crée le fichier texte !readme.txt qui contient le message suivant :

Please contact us: openy0urm1nd@protonmail.ch

Outre ce maliciel pour Windows, le groupe TeleBots a utilisé un rançongiciel pour Linux sur des serveurs autres que Windows. Ce dernier a été détecté par les produits d’ESET comme Python/Filecoder.R et, naturellement, il est écrit dans le langage de programmation Python. Cette fois, les attaquants ont exécuté des utilitaires tiers tels que openssl pour chiffrer les fichiers. Ce chiffrement repose sur les algorithmes RSA-2048 et AES-256.

Figure 7 – Code Python du rançongiciel Python/Filecoder.R conçu pour Linux et utilisé par le groupe TeleBots

Figure 7 – Code Python du rançongiciel Python/Filecoder.R conçu pour Linux et utilisé par le groupe TeleBots

Dans le code de script Python, les attaquants ont laissé ce commentaire :

feedback: openy0urm1nd[@]protonmail.ch

Win32/Filecoder.AESNI.C

Le 18 mai 2017, nous avons observé de nouvelles activités causées par une autre famille de rançongiciel, soit Win32/Filecoder.AESNI.C (également appelé XData).

Ce rançongiciel s’est propagé principalement en Ukraine, en raison d’un vecteur initial intéressant. Selon nos données télémétriques LiveGrid®, le maliciel se déploie tout juste après l’exécution du logiciel financier M.E.Doc, largement utilisé par le personnel comptable en Ukraine,

ce qui lui permet de se répandre à l’intérieur d’un réseau compromis. Plus précisément, le maliciel intégrait une bibliothèque de liens dynamiques (DLL) Mimikatz qu’il utilisait pour extraire les identifiants de compte Windows de la mémoire d’un ordinateur compromis. Grâce à ces identifiants, le maliciel était en mesure de se propager à l’intérieur de son réseau hôte à l’aide de l’utilitaire SysInternals’ PsExec.

Il semble que les attaquants n’aient pas atteint leur objectif à cette occasion, ou qu’il s’agissait d’un essai avant une frappe plus efficace. Les attaquants ont publié les principales clés de déchiffrement sur le forum BleepingComputer, ainsi qu’une affirmation selon laquelle cet incident s’était produit parce que l’auteur original du maliciel avait déclaré qu’on lui avait volé le code source utilisé dans l’incident survenu en Ukraine.

ESET a publié un outil de déchiffrement pour le rançongiciel Win32/Filecoder.AESNI, et cet événement n’a pas retenu l’attention des médias.

Menace Diskcoder.C (variante de Petya)

Ce qui a beaucoup suscité l’attention des médias toutefois, c’est la dernière attaque liée à une variante de Petya survenue le 27 juin 2017. De nombreux systèmes de l’infrastructure essentielle et d’autres entreprises ont été compromis en Ukraine et ailleurs.

Le maliciel utilisé pour perpétrer cette attaque avait la capacité de remplacer l’enregistrement d’amorçage maître (MBR) par son propre code malveillant. Ce code a été emprunté au rançongiciel Win32/Diskcoder.Petya. C’est pourquoi d’autres chercheurs du domaine ont nommé cette menace ExPetr, PetrWrap, Petya ou NotPetya. Cependant, les auteurs de Diskcoder.C ont modifié le code MBR de telle sorte qu’aucune récupération ne soit possible (ce qui n’était pas le cas avec le rançongiciel Petya original). Plus précisément, l’attaquant ne peut pas fournir de clé de déchiffrement légitime. La victime paye donc la rançon et obtient une clé de déchiffrement qu’elle ne peut taper à l’écran, parce qu’elle contient des caractères non acceptés.

Par son aspect, le code MBR de Diskcoder.C semble s’apparenter à une version légèrement modifiée de Petya : d’abord, il affiche un message qui semble provenir de CHKDSK, l’utilitaire de vérification de disque de Microsoft. Pendant que le faux utilitaire procède à une analyse, Diskcoder.C chiffre les données.

Figure 8 – Message provenant de la fausse version de l’utilitaire CHKDSK affiché par Diskcoder.C

Figure 8 – Message provenant de la fausse version de l’utilitaire CHKDSK affiché par Diskcoder.C

Après le chiffrement des données, le code MBR affiche un autre message contenant les instructions de paiement. Mais comme nous l’avons expliqué, ces renseignements sont inutiles.

Figure 9 – Message de Diskcoder.C contenant les instructions de paiement

Figure 9 – Message de Diskcoder.C contenant les instructions de paiement

Le reste du code, autre que le MBR emprunté, a été mis en œuvre par les auteurs eux-mêmes, notamment la clé de chiffrement des fichiers qui peut être utilisée en complément du code MBR. Pour chiffrer les fichiers, le maliciel utilise les algorithmes AES-128 et RSA-2048. Il convient de noter que les auteurs ont commis des erreurs, ce qui complexifie encore davantage le déchiffrement des fichiers. Le maliciel chiffre uniquement le premier mégaoctet de données. Il n’écrit aucun en-tête ni pied de page, uniquement des données chiffrées brutes. Enfin, il ne renomme pas les fichiers chiffrés, ce qui rend ces derniers difficiles à repérer. En outre, les fichiers supérieurs à 1 Mo ne contiennent pas de caractères de remplissage après leur chiffrement. Il n’y a donc aucun moyen de vérifier la clé.

Fait intéressant, la liste des extensions de fichiers cibles, sans être identique, est très similaire à celle que le maliciel KillDisk a utilisée lors des attaques de décembre 2016.

Figure 10 – Liste des extensions de fichiers cibles de Diskcoder.C

Figure 10 – Liste des extensions de fichiers cibles de Diskcoder.C

Lorsqu’il est exécuté, le maliciel tente de se propager à l’aide de l’exploit EternalBlue, en passant par la porte dérobée DoublePulsar en mode noyau. Exactement la même méthode qu’utilisait le rançongiciel WannaCryptor.D. Diskcoder.C a également adopté le mode opératoire du rançongiciel Win32/Filecoder.AESNI.C (XData) : il utilise une version légère de Mimikatz pour obtenir les justificatifs d’identité dont il a besoin, puis il se déploie sur d’autres machines connectées au réseau local au moyen de SysInternals’ PsExec. De plus, les attaquants ont mis en œuvre une troisième méthode de déploiement basée sur un mécanisme WMI (infrastructure de gestion Windows).

Ces trois méthodes ont été utilisées pour déployer le maliciel sur des réseaux locaux. Contrairement au maliciel WannaCryptor, Diskcoder.C emploie l’exploit EternalBlue uniquement contre les ordinateurs qui figurent dans l’espace d’adressage du réseau local.

Pourquoi des systèmes ont-ils été infectés dans d’autres pays que l’Ukraine? Notre enquête a révélé que les entreprises touchées dans d’autres pays étaient reliées par RPV à des succursales ou à des partenaires commerciaux situés en Ukraine.

Vecteur d’infection initiale

Diskcoder.C et Win32/Filecoder.AESNI.C ont utilisé une attaque de chaîne d’approvisionnement comme vecteur d’infection initiale. Ces familles de maliciels se sont propagées à l’aide du logiciel de comptabilité ukrainien appelé M.E.Doc.

Il existe plusieurs façons de mettre en œuvre une attaque de ce type. M.E.Doc est doté d’un système de messagerie et d’échange de documents à l’interne. Les attaquants pouvaient donc envoyer des messages de harponnage aux victimes. Pour exécuter le maliciel de cette façon, une interaction est requise de la part de l’utilisateur. Les attaquants devaient donc également recourir à des techniques d’ingénierie sociale. Puisque Win32/Filecoder.AESNI.C ne s’est pas répandu à grande échelle, nous avons présumé à tort que ces techniques avaient été utilisées.

Toutefois, la menace Diskcoder.C subséquente suggère que les attaquants ont eu accès au serveur de mise à jour du logiciel légitime. En utilisant l’accès à ce serveur, les attaquants ont déployé une mise à jour malveillante qui s’est appliquée automatiquement, sans interaction de la part des utilisateurs. C’est pourquoi tant de systèmes en Ukraine ont été touchés par cette attaque. Cependant, il semble que les auteurs du maliciel aient sous-estimé les capacités de déploiement de Diskcoder.C.

Les chercheurs d’ESET ont d’ailleurs trouvé des preuves qui étayent cette théorie. Nous avons repéré une porte dérobée PHP malveillante qui a été déployée sous medoc_online.php dans l’un des répertoires FTP sur le serveur de M.E.Doc. Cette porte dérobée était accessible à partir de HTTP; toutefois, elle était chiffrée. L’attaquant devait donc connaître le mot de passe pour l’utiliser.

Figure 11 – Arborescence du répertoire FTP contenant la porte dérobée PHP

Figure 11 – Arborescence du répertoire FTP contenant la porte dérobée PHP

Notez qu’il existe des signes suggérant que Diskcoder.C et Win32/Filecoder.AESNI.C n’ont pas été les seules familles de maliciels à avoir été déployées au moyen de ce vecteur de propagation. Tout porte à croire que ces mises à jour malveillantes ont été déployées de manière furtive sur des réseaux informatiques qui appartiennent à des cibles de grande valeur.

L’un des maliciels déployés par l’intermédiaire du serveur de mises à jour de M.E.Doc est la porte dérobée VBS utilisée par le groupe TeleBots. Cette fois, l’attaquant a de nouveau employé un nom de domaine à thème financier : bankstat.kiev[.]ua.

Le jour de l’attaque Diskcoder.C, l’enregistrement A de ce domaine a été configuré à 10.0.0.1.

Conclusions

Le groupe TeleBots continue de se perfectionner afin de mener des attaques perturbatrices contre l’Ukraine. Au lieu de diffuser des courriels de harponnage auxquels sont joints des documents contenant des macros malveillantes, il emploie une méthode plus sophistiquée connue sous le nom d’attaque de chaîne d’approvisionnement. Avant cette récente attaque, le groupe TeleBots ciblait principalement le secteur financier. La dernière menace était dirigée contre des entreprises d’Ukraine, mais le groupe a apparemment sous-estimé les capacités de déploiement du maliciel. C’est pourquoi il en a perdu la maîtrise.

Indicateurs de compromission

Noms répertoriés par ESET :

Win32/TeleBot trojan
VBS/Agent.BB trojan
VBS/Agent.BD trojan
VBS/Agent.BE trojan
Win32/PSW.Agent.ODE trojan
Win64/PSW.Agent.K trojan
Python/Filecoder.R trojan
Win32/Filecoder.AESNI.C trojan
Win32/Filecoder.NKH trojan
Win32/Diskcoder.C trojan
Win64/Riskware.Mimikatz application
Win32/RiskWare.Mimikatz application

C&C servers:

transfinance.com[.]ua (IP: 130.185.250.171)
bankstat.kiev[.]ua (IP: 82.221.128.27)
www.capital-investing.com[.]ua (IP: 82.221.131.52)

Legitimate servers abused by malware authors:

api.telegram.org (IP: 149.154.167.200, 149.154.167.197, 149.154.167.198, 149.154.167.199)

VBS backdoor:

1557E59985FAAB8EE3630641378D232541A8F6F9
31098779CE95235FED873FF32BB547FFF02AC2F5
CF7B558726527551CDD94D71F7F21E2757ECD109

Mimikatz:

91D955D6AC6264FBD4324DB2202F68D097DEB241
DCF47141069AECF6291746D4CDF10A6482F2EE2B
4CEA7E552C82FA986A8D99F9DF0EA04802C5AB5D
4134AE8F447659B465B294C131842009173A786B
698474A332580464D04162E6A75B89DE030AA768
00141A5F0B269CE182B7C4AC06C10DEA93C91664
271023936A084F52FEC50130755A41CD17D6B3B1
D7FB7927E19E483CD0F58A8AD4277686B2669831
56C03D8E43F50568741704AEE482704A4F5005AD
38E2855E11E353CEDF9A8A4F2F2747F1C5C07FCF
4EAAC7CFBAADE00BB526E6B52C43A45AA13FD82B
F4068E3528D7232CCC016975C89937B3C54AD0D1

Win32/TeleBot:

A4F2FF043693828A46321CCB11C5513F73444E34
5251EDD77D46511100FEF7EBAE10F633C1C5FC53
8D379585E0A9DB4C65450622CED26C108DC694AB

Win32/PSW.Agent.ODE (CredRaptor):

759DCDDDA26CF2CC61628611CF14CFABE4C27423
77C1C31AD4B9EBF5DB77CC8B9FE9782350294D70
EAEDC201D83328AF6A77AF3B1E7C4CAC65C05A88
EE275908790F63AFCD58E6963DC255A54FD7512A
EE9DC32621F52EDC857394E4F509C7D2559DA26B
FC68089D1A7DFB2EB4644576810068F7F451D5AA

Win32/Filecoder.NKH:

1C69F2F7DEE471B1369BF2036B94FDC8E4EDA03E

Python/Filecoder.R:

AF07AB5950D35424B1ECCC3DD0EEBC05AE7DDB5E

Win32/Filecoder.AESNI.C:

BDD2ECF290406B8A09EB01016C7658A283C407C3
9C694094BCBEB6E87CD8DD03B80B48AC1041ADC9
D2C8D76B1B97AE4CB57D0D8BE739586F82043DBD

Win32/Diskcoder.C:

34F917AABA5684FBE56D3C57D48EF2A1AA7CF06D

PHP shell:

D297281C2BF03CE2DE2359F0CE68F16317BF0A86