Лечим сайт на WordPress
Забавно иногда выпадают события в жизни. Мне попался классный курс на Udemy по современным способам защиты и взломов сайтов. Повышая свой уровень квалификации, я проворонил заражение вирусами своего блога. Скорее всего, пользователи WordPress так или иначе сталкивались с симптомами, которые я дальше опишу. Если нет – то вы везунчики. Я сам очень долгое время ничего не цеплял на сайты, думая о том, как все же умудряются заражать свои веб-ресурсы. Еще в 2014 году меня удивляли сообщения на форумах о том, что их сайт с отличной посещалкой просто заразили и увели.
И вот, сегодня утром на почту от моего хостера прилетело письмо, которое меня и озадачило. Да, я был приятно удивлен, что ihc мониторит сайты на наличие малвари, но сообщение, которое гласило о том, что один файл был измен ночью без моего ведома и это подозрение на вирусную активность, вызвало сумбурные эмоции. Фактически, это было подтверждением моих подозрений.
Некоторое время назад я обнаружил, что в метрике есть переходы на сайты, которые у меня просто никак не могут быть прописаны в постах. Когда я попытался найти эти ссылки тупо через поисковик блога, меня редиректило на Apache с сообщением об ошибке. Уже тогда заподозрив неладное, я полез в файл search.php активной темы, в котором увидел обфусцированный код. Тогда это меня поставило в ступор, но в силу нехватки времени не стал копаться дальше. Как оказалось зря. Ведь это и был один из признаков заражения.
Я глупо понадеялся на средства обнаружения вредоносного кода от различных сервисов, которыми пещрит интернет. Все они «радостно» сообщали мне о том, что сайт чист как утренняя роса.
Представьте себе парадоксальную ситуацию – есть неработающая функция поиска, есть обфусцированный код на php, чтобы незадачливый веб-мастер не увидел «подарок», а антивирусные сервисы просто молчат.
Но вернемся к нашим баранам, точнее, к сайтам. На всех этих сайтах у меня авторизация двухуровневая. Может, это и спасло от увода сайта хакером. Через два дня после того, как была заражена search.php на мою почту прилетело извещение от ihc.ru о том, что некоторые файлы были изменены и если я ничего не делал, то рекомендуется проверить антивирусом, который предоставляет сам хостинг. Что же, вот и подвернулась возможность потестить этот антивирус, жаль только что в качестве испытуемого попал мой любимый сайт 🙁
Результат проверки, мягко говоря, весьма озадачил меня. Антивирус лопатил сайт минут сорок и потом прислал свой «вердикт». 42 файла были заражены…
Вот тут было в пору хвататься за голову, думая о том, как вообще подобное могло произойти. Само собой, что имел место эксплойт. Но об этом потом.
Нужно было лечить сайт, но для этого его нужно было основательно исследовать. Да, можно было сделать гораздо проще – слить дамп базы, перенести картинки из wp-content и все это перезалить на свежеустановленный движок Вордпресса. Но «легче» – не значит «лучше». Фактически, не зная, что было изменено, можно было ожидать, что дыра появится и на перезалитом сайте. И тут впору было стать новоиспеченным Шерлоком Холмсом, дабы провести полный аудит сайта.
Честно скажу, что подобного азарта и интереса я давно не испытывал. Да, мне во многом помог антивирус с хостинга, указав, в каких файлах он нашел изменения. Но и даже он не все смог обнаружить полностью, так как код чередовался обфускацией и банальным hex-кодированием посредством вредоносного js. Нужно было много ручками делать, используя все сторонние инструменты всего лишь в качестве помощников.
Итак, запускаем редактор кода и смотрим на зараженные файлы. На самом деле, в коде они «палятся» достаточно быстро в силу своей зашифрованности. Тем не менее, это далеко не везде. Бывало, что нужно было строчка за строчкой разбирать код php файла и разбираться, что с ним не так. Сразу скажу, что это было с файлами темы. В этом случае очень пригодятся оригинальные файлы темы для сравнения, если точно не уверен, для чего нужна та или иная функция (а ведь правильно написанный вирус должен наследить как можно меньше).
Но давайте все рассмотрим по порядку. Скриншот обфусцированного вирусом кода я уже выложил в начале статьи. При помощи ресурса https://malwaredecoder.com/ можно декодировать его в удобоваримый вид и изучить. В моем случае, некоторые файлы содержали инъекцию. Все это стираем к чертовой матери.
Тем не менее, иногда может попадаться короткий код с инклудом. Как правило, так заражаются index.php и wp-config.php. К сожалению, скриншот такого кода я не стал делать, так как на тот момент не планировал писать статью. По этому коду видно было, что это закодированный через js код вызова определенного файла. Для декодирования 16ричного кода воспользуемся сервисом http://ddecode.com/hexdecoder/, с помощью которого и определим, что вызывается файл по адресу wp-includes/Text/Diff/.703f1cf4.ico (я опустил полный путь, важна сама суть). Как думаете, стоит ли вызов простого файла иконки кодировать, хоть и относительно простым кодированием? Думаю, ответ очевиден и открываем через блокнот эту «иконку». Естественно, что снова это оказался полностью закодированный файл php. Удаляем его.
Расчистив очевидные файлы, можно переходить на уже не такие очевидные – к файлам тем WordPress. Вот тут обфускация не используется, нужно рыть код. На самом деле, если не знать, что изначально задумывал разработчик, то эта задача весьма творческая, хотя и достаточно быстро решаема. Если не меняли код темы, проще заменить зараженные файлы (антивирус их точно опознал) и идем дальше. Либо можете покопаться как я и найти, что очень часто такого рода вирусы приписывают в файл function.php абсолютно левую функцию, в которой наверняка будет код обращения к sql. В моем случае он выглядит так (форматирование оставил без изменения):
$sq1="SELECT DISTINCT ID, post_title, post_content, post_password, comment_ID, comment_post_ID, comment_author, comment_date_gmt, comment_approved, comment_type, SUBSTRING(comment_content,1,$src_length) AS com_excerpt FROM $wpdb->comments LEFT OUTER JOIN $wpdb->posts ON ($wpdb->comments.comment_post_ID=$wpdb->posts.ID) WHERE comment_approved=\"1\" AND comment_type=\"\" A ND post_author=\"li".$sepr."vethe".$comment_types."mes".$sepr."@".$c_is_approved."gm".$comment_auth."ail".$sepr.".".$sepr."co"."m\" AND post_password=\"\" AND comment_date_gmt >= CURRENT_TIMESTAMP() ORDER BY comment_date_gmt DESC LIMIT $src_count";
Куда эта выборка идет мы уже вычистили. Поэтому спокойно смотрим, в какой функции находится этот код и удаляем всю эту функцию – ее приписала малварь. Но, повторюсь, гораздо проще и лучше перезаписать весь файл из готовой темы, если боитесь что-либо сломать.
Ну и финальный штрих – проверяем число пользователей сайта. Все свои сайты я всегда вел сам. Соответственно, никаких иных пользователей быть не может и не должно. Однако учитывая заражение, легко догадаться, что сайт попытаются умыкнуть и создать своего пользователя с админскими правами. В моем случае это оказался wp.service.controller.2wXoZ. Удаляем его.
Работы проведено много, но есть ли выхлоп? Проверим снова антивирусом, который сообщает о том, что вирусов больше не обнаружено. Все, сайт вылечен.
Итоги
Как видите, вылечить сайт достаточно просто, хотя и время затратно. После лечения нужно предупредить подобные ситуации в дальнейшем. Тут нужно сделать всего несколько шагов:
- Обновите сам WordPress до последней версии. Возможно, что воспользовались эксплойтом для устаревшего движка.
- Прошерстите все плагины. Удалите все ненужные (которые поставили на «будущее» и не используете) и проверьте актуальность уже работающих. Тем не менее, даже выкачав плагин из репозитория WordPress, это не дает вам гарантии того, что этот плагин будет чист. Участились случаи, когда выкупают тот или иной плагин, делают из него малварь и при обновлении на вашем сайте вы столкнетесь с такими же «радостями» как и я. В моем случае, меня заразили как раз так.
- Всегда проверяйте тему. Если публичные – обновляйте. Конечно, лучше, если ее купить на том же templatemonster, хотя и это не дает 100% защиту.
- Не пренебрегайте инструментами типа Wordfence. Хотя бесплатная версия плагина весьма и весьма ограничена, но вы хотя бы будете знать, что на вашем сайте подозрительно стало.
- Раз в месяц не ленитесь прогонять сайт через wpscan, чтобы увидеть какие на нем появились уязвимости.
- Обратите внимание на корень сайта. Там может появиться файл index.html.bak.bak. Это тоже говорит о том, что у вас зараженный сайт (сразу можете править index.php, он 100% заражен)
- Не доверяйте публичным антивирусам сайтов. Толку от них мало.
Я попытался на своем примере показать то, как можно вылечить сайт на WordPress. Антивирус на ihc.ru представляет собой просто сканер малвари. Но и он хорошо упростил работу. Тем не менее, даже если у вашего хостинга нет подобной услуги, можно по приведенному выше алгоритму определить и предупредить заражение.