Лечение зараженных сайтов на modhost.pro
Привет, друзья!
Как многие уже заметили, в MODX недавно обнаружили критическую уязвимость. Заключается она в том, что одним простым запросом можно залить произвольный файл на сайт, и выполнить его. Это может быть шел, вредоносный скрипт, что угодно.
Простота атаки и беспечность владельцев сайтов привели к тому, что я уже неделю разгребаю последствия этой атаки на modhost.pro. Итак, что нужно делать, чтобы вылечить свои сайты?
Первым делом, нужно проверить, касается ли вас эта проблема. Потому что умные люди, которые закрыли служебные директории (core, manager и connectors) базовой авторизацией, как обычно ничего не заметили.
Для этого заходим на сервере по SSH, скачиваем замечательный AI-Bolit для сайтов, распаковываем zip и прогоняем сканер по всей своей директории:
После этого у вас должен быть отчёт report.json в корне рабочей директории. Выводим его на экран cat ~/report.json, копируем и вставляем на bezumkin.ru/utils/json.

В принципе, вы можете использовать любой другой антивирус или скрипт, который запустится на хостинге, но AI-Bolit очень грамотно работает, распознавая подозрительные строки кода. Бывают, конечно, и ложные срабатывания, но вы их отфильтруете при изучении результатов.
После этого возможны 2 варианта:
Нехороших файлов нет, ура! Обновляем сайт до MODX 2.6.5 через панель управления хостинга. Если есть Gallery, то её тоже, до версии 1.7.1. Заодно можно и другие дополнения обновить. После этого остаётся только закрыть служебные директории по инструкции — это защитит вас от подобных атак в будущем.
Вариант второй — вредоносные файлы есть. Тут еще 2 варианта:
— на хостинге есть резервная копия за 17 — 20 число, и вы можете её восстановить.
— нет копии, или работа вашего сайта не предполагает полное восстановление (много заказов, комментариев и т.д.), тогда чистим вручную.
Файлы могут быть как заруженными извне внедоносами, так и вашими скриптами, в которые дописали нехороший код. Поэтому придётся вручную по ним пройтись и проверить. Ненужные плохие удалить, нужные хорошие почистить от чужого кода.
Дальше как и в предыдущем пункте — обновляем ядро, Gallery, другие допы, и закрываем служебные директории через Nginx.
После всех работ прогоняем еще раз сканер — всё должно быть чисто. Обращаю ваше внимание, что сканер не является панацеей и что-то может пропустить. Поэтому можно прогнать его еще в параноидальном режиме:
На всякий случай еще посмотрите вывод ps aux в консоли — там должны быть только ваши процессы, типа php-fpm, никакой странной активности, типа запущенного почтового сервера exim от вашего имени. Еще можно смотреть свой access.log на предмет странных POST запросов — через это тоже можно найти хорошо скрытые шеллы.
Главное помните, что это не какие-то мифические неуловимые вирусы. Это просто вредоносные скрипты, залитые на сайт и работающие от имени вашего пользователя. Соседним пользователям и серверу они навредить не могут, только вашему сайту. Поэтому нужно найти и удалить все скрипты, закрыть уязвимости и всё будет хорошо. Если что-то пропустите — это что-то может снова переписать ваши файлы.
Плюсом к вашим стараниям, хостинг теперь сам мониторит странную активность, и если что-то нехорошее заметит, вы получите уведомление. Если нехорошего много, то это будет уведомление об отключении вашего сайта, потому что мы уже получили кучу жалоб от других хостингов на атаки и спам с нашего.
Напоминаю еще разок, как закрыть свои служебные директории базовой авторизацией. Судя по всему, это теперь обязательная практика для всех сайтов на MODX.
Как многие уже заметили, в MODX недавно обнаружили критическую уязвимость. Заключается она в том, что одним простым запросом можно залить произвольный файл на сайт, и выполнить его. Это может быть шел, вредоносный скрипт, что угодно.
Простота атаки и беспечность владельцев сайтов привели к тому, что я уже неделю разгребаю последствия этой атаки на modhost.pro. Итак, что нужно делать, чтобы вылечить свои сайты?
Первым делом, нужно проверить, касается ли вас эта проблема. Потому что умные люди, которые закрыли служебные директории (core, manager и connectors) базовой авторизацией, как обычно ничего не заметили.
Для этого заходим на сервере по SSH, скачиваем замечательный AI-Bolit для сайтов, распаковываем zip и прогоняем сканер по всей своей директории:
wget https://revisium.com/ai/index.php?q=715147663154063253513112476309509 -O ~/aibolit.zip
unzip ~/aibolit.zip -d ~/aibolit
php ~/aibolit/ai-bolit/ai-bolit.php -p ~/ --mode=1 -o ~/report.json --no-html --delay=5 --allАктуальную ссылку на закачку смотрите на сайте — она меняется каждый день.После этого у вас должен быть отчёт report.json в корне рабочей директории. Выводим его на экран cat ~/report.json, копируем и вставляем на bezumkin.ru/utils/json.

В принципе, вы можете использовать любой другой антивирус или скрипт, который запустится на хостинге, но AI-Bolit очень грамотно работает, распознавая подозрительные строки кода. Бывают, конечно, и ложные срабатывания, но вы их отфильтруете при изучении результатов.
После этого возможны 2 варианта:
Нехороших файлов нет, ура! Обновляем сайт до MODX 2.6.5 через панель управления хостинга. Если есть Gallery, то её тоже, до версии 1.7.1. Заодно можно и другие дополнения обновить. После этого остаётся только закрыть служебные директории по инструкции — это защитит вас от подобных атак в будущем.
Вариант второй — вредоносные файлы есть. Тут еще 2 варианта:
— на хостинге есть резервная копия за 17 — 20 число, и вы можете её восстановить.
— нет копии, или работа вашего сайта не предполагает полное восстановление (много заказов, комментариев и т.д.), тогда чистим вручную.
Файлы могут быть как заруженными извне внедоносами, так и вашими скриптами, в которые дописали нехороший код. Поэтому придётся вручную по ним пройтись и проверить. Ненужные плохие удалить, нужные хорошие почистить от чужого кода.
Дальше как и в предыдущем пункте — обновляем ядро, Gallery, другие допы, и закрываем служебные директории через Nginx.
После всех работ прогоняем еще раз сканер — всё должно быть чисто. Обращаю ваше внимание, что сканер не является панацеей и что-то может пропустить. Поэтому можно прогнать его еще в параноидальном режиме:
php ~/aibolit/ai-bolit/ai-bolit.php -p ~/ --mode=2 -o ~/report-2.json --no-html --delay=5 --allЗдесь будет куча ложных срабатываний, но вы можете заметить что-то подозрительное.На всякий случай еще посмотрите вывод ps aux в консоли — там должны быть только ваши процессы, типа php-fpm, никакой странной активности, типа запущенного почтового сервера exim от вашего имени. Еще можно смотреть свой access.log на предмет странных POST запросов — через это тоже можно найти хорошо скрытые шеллы.
Главное помните, что это не какие-то мифические неуловимые вирусы. Это просто вредоносные скрипты, залитые на сайт и работающие от имени вашего пользователя. Соседним пользователям и серверу они навредить не могут, только вашему сайту. Поэтому нужно найти и удалить все скрипты, закрыть уязвимости и всё будет хорошо. Если что-то пропустите — это что-то может снова переписать ваши файлы.
Плюсом к вашим стараниям, хостинг теперь сам мониторит странную активность, и если что-то нехорошее заметит, вы получите уведомление. Если нехорошего много, то это будет уведомление об отключении вашего сайта, потому что мы уже получили кучу жалоб от других хостингов на атаки и спам с нашего.
Напоминаю еще разок, как закрыть свои служебные директории базовой авторизацией. Судя по всему, это теперь обязательная практика для всех сайтов на MODX.
Комментарии: 80
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Настраивайте внешний SMTP, как я всегда советовал.
Настроил, вс равно проблемы с отправкой почты. Письма о новых заказов не приходят, клиентам тоже.
Значит, или неправильно настроил, или на проверка на спам не проходится и там. Других вариантов нет.
а в админке сайта SMTP авторизацию. будет всё ходить и зеленый замочек в почте отображаться, что отправитель проверен
P.S. Это нормально, что генератор .htpasswd каждый раз выдает разный хеш, хотя пароль ввожу один и тот же?
2018/07/31 20:58:16 [error] 28458#28458: *4053228 open() "/home/s11188/.htpasswd" failed (2: No such file or directory)
поставил 644 на файл, все равно в логе те же ошибки и не пускает. какие права надо на него выставить?
Каждый день новые открытия.
Ну и куча ошибок в логе насчёт session_handler говорит о том, что версия MODX на сайте очень старая.
А версию как раз вот только клиент созрел обновлять, я ее уже обновил, и стал делать базовую авторизацию, ну и вот, пришлось тебя беспокоить. Спасибо еще раз.
2) обновил MODx до последней версии средствами MODhost (кнопочка обновить систему)
3) ставлю Айболит, всё по инструкции. Прогоняю через командную строку.
4) получаю json, перевожу его в читаемый вид — тем самым получаю список зараженных файлов
5) снова откатился на Full 18/07/2018
6) НЕ обновляя систему, захожу по SSH и начинаю удалять файл за файлом из моего списка и вижу…
что у меня НЕТ файла
[16] => Array
(
[fn] => /home/s6322/www/core/packages/core.transport.zip
[ct] => 1533063699
[mt] => 1533063697
[sz] => 2981227
[sigid] => id_n6444910
)
значит, я получил зараженный файл ядра, скачав его при обновлении.
вопрос: откуда качается транспортный пакет ядра?
кто виноват?
не стал парится, удалил все. тупо. эффективно.
Там же по-русски написано:
AI-Bolit вообще по умолчанию файлы больше 650Kb не проверяет и помечает их как «большие», а не «зараженные».
AI-Bolit ругается на файл -secur.php
путь-manager/controllers/default/security/secur.php
скрин-http://joxi.ru/L21QKdoh8DyZe2
Подскажите можно удалить этот файл?
Или считаете кто-то имеет кучу свободного времени, чтобы изучить список из пары сотен файлов, что вы скинули?
подобная хрень в index php
последняя копия 28,07
Ну а потом проверить всё остальное.
Про резервные копии писал вот здесь. На заполненных серверах они делаются, если есть свободное место. Переезжайте на сервер в РФ.
А если сделать вот так:
В место защиты через nginx.
Это же обеспечит защиту директорий, хотя бы на уровне php (как раз этого и будет достаточно чтобы сайт не заразили через эту уязвимость.
Где гарантия, что в будущем не найдут что-то, что сработает раньше твоего кода и так-же заразит сайт? Ну там, в системе вызова плагинов MODX, или инициализации контекста (где уже находили дыру).
Nginx — это добавление второго фактора авторизации, а не усложнение первого.
Покопался в документации, нашел только это:
Чтобы в конфиг ngixn постоянно не лазить для добавления разрешенных IP:
Можно было бы хранить список с IP там откуда есть доступ к примеру какого то php скрипта в котором прописываешь список разрешенных IP.
По идее тогда вся защита ложится на nginx.
Или для modhost:
Можно сделать чтобы к примеру в папке /core/admin-ips лежал список ip
Администратор добавляет туда разрешенный IP
На modhost запускается скрпит каждую минуту и проверят не было ли изменений в файле. Если были то делает
Так уже можно что то придумать в плане управления MODX с этим списком IP. А то ну не прикольно добавлять новые IP для открытия доступа через панель управления хостинга или вообще через ssh.
Nginx грузит весь конфиг сразу в ОЗУ, ведь он рассчитан на высокие нагрузки и это позволяет ему не перечитывать .htaccess файлы при каждом запросе, как Apache2.
[sig] => [1] <?php /* Obfuscation provided by FOPO — Free Online PHP Obfuscator: www. @!!!>fopo.com.ar/
Это вредоносный код? Его удалять?
1. Скачиваем PuTTY для SSH (putty.exe)
2. Запускаем putty.exe и подключаемся введя данные SSH из панели управления сайтом.
Пароль пишите руками или вставляйте нажатием правой кнопки мыши. Пароль не будет виден, нажимайте enter и подключение пойдет дальше.
3. После того как Вы подключились вводим команду скачать и распаковать архив ай-болита (она указана выше):
Не забудьте обновить ссылку на айболит, которую можно взять здесь: revisium.com/ai/
Нажимаем enter и получаем вот это:
4. Ещё раз нажимаем enter, ждем 2-3 секунды и пошла проверка, которая может продлится несколько минут.
5. После окончания проверки, когда вы увидите результат в 100%, вводим команду и нажимаем enter.
6. На экране появится отчёт, который копируем от одной до другой узоной скобки (включительно).
7. После чего вставляем его сюда bezumkin.ru/utils/json
Получаем расшифровку отчёта, в котором перечислены файлы.
8. Ищем подозрительные файлы, с незнакомым названием. Если файл вам незнаком, проверяем его наличие в чистом modx revo, сравнивая его с github.com/modxcms/revolution
Я проверил все свои сайты. На одном нашёл несколько файлов, которые удалил.
Надеюсь, кому-то будет полезно.
переносишь список файлов к удалению в отдельный текстовый файл, в нем каждая строка — удаляемый файл и путь к нему
И да, вместо PuTTY под винду лучше www.bitvise.com/
А под мак?
Команда консольная, должна быть универсальна.
PuTTY — люто ненавижу)))))
В будущем планируется поддержка двух версий платной и бесплатное.
От вирусов оно конечно не избавит, но поможет разобраться с вашей файловой системой.
Смысл в том что во время сканирования происходит заказчка вашей версия MODX из репозитория https://ilyaut.ru/download-modx/ (только чистая)
Затем все распаковывается в папке core/cache/default/scannermodx/repository/modx-2.6.5-pl
Запускается паук который ищет все файлы с расширение: php,js,html,tpl,css,scss,sass,less (можно свои добавить)
И во время поиска сравниваются файлы ядра с версией ядра из репозитория.
Если в файлах ядра были какие то изменения то вы это все увидите.
В общем пробуем: https://yadi.sk/d/mLKu-jXq3a7jJU
Так же составляется список карантинных файлов и список доверенных файлов и директорий.
Чтобы не сканировать все подряд.
Так же еще можно открыть файл и посмотреть что в нем.
Вот так это все выглядит:
Если будут какие то идеи по улучшению то пишите.
Особенно нужны алгоритмы для отлова вирусных файлов. Чтобы можно было вычислять зараженные файлы.
Директории и файлы:
- 'core/components',
- 'core/docs',
- 'core/cache',
- 'core/packages',
- 'setup',
- 'core/config/config.inc.php',
По умолчанию исключены из сканирования. Но можно включить их в настройках: scannermodx_enabled_dirтогда скрипт автоматически начнет распаковку вашей версии. Версию можно посмотреть в настройках параметр settings_version
Но если брать папку core/components то сейчас ее можно сравнить! Тока надо залить свои преложения в папку с репазиторием!
scannermodx
Может быть связано с тем что установка сделана не как обычно, а с Advanced версией и с выносом ядра на более верхний уровень хостинга? Критичны ли эти ошибки?
Теперь поддержка php5 тоже есть
Закодированных обозначений, и т.д.
Что удивительно на одном аккаунта хостинга (host land. ru) сайт взломали, а на другом аккаунте этого же хостинга сайт с такими же настройками ничего не тронуто. У хостинга есть встроенный инструментарий айболита.
Ставились сайты по расширенной схеме установки, с переносом core на верхний уровень, переименованием manager и connectors.
Вот список того что было заражено:
файл minishop:
/htdocs/www/assets/components/minishop2/action.php
А также были левые файлы формата:
в переименованной папке connectors:
htdocs/www/nkucon/modx.config.js.php
в переименованной папке manager
/templates/default/security/xwfngqlk.php
/min/lib/HTTP/bqnuysmc.php
/assets/modext/sections/jghrrjgz.php
/controllers/default/system/event.class.php
/min/lib/Minify/HTML.php
/min/lib/Minify/DebugDetector.php
в корне папки assets
/assets/zlpiiuol.php
На одном из сайтов были директории плагинов редактора tinymce (не совсем понимаю почему он у меня лежит в корне сайта, а не в папке assets, лень разбирается что есть то есть)
там тоже обнаружился левый код в контроллере:
htdocs/www/js/tinymce/plugins/jbimages/ci/system/core/Controller.php
и
htdocs/www/js/tinymce/plugins/jbimages/ci/system/core/Benchmark.php
Этот файл левый лишний как оказалось — в нем явно что-то подозрительное было (без айболита не догадался бы). Может кто подскажет что делает этот файл?:
Что делает этот файл? Это взлом? Удалять этот файл?
Меня удивляет как удалось злоумышленникам записать в директории админки и коннекторов если я их переименовал (core вынес наверх)?
Из списка обнаруженного — можно говорить что риску взлома подвержены компоненты Minify? (про Gallery понятно).
Как зараза они смогли модифицировать системные файлы (/controllers/default/system/event.class.php).
У себя заметил что все измененные и зараженные файлы были модифицированны в одно и то же время (28.05.18). И таким образом я искал все файлы которые были изменены в эту дату. Но все равно айболит нашел файлы которые имели дату изменения более ранние (даже 2016 года), но при этом были встроенные левые коды (сравнивал с другими сайтами — там левых кодов в этих файлах не было).
php ~/aibolit/ai-bolit/ai-bolit.php -p ~/ --mode=1 -o ~/report.json --no-html --delay=5 --all
PHP Parse error: syntax error, unexpected T_FUNCTION in /home/s/sknnovyand/aibolit/ai-bolit/ai-bolit.php on line 2337
Запускать из консоли. Просто смотрим дату создания файла с вирусом, и в корневой директории доступной для php запускаем из командной строки пользователя данную команду с разбегом ±месяц. Видимо вирус не удосужился заменить дату создания файлов, поэтому его можно вычислить.
Ну а эта команда покажет список файлов созданных между 1 сентября 2018 года и 10 декабря 2018 года.
вирус создаёт карту сайта, авторизируется в гугл-вебмастере(собственно оттуда я и узнал что моим сайтом кто-то ещё начал управлять) добавляет туда кучу новых sitemap.xml. Похоже кто-то так размещает статьи для темного СЕО.