Как найти источник спама с сайта? Логгер стека вызова функций.

Друзья, очень нужен ваш совет.
Как отследить, каким модулем вызывается class.phpmailer.php? Именно на него ссылаются логи полученные от хостера.
Знаний не хватает, а хотелось бы, (но не знаю как) реализовать логгер стека вызова функций. Это должно помочь в поиске первоисточника «заразы».
Заранее каюсь, что «новичок», поэтому прошу сильно не троллить.

Как план действий:
Хочу обновить MODX и все дополнения до последних версий. Запилить по возможности логгер и попросить хостера разблокировать почту.
Если это была просто не закрытая уязвимость в неактуальных версиях софта и спам прекратиться, то хорошо. Если не прекратиться, то хотя-бы лог поможет отследить источник.

Подробности:
Хостер прислал письмо о спаме, рассылаемом с сайта, в связи с чем им была заблокирована возможность отправки почты.
Благо, аккаунт не заблокировали и сайт работает.
Прислали логи веб-сервера и почтовика. В логах почты обнаружились строки отсылающие к модулю «class.phpmailer.php» такого вида:
«X-PHP-Originating-Script: „1550:class.phpmailer.php“
Из этого лога так же видно, что спам рассылался на адреса зарегистрованных на сайте пользователей, а не просто „кому-попало“.
Сопоставление логов по времени не дало каких-либо зацепок.
Прогон по онлайн-сканерам virustotal.com, rescan.pro, drweb.ru и другим не выявил ничего подозрительного, равно как и сканирование AI-Bolit-ом через ssh и локальное сканирование Norton Security.
Пароли админа CMS, БД и хостинга поменял в первую очередь.

Исходные данные:
На сайте MODX Revo (2.5.4).
Компоненты: Login (1.9.2), FormIt (2.2.11), Tickets (1.8.0), pdoTools (2.8.0), EasyComm (1.2.6), ajaxform (1.1.8).
Знаю, что надо было обновляться вовремя, но момент уже упущен.
На сайте реализован форум на Tickets, сообщения могут оставлять только зареганные пользователи. Есть регистрация/авторизация пользователей через Login.
На формах обратной связи (FormIt) и EasyComm стоит гугловская Recapcha2.

Конкретных вопросов два:
1. Как бы вы поступили в подобном случае?
2. Как отследить откуда вызывается class.phpmailer.php?
exist17
07 декабря 2017, 10:14
modx.pro
1
3 630
0

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

Павел Романов
07 декабря 2017, 14:07
+1
Для начала переименуйте директорию assets.

У меня пару раз были (сопоставил по времени access-лог и лог mail-сервера) массовые обращения к assets/components/office/action.php
Переименовал assets — все прошло )) Видно кто-то целенаправленно долбит Office. То же самое, теоретически возможно и с Login.

Только не забудьте после переименования переписать пути в core/config/config.inc.php
Ну и потестируйте — в некоторых дополнениях assets явно задан (например, в JS-скрипте Shopkeeper).
    exist17
    07 декабря 2017, 14:14
    0
    Павел, спасибо за ответ! Как вариант, возьму на заметку.
    g0dzilla
    07 декабря 2017, 14:22
    +2
    Я так понимаю непонятно, что провоцирует отправку писем.
    Пробегитесь поиском по mysql по фразе «modx->mail», может где встречается в плагинах, сниппетах.
    И так же по этой фразе по всем файлам.
    Далее — самое сложное, нужно логировать отправку писем, т.е. везде дописать лог (факт) отправки писем. (время, тема, тело письма и т.д.).
    Лучше начать с тех мест, до которых дотронулись руки не автора компонента (системы).
      exist17
      07 декабря 2017, 14:42
      0
      Спасибо! Вы же имеете в виду логгирование в журнал MODXа?
      $modx->log(modX::LOG_LEVEL_ERROR, 'Информация об отравляемом письме');
      Правильно понимаю?
        g0dzilla
        07 декабря 2017, 17:21
        +2
        Да, его именно
          exist17
          08 декабря 2017, 09:41
          0
          Можно уточню?
          Сори заранее за нубский вопрос. Сформулирую как смогу.
          Получается, если нам известно из логов, что при отправке спама был задействован модуль «class.phpmailer.php», то в любом случае был использован встроенный почтовик MODXа?
          То есть, в любом случае был использован метод modx->mail->send()?
          Нет ли каких то обходных вариантов, при которых метод modx->mail->send() не используется, но в конечном итоге задействуется «class.phpmailer.php»?
            g0dzilla
            08 декабря 2017, 10:53
            0
            есть, но думаю маловероятно.
            У вас не вирус, не троян серверный. У вас ошибка разработчика (фрилансера или сотрудника, хз). Что-то упустили, и письма строчатся по кд.
              g0dzilla
              08 декабря 2017, 10:53
              0
              я думаю, что виновник вообще один из плагинов, но это только мысли. Начал бы оттуда
                exist17
                08 декабря 2017, 12:26
                0
                Тут новые подробности выясняются по ходу дела. Покопался в логах, сопоставил некоторые факты. Пока только предположение. Но если подтвердится — то это полный успех.
                Похоже, что дело вовсе не в зловреде каком-то. А все гораздо прозаичнее.
                У нас к сайту почта mail.ru привязана, и есть подозрение, что забанили за большое количество одновременно высылаемых писем-уведомлений от Tickets-a. Такие дела :)
                Сейчас жду ответа от саппорта мэйла.
        Олег Максименко
        08 декабря 2017, 15:48
        +1
        Пиши в лог прямо в class.phpmailer.php перед отправкой письма результат работы функции debug_backtrace(). Как найдёшь уберёшь запись в лог.
          exist17
          08 декабря 2017, 19:00
          0
          Вы знаете, пробовал в самом начале этой истории. Но что-то у меня не взлетело.
          Насколько помню у меня даже запись в лог не пошла. Пробовал как то так:
          $modx->log(1, 'что-то для записи в лог');
          и так:
          $this->modx->log(1, 'что-то для записи в лог');
          Оба варианта вешали страницу с 500-й ошибкой.
            Олег Максименко
            08 декабря 2017, 19:06
            +1
            Не используейте там апи модыкса (оно скорее всего там недоступно). Можно как-то так:

            file_put_contents(
                dirname($_SERVER['DOCUMENT_ROOT']) . '/~phpmailer.log',
                json_encode(debug_backtrace()) . PHP_EOL,
                FILE_APPEND
            );
              exist17
              08 декабря 2017, 19:53
              0
              Блин, а я голову ломал, «что не так делаю?!»
              Спасибо!
                Леонид
                07 января 2019, 07:11
                0
                А куда это внедрить:
                file_put_contents(
                dirname($_SERVER['DOCUMENT_ROOT']). '/~phpmailer.log',
                json_encode(debug_backtrace()). PHP_EOL,
                FILE_APPEND
                );
            Леонид
            02 января 2019, 18:06
            0
            class.phpmailer.php находится в /core, если у вас Apache, есть ли у вас там .htaccess? Говорят помогает от доступа к файлу напрямую)))
              exist17
              14 февраля 2019, 13:46
              0
              Спасибо, но вопрос уже решен.
              Дело было не во взломе и не в каком-либо зловредном скрипте.
              На сайте блог на Tickets. Когда пользователи оставляют комментарий, Tickets отсылает всем подписанным на данный пост уведомления на электронку. Робот хостера посчитал большое количество этих писем-уведомлений за спамную активность и отрубил почтовый сервис. Решилось все после добавления пары доменных записей DKIM и SPF и общения с тех.поддержкой хостера.
              Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
              16