Los Caballeros

"Sobre seguridad, programación, modding, frikismo, etc... "

Conexiones persistentes y ataques DoS

Twitter icon Twitter icon
HTTP/1.1 tiene entre otras novedades el uso de conexiones persistentes (o conexiones vivas), las cuales en resumen son lo siguiente:
  1. Se utiliza una misma conexión para varios diálogos HTTP.
  2. Al re-utilizarse una misma conexión para todos los diálogos se ahorra tiempo y recursos al no necesitar finalizar la conexión y crear otra.
  3. El HTTP Pipelining, nos permita enviar todas las consultas de forma consecutiva sin tener que esperar la respuesta del servidor antes de enviar otra, lo cual nos permite enviar las consultas de forma rápida y obtener las respuestas a todas las consultas de una sola vez.
  4. Gran cantidad de servidores de cache no soportan conexiones persistentes, asi que aun consultas repetidas no utilizaran cache (en ciertas ocaciones).
Teniendo todo esto en cuenta, procedemos a diseñar una tecnica de DoS.

Otras "desventajas" que tienen muchos servidores que utilizan PHP es que este tiene instalado librerías para compresión, las cuales tienen la ventaja de que ahorran ancho de banda, pero gastan cierta cantidad de recursos adicionales a los que la carga normal de la pagina conlleva, por lo cual, si nosotros realizamos un envío masivo de paquetes por conexiones persistentes haremos trabajar al servidor muchas mas veces que las que un usuario normal haría. Además de todo esto, si tomamos en cuenta que la mayoría de los sistemas de firewall contra ataques de denegación de servicio que existen únicamente cuentan la cantidad de conexiones que se realizan, no detectaran esta clase de ataques, puesto que no utilizan gran cantidad de conexiones, además de que no representa gran consumo de banda de subida, por lo cual aun teniendo una conexión de hogar podemos denegar a servidores profesionales. En el x25 realice una prueba de concepto en la cual mediante 10 conexiones se denegó un servidor con 3 GB's de ram y doble núcleo, mediante esta técnica (gracias al voluntario que nos presto su PC para el PoC y proximamente vídeos y/o fotos de mi conferencia :P) en cuestión de 2 segundos.

Como forzamos a un servidor a utilizar las librerías de compresión si este las tiene instaladas?, simple utilizando la cabecera que fue diseñada para este proposito: Accept-Encoding. En esta especificaremos las compresiones que le daremos a elegir al servidor a utilizar.

Accept-Encoding: gzip,deflate

Ahora otro dato curioso, en la prueba de concepto realizada en x25 se utilizo un servidor Apache2, con conexiones persistentes activadas y un joomla.


uno de los defectos que tiene joomla es la gran cantidad de consultas SQL que realiza, ahora agregando a esto la cabecera: CLIENT-IP, podemos realizar unas cuantas mas, adicional a todo esto, si se realizan conexiones persistentes el PHP se ejecutara cuantas consultas enviemos. A esto agregándole el hecho de que básicamente todos los servidores en internet no tienen configurado un limite de paquetes por conexión persistente, podemos realizar un envío masivo de paquetes HTTP especialmente diseñados para consumir los recursos del servidor, ahora otro detalle que tienen los servidores Apache y similares, es que despliegan hilos cada vez que detectan que hay demasiadas consultas HTTP, los cuales consumen bastante memoria, entre mas hilos haya en memoria mas haremos trabajar al servidor y por consiguiente el servidor podrá cada vez atender menos consultas. A esto agreguemos el hecho de que el servidor de SQL esta saturado de consultas.


PoC proximamente.

2 comentarios:

Anónimo dijo...

NO SE SI SERIA POSIBLE QUE HABLARAN MAS DE SISTEMAS OPERATIVOS (PUNTOS DE MONTAJE, SISTEMAS DE ARCHIVOS, PLATAFORMAS MAS SEGURAS,SISTEMAS DE RED)ETC.

Anónimo dijo...

buen articulo esperamos el poc