82 votos

Tratar con HTTP w00tw00t ataques

Tengo un servidor con apache y recientemente he instalado mod_security2 porque me atacan mucho por esto:

Mi versión de apache es apache v2.2.3 y yo uso mod_security2.c

Esta fueron las entradas del registro de errores:

[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:)

Aquí están los errores de la 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 "-" "-" 

He intentado configurar mod_security2 como este:

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:\)"

La cosa en mod_security2 es que SecFilterSelective no puede ser utilizado, me da errores. En lugar de eso usar una regla como esta:

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:\)"

Incluso esto no funciona. No sé qué hacer ya. Alguien tiene algún consejo?

Actualización 1

Veo que nadie puede resolver este problema utilizando mod_security. Hasta el momento el uso de ip-tables parece que la mejor opción para hacer esto, pero creo que el archivo es muy grande debido a que la ip cambia varias veces al día.

Me vino con 2 otras soluciones, alguien puede comentar sobre ellos en ser bueno o no.

  1. La primera solución que viene a mi mente es la exclusión de estos ataques desde mi apache registros de error. Esto hará que sea más fácil para mí para encontrar otras urgente errores que se producen y no tiene que escupir a través de un largo registro.

  2. La segunda opción es mejor, yo creo, y que es el bloqueo de los hosts que no son enviados en la forma correcta. En este ejemplo, el w00tw00t ataque es enviar sin nombre de host, así que creo que me pueden bloquear los hosts que no son de la forma correcta.

Actualización 2

Después de pasar a través de las respuestas que se llegó a las siguientes conclusiones.

  1. Tener un registro personalizado para apache se consumen algunos innecesario de recursos, y si realmente hay un problema que probablemente va a querer mirar el log completo sin faltantes.

  2. Es mejor ignorar los éxitos y concentrarse en una mejor forma de analizar los registros de error. El uso de filtros en sus registros un buen enfoque para esto.

Reflexiones finales sobre el tema

El ataque se mencionó anteriormente no va a llegar a su máquina si al menos se cuenta con un sistema así que básicamente no hay preocupaciones.

Puede ser difícil de filtrar todos los falsos ataques de la real después de un tiempo, debido a que tanto los registros de errores y registros de acceso se hacen muy grandes.

Evitar que esto ocurra en cualquier forma le costará recursos y es una buena práctica de no desperdiciar sus recursos en cosas sin importancia.

La solución que yo uso ahora es Linux logwatch. Ella me envía resúmenes de los registros y que se filtran y se agrupan. De esta manera usted puede fácilmente separar lo importante de lo no importante.

Gracias a todos por la ayuda, y espero que este post puede ser útil para alguien más.

34voto

Imo Puntos 711

A partir de su registro de errores que envía un HTTP/1.1 solicitud sin el Host: porción de la solicitud. Por lo que he leído, Apache responde con un 400 (solicitud incorrecta) error a esta solicitud, antes de entregar a mod_security. Así, no parece que sus normas serán procesados. (Apache para tratar con él antes de requerir a entregar a mod_security)

Pruebe usted mismo:

telnet nombre de host 80
GET /blahblahblah.html HTTP/1.1 (enter)
(intro)

Usted debe obtener el error 400 y ver el mismo error en tus registros. Esta es una mala solicitud y apache está dando la respuesta correcta.

Solicitud correcta debería ser:

GET /blahblahblah.html HTTP/1.1
Host: blah.com

Una solución para este problema podría ser el parche mod_uniqueid, para generar un IDENTIFICADOR único, incluso para un error en la solicitud, a fin de que apache pasa la solicitud a petición de los controladores. La dirección URL siguiente es una discusión acerca de esta obra de alrededor, y se incluye un parche para mod_uniqueid puede utilizar: http://marc.info/?l=mod-security-users&m=123300133603876&w=2

No se pudo encontrar otras soluciones para ti y me pregunto si la solución es realmente necesario.

11voto

Hooman Puntos 11103

Iv también comencé a ver estos tipos de mensajes en mis archivos de registro. Una manera de prevenir este tipo de ataques es configurar fail2ban( http://www.fail2ban.org/ ) y la instalación de filtros específicos a la lista de negro estas direcciones ip en sus reglas iptables.

Heres un ejemplo de un filtro que pueda bloquear la dirección ip asociada con la fabricación de los mensajes

[Tue Aug 16 02:35:23 2011] [error] [cliente ] Archivo no existe: /var/www/skraps/w00tw00t.en.blackhats.rumano.anti-sec:) === apache w00t w00t mensajes de la cárcel - regex y filtro === La cárcel

 [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

Filtro

 # 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 =

10voto

Des Puntos 121

El filtrado de IPs no es una buena idea, en mi humilde opinión. ¿Por qué no tratar de filtrado de la cadena sabes?

Me refiero a:

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

3voto

PRW Puntos 41

w00tw00t.en.blackhats.rumano.anti-sec es un intento de hacking y los usos de suplantación de IP de tantas búsquedas como VisualRoute informará de China,Polonia,Dinamarca, etc, de acuerdo a la dirección IP, siendo secundada en ese momento. Para la configuración de una Deny IP o se puede resolver el Nombre de Host es casi imposible, ya que va a cambiar dentro de una hora.

2voto

Xorlev Puntos 1647

Yo personalmente escribí una secuencia de comandos de Python para la adición automática de reglas IPtables.

Aquí un poco versión abreviada, sin registro y otro tipo de basura:

#!/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)

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: