如何简单的防御syn攻击

0×01 前言

syn攻击由来已久,威力也十分巨大,一台笔记本就能轻易干翻一台没防护的服务器,而如今web又发展的异常迅速,很多的应用都是基于http协议的,而http协议又是建立在TCP协议之上的应用层协议,所以到了现在syn攻击依然生命力旺盛。其实syn攻击是利用了TCP建立连接需要三次握手的缺陷,只要一个小小的syn包就能占用服务器相对较大的内存空间,这样不平等的关系才使得攻击者能够四两拨千斤,但是syn出现了这么多年不可能没有防御他的方法,今天我要说的syn cookie就是比较好的防御方法之一。

0×02 syn cookie详解

syn cookie技术是在1996年由Daniel J. Bernstein和Eric Schenk创造的(其实这俩人我也不认识,怎么念都不知道,我百度出来的。。。。),最早是1997年在linux上实现的,至今linux依然支持syn cookie技术。

syn cookie技术是对tcp的三次握手进行了一定的修改,但是修改仅在于服务器端,对任何客户端的使用都没有影响。原本tcp协议是在收到syn包时,服务器返回syn+ack包并分配一个专门的数据区来储存tcp连接需要的数据,这就使攻击者有机可乘,可以利用伪造的syn包来消耗服务器的内存空间和半开连接数,这就可以使服务器的内存或者半开连接数耗尽而拒绝服务。

捕获22.PNG

而syn cookie技术是服务器在收到syn包时并不马上分配储存连接的数据区,而是根据这个syn包计算出一个cookie,把这个cookie填入tcp的Sequence Number字段发送syn+ack包,等对方回应ack包时检查回复的Acknowledgment Number字段的合法性,如果合法再分配专门的数据区。

捕获111.PNG

那么这个cookie的值是如何计算的呢?听我慢慢说。。。

这里说的cookie其实就是TCP协议中的Sequence Number字段,长度是32bit也就是4字节,这32bit分成三段,

其中第一段是前5bit是时间t,t的值是系统时间除以64再对32取余数(time()>>6 mod 32),因为5bit最高只能表示到31。

第二段是3bit表示tcp中最大分段的大小(Maximum segment size),但是由于这个段只有3bit所以表示最大分段大小的数量只有八种,所以服务器在启用了 SYN Cookie 时只能发送八种不同的数值。

第三段是最后的24bit,他是一个由加密散列函数计算得到的值mac = MAC(A, k),其中MAC为带有密钥的散列函数,在linux中是sha1,A = SOURCE_IP || SOURCE_PORT || DST_IP || DST_PORT || t || MSSIND,其中t就是上面说的时间,而MSSIND是上面说的最大分段大小。k是服务器提供的密钥。

捕获3333.PNG

cookie之所以搞的这么复杂原因就是为了防止seq的预测,如果seq 的值是可以预测出来那么造成的后果远比syn攻击严重的多。好在现在linux系统都已经内置了syn cookie功能,不需要我们自己来实现。

0×03 开启syn cookie

我以kali为例来演示一下如何开启syn cookie,在linux内核中提供了很多SYN相关的配置,用命令:sysctl -a | grep syn就能看得到。

捕获444.PNG

这其中net.ipv4.tcp_max_syn_backlog是syn队列的长度,而net.ipv4.tcp_syncookies就是我们今天要说的syn cookie的开关,在kali中已经默认开启了,如果其他linux没有开启只需要输入命令:

sysctl -w net.ipv4.tcp_syncookies=1即可,关闭则输入sysctl -w net.ipv4.tcp_syncookies=0,如果是服务器最好把syn队列调的大一些,这样也能增强对syn攻击的抵抗力,不过具体多大要根据服务器的内存和带宽来决定,我运维经验不多也说不好多高合适有这方面经验的朋友在留言处分享一下吧。

实验我就不做了,现在做实验不像以前那么方便了,有设备的小伙伴们去实验看看吧,看看效果如何,syn攻击工具在我之前的文章中发布过,性能还不错,大家可以拿去试试。

0×04 syn cookie的缺点

syn cookie虽然与任何的上层和下层协议都不冲突,但是还是有他的不足之处,第一,服务器只能编码八种 MSS 数值,因为只有 3 位二进制空间可用。其次,这个服务器必须拒绝所有的TCP 选用项,例如大型窗口和时间戳,因为服务器会在信息被用其他方式存储时丢弃 SYN 队列条目,还有最致命的缺点就是开启syn cookie后会使服务器对与ack攻击的抵抗力大大降低,他虽然保护了内存空间的过度分配但是也使得cpu的计算资源被消耗(需要计算哈希值),所以说syn cookie虽然能抵御syn攻击但是却容易受到ack攻击。想要防御住所有类型的DOS攻击是很苦难的,需要对各种攻击的原理与防御方法非常了解,并且针对不同攻击选择合适的防御方法才行。

1

更多精彩
发表评论

已有 1 条评论

取消
Loading...

填写个人信息

姓名
电话
邮箱
公司
行业
职位
css.php