Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1069418
  • 博文数量: 242
  • 博客积分: 10209
  • 博客等级: 上将
  • 技术积分: 3028
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-12 09:27
文章分类

全部博文(242)

文章存档

2014年(1)

2013年(1)

2010年(51)

2009年(65)

2008年(124)

我的朋友

分类: 网络与安全

2009-06-09 23:15:43

一、SYN攻击原理

TCP “SYN” 攻击也叫 SYN 淹没。它使用了大多数主机使用 TCP 三向握手机制中的漏洞。当主机 B 接收到 A 中的 SYN 请求时,它必须利用一个“监听队列”将该特别连接至少保持75秒。恶意的主机通过向其它主机发送多个 SYN 请求的方式来利用该监听队列,但从不响应其它主机发回的 SYN&ACK。这样一来,其它主机的监听队列很快被填满,然后就停止接受新的连接,直到队列中某个特别打开的连接完成或超时。这种使某台主机脱 离网络至少达75秒的功能可用于服务拒绝攻击,或者它可以用于实施其它攻击的工具,如 IP 欺骗。

在TCP连接的三次握手中,假设一个用户向服务器发送了SYN报文后突然死机或掉线,那么服务器在发出SYN+ACK应答报文后是无法收到客户端的ACK 报文的(第三次握手无法完成),这种情况下服务器端一般会重试(再次发送SYN+ACK给客户端)并等待一段时间后丢弃这个未完成的连接,这段时间的长度 我们称为SYN Timeout,一般来说这个时间是分钟的数量级(大约为30秒-2分钟);一个用户出现异常导致服务器的一个线程等待1分钟并不是什么很大的问题,但如 果有一个恶意的攻击者大量模拟这种情况,服务器端将为了维护一个非常大的半连接列表而消耗非常多的资源----数以万计的半连接,即使是简单的保存并遍历 也会消耗非常多的CPU时间和内存,何况还要不断对这个列表中的IP进行SYN+ACK的重试。实际上如果服务器的TCP/IP栈不够强大,最后的结果往 往是堆栈溢出崩溃---即使服务器端的系统足够强大,服务器端也将忙于处理攻击者伪造的TCP连接请求而无暇理睬客户的正常请求(毕竟客户端的正常请求比 率非常之小),此时从正常客户的角度看来,服务器失去响应,这种情况我们称作:服务器端受到了SYN Flood攻击(SYN洪水攻击)。

TCP SYN 攻击是一种能够导致基于网络服务拒绝(DOS)或分布式服务拒绝(DDOS)的主要攻击方式。



从防御角度来说,有几种简单的解决方法

   第一种是缩短SYN Timeout时间,由于SYN Flood攻击的效果取决于服务器上保持的SYN半连接数,这个值=SYN攻击的频度 x  SYN Timeout,所以通过缩短从接收到SYN报文到确定这个报文无效并丢弃改连接的时间,例如设置为20秒以下(过低的SYN Timeout设置可能会影响客户的正常访问),可以成倍的降低服务器的负荷。

    第二种方法是设置SYN Cookie,就是给每一个请求连接的IP地址分配一个Cookie,如果短时间内连续受到某个IP的重复SYN报文,就认定是受到了攻击,以后从这个IP地址来的包会被一概丢弃。

    可是上述的两种方法只能对付比较原始的SYN Flood攻击,缩短SYN Timeout时间仅在对方攻击频度不高的情况下生效,SYN Cookie更依赖于对方使用真实的IP地址,如果攻击者以数万/秒的速度发送SYN报文,同时利用SOCK_RAW随机改写IP报文中的源地址,以上的 方法将毫无用武之地。

二、SYN攻击工具
sT;Q_:{6Zd&f#|R3|+u1_0      SYN攻击实现起来非常的简单,上 有大量现成的SYN攻击工具。以synkill.exe为例,运行工具,选择随机的源地址和源端囗,并填写目标机器地址和TCP端囗,激活运行,很快就会 发现目标系统运行缓慢。如果攻击效果不明显,可能是目标机器并未开启所填写的TCP端囗或者防火墙拒绝访问该端囗,此时可选择允许访问的TCP端囗,通 常,系统开放tcp139端囗,UNIX系统开放tcp7、21、23等端囗。
SYN Flooder源码解读

下面我们来分析SYN Flooder的程序实现。

首先,我们来看一下TCP报文的格式:

  

0         1         2         3         4         5         6

    0 2 4 6 8 0 2 4 6 8 0 2 4 6 8 0 2 4 6 8 0 2 4 6 8 0 2 4 6 8 0 2 4

    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

   |      IP首部      |    TCP首部      |    TCP数据段    |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

              图一 TCP报文结构

  
如上图所示,一个TCP报文由三个部分构成:20字节的IP首部、20字节的TCP首部与不定长的数据段,(实际操作时可能会有可选的IP选项,这种情况 下TCP首部向后顺延)由于我们只是发送一个SYN信号,并不传递任何数据,所以TCP数据段为空。

TCP首部的数据结构为:


   0                   1                   2                   3  

   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2

   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

   |             十六位源端口号    |           十六位目标端口号    |

   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

   |                        三十二位序列号                         |

   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

   |                        三十二位确认号                         |

   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

   | 四位  |           |U|A|P|R|S|F|                              |

   | 首部  |六位保留位  |R|C|S|S|Y|I|         十六位窗口大小         |

   | 长度  |           |G|K|H|T|N|N|                              |

   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

   |           十六位校验和        |         十六位紧急指针          |

   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

   |                          选项(若有)                         |

   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

   |                          数据(若有)                         |

   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

                      图二  TCP首部结构


根据TCP报文格式,我们定义一个结构TCP_HEADER用来存放TCP首部:

typedef struct _tcphdr              

{

        unsigned short th_sport;               //16位源端口

        unsigned short th_dport;             //16位目的端口

        unsigned int th_seq;         //32位序列号

        unsigned int th_ack;         //32位确认号

        unsigned char th_lenres;        //4位首部长度+6位保留字中的4位

        unsigned char th_flag;            //2位保留字+6位标志位

        unsigned short th_win;                 //16位窗口大小

        unsigned short th_sum;                 //16位校验和

        unsigned short th_urp;                 //16位紧急数据偏移量

}TCP_HEADER;

|CEb5cZ+SR
阅读(873) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~