Ataques DDos a través de XSS Persistente

Publicado el 24/03/2015, por Álvaro Díaz Hernández
Ataques DDos a través de XSS Persistente

A lo largo del año pasado se han conocido diferentes noticias que confirman que muchos ataques DDoS están siendo generados desde páginas con vulnerabilidades de tipo Cross Site Scripting (XSS) Persistentes.

Esto es debido, a que los cibercriminales, inyectan código JavaScript en el interior de la vulnerabilidad XSS persistente que será ejecutado por todos los visitantes a través de su navegador. De esta manera se puede generar una gran cantidad de peticiones por segundo hacia el sitio atacado, incluido en el código JavaScript, y dependiendo del tráfico de visitas de la web que alberga el XSS persistente, generar el efecto de DDoS masivo.

Como se puede apreciar, este tipo de ataque puede ser muy dañino, ya que solo se necesita encontrar un sitio vulnerable a Cross Site Scripting (XSS) persistentes con bastante tráfico y visitantes que mantengan la página abierta, para mantener el código JavaScript ejecutándose en su navegador.

Los atacantes también tienen en cuenta, el tipo de petición que se realizará el código JavaScript insertado en a través del XSS, por ejemplo, una petición como:

http://dominio.com/index.php

Puede ser menos dañina que:

http://dominio.com/buscar.php?query=incibe&resultados=100

La segunda URL causaría una cantidad más considerable de trabajo a nivel de procesamiento en el servidor de la víctima, debido a que tiene que buscar la palabra "incibe" en la base de datos.

Las noticias publicadas, han señalado que los sitios de vídeo son un objetivo común para este tipo de ataques, ya que las víctimas pasan un largo periodo de tiempo visitando la página mientras se reproducen los videos. Esto los convierte en objetivo preferido de estos ataques, porque cuanto más tiempo esté abierta la página, más tiempo continúa el ataque.

En general, este tipo de ataque es simple y eficaz cuando los atacantes se toman su tiempo y ponen empeño en conseguirlo. También tienen una gran ventaja para el atacante, ya que no requieren ningún tipo de infección en un ordenador de los usuarios, sino tan sólo código JavaScript en sitios vulnerables.

¿Cómo podemos protegernos de este tipo de ataque?

Cómo cualquier ataque DDoS, lo primero que debemos de hacer es identificar el patrón utilizado por el atacante, por lo que podemos ejecutar el siguiente comando para visualizar los logs de acceso en nuestro servidor, en este caso Apache:

Una vez ejecutado, podremos visualizar en tiempo real las visitas de nuestro sitio, pudiendo así identificar la IP atacante.

- IPs y fecha de cada petición -

- Petición que recibe nuestro servidor web -

- User-Agent utilizado por los usuarios -

Como se puede observar, cada IP corresponde a los diferentes usuarios que están accediendo a la web infectada. Y es esta web la que se encarga de que los usuarios, sin ser conscientes de ello, lancen peticiones a nuestro servidor.

Puesto a que no han editado las cabeceras, podemos saber la página que se está utilizando para generar el ataque Ddos.

En este caso, es http://alvarodiaz.ovh/index.php?video=ID

Dado este punto, lo mejor sería avisar al administrador de esa página web, pues seguramente no sea consciente de lo que esté ocurriendo. Mientras los programadores del sitio arreglan la vulnerabilidad, podemos bloquear el acceso de las IPs atacantes para intentar frenar el ataque DDoS que estamos recibiendo.

Mientras tanto, podemos bloquear el acceso al servidor a las IPs atacantes, en este caso, bloquearemos las IPs con fail2ban. Fail2ban es un script programado en Python que monitoriza los logs de Apache en busca de patrones sospechosos, además es capaz de tomar medidas para bloquear a los atacantes ya sea con iptables o lanzando un comando de nuestra elección. Se distribuye bajo licencia GNU.

Fail2ban, nos permite filtrar las la peticiones por múltiples campos como por IPs, referer de la cabecera o por el número de conexión en un tiempo dado. En, nuestro ejemplo podríamos filtrar por el referer "http://alvarodiaz.ovh/index.php?video=ID" .

En caso de no disponer de este dato deberíamos tener en cuenta todas las peticiones, filtrando por las cadena "GET / HTTP/1.1", condición que es muy común y con la que podríamos banear visitas legitimas.

- Instalación de fail2ban -

 

Veamos como configurar Fail2ban. El directorio de configuración de Fail2ban se encuentra en: /etc/fail2ban/ en donde existen dos directorios más: action.d y filter.d

  • action.d: Encontraremos las acciones que Fail2ban realizará cuando alguno de nuestros filtros encuentre alguna IP haciendo maldades.
  • filter.d: Se almacenarán los filtros que utilizaremos para identificar a los atacantes.

Para evitar el ataque editaremos el archivo /etc/fail2ban/jail.conf para añadirle las siguientes líneas:

- Líneas de configuración que debemos añadir -

  • Maxretry: Especifica cuantos intentos vamos a dejar antes de banear la ip.
  • findtime: Es el período de tiempo en segundos que estamos contando los "reintentos" (300 segundos = 5 minutos).
  • bantime: Es el tiempo que debemos esperar para liberar las peticiones, ósea el tiempo que la IP estará baneada, en este caso se trata de 5 minutos.
  • Logpath: La ruta de nuestro log de Apache.

Es importante configurar correctamente este archivo, ya que, si lo hacemos mal, fail2ban baneará visitas legitimas.

Ahora creamos el archivo de filtrado en /etc/fail2ban/filters.d/http-get-dos.conf y dentro de este, colocamos las siguientes líneas:

- Líneas de configuración que debemos añadir -

 

Por último, debemos reiniciar Fail2ban para que coja la nueva configuración.

- Comando para reiniciar fail2ban -

Una vez reiniciado, solo debemos esperar a que fail2ban banee automáticamente a las IPs atacantes, podremos ver los baneos que realiza desde su fichero de logs /var/log/fail2ban.log

- Baneo de la IP 1.20.10.1 -

Cuando esta IP intente acceder a nuestro servidor, fail2ban se lo impedirá.

 

¿Por qué baneamos las IPs con fail2ban y no desde Apache o htaccess?

Esto es debido, a que si bloqueamos las IPs desde el nivel de aplicación es ineficaz, ya que, el servidor, en este caso Apache, recibe la petición igualmente. Si utilizamos algún firewall como iptables, bloqueamos las conexiones a nivel de red y de este modo Apache nunca procesa la petición.

Por ultimo comentar que aunque Fail2ban limita el impacto de un ataque de este tipo no es una solución definitiva, ya que el servidor sigue recibiendo las peticiones. En caso de que un ataque genere un gran volumen podría provocar igualmente una denegación de servicio en nuestro servidor.

Etiquetas: