Как стать автором
Обновить

Комментарии 43

Главная проблема, по-моему, в том, что кто-то вам залил на сервер свой файл. Гораздо интереснее было бы прочитать анализ того, как это было сделано, а не что этот файл делал дальше.
Мопед не мой © у знакомого на сервере стоят различные покупные php-скрипты, в одном из них была дырка, он обновил его на новую версию.
Видел сегодня точно такой же взлом с db/indx.php (именно в db/). На сайте установлен pivotX. Видимо, выплыл какой-то эксплойт для этой CMS'ки.
Название CMS'и еще бы знать.
В моем случае оказалось, что поломали еще в октябре через timthumb.php в pivotX. С тех пор лежало тихонько, получается.

В последнее время вижу много сайтов, которые поломали 2-3 месяца назад, но какая-то заметная активность началась только сейчас.

Также вижу повышение хитрости взломщиков — скрипты чаще маскируют под поломанную CMS'ку, раньше просто валялись с легкоузнаваемыми названиями в легкоузнаваемых местах.
НЛО прилетело и опубликовало эту надпись здесь
Отнюдь. У меня есть несколько скриптов, которые запускают шелл-вызовы через веб-морду и от них отказаться нет возможности.

Может быть есть способ запретить шелл-вызовы всем скриптам, кроме определенных? А то меня тоже недавно поимели через дырку в забытом phpmyadmin.
НЛО прилетело и опубликовало эту надпись здесь
Ну так там интерактивная веб-морда, которая запускает команды, нужные не по крону, а прям сейчас.

Или я что-то не знаю о взаимодействии пхп с кроном?
НЛО прилетело и опубликовало эту надпись здесь
Вариант 1:
Можно приколхозить слежение за каким-либо файлом, хоть на tail -f и просто писать в файл из РНР. А потом в РНР ждать появления определённого файла с ответом и просто его транслировать.
Вариант 2:
Ставим модуль runkit, запрещаем все функции кроме, например, exec(), через ранкит переименовываем стандартную функцию exec() и делаем свою с фильтрацией команд и т.п. Потом уже вызываем переименованную функцию (которая на самом деле стандартная) и возвращаем её результат. Выгода: вызывай хацкер хоть завызывайся эту функцию, если команды не пройдут проверку — в сад.
Вариант 3:
Придумать самим.
Вариант 4: придумать для PHP-файлов специальное расширение, которое никто не будет знать. Например *.somephpstuff. Кулхацкер заливает файл *.php, запрашивает и… Видит свой-же г-внокод. Но есть минус, который я где-то на хабре уже обсуждал — переезд на другой сервер, и все исходники случайно выставляются напоказ. Плюс, хранить php в файлах не *.php — некошерно, ИМХО.

Вариант 5: запретить пользователю, от которого работает PHP записывать файлы на диск. Хранить все, включая небольшие картинки-аватарки, в БД (естественно, нужно фильтровать вх. данные). Тогда никакой шелл залить не получится.

Вариант 6: самостоятельно выдавать имена загружаемым файлам (чтобы не залили картинку «backdoor.php»).
Я примерно о том же и написал в п. 3 :) Вариантов решения одной проблемы всегда >1 :)
Еще есть прекрасная опция auto_prepend_file. Указываем файл, в нем проверяем какой php файл был запущен, если не из списа разрешенных — exit
Вполне неплохое решение, как правило используют mod-rewrite и файл запускают один
Примерно так с runkit:
runkit_function_rename ('exec', 'execWithBlackjack');
function exec($sCommand) {
    if (isValidCommand($sCommand)) {
        return execWithBlackjack($sCommand);
    }
    return FALSE;
}
pro100tak, однако, спасибо за крутой коммент! именно так и сделаю значит на продакшне.

Еще недавно узнал, что можно переопределять в PHP некоторые системные функции. Например, у нас так программер переписал все функции по работе с сессиями под наши нужды.
upd. Насчет переопределения функций — это я глупость сказал, не подумав: оно ведь работает в пределах одного скрипта, а не глобально.
Оно как раз должно работать глобально, чтобы ни с какого места не смогли бы до него достучаться. Я б ещё использовал auto_prepend_file директиву в ini файле. А там — если адреса страниц не в списке — просто удалять эту функцию (чтоб даже мышь не проскочила). А для разрешённых адресов — переопределять.
Кстати (c php.net):
Замечание: По умолчанию, только пользовательские функции могут быть удалены, переименованы или изменены. Для перекрытия внутренних функций, необходимо включить в php.ini опцию runkit.internal_override.

Мануал: http://php.net/manual/ru/book.runkit.php
runkit достаточно накладен по ресурсам и медленен. Я бы не стал его использовать на часто запрашиваемых страницах. Точно также как и Reflection.
И чего такого медленного и накладного в приведенном примере? Вроде бы речь не о sandbox.
Я стараюсь вообще такую магию не пользовать или кешировать напрочь результаты работы заклинаний :)
Хотя, я даже не задумывался — что же там накладного… Наверное — это условный рефлекс уже: runkit — медленно.
А сам runkit уже продакшн-реди? Я где-то читал, что он сам еще молод, зелен и дыряв!
Что-то я не верю, что может быть задача которая не сможет подождать максимум минуту. Вопросы безопасности это всегда отношение скорость/безопасность. Поэтому, имхо, разумнее схема, при которой из веб морды запускается не команда, а делается запись в БД с описанием задания. В кроне висит скрипт который ежеминутно дергает cli php скрипт который лезет в базу, получает задание и уже сам решает, делать или нет и если да, то выполняет его. Максимальная задержка на запуск — минута, в реальности будет ниже.
Вариант с tail -f пока мне нравится больше всего.
Тут не суть, главное чтобы в файл или БД (или в очередь в памяти) писалась не команда шелла, а команда «наблюдателю», которую он сам будет интерпретировать в команды шелла.

Кстати, хороший, имхо, вариант — реализовать через sysvsem msg_*. Оверхида должно быть куда меньше, чем при работе с БД или ФС. Веб-морда пишет задания в одну очередь, демон или задача хрона (чтоб возможных утечек избежать) их оттуда читает, обрабатывает и пишет результаты в другую очередь, откуда их читает веб-морда.
Ну ты же знаешь, что это не всегда возможно. Всякие платные скрипты под зендом очень любят дернуть mplayer, imagemagick и тп
Это ж Анонимусы ) Продолжают войну за свободу викиликс )
а тем временем Bank of America грузится очень долго.
не выдерживает хабраэффект :)
да не скорей подобные скрипты залитые на другие сервера.
Хм… DDOS второго порядка (через хабраэффект)…
Можно было еще посомтреть, кто к этому скрипту обращался и с какого IP. Сейчас многие «хакеры» даже IP не скрывают, так как их никто не ловит все равно.
Разумеется, я сразу настроил лог на этот локейшен. Обращались всего один раз, отсюда 184.22.135.184. Какой-то сервант в штатах.
Помню была такая хреновина достаточно давно. Контрольный центр кажется smerch назывался, а «ноды» — обычные вебшеллы c возможностью exec.
2006 год, кажется. Не думал что кто-то вспомнит про эту технологию.
шеловый ботнет. они сейчас актуальны
Недавно такое же было на одном из серверов. Было подозрение на открытый PMA (но вход в сам ПМА по логину и паролю) без Basic Auth и на CNStats.

CNStats просто выпили, PMA теперь под Basic Auth. Больше гадость не появлялась.

Коннекты кстати были с айпи 188.240.236.12 (Румыния).

Забивало весь канал пару часов.
Совершенно очевидно, что используются эксплоиты, заливается файл и дальше пошло-поехало. Держите софт обновленным, а необновленным — скрытым от посторонних глаз.

Хорошо, что сервер был не продакшен, ничего особенного на нем не вертелось.
Itsoknoproblembro. Порадовало название скрипта.
Спасибо за статью, прочитал на одном дыхании, прямо мануал по troubleshoot'ингу ;-)
во многие wordpress-темы, кстати, входит библиотека thumbnail — которая легко и просто кропает картинки, но при этом является ещё и дырой, которую надо умело прикрывать (делов то — назначить false двум переменным).

а изза того, что я вовремя не обновил саму библиотеку на 4 сайтах — у меня на хёцнере целиком сервак стопанули. теперь вот и не знаю как быть то вообще.
А нельзя поподробнее?
Сейчас уже, в свежих версиях этой библиотеки беда «прикрыта».
в 2011 году — библиотека thumbnail была дырой.
Теперь уже не акутально.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории