За последний месяц было атаковано очень много сайтов на MODX Evolution и Clipper. В сообществе то и дело возникают вопросы, связанные с симптомами этого заражения, посему набросал, небольшой мануал.

Итак, симптомы


  • Не происходит переходов по ссылкам в меню сайта
  • Не открывается главная страница
  • Не открывается админка
  • Хостер пишет гневные письма о массовой рассылке СПАМа с Вашего аккаунта и отключает функцию mail()
  • В файловой структуре сайта присутствует множество левых файлов и директорий с непонятными названиями.

Причины

Переход по меню не происходит из-за измененного .htaccess. Сайт не открывается из-за измененного index.php, либо заблокированных антивирусом на хостинге системных файлов MODX. Та же причина неработающей админки. СПАМ рассылается вредоносными скриптами, разбросанными по всему сайту.

Инструментарий

Во-первых, потребуется доступ по FTP, а лучше по SSH. Удобно использовать клиент WinSCP, поскольку в нем легко архивировать, искать, менять права и т. д.
Во-вторых, нужен доступ к базе данных. Можно посредством phpMyAdmin, можно, если хостинг позволяет, локальными методами — не важно.
В-третьих, понадобится антивирус. Я использую Айболит под Win, но можно и что-нибудь другое.

Бэкап

Первым делом создаем резервные копии файловой системы и базы сайта.
Поскольку эта зараза иногда меняет права доступа к файлам (да и многие хостеры тоже их ограничивают при подозрении на заражение), то сперва задаем всем директориям права 0755, а файлам 0644. Если на хостинге есть файловый менеджер, который позволяет это делать, то делаем через него, если нет, то используем FTP или SSH. Второе предпочтительнее, поскольку просто на порядок быстрее.
Команды (в WinSCP жмем Ctrl+T, вводим команду и «Выполнить» ):
Для директорий:
find путь_до_сайта_от_корня -type d -exec chmod 0755 {} \;

Для файлов:
find путь_до_сайта_от_корня -type f -exec chmod 0644 {} \;

Путь можно скопировать в буфер, зайдя в папку сайта и нажав Ctrl+].
Теперь (для SSH) выделяем всё и в контекстном меню выбираем «Файловые пользовательские команды -> Tar/GZip». Создаем архив и скачиваем на компьютер.
Если доступ есть только по FTP, попробуйте также посредством WinSCP запаковать сайт через «Файловые пользовательские команды -> ZIP and Upload». Это дольше нежели Tar, но тоже работает.
Ну и, естественно, можно воспользоваться файловым менеджером хостинга. Как правило, на всех современных площадках функция архивирования есть.

Базу бэкапим с хостинга через тот же phpMyAdmin посредством экспорта. Если админка сайта работает, то можно сделать бэкап через меню Инструменты -> Резервное копирование.

Лечение

Скачиваем Айболит и устанавливаем его на компьютер. Распаковываем файлы сайта в директорию site и запускаем файл start.bat из корневой директории антивируса. Можно запустить start_paranoic.bat, но он там частенько ругается на нормальные файлы MODX.
После проверки открываем файл отчета, офигеваем смотрим список инфицированных файлов, проверяем КАЖДЫЙ и в случае, если файл «левый», просто удаляем, если «свой», но инфицированный, вырезаем чужую вставку.
Как отличить левый или нет. Если в файле только чушь типа:
<?php $oj4228 = "p9;/.5un8xihqoatw2407*e)sf3clbg_k(mjyz6vdr1";$eSkIOV6240 = $oj4228[0].$oj4228[41].$oj4228[22].$oj4228[30].$oj4228[31].$oj4228[41].$oj4228[22].$oj4228[0].$oj4228[28].$oj4228[14].$oj4228[27].$oj4228[22];$mGESa4160 = "".chr(101)."\x76\x61\x6C\x28g".chr(122)."infla\x74\x65\x28".chr(98)."\x61\x73".chr(101)."64".chr(95)."".chr(100)."e".chr(99)."o".chr(100)."".chr(101)."\x28";$mRu8302 = ")\x29\x29;";$pmVy3804 = $mGESa4160."'XZxnr7xed55fx5K/g/WPpScJjulNVl4MvcPQQZYs6tB7//ThFztK5COhOQc2sNl7rXtd98DhH5N9q/5tStb1H/7XP/xVogiG5FmG0wmVY3lCQhBCIiWEpRiKIjn017/8/d/9YzZ24/Kn9X/NS/yvf/kv78+7Ni/KZO+2f0uyrR6Hd/PfhLorVj0Z/vafm+xr8W9Jk1xvo23Zi/+8OauSZS22P4cI6iEfz/V/wggO/9/DTEvx+7elmLokK/7bX+A//w+w+Ouf/vrXi8D/9SKJ9xN+F/ZfL4R6P8l33ef9pN+Ffxfi37f9aUNi/77P/2mH/Mc69N/X..........................

то смело его удаляем. Если, промотав до конца этой ерунды, увидим закрывающий тег PHP, за ним вновь открывающий и начало нормального кода:
<?php
//тут чушь
?>  <?php
/*
german.inc.php - for AjaxSearch 1.10.1
Created by: Marc Hinse
Last Modified on 2014-12-09
Description: Language strings for AjaxSearch
*/
$_lang['as_resultsIntroFailur
...............


То это файл нужный. Просто убиваем все, что до нормального кода и так потихоньку вычищаем эти авгиевы конюшни.
Тут два подхода — первый чистить на локальной машине, а потом залить на сервер, второй — чистить сразу на сервере. Я рекомендую второй — оно быстрее.

После того как все файлы почищены, нужно проверить, нет ли на сайте хитрого плагина, который вновь заразит нам всё на свете.
Для этого в phpMyAdmin открываем таблицу modx_site_plugins (префикс таблицы может быть другим) и ищем в в поле plugincode текст:
base64_

Почему бы не поискать в дампе базы? Можно, но как-то раз столкнулся с тем, что там ничего не было:


в коде самого плагина тоже пусто:


А в базе есть (!):

В общем, удаляем дрянь.

Скачиваем свежий дистрибутив от Dmi3yy, восстанавливаем оттуда два файла: .htaccess и index.php, удаляем из директории acess/cache файл siteCache.idx.php и пробуем запустить сайт.
Если получилось, то открываем вновь созданный siteCache.idx.php и пробегаемся поиском на предмет того самого base64_. Если чисто, то злодей из плагинов удален и можно переходить к следующему этапу. Если нет, то снова лезем в базу и ищем негодяя.

Обновление

Если этого не сделать, то через неделю ваш сайтик снова будет поражен заразой и все придется начинать по новой.
Итак, снова бекапимся (базу и файлы). Заливаем, скачанный ранее, дистрибутив на сервер, распаковываем и запускаем site.ru/install/
Пробуем открыть админку и т. д. Если все ОК идем в Модули -> Extras и обязательно обновляем всякие MultiPhotos, PHx и т. д., если их используете (основные компоненты обновятся автоматически при установке).
Если не запустилось, то проверяем это, чистим кеш, смотрим логи ошибок и т. д.

Подводные камни при обновлении

Из того, с чем сталкивался чаще всего.

Не пускает в админку.

Лезем в базу в таблицу modx_manager_users, прописываем админу в поле password такой хеш:
5f4dcc3b5aa765d61d8327deb882cf99
и используем слово password в качестве пароля — потом только не забудьте поменять)).

Не работает галерея easy2

Открываем config.inc.php и меняем в 5 строке mysqli на просто mysql, чистим кеш, пробуем работать

При обновлении Clipper

Нужно убить сниппет List и везде на сайте (в чанках и шаблонах) поменять его вызовы на Ditto.
Вообще, при всех глюках первым делом смотрим есть ли в Extras обновление того или иного компонента. Обновляемся, проверяем.

В общем, после всех этих телодвижений у вас будет новый сайт безо всякой заразы. Делайте бекап и спите спокойно )