系统安全:一次DOS事件的解决办法

发表于:2007-06-23来源:作者:点击数: 标签:
下一页 1 2 0.分析过程 首先,分析了DOS的类型、特征、攻击方法。 使 .net stat -na|grep SYN_RECV|wc,发现当前存在大量SYN_RECV状态连接,源地址都是伪造的,netstat -na|grep SYN_RECV|wc显示数量为1024个,这个是当然, Linux 默认的Syn_Backlog对列就是

下一页 1 2 

   

0.分析过程

首先,分析了DOS的类型、特征、攻击方法。

    使.netstat -na|grep SYN_RECV|wc,发现当前存在大量SYN_RECV状态连接,源地址都是伪造的,netstat -na|grep SYN_RECV|wc显示数量为1024个,这个是当然,Linux默认的Syn_Backlog对列就是1024,超过的SYN都丢弃了。

针对的攻击端口是80:WWW服务,当然,Web服务器也已经无法访问了。

    在打开SYN_Cookie防护之后,攻击得到了一些缓解,但随后攻击流量又增大了,情况也好不到哪儿去,而Linux的Iptables又不能做syn_proxy的,那么只好从其他方面下手,用tcpdump -w抓下了当时的数据流量,计数分析流量大约在1.8w pps左右,其中99%以上都是伪造源地址的syn包。

    既然是伪造地址,那就比较难处理,不过经过仔细的统计和分析,还是分析出了这次攻击中主要数据的特征,主要有以下几条:

代码:
1. tcp标志位为 syn 2. ip数据总长为40Byte 3. ip头中的Identifier字端固定为256(0x0100) 4. TTL值平均分布为 74 - 95之间 5. tcp窗口值固定为16384 6. 目标端口为tcp:80 7. tcp初始化序列号为 17314131xx,按+1累计依次递增

   这样,注意看其中的3、4、5几条,这是对我们来说最重要的线索。

     3. ip identifier字端固定为0x0100,而在TCP/IP规范中,这个字段是为了防止一个连接中的分片包重复而作的包内序列号。虽然大多数操作系统没有严格准循着一条规范,但这个数值的来源却是确定的,即在正常的TCP/IP堆栈中,这个字段的值应该是发送此数据包是的TCB(TCP控制块,一个内核空间的TCP数据结构)的序列号。而即使系统也没有严格准循这一条,那么在网络中传输的数据,identifier字段的内容也应该是随机分布的,正常的操作系统网络堆栈不可能发送出大量0x0100这样固定的字段内容来。

    4. TTL值平均分布在74 - 95之间。按照常识也知道,大多数操作系统默认的TTL应该为32、64、128这样的2的整数次方;而另一个方面,TTL在网络传输的过程中每过一个路由器就会自动减一,而现在的Internet路由设计已经是比较良好的,从任何一点到达Intetnet的另一端,一般来说TTL条数不会超过20-30,这个我也测试过,从国内网通和电信的网络看来,到达国内和国际的大多数网站,TTL跳数都在20以内,而从Windows的Tracert命令也可以看出--它假设的最大TTL超时条数也只是30。超过30条的正常Internet路由是很罕见的。那么我们来做一个简单的减法:

代码:
128 - 30 = 98 64 - 30 = 34 32 - 30 = 2

所以一个数据包,在正常的传输过程中,当到达端点时,它的TTL数分布范围应该是:代码:

2 - 32 (罕见)、 34 - 64 、 98 - 128


而在本次数据采样中,大多数伪造地址的SYN数据,TTL都在74 - 95之间。

    其他附加特征,例如IP长度、TCP窗口、TCP SYN_Flag等,也可以作为附加判断标志。这样我们提取出这次攻击的主要特征码为:

代码:
a. tcp syn flag only, dst port 80 b. ip identifier = 0x0100 c. 74 < ttl < 95 d. tcp window = 16384

这样四条特征。

  

原文转自:http://www.ltesting.net