0 Пользователей и 1 Гость просматривают эту тему.
  • 18 Ответов
  • 4380 Просмотров
*

GRIG

  • Осваиваюсь на форуме
  • 38
  • 2 / 0
Делюсь наработкой, родившейся в результате чистки последствий двух хакерских атак (включая одну с внедрением WSO web shell).
Всем понятно, что одним из средств своевременного обнаружения атаки является мониторинг файлов на предмет возможных несанкционированных изменений в них. Вот я и сделал средство для такого мониторинга для своих нужд.
Средство заточено под хостинг NIC, но может быть легко подогнано под другой хостинг, использующий UNIX-подобную ОС и позволяющий пользователям использовать ssh и cron.
Особенности конкретной CMS используются только в одном месте. Так что можно легко подогнать средство под другие CMS.

На хостинге каждому арендатору дается идентификатор. Арендатор на своем хостинге может держать несколько сайтов. В соответствии с правилами хостинга сайт живет в каталоге:
Код
(скрытая часть)/home/идентификатор_пользователя/домен_сайта

Часть полного пути хостинг каким-то образом от пользователя скрывает. Но для нас она не существенна.
Для файлов, составляющих непосредственно сайт, выделен каталог
Код
(скрытая часть)/home/идентификатор_пользователя/домен_сайта/docs

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

Для установки системы мониторинга на хостинг нужно сделать следующее:
1. Зайти на хостинг по ssh
2. Создать каталог
Код
/home/идентификатор_польователя/домен_сайта/.security
и прописать ему права доступа 0700
3. Перейти в только что созданный каталог и в нем создать файл с именем check.sh следующего содержания:
UPD от 8.06.2013: по сравнению с первой версией добавил еще 2 строки в конец
Код
cd $HOME/домен_сайта/docs
find . -ls | grep -v " ./cache" | grep -v " ./administrator/cache" | grep -v " ./tmp" | sort -k 11 > ../.security/filelist
cd $HOME/домен_сайта/.security
#diff -bw -c0 filelist.prev filelist
cp filelist filelist.prev
cp filelist filelist.`date +"%Y%m%d-%H%M%S"`
find . -name "filelist*[0-9]" -mtime +1 -exec gzip {} \;
find . -name "filelist*gz" -mtime +15 -exec rm {} \;
обратите внимание на сочетание обратных апострофов, двойных кавычек и регистр букв в последней строке - все это существенно.
4. Присвоить этому файлу права доступа 0700
5. Один раз запустить этот файл
6. Снова открыть этот файл в редакторе и в 4-й строке убрать знак "#" в самом начале строки.

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

7. Войти на хостинг через панель управления хостингом, в предлагаемом меню выбрать "Веб-сервер", затем "Планировщик заданий".
8. В поле ввода "создать новое задание" написать какое-либо имя для задания и кликнуть в кнопку "создать".
9. В появившейся форме ввести:
  • в поле "выполняемая программа" - /home/идентификатор_пользователя/домен_сайта/.security/check.sh
  • в списке выбора "выполнение" - "разрешено"
  • в списке выбора "выводить сообщения" - "да"
  • в наборе чекбоксов "время выполнения" - как пожелаете (я поставил ежечасно)
после чего кликнуть в кнопку "сохранить".

Система готова. Теперь для тех, кто совсем плохо знает *NIX-системы объясняю как она работает.
Про запуск контролирующего скрипта по cron'у все более-менее понятно. Тонкостью тут является настройка "выводить сообщения": если она включена - то хостинг перехватывает стандартный вывод запущенного скрипта, и если этот вывод не равен нулю - посылает его письмом контактному лицу, указанному в договоре хостинга. Если же вывод пустой - то никаких писем не посылается.
Теперь непосредственно по контролирующему скрипту.
1-я строчка - просто переход в каталог, где живет сайт.
2-я строчка - сцепленные между собой "конвейером" команды:
  • find . -ls - найти все файлы в каталоге и его подкаталогов и для каждого вывести в стандартный вывод строчку информации. Далеко не все из того, что будет выведено, нам интересно. Но некоторое количество интересных вещей тоже имеется. А именно: пользователь-владелец, группа, права доступа, размер в байтах, время последней модификации, имя файла и путь к нему относительно каталога, указанного в параметре команды (т.е. в нашем случае - относительно корневого каталога видимой части сайта)
  • 3 команды grep -v - удалить из получившегося списка каталоги, которые могут на законных основаниях менять свое содержимое, и файлы из них. Это необязательная часть скрипта (например, у меня один из сайтов на Wordpressе - для него эта часть не понадобилась)
  • sort -k 11 - отсортировать получившийся набор строк по 11-му полю (полем считается группа непробельных символов, разделенная любым количеством пробелов), т.е. в данном конкретном случае по пути к файлу и имени файла
  • > - записать результат выдачи команды в заданный файл
3-я строчка - перейти в тот каталог, где живет система контроля и создаваемые ей файлы
4-я строчка - сравнить получившийся файл построчно с файлом, который получился при предыдущем запуске скрипта. Из-за этого в самом начале эта строчка закрыта комментарием - ведь нет предыдущего запуска, т.е. не с чем сравнивать.
5-я строчка - сохранить получившийся при этом запуске скрипта файл для использования при следующем запуске скрипта
6-я строчка - сохранить получившийся при этом запуске скрипта файл для истории и возможного анализа. При этом в имя файла выносятся текущие дата и время с точностью до секунды.
UPD по добавленным строкам:
7-я строчка - файлы, полученные скриптами, запущенными более суток назад, сжимаются архиватором gzip (чтобы меньше места занимали).
8-я строчка - сжатые файлы, полученные скриптами, запущенными более 15 суток назад, удаляются (чтобы не тратить место для хранения откровенного старья).

Конечно, эта система не предотвратит атаку на сайт. Но непременно обнаружит ее при следующем запуске скрипта. И уведомит владельца сайта письмом примерно такого содержания:


Cron: /home/идентификатор_пользователя/домен_сайта/.security/check.sh
*** filelist.prev         Thu Jun   6 19:40:01 2013
--- filelist         Thu Jun   6 20:40:02 2013
**********­*****
*** 829 ****
! 131686506         4 -rw-r--r--     1 user_id           group_id             1321 May 27 23:52 ./wp-content/themes/twentyten/index.php
--- 830 ----
! 131686506         4 -rw-r--r--     1 user_id           group_id              333 Jun  6 20:36 ./wp-content/themes/twentyten/index.php
**********­*****
*** 842 ****
! 131687374         4 -rw-r--r--     1 user_id           group_id              247 May 23 22:52 ./wp-content/themes/twentyten/page-contacts.php
--- 843 ----
! 131687374         4 -rw-r--r--     1 user_id           group_id              381 Jun  6 20:39 ./wp-content/themes/twentyten/page-contacts.php

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

Все. До уровня "мышь не проскочит", конечно, не дотягивает. Но кошка для этой мыши уже на страже.

PS. Чуть не забыл. У системы есть один недостаток. На мой взгляд несущественный, но все-таки есть. Заключается он в том, что время модификации файла выводится по-разному в зависимости от его давности: если оно менее полугода назад - то выводятся месяц, число, часы и минуты, если же более полугода назад - то месяц, число и год. Из-за этого когда какому-нибудь файлу исполнится ровно полгода от последней модификации, система выдаст ложное предупреждение о том, что файл изменился, хотя он не изменялся. Устранить этот недостаток можно путем применения параметра "-printf" в команде find, но не во всех UNIX-подобных системах этот параметр поддерживается.
« Последнее редактирование: 08.06.2013, 12:06:56 от GRIG »
*

_ib_

  • Давно я тут
  • 673
  • 100 / 8
кто будет это всё смотреть как там крон выполняется? :)

я бы порекомендовал добавить.
MAILTO=noemail@biwebco.com
Легальные шаблоны и дёшево!  + скидки до 50% для шаблонов клуба Joomlart, RocketTheme, Yootheme и Gavick.

при интересе пишите в личку или на мыло: "p" точка "d" собака gmx.de
*

Maugli

  • Новичок
  • 4
  • 0 / 0
А почему бы банально не пользовать  Eyesite?
*

_ib_

  • Давно я тут
  • 673
  • 100 / 8
Спасибо за альтернативу, Maugli.

+ через bash быстрее должно работать, менее ресурсоёмко.
- но не все имеют в хостинговом плане bash и cron.

+ универсальное решение для любого "движка"
? Eyesite работает на J!3 ?
Легальные шаблоны и дёшево!  + скидки до 50% для шаблонов клуба Joomlart, RocketTheme, Yootheme и Gavick.

при интересе пишите в личку или на мыло: "p" точка "d" собака gmx.de
*

AL_ALEX

  • Глобальный модератор
  • 855
  • 112 / 1
? Eyesite работает на J!3 ?
Судя по всему - нет.
Вот сайт производителя Eyesite
*

_ib_

  • Давно я тут
  • 673
  • 100 / 8
да, смотрел уже. Иногда бывают расширения написанные для 2.5, но работают на 3. Т.е. интресует ставил ли Маугли или кто-то другой на 3-ю джумлу.
Легальные шаблоны и дёшево!  + скидки до 50% для шаблонов клуба Joomlart, RocketTheme, Yootheme и Gavick.

при интересе пишите в личку или на мыло: "p" точка "d" собака gmx.de
*

GRIG

  • Осваиваюсь на форуме
  • 38
  • 2 / 0
кто будет это всё смотреть как там крон выполняется? :)

я бы порекомендовал добавить.
MAILTO=noemail@biwebco.com
Разумеется, можно вывод diff'а самостоятельно закатать в файл, проверить этот файл на ненулевую длину и в случае положительного ответа отправить по почте админу. Все необходимые команды существуют, надо только применить их в правильном порядке и вписать в скрипт.
Только вот, во-первых, если хостинг позаботился о клиентах и предоставил им возможность доставки вывода cron'овых скриптов - то нафига городить лишний огород?
И, во-вторых, одна из атак на мои сайты состояла в том, что через них стала осуществляться массовая рассылка спама. И за такое дело мне хостинг прикрыл возможность отсылать мыло с сайта. Если при таком раскладе организовывать отсылку результата diff'а самому - то письмо будет зарезано и никуда не уйдет. А вот отсылка средствами самого хостинга - пройдет как миленькая.
*

voland

  • Легенда
  • 11031
  • 588 / 112
  • Эта строка съедает место на вашем мониторе
очень много букв..
А если кратко - то что там?
Проверка файлов по названиям? Или по md5?
*

GRIG

  • Осваиваюсь на форуме
  • 38
  • 2 / 0
А почему бы банально не пользовать  Eyesite?
Потому что это компонент Joomla. Если злоумышленник сумел внедрить свой код в сайт, то он вполне может просканировать доступный ему кусок файловой системы сервера и обнаружить присутствие этого компонента. Где в конфигах Joomla живут данные для доступа к базе - это хорошо известно. Если уж хакеры смогли написать компактный веб-шелл, который позволяет делать с файловой системой все что в голову взбредет, то наверняка они смогут написать столь же компактный аналог PHPMyAdmin'а. Так что после такого можно подсунуть "руками" в базу данных новые данные измененных файлов (по анализу исходных текстов компонента наверняка можно установить, какие и куда), либо просто стереть из базы информацию о том, какие файлы должны контролироваться - и "недреманное око" спит спокойно и в ус не дует.

Предлагаемая система по отношению к Joomla является внешним объектом и никак свое присутствие не проявляет.
« Последнее редактирование: 07.06.2013, 16:11:45 от GRIG »
*

flyingspook

  • Moderator
  • 3590
  • 247 / 9
Цитировать
Если уж хакеры смогли написать компактный веб-шелл, который позволяет делать с файловой системой все что в голову взбредет
его написал очень грамотный кодер для поддержки админов серверов, он не имел изначально ни какого отношения к хакерам, да и сейчас не имеет, это специальная оболочка которая содержит в себе удобный интерфейс для работы с сервером, в помощь админам, а то что его начали использовать хакеры, так в этом нет ни чего не предсказуемого он же написан на РНР, и сайты также используют скриптовый язык
Цитировать
то наверняка они смогут написать столь же компактный аналог PHPMyAdmin'а
в PHPshell есть доступ к БД, уже писать ни чего не надо
*

GRIG

  • Осваиваюсь на форуме
  • 38
  • 2 / 0
С PHPshell я дела не имел, так что не знаю, что и как. А вот возможности WSO меня очень впечатлили.
*

flyingspook

  • Moderator
  • 3590
  • 247 / 9
С PHPshell я дела не имел, так что не знаю, что и как. А вот возможности WSO меня очень впечатлили.
это то же самое
PHPshell=WSO(это просто аббревиатура)
ну а впечатлять в прочем там не чем, просто упрощенная панель хоста через которую ведется вся работа
*

WebDisaster

  • Захожу иногда
  • 108
  • 12 / 0
GRIG, по-моему очень хорошая идея. Хотя тоже "не Касперский и думать нужно". Пробовал я ставить упомянутый здесь Eyesite - дохлый номер. На реально большом сайте процесс будет убит по таймауту до его завершения (притом, что у меня время выполнения скрипта выставлено в 600 секунд).

кто будет это всё смотреть как там крон выполняется? :)

Код
diff -bw -c0 filelist.prev filelist | mail -s "Заголовок письма" "адрес@администратора.сайта"
« Последнее редактирование: 05.08.2013, 07:56:09 от WebDisaster »
*

dyominroma

  • Захожу иногда
  • 124
  • 6 / 0
В крон выдает ошибку Exited with return code = 127 или Exited with return code = 1

По ssh выполняется. Но файлы получаются слишком большие. Как можно отфильтровать по расширению, допустим php js ?


Код
diff -bw -c0 filelist.prev filelist | mail -s "Заголовок письма" "адрес@администратора.сайта"
Не вкладывает файл в письмо.
« Последнее редактирование: 06.02.2014, 22:40:55 от dyominroma »
*

WebDisaster

  • Захожу иногда
  • 108
  • 12 / 0
отфильтровать по расширению, допустим php js ?
find . -name *.php и т.п., а вообще - man find

Не вкладывает файл в письмо.
Эта команда перенаправляет вывод diff на вход mail - такой должна быть 4я строка приведенного выше скрипта (вместо diff -bw -c0 filelist.prev filelist). У меня (FreeBSD) она гарантированно работает.
*

winstrool

  • Давно я тут
  • 820
  • 51 / 2
  • Свободен для работы
С PHPshell я дела не имел, так что не знаю, что и как. А вот возможности WSO меня очень впечатлили.
это по сути, что то типо файлового менеджера с расширенными возможностями для простаты работы на стороне веб-сервера, к примеру как нортен командер, токо на стороне сервера...

А сам WSO это один из вариантов возможного функционала, и как правило отлавливают только паблик версии и реже модифицированные версии.
*

winstrool

  • Давно я тут
  • 820
  • 51 / 2
  • Свободен для работы
то наверняка они смогут написать столь же компактный аналог PHPMyAdmin'а.
давно уже есть версия для общего использования ввиде одного файла http://www.adminer.org/



Эта команда перенаправляет вывод diff на вход mail - такой должна быть 4я строка приведенного выше скрипта (вместо diff -bw -c0 filelist.prev filelist). У меня (FreeBSD) она гарантированно работает.
Также можно использовать сторонний сервер для распределения логов, это болие безопасный вариант, чем все творится на одном да и нагрузку снижает...
« Последнее редактирование: 07.02.2014, 11:50:11 от winstrool »
*

AlexSims

  • Захожу иногда
  • 314
  • 38 / 0
  • кручу верчу
полезный скрипт.
одно не понятно он у меня и пустые письма шлет. а если поставить его на раз в минуту, то потом чума все удалять.
С фантазией плохо.
*

cntrl

  • Захожу иногда
  • 181
  • 6 / 0
Идея хорошая, тоже давно думаю подобное написать, но вопрос, не впишут тебе в этот sh скрипт, хакцеры свои строчки, а он по крону потом запустится и неизвестно с какими привилегиями. Я бы не рискнул в паблик_диру скрипты класть и запускать их по крону. Почему скрипт нельзя запускать из другой диры, на пару каталогов выше, недоступной из php, или я что не понял  :o.
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Компоненты и скрипты для защиты сайта. Логи атак на сайты

Автор wishlight

Ответов: 678
Просмотров: 243456
Последний ответ 14.09.2022, 14:29:43
от wishlight
Способы защиты сайта от DDoS атак?

Автор IgorMJ

Ответов: 7
Просмотров: 1226
Последний ответ 05.10.2021, 21:39:26
от ShopES
Новый набег ботов в регистрации сайта... Какой в этом смысл то?

Автор Cedars

Ответов: 11
Просмотров: 1069
Последний ответ 03.11.2020, 17:36:03
от Cedars
IPSecure - защита сайта от ботов

Автор SeBun

Ответов: 7
Просмотров: 5242
Последний ответ 05.12.2019, 23:42:43
от SeBun
Письма от имени сайта

Автор homecraft

Ответов: 17
Просмотров: 1628
Последний ответ 14.06.2019, 19:22:23
от xpank