cpanel + mod_evasive + неприятная особенность

12
Romka_Kharkov
На сайте с 08.04.2009
Offline
485
1581

День добрый,

В процессе очередного исследования вчера, обнаружил весьма интересную особенность.

Попытался использовать mod_evasive в комплекте с cPanel, все собралось, все подключилось все настроилось, но появился интересный симптом, изначально моим желанием было забанить нарушителя на 2-3 часа... такие параметры и натравил на evasive, но решил банить не путем самого evasive, а вывел ему CMD в отдельный файлик который сочиняет правило в iptables.

Что же получается:

1. Приходит на сайт тот, кто сильно много смотрит и надо бы его забанить :D

2. Его банит, при этом создавая правило в iptables + /tmp/dos-$ip файлик.

3. Приходит CSF и рестартит файрвол (еще не проходит то время когла нарушителя надо разбанить) и естественно сносит правило которое блокирует.

Все бы ничего, но в этом положении дел mod_evasive перестает банить до тех пор пока в наличии есть файлик /tmp/dos-$ip.... т.е по факту зловред продолжает добить апач, а реакции от Evasive на CMD уже не передается...... только сношу /tmp/dos-$ip моментально срабатывает CMD и заносится все в файрвол :)

Такие вот дела смутные ;)

---------- Добавлено 26.07.2013 в 12:07 ----------

Так же , при том что:


DOSBlockingPeriod 30

Почему-то наблюдается следующее:


# date
Fri Jul 26 05:05:50 EDT 2013
# ls -all /tmp/|grep -i dos
-rw-r--r-- 1 nobody nobody 6 Jul 25 23:51 dos-107.20.173.101
-rw-r--r-- 1 nobody nobody 6 Jul 25 20:59 dos-107.22.86.46
-rw-r--r-- 1 nobody nobody 5 Jul 26 00:00 dos-113.0.83.196
-rw-r--r-- 1 nobody nobody 6 Jul 25 23:39 dos-192.111.153.142
-rw-r--r-- 1 nobody nobody 6 Jul 25 23:39 dos-192.198.86.230
-rw-r--r-- 1 nobody nobody 6 Jul 25 23:30 dos-50.19.127.123
-rw-r--r-- 1 nobody nobody 6 Jul 26 01:40 dos-54.227.54.190
-rw-r--r-- 1 nobody nobody 6 Jul 25 21:43 dos-66.249.73.157

С момента создания файлов до текущего времени прошло явно > 30 минут, почему Evasive до сих пор держит эти файлы, или он просто забыл про них ? это теперь те , кто залочены перманентно ? :) :) :)

Есть около 15.000 ipv4 !!! (http://onyx.net.ua/price.php#ipv4) Качественный хостинг с 2005 года - лучшее клиентам! (http://onyx.net.ua/)
Romka_Kharkov
На сайте с 08.04.2009
Offline
485
#1

Чудо из чудес :D

Исходя из выше сказанного, пришла идея проверки одной логики, которая дала свой результат, в ходе изучения стало ясно, что если файл /tmp/dos-x.x.x.x есть в наличии.... то дело до CMD в общем-то не доходит..... стало быть , достаточно подложить файл с IP откуда будет атака в папочку /tmp и дело в шляпе... как понимаем сложности в этом нет ни у одного из пользователей системы....

Теперь внимание, как проверялось и при каких настройках:

evasive.conf (включенный в апач)


<IfModule mod_evasive20.c>
DOSHashTableSize 3097
DOSPageCount 5
DOSPageInterval 10
DOSSiteCount 15
DOSSiteInterval 3
DOSBlockingPeriod 30
DOSSystemCommand "/usr/bin/sudo /usr/bin/evasive_ban %s"
</IfModule>

В sudo разрешено....

/usr/bin/evasive_ban:


#!/bin/bash
if [ "x$1" = "x" ] ; then
echo "USAGE: $0 IPADDR"
exit
fi
/sbin/iptables -A DENYIN -s $1 -j DROP

Очищаем /tmp/dos-*

Перезапускаем апач....

Запускаем test.pl из поставки модуля, для генерации сотни запросов в сторону 127.0.0.1

В логах получаем:

Jul 26 11:14:55 xeon sudo: nobody : TTY=unknown ; PWD=/ ; USER=root ; COMMAND=/usr/bin/evasive_ban 127.0.0.1

Т.е все сработало /tmp/dos-127.0.0.1 появился.

Теперь повторяем то же самое, только с небольшим изменением:

Очищаем /tmp/dos-*

Перезапускаем апач....

Заходим в систему под пользователем 'romka' :) (условно) и проделываем следующее:


touch /tmp/dos-127.0.0.1

после чего запускаем test.pl из той же поставки и...... повторяем команду "perl test.pl" хоть 20 раз, в логе сообщение от sudo мы не получаем, стало быть процедура бана не работает, не смотря на то, что апач все таки в ответ скрипта начинает выдавать 403......

Пойду наверное на код взгляну.... :) А то собрал непонятно что в апач себе :D

Нормальная такая пятница :D

---------- Добавлено 26.07.2013 в 19:19 ----------

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

Romka_Kharkov
На сайте с 08.04.2009
Offline
485
#2

В общем беда в конструкции:



if (stat(filename, &s)) {
......
}

Дописал к ней


else { LOG(...) }

поехали сообщения с ошибками.... стало быть в случае когда файл уже создан.... stat() не происходит..... или не может происходить, я не особый программист, может кто подскажет как отдебажить еще плотнее? Что бы понять в чем загвоздка, я предположил что дело в правах на файлы /tmp/dos-*, но при 777 - результат тот же.. stat() вроде как указывает на существующий файл , судя по документации функции, но х3 как это трактовать....

iHead
На сайте с 25.04.2008
Offline
137
#3

man 2 stat

:)

Рекомендуемый хостинг партнер 1С-Битрикс (https://www.ihead.ru/bitrix/), PHP-хостинг (https://www.ihead.ru/php/), доверенный партнер RU-CENTER (https://www.ihead.ru/news/573.html), официальный представитель REG.RU в Кирове (https://www.ihead.ru/news/851.html)
Glueon
На сайте с 26.07.2013
Offline
172
#4
Romka_Kharkov:
В общем беда в конструкции:


if (stat(filename, &s)) {
......
}

Дописал к ней

else { LOG(...) }

поехали сообщения с ошибками.... стало быть в случае когда файл уже создан.... stat() не происходит..... или не может происходить, я не особый программист, может кто подскажет как отдебажить еще плотнее? Что бы понять в чем загвоздка, я предположил что дело в правах на файлы /tmp/dos-*, но при 777 - результат тот же.. stat() вроде как указывает на существующий файл , судя по документации функции, но х3 как это трактовать....

Возвращает -1?

Странный код. Если срабатывает else, то все как раз в порядке, потому что если происходит ошибка, например, файла нет, тогда if( stat(...) ) будет true и в тот LOG, что у вас в примере, вы не попадете.

Видимо, если в if-е идет какая-то обработка файла в случае, если он существует, должно быть:


if (stat(filename, &s) > 0) {
......
}
Есть много IP-сетей в аренду под прокси, парсинг, рассылки (optin), vpn и хостинг. Телега: @contactroot ⚒ ContactRoot команда опытных сисадминов (/ru/forum/861038), свой LIR: сдаем в аренду сети IPv4/v6 (/ru/forum/1012475).
Romka_Kharkov
На сайте с 08.04.2009
Offline
485
#5
iHead:
man 2 stat

:)

Да читал, что толку то...

---------- Добавлено 27.07.2013 в 01:39 ----------

Glueon:
Возвращает -1?
Странный код. Если срабатывает else, то все как раз в порядке, потому что если происходит ошибка, например, файла нет, тогда if( stat(...) ) будет true и в тот LOG, что у вас в примере, вы не попадете.
Видимо, если в if-е идет какая-то обработка файла в случае, если он существует, должно быть:

if (stat(filename, &s) > 0) {
......
}

Посмотрите код сами, там совсем не много, функция access_checker()

---------- Добавлено 27.07.2013 в 01:40 ----------

Glueon:
Возвращает -1?
Странный код. Если срабатывает else, то все как раз в порядке, потому что если происходит ошибка, например, файла нет, тогда if( stat(...) ) будет true и в тот LOG, что у вас в примере, вы не попадете.
Видимо, если в if-е идет какая-то обработка файла в случае, если он существует, должно быть:

if (stat(filename, &s) > 0) {
......
}

Тут в том то и дело, что когда файл есть... :) А проверка там судя по всему boolean , когда false / true возвращается, либо возврат в виде 0 считается true.

Glueon
На сайте с 26.07.2013
Offline
172
#6

Почитал код. Получается если filename НЕТ он создается.

Если файла нет - возвращается -1, который интепретируется как true и мы попадаем в ветку с логированием, отправкой почты. Если файл есть - ничего не происходит.

Какого эффекта хотим достигнуть? :)

Если вы руками создали файл - результат проверки все равно будет HTTP_FORBIDDEN, но в лог это не выведется ("Blacklisting address...") и почтовое сообщение не пошлется.

Romka_Kharkov
На сайте с 08.04.2009
Offline
485
#7

Glueon и не выполнится system_command .......

А теперь читаем пост номер 2 .... файл создать может КТО угодно в системе , а mod_evasive в этом случае .... зажует морковку :D

Стало быть в таком положении дел любой локальный юзер может по факту "отключить" блокировку по CMD путем создания файлика в /tmp :)

iHead
На сайте с 25.04.2008
Offline
137
#8
Romka_Kharkov:
Glueon и не выполнится system_command .......
А теперь читаем пост номер 2 .... файл создать может КТО угодно в системе , а mod_evasive в этом случае .... зажует морковку :D
Стало быть в таком положении дел любой локальный юзер может по факту "отключить" блокировку по CMD путем создания файлика в /tmp :)

кто запрещает создавать файлики не в /tmp? :)

Romka_Kharkov
На сайте с 08.04.2009
Offline
485
#9
iHead:
кто запрещает создавать файлики не в /tmp? :)

Да, но это уже звучит как решение, а проблема на лицо :D

Glueon
На сайте с 26.07.2013
Offline
172
#10
Romka_Kharkov:
Glueon и не выполнится system_command .......
А теперь читаем пост номер 2 .... файл создать может КТО угодно в системе , а mod_evasive в этом случае .... зажует морковку :D
Стало быть в таком положении дел любой локальный юзер может по факту "отключить" блокировку по CMD путем создания файлика в /tmp :)

Да, не обратил внимания ... Если это убрать или переместить этот кусок - непонятно будет заблокирован ли уже IP или нет. Я так понимаю это сделано именно из этих побуждений :)

Меняем log_dir на root-only доступную директорию и все будет нормально. Не пойдет разве?

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий