Вопрос: Работа с HTTP-атаками w00tw00t


У меня есть сервер с apache, и я недавно установил mod_security2, потому что меня сильно атаковали:

Моя версия apache - apache v2.2.3, и я использую mod_security2.c

Это были записи из журнала ошибок:

[Wed Mar 24 02:35:41 2010] [error] 
[client 88.191.109.38] client sent HTTP/1.1 request without hostname 
(see RFC2616 section 14.23): /w00tw00t.at.ISC.SANS.DFind:)

[Wed Mar 24 02:47:31 2010] [error] 
[client 202.75.211.90] client sent HTTP/1.1 request without hostname 
(see RFC2616 section 14.23): /w00tw00t.at.ISC.SANS.DFind:)

[Wed Mar 24 02:47:49 2010] [error]
[client 95.228.153.177] client sent HTTP/1.1 request without hostname
(see RFC2616 section 14.23): /w00tw00t.at.ISC.SANS.DFind:)

[Wed Mar 24 02:48:03 2010] [error] 
[client 88.191.109.38] client sent HTTP/1.1 request without hostname
(see RFC2616 section 14.23): /w00tw00t.at.ISC.SANS.DFind:)

Вот ошибки из access_log:

202.75.211.90 - - 
[29/Mar/2010:10:43:15 +0200] 
"GET /w00tw00t.at.ISC.SANS.DFind:) HTTP/1.1" 400 392 "-" "-"
211.155.228.169 - - 
[29/Mar/2010:11:40:41 +0200] 
"GET /w00tw00t.at.ISC.SANS.DFind:) HTTP/1.1" 400 392 "-" "-"
211.155.228.169 - - 
[29/Mar/2010:12:37:19 +0200] 
"GET /w00tw00t.at.ISC.SANS.DFind:) HTTP/1.1" 400 392 "-" "-" 

Я попытался настроить mod_security2 следующим образом:

SecFilterSelective REQUEST_URI "w00tw00t\.at\.ISC\.SANS\.DFind"
SecFilterSelective REQUEST_URI "\w00tw00t\.at\.ISC\.SANS"
SecFilterSelective REQUEST_URI "w00tw00t\.at\.ISC\.SANS"
SecFilterSelective REQUEST_URI "w00tw00t\.at\.ISC\.SANS\.DFind:"
SecFilterSelective REQUEST_URI "w00tw00t\.at\.ISC\.SANS\.DFind:\)"

Дело в mod_security2 заключается в том, что SecFilterSelective нельзя использовать, это дает мне ошибки. Вместо этого я использую такое правило:

SecRule REQUEST_URI "w00tw00t\.at\.ISC\.SANS\.DFind"
SecRule REQUEST_URI "\w00tw00t\.at\.ISC\.SANS"
SecRule REQUEST_URI "w00tw00t\.at\.ISC\.SANS"
SecRule REQUEST_URI "w00tw00t\.at\.ISC\.SANS\.DFind:"
SecRule REQUEST_URI "w00tw00t\.at\.ISC\.SANS\.DFind:\)"

Даже это не работает. Я не знаю, что делать дальше. У кого-нибудь есть совет?

Обновление 1

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

Я придумал еще 2 решения, может кто-то прокомментировать их, что они хороши или нет.

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

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

Обновление 2

Пройдя ответы, я пришел к следующим выводам.

  1. Чтобы пользовательское ведение журнала для apache будет потреблять ненужные ресурсы, и если есть действительно проблема, вы, вероятно, захотите просмотреть полный журнал без каких-либо недостатков.

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

Заключительные мысли по этому вопросу

Атака, упомянутая выше, не дойдет до вашей машины, если вы, по крайней мере, имеете современную систему, поэтому в принципе нет никаких проблем.

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

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

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

Спасибо всем за помощь, и я надеюсь, что этот пост может быть полезен и для кого-то другого.


80
2018-03-24 05:33


Источник




Ответы:


Из вашего журнала ошибок они отправляют HTTP / 1.1 запрос без хоста: часть запроса. Из того, что я прочитал, Apache отвечает с ошибкой 400 (плохой запрос) на этот запрос, прежде чем передать в mod_security. Таким образом, это не похоже на то, что ваши правила будут обработаны. (Apache работает с ним, прежде чем требовать передачи в mod_security)

Попробуйте сами:

Имя хоста telnet 80
GET /blahblahblah.html HTTP / 1.1 (введите)
(войти)

Вы должны получить ошибку 400 и увидеть ту же ошибку в ваших журналах. Это плохой запрос, и apache дает правильный ответ.

Правильный запрос должен выглядеть так:

GET /blahblahblah.html HTTP / 1.1
Хост: blah.com

Работа над этой проблемой может заключаться в исправлении mod_uniqueid, для создания уникального идентификатора даже для отказавшего запроса, чтобы apache передавал запрос своим обработчикам запросов. Следующий URL-адрес - это обсуждение этой работы и включает патч для mod_uniqueid, который вы можете использовать:   http://marc.info/?l=mod-security-users&m=123300133603876&w=2

Не удалось найти другие решения для этого и задаться вопросом, действительно ли требуется решение.


34
2018-03-29 13:17



Я вижу проблему сейчас. Вы рекомендуете решение, приведенное в этой статье, или вы считаете, что лучше оставить его как есть. Это сканер для любых задних дверей в системе. Если я оставлю это просто сканирование, я могу однажды напасть. - Saif Bechan
Привет, Саиф, я думаю, что до тех пор, пока вы будете поддерживать свою установку apache в соответствии с вашими планами защиты (или вручную), вы должны быть в порядке. Недостаточно структурированный запрос HTTP / 1.1 (как вы видели) не должен возвращать ничего, кроме 400 ошибок от apache. Похоже на это май были своего рода сканирование уязвимостей, ориентированное на маршрутизаторы DLink. (По некоторым другим источникам) - Imo
Есть, по крайней мере, способ получить эти поля из моего apache error_log - Saif Bechan
Вы может быть в состоянии сделать это через mod_log :: httpd.apache.org/docs/2.2/mod/mod_log_config.html#customlog - Imo
Мой дополнительный намек: настроить по умолчанию virtualhost рядом с теми, которые действительно используются. Попытки, упомянутые выше, попадут в журналы для по умолчанию VirtualHost. - Koos van den Hout


Фильтрация IP-адресов - не очень хорошая идея, imho. Почему бы не попробовать фильтровать строку, которую вы знаете?

Я имею в виду:

iptables -I INPUT -p tcp --dport 80 -m string --to 60 --algo bm --string 'GET /w00tw00t' -j DROP

15
2018-05-09 16:21



spamcleaner.org/en/misc/w00tw00t.html аналогичное решение, но немного более подробно. - Isaac
Одна из проблем со строчной фильтрацией в брандмауэре заключается в том, что он «довольно медленный». - Alexis Wilke
@AlexisWilke у вас есть доказательства, чтобы предположить, что фильтрация строк iptables медленнее, чем фильтрация на уровне apache? - jrwren


Iv также начал видеть эти типы сообщений в моих файлах журналов. Одним из способов предотвращения этих типов атак является установка fail2ban ( http://www.fail2ban.org/ ) и настроить специальные фильтры для черного списка этих IP-адресов в правилах iptables.

Вот пример фильтра, который блокирует ip-адрес, связанный с созданием этих сообщений

[Вт Авг 16 02:35:23 2011] [error] [клиент] Файл не существует: /var/www/skraps/w00tw00t.at.blackhats.romanian.anti-sec :) === apache w00t w00t сообщения jail - регулярное выражение и фильтр === тюремное заключение

 [apache-wootwoot]
 enabled  = true
 filter   = apache-wootwoot
 action   = iptables[name=HTTP, port="80,443", protocol=tcp]
 logpath  = /var/log/apache2/error.log
 maxretry = 1
 bantime  = 864000
 findtime = 3600

Фильтр

 # Fail2Ban configuration file
 #
 # Author: Jackie Craig Sparks
 #
 # $Revision: 728 $
 #
 [Definition]
 #Woot woot messages
 failregex = ^\[\w{1,3} \w{1,3} \d{1,2} \d{1,2}:\d{1,2}:\d{1,2} \d{1,4}] \[error] \[client 195.140.144.30] File does not exist: \/.{1,20}\/(w00tw00t|wootwoot|WootWoot|WooTWooT).{1,250}
 ignoreregex =

11
2017-08-19 17:46



Это правда, что вы можете блокировать их, но нет необходимости, потому что они просто плохие запросы. Лучше просто игнорировать их, спасти вас, и вы освободите некоторые ресурсы. - Saif Bechan
Right @Saif Bechan, если кто-то беспокоится о том, что «тестирование атак» будет успешным, он должен лучше исправить собственное приложение, а тратить время на то, чтобы найти способ блокировать это. - Thomas Berger
Дал вам +1, спасибо за ответ. - Saif Bechan
@SaifBechan, я не согласен. w00tw00t - это сканер уязвимостей, и машине, которая выдаёт такие запросы, не может быть доверена попытка других запросов, поэтому, если я системный администратор, и мне требуется 2 минуты для запрещения таких клиентов в течение нескольких дней, я «Сделай это. Тем не менее, я бы не основывал всю свою реализацию безопасности на таком подходе. - Isaac


w00tw00t.at.blackhats.romanian.anti-sec - попытка взлома и использует IP-запросы spoof, такие как VisualRoute будет сообщать о Китае, Польше, Дании и т. д. в соответствии с тем, что IP-адрес был откомандирован в то время. Поэтому настройка запрещающего IP-адреса или разрешимого имени хоста почти невозможен, поскольку он изменится в течение часа.


4
2018-06-01 11:20





Я лично написал сценарий Python для автоматического добавления правил IPtables.

Вот немного сокращенная версия без протоколирования и другого мусора:

#!/usr/bin/python
from subprocess import *
import re
import shlex
import sys

def find_dscan():
        p1 = Popen(['tail', '-n', '5000', '/usr/local/apache/logs/error_log'], stdout=PIPE)
        p2 = Popen(['grep', 'w00t'], stdin=p1.stdout, stdout=PIPE)

        output = p2.communicate()[0].split('\n')

        ip_list = []

        for i in output:
                result = re.findall(r"\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b", i)
                if len(result):
                        ip_list.append(result[0])

        return set(ip_list)

for ip in find_dscan():
        input = "iptables -A INPUT -s " + ip + " -j DROP"
        output = "iptables -A OUTPUT -d " + ip + " -j DROP"
        Popen(shlex.split(input))
        Popen(shlex.split(output))

sys.exit(0)

2
2018-03-24 07:06



Это предотвращает атаку w00tw00t - Saif Bechan
Да, я проверил журналы ошибок Apache для любых «w00tw00t» IP-адресов и добавил их, если они не существуют, хотя для простоты я не добавил проверку на дубликаты. - Xorlev
Этот сценарий, вероятно, должен использовать таблицу, добавляя массу дополнительных правил в цепочку iptables, чтобы немного замедлить обработку. - Eric
Он использует таблицу. Однако я упростил его, поскольку он был адаптирован к моей системе. - Xorlev
как вы думаете, это лучшее решение для использования mod_security - Saif Bechan


Я считаю, что причина, по которой mod_security не работает для вас, заключается в том, что Apache не смог самостоятельно проанализировать запросы, они вне спецификации. Я не уверен, что у вас есть проблема здесь - apache регистрирует странное дерьмо, которое происходит в сети, если оно не регистрируется, вы не будете знать, что это даже происходит. Ресурсы, необходимые для регистрации запросов, вероятно, минимальны. Я понимаю его разочарование в том, что кто-то заполняет ваши журналы - но это будет более неприятно, если вы отключите ведение журнала, только чтобы найти, что вам действительно нужно. Как кто-то ворвался на ваш веб-сервер, и вам нужны журналы, чтобы показать, как они ворвались.

Одним из решений является настройка ErrorLogging через syslog, а затем с помощью rsyslog или syslog-ng вы можете специально фильтровать и отбрасывать эти нарушения RFC в отношении w00tw00t. Или, альтернативно, вы можете отфильтровать их в отдельный файл журнала, чтобы ваш основной ErrorLog был легко читаемым. Rsyslog невероятно мощный и гибкий в этом отношении.

Итак, в httpd.conf вы можете:

ErrorLog syslog:user 

то в rsyslog.conf у вас может быть:

:msg, contains, "w00tw00t.at.ISC.SANS.DFind" /var/log/httpd/w00tw00t_attacks.log

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

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

Блокировка IPTables - это идея, но вы можете получить очень большой список блоков iptables, который может иметь последствия для производительности сам по себе. Есть ли шаблон в IP-адресах или он исходит из большого распределенного ботнета? Вам нужно будет X% дубликатов, прежде чем вы получите преимущество от iptables.


2
2018-03-30 11:09



Хороший ответ, мне нравятся разные подходы. Размышляя об этом, наличие пользовательских протоколов создаст больше возможностей использования ресурсов, потому что сначала необходимо проверить все, я думаю, этот параметр также отпадает. У меня теперь включен logwatch. Это отправляет мне отчет 2 раза в день с резюме всех систем. Журналы apache также проверяются, и он просто говорит, что попытки w00tw00t 300 раз. Я думаю, что оставлю настройку так, как она есть на данный момент. - Saif Bechan


Вы скажете в обновлении 2:

Проблема, которая все еще остается   Проблема, которая все еще остается, заключается в следующем. Эти атаки исходят от ботов, которые ищут определенные файлы на вашем сервере. Этот конкретный сканер ищет файл /w00tw00t.at.ISC.SANS.DFind :).

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

Из моего предыдущего ответа мы пришли к выводу, что Apache возвращает сообщения об ошибках из-за плохо сформированного запроса HTML 1.1. Все веб-серверы, поддерживающие HTTP / 1.1, вероятно, должны возвращать ошибку, когда они получают это сообщение (я не проверял дважды RFC - возможно, RFC2616 говорит нам).

Имея w00tw00t.at.ISC.SANS.DFind: на вашем сервере некоторые, где не мистически означает «у вас какие-то проблемы» ... Если вы создаете файл w00tw00t.at.ISC.SANS.DFind: в вашем DocumentRoot или даже DefaultDocumentRoot не имеет значения ... сканер отправляет сломанный запрос HTTP / 1.1, а apache говорит «нет, это плохой запрос ... до свидания». Данные в файле w00tw00t.at.ISC.SANS.DFind: не будут обслуживаться.

Использование mod_security для этого случая не требуется, если вы действительно не хотите (нет смысла?) ... в этом случае вы можете посмотреть его исправление вручную (ссылка в другом ответе).

Еще одна вещь, которую вы можете посмотреть на использование, - это функция RBL в mod_security. Возможно, есть RBL онлайн, где есть IP-адреса w00tw00t (или другие известные вредоносные IP-адреса). Это, однако, означает, что mod_security выполняет поиск DNS для каждого запроса.


1
2018-03-31 08:52



Я не думаю, что apache отвергает их, он просто выдает ошибку, но поиск все равно проходит. У меня есть тот же w00tw00t.at.ISC.SANS.DFind в журнале доступа. Он делает GET. Таким образом, поиск выполняется, и если у вас есть файл на вашем компьютере, он будет выполнен. Я могу публиковать записи журнала доступа, но они выглядят так же, как журнал ошибок, только с GET перед ними. Apache выдает ошибку, но запрос проходит. Вот почему я спросил, было бы неплохо заблокировать этот запрос без имен хостов. Но я не хочу блокировать обычных пользователей. - Saif Bechan
Конечно, вы получаете одну и ту же запись в журнале доступа, но смотрите код ошибки ... 400. Он не обрабатывается. HTTP / 1.1 (имя хоста) используется, чтобы сообщить apache, какой виртуальный хост должен отправить запрос ... без части имени хоста запроса HTTP / 1.1 apache не знает, куда отправить запрос, и возвращает ошибку «400 bad request» назад к клиенту. - Imo
Попробуйте сами ... создайте себе html-страницу на своем веб-сервере и попробуйте подключиться к ней вручную с помощью «telnet hostname 80» ... другие шаги в моем первом ответе. Я бы поставил на него большую щедрость, чтобы вы не могли отобразить html-файл с помощью HTTP / 1.1 без имени хоста. - Imo
Ах да, это для того, чтобы указать на это. Я всегда думал, что access_log - это записи, которые были переданы через журнал ошибок и фактически вошли в вашу машину. Спасибо, что указали мне это, и я отредактирую свой пост. Я действительно ценю твою помощь. - Saif Bechan
Привет Саиф, никаких проблем, рад помочь. С уважением, Imo - Imo


Как насчет добавления правила в modsecurity? Что-то вроде этого:

   SecRule REQUEST_URI "@rx (?i)\/(php-?My-?Admin[^\/]*|mysqlmanager
   |myadmin|pma2005|pma\/scripts|w00tw00t[^\/]+)\/"
   "severity:alert,id:'0000013',deny,log,status:400,
   msg:'Unacceptable folder.',severity:'2'"

1
2017-08-09 08:23