TCP三次握手有哪些漏洞?

SYN Flood 攻击

 SYN Flood 是 DDoS 攻击的方式之一,这是一种利用TCP协议缺陷,发送大量伪造的TCP连接请求,从而使得被攻击方资源耗尽(CPU满负荷或内存不足)的攻击方式。

 要明白这种攻击的基本原理,还是要从TCP连接建立的过程开始说起:

  首先,请求端(客户端)发送一个包含SYN标志的TCP报文,SYN即同步(Synchronize),同步报文会指明客户端使用的端口以及TCP连接的初始序号。

  第二部,服务器在收到客户端的SYN报文后,将返回一个SYN+ACK的报文,表示客户端的请求被接受,同时TCP序号被加一,ACK即确认(Acknowledgment)。

  第三部,客户端也返回一个确认报文ACK给服务器端,同样TCP序列号被加一,到此一个TCP连接完成。

 以上的连接过程在TCP协议中称为三次握手。

 问题就出在TCP连接的三次握手中,假设一个用户向服务器发送了SYN报文后突然死机或掉线,那么服务器在发出SYN+ACK应答报文后是无法收到客户端的ACK报文的(第三次握手无法完成),这种情况下服务器端一般会不停地重试(再次发送SYN+ACK给客户端)并等待一段时间后丢弃这个未完成的连接,这段时间的长度我们称为SYN Timeout(大约为30秒-2分钟);一个用户出现异常导致服务器的一个线程等待1分钟并不是什么很大的问题,但如果有一个恶意的攻击者发送大量伪造原IP地址的攻击报文。发送到服务端,服务器将为了维护一个非常大的半连接队列而消耗非常多的CPU时间和内存。服务器端也将忙于处理攻击者伪造的TCP连接请求而无暇理睬客户的正常需求(毕竟客户端的正常请求比率非常之小),此时从正常客户的角度看来,服务器失去响应,这种情况我们称作:服务器端受到了SYN Flood攻击(SYN 洪水攻击)。

  原理:攻击者首先伪造地址对服务器发起SYN请求,服务器回应(SYN+ACK)包,而真实的IP会认为,我没有发送请求,不作回应。服务器没有收到回应,这样的话,服务器不知道(SYN+ACK)是否发送成功,默认情况下会重试5次(tcp_syn_retries)。这样的话,对于服务器的内存,带宽都有很大的消耗。攻击者如果处于公网,可以伪造IP的话,对于服务器就很难根据IP来判断攻击者,给防护带来很大的困难。

解决方法:

  第一种是缩短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报文,同时利用随机改写IP报文中的源地址,以上的方法将毫无用武之地。例如SOCK_RAW 返回的套接字通过适当的设置可以自己完全控制IP头的内容从而实现IP欺骗。

  第三种方法是Syn Cache技术;

  这种技术在收到SYN时不急着去分配系统资源,而是先回应一个ACK报文,并在一个专用的HASH表中(Cache)中保存这种半开连接,直到收到正确的ACK报文再去分配系统。

  第四种方法是使用硬件防火墙;

  SYN Flood攻击很容易就能被防火墙拦截。

扩展:DDOS攻击的原理,如何防止DDOS攻击?

DDOS是英文Distributed Denial of Service 的缩写,意即“分布式拒绝服务”。

当下主要有2种流行的DDOS攻击:

  1、SYN Flood攻击:这种攻击方法是经典最有效的DDOS方法。

  2、TCP全连接攻击

  这种攻击是为了绕过常规防火墙的检查而设计的,一般情况下,常规防火墙大多具备过滤Land等DOS攻击的能力,但对于正常的TCP连接时放过的,很多网络服务程序(如:IIS、Apache等Web服务器)能接受的TCP连接数是有限的,一旦有大量的TCP连接,则会导致网站访问非常缓慢甚至无法访问。

  TCP全连接攻击就是通过许多僵尸主机不断地与受害服务器建立大量的TCP连接,直到服务器的内存等资源被耗尽而被拖垮,从而造成拒绝服务。

  这种攻击的特点是可绕过一般防火墙的防护而达到攻击目的。

  缺点是需要找很多僵尸主机,并且由于僵尸主机的IP是暴露的,因此容易被追踪。

如何防止呢?

  1、限制SYN流量

  用户在路由器上配置SYN的最大流量来限制SYN封包所能占有的最高频宽,这样,当出现大量的超过所限定的SYN流量时,说明不是正常的网络访问,而是有黑客入侵。

  2、定期扫描

  定期扫描现有的网络主节点,清查可能存在的安全漏洞,对新出现的漏洞及时进行清理。

  3、在骨干节点配置防火墙

  防火墙本山能抵御DDOS攻击和其他一些攻击。在发现受到攻击的时候,可以将攻击导向一些牺牲主机,这样可以保护真正的主机不被攻击。当然导向的这些牺牲主机可以选择不重要的,或者是Linux以及unix等漏洞少和天生防范攻击优秀的系统。

  4、用足够的机器承受黑客攻击

  这是一种较为理想的应对策略。如果用户拥有足够的容量和足够的资源给黑客攻击,在它不断访问用户、夺取用户资源之时,自己的能量也在逐渐耗失,或许未等用户被攻死,黑客已无力支招了。不过此方法需要投入的资金比较多,平时大多数设备处于空闲状态,和目前中小企业网络实际运行情况不相符。

  5、过滤不必要的服务和端口

  可以使用Inexpress、Express、Forwarding等工具来过滤不必要的服务和端口,即在路由器上过滤假IP。

Land攻击

  LAND攻击力用了TCP连接建立的三次握手过程,通过向一个目标主机发送一个用于建立请求连接的TCP SYN报文而实现对目标主机的攻击。与正常的TCP SYN报文不同的是:LAND攻击报文的源IP地址和目的IP地址是相同的,都是目标主机的IP地址。这样目标主机接在收到这个SYN报文后,就会向该报文的源地址发送一个ACK报文,并建立一个TCP连接控制结构,而该报文的源地址就是自己。由于目的IP地址和源IP地址是相同的,都是目标主机的IP地址,因此这个ACK报文就发给目标主机本身。这样如果攻击者发送了足够多的SYN报文,则目标计算机的TCB可能会耗尽,最终不能正常服务。

 

TCP存在的缺陷有哪些?

  1、TCP三次握手可能会出现SYN Flood攻击。

  2、TCP三次握手可能会出现Land攻击。

  3、Connection Flood攻击。

  原理是利用真实的IP地址向服务器发起大量的连接,并且建立连接之后很长时间不释放并定时发送垃圾数据包给服务器使连接得以长时间保持,占用服务器的资源,造成服务器上残余连接(WAI-time状态)过多,效率降低,甚至资源耗尽,无法响应其他客户所发起的连接。

  防范该攻击主要有如下方法:

    1、限制每个源IP的连接数

    2、对恶意连接的IP进行封禁

    3、主动清除残余连接

posted @ 2020-03-30 18:11  MrHH  阅读(4679)  评论(0编辑  收藏  举报