Actualmente, uno de los ataques más comunes y que prácticamente cualquier persona o grupo de personas puede llevar a cabo contra un sistema en internet, son los ataques de denegación de servicio (DoS) tanto desde una única ubicación (dirección IP) como desde múltiples ubicaciones (DDoS Distributed Denial Of Service), el objetivo obvio de este tipo de ataques, es interrumpir la actividad normal de un servidor durante un periodo de tiempo determinado o de forma indefinida. Se trata de un tipo de ataque que en la mayoría de los casos, solamente requiere “masa”, es decir, una gran cantidad de peticiones en intervalos de tiempo cortos contra un sistema determinado desde una o varias ubicaciones, normalmente los atacantes no necesitan tener conocimientos profundos sobre hacking (o informática general), es por este motivo que en los últimos años este tipo de ataques resultan tan frecuentes.

NOTA: En este punto es oportuno apuntar que algunos ataques de denegación de servicio, no requieren que existan una gran cantidad de peticiones para interrumpir la ejecución normal de un servicio, en algunos casos concretos, algunos servicios pueden contener vulnerabilidades de muchos tipos (Stack Overflow, Buffer Overflow, Heap Overflow, etc.) que pueden desembocar en una interrupción del servicio vulnerable.

 

Ahora bien, existen en el mercado una muy buena cantidad de herramientas que permiten proteger a un servidor de este tipo de ataques, desde soluciones simples y ligeras hasta soluciones de alta gama y robustas (que comercialmente se venden muy bien, pero luego en la practica… bueno, hay de todo), dado que esta serie de publicaciones se intenta hablar sobre web hacking, en esta ocasión se detallará el funcionamiento de un módulo de Apache bastante interesante que permite proteger a la instancia de un servidor web contra este tipo de amenazas sin que ello suponga una desmejora significativa en el rendimiento.

MOD_EVASIVE

Se trata de un módulo DSO que puede instalarse sobre Apache y que permite implementar acciones de evasión ante los eventos de ataques DoS y DDoS. Puede ser fácilmente instalado y configurado utilizando APXS y permite la integración con herramientas como IPTables.

Su funcionamiento es simple, internamente crea una tabla hash dinámica de direcciones IP y URI’s la cual es tomada para realizar el proceso de validación y posterior denegación en base a los siguientes supuestos:

  1. Cuando un cliente solicita la misma página un número determinado de veces por segundo
  2. Cuando un cliente realiza más de 50 peticiones concurrentes contra el mismo proceso hijo del servidor por segundo
  3. Cuando un cliente realiza peticiones mientras que se encuentra temporalmente bloqueado en una lista negra.

     

NOTA: Existe un bug que debe ser parcheado en este módulo, el bug ha sido encontrado por “Thor”. El problema es que el módulo no resetea adecuadamente el número de peticiones que se han realizado anteriormente por un cliente, lo que al final da como resultado, que el cliente sea baneado después de realizar 20 peticiones (que es el valor establecido por defecto) sin importar el intervalo de tiempo. La prueba de concepto realizada por Thor, indicaba que después de 20 peticiones en un intervalo de 200 segundos, el cliente era baneado por el servidor. Se ha puesto un parche y la descripción de este fallo en el blog de Thor en esta entrada: http://el-blog-de-thor.blogspot.com.es/2009/04/fallo-de-programacion-en-modevasive.html

 

Ahora, para llevar a cabo el proceso de instalación y configuración, solamente es necesario descargar el fichero comprimido, compilarlo e instalarlo en Apache utilizando APXS de la siguiente forma:

 

>cd/opt/WebServerFull/httpd-2.2.22/modules/mappers

>wget http://www.zdziarski.com/blog/wp-content/uploads/2010/02/mod_evasive_1.10.1.tar.gz

>tar zxvf mod_evasive_1.10.1.tar.gz

>rm -rf mod_evasive_1.10.1.tar.gz

>cd mod_evasive/

>../../../bin/apxs -cia mod_evasive20.c

/usr/share/apr-1.0/build/libtool –silent –mode=compile i486-linux-gnu-gcc -prefer-pic -D_REENTRANT -D_GNU_SOURCE -D_LARGEFILE64_SOURCE -pthread -I/opt/WebServerFull/httpd-2.2.22/include -I/usr/include/apr-1.0 -I/usr/include/apr-1.0 -c -o mod_evasive20.lo mod_evasive20.c && touch mod_evasive20.slo

/usr/share/apr-1.0/build/libtool –silent –mode=link i486-linux-gnu-gcc -o mod_evasive20.la -rpath /opt/WebServerFull/httpd-2.2.22/modules -module -avoid-version mod_evasive20.lo

/opt/WebServerFull/httpd-2.2.22/build/instdso.sh SH_LIBTOOL=’/usr/share/apr-1.0/build/libtool’ mod_evasive20.la /opt/WebServerFull/httpd-2.2.22/modules

/usr/share/apr-1.0/build/libtool –mode=install cp mod_evasive20.la /opt/WebServerFull/httpd-2.2.22/modules/

libtool: install: cp .libs/mod_evasive20.so /opt/WebServerFull/httpd-2.2.22/modules/mod_evasive20.so

libtool: install: cp .libs/mod_evasive20.lai /opt/WebServerFull/httpd-2.2.22/modules/mod_evasive20.la

libtool: install: cp .libs/mod_evasive20.a /opt/WebServerFull/httpd-2.2.22/modules/mod_evasive20.a

libtool: install: chmod 644 /opt/WebServerFull/httpd-2.2.22/modules/mod_evasive20.a

libtool: install: ranlib /opt/WebServerFull/httpd-2.2.22/modules/mod_evasive20.a

libtool: finish: PATH=»/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/apache-maven-3.0.4/bin/:/sbin» ldconfig -n /opt/WebServerFull/httpd-2.2.22/modules

———————————————————————-

Libraries have been installed in:

/opt/WebServerFull/httpd-2.2.22/modules

 

If you ever happen to want to link against installed libraries

in a given directory, LIBDIR, you must either use libtool, and

specify the full pathname of the library, or use the `-LLIBDIR’

flag during linking and do at least one of the following:

– add LIBDIR to the `LD_LIBRARY_PATH’ environment variable

during execution

– add LIBDIR to the `LD_RUN_PATH’ environment variable

during linking

– use the `-Wl,-rpath -Wl,LIBDIR’ linker flag

– have your system administrator add LIBDIR to `/etc/ld.so.conf’

 

See any operating system documentation about shared libraries for

more information, such as the ld(1) and ld.so(8) manual pages.

———————————————————————-

chmod 755 /opt/WebServerFull/httpd-2.2.22/modules/mod_evasive20.so

[activating module `evasive20′ in /opt/WebServerFull/httpd-2.2.22/conf/httpd.conf]

 

Con lo anterior, el módulo se ha compilado e instalado en el directorio <APACHE_INSTALL>/modules.

El siguiente paso es cargar el módulo en el servidor web por medio del fichero de configuración de Apache. Para ello, es necesario incluir la siguiente linea en el fichero de configuración:

 

LoadModule evasive20_module modules/mod_evasive20.so

 

Ahora, si el servidor arranca correctamente indica que el módulo se ha podido instalar y cargar correctamente en el servidor web. El siguiente paso es conocer las directivas disponibles en este módulo y aprender cual es el objetivo de cada una.

 

Directivas MOD_EVASIVE

Las directivas de este módulo son bastante simples y permiten controlar su funcionamiento, no son tantas como en el caso de módulos tan completos y robustos como mod_security o mod_ssl, pero cumplen con su objetivo bastante bien. La descripción y el uso de estas directivas se detalla a continuación:

DOSHashTableSize:

Esta directiva permite controlar el tamaño máximo de la tabla de hash, se trata de un valor importante para conseguir un equilibrio entre el rendimiento del módulo. Cuando se establece un valor alto (por ejemplo, superior a 1024) el rendimiento del módulo será mayor ya que las iteraciones necesarias para obtener un registro de la tabla son menores, sin embargo, el consumo de memoria será más alto. El creador de esta librería aconseja establecer un valor de 2048 (o superior) en el caso de servidores que tengan niveles de carga altos.

DOSHashTableSize 2048

Con lo anterior en el fichero de configuración, el módulo reservará 2048 MB de memoria para la creación de la tabla de hashes.

DOSPageCount:

Se trata de otra directiva muy importante, ya que permite determinar el número máximo de peticiones que puede hacer un cliente sobre una página determinada. Una vez este limite es alcanzado, la dirección IP del cliente se incluye en una lista de bloqueo.

DOSPageCount 8

Una máximo de 8 peticiones para una página determinada en un rango de tiempo determinado (este rango también se define en una directiva que se detalla unas lineas más abajo).

DOSSiteCount:

Esta directiva funciona igual que la anterior, con la diferencia de que aquí se miden el número total de peticiones a cualquier tipo de recurso en el servidor web (limite que se determina por cada listener atendiendo a un cliente determinado).

Nuevamente, dependiendo de la carga del servidor, es aconsejable medir adecuadamente este valor, con el fin de bloquear aquellas peticiones que pueden ser maliciosas y permitir las que son legitimas.

DOSSiteCount 100

Con esto se define un máximo de 100 peticiones.

DOSPageInterval

Esta directiva viene acompaña de la directiva DOSPageCount dado que termina el intervalo de tiempo máximo en el que se mantendrá el contexto de páginas solicitadas por un cliente. Por ejemplo, suponiendo que el valor de la directiva DOSPageInterval sea 5 y el valor de la directiva DOSPageCount sea 10, el módulo incluirá la dirección IP del cliente en una lista de bloqueo cuando se realicen 10 o más peticiones a una misma página en un periodo igual o inferior a 5 segundos.

DOSPageInterval 5

Con esto, se establece un valor de intervalo máximo de 5 segundos.

DOSSiteInterval

Esta directiva viene acompañada de la directiva DOSSiteCount ya que permite determinar el intervalo de tiempo en el que el conteo de visitas por parte de un cliente a cualquier recurso del servidor será reiniciado (recurso por listener dedicado por el servidor web, tal como se ha explicado en anteriores publicaciones).

Esta directiva funciona prácticamente igual que la combinación de las directivas DOSPageCount y DOSPageInterval con la diferencia de que las anteriores realizan un conteo y una medición de peticiones a cada página de un sitio web, mientras que la combinación de estas directivas (DOSSiteCount y DOSSiteInterval) lo hacen sobre cualquier tipo de recurso. Por ejemplo, si el valor de la directiva DOSSiteCount es de 100 y el valor de la directiva DOSSiteInterval es de 2, indica, simplemente que cuando un cliente realice 100 o más peticiones al servidor web en un intervalo máximo de 2 segundos, la dirección IP de dicho cliente será incluida en una lista de bloqueo.

DOSSiteInterval 2,8

Con lo anterior, se define un intervalo máximo de 2,8 segundos.

DOSBlockingPeriod

Como su nombre lo indica, representa el tiempo en segundos que permanecerá bloqueada una dirección IP determinada. recordar que dichas direcciones IP se incluyen directamente en una lista de bloqueo si se cumplen las condiciones definidas en las directivas anteriores (tanto bloqueo por página como bloqueo por recurso en servidor).

Luego, es importante saber que una vez una dirección IP es incluida en una lista de bloqueo, cada petición que se realice al servidor web dará como resultado un código HTTP 403 (Forbidden) y ademas de esto, el tiempo en el que el cliente permanecerá bloqueado será reseteado y se adicionarán 10 segundos. Por ejemplo, si un cliente esta bloqueado y realiza una petición, el valor de la directiva DOSBlockingPeriod será reiniciado y su nuevo valor será de 10 segundos (obviamente, esto solamente aplica para dicho cliente).

DOSBlockingPeriod 2

En este caso el valor es de 2 segundos, no es necesario establecer un valor muy alto, ya que si se trata de un ataque DoS real, el cliente ante su “insistencia” quedará bloqueado cada 10 segundos cada vez que realice una petición.

DOSSystemCommand

Por mediode esta directiva es posible definir el comando que se ejecutará por el servidor, cuando un cliente es incluido en la lista de bloqueo.

DOSSystemCommand “echo IP=%s >> /etc/logs.log”

Un uso tipico de esta directiva es el de registrar las direcciones IP que quedan bloqueadas en un fichero independiente, sin embargo, puede ejecutarse cualquier comando en el sistema operativo.

DOSWhitelist

Con esta directiva se pueden definir las direcciones IP que van a ser ignoradas en todo momento por el módulo.

DOSWhitelist 192.168.17.*

El módulo ignorará todas las peticiones realizadas desde una de estas direcciones IP.

DOSLogDir

Indica una ruta temporal donde se creará el fichero de logs para el módulo.

DOSLogDir /tmp/evasive

Se define un directorio con permisos de escritura para el usuario del proceso del servidor web.

Como comentario final de esta publicación, podria decir que se trata de un módulo facil de entender y a su vez bastante robusto, puede ser una muy buena herramienta complementaria para la seguridad del servidor web para evitar esos molestos ataques de denegación.