检测来源于传输层的攻击及防御

检测来自传输层的攻击及防御
本文档的Copyleft归yfydz所有,使用GPL发布,可以*拷贝、转载,转载时请保持文档的完整性,严禁用于任何商业用途。
msn: yfydz_no1@hotmail.com
来源:http://yfydz.cublog.cn

0. 传输层
传输层在IP层的上层,通常是IP头中protocol字段中指定的协议,通常用得最多的是TCP(6)和UDP(1)。

为方便理解,先列出TCP和UDP头结构,下面是RFC793定义的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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |          Source Port          |       Destination Port        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                        Sequence Number                        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                    Acknowledgment Number                      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |  Data |           |U|A|P|R|S|F|                               |
   | Offset| Reserved  |R|C|S|S|Y|I|            Window             |
   |       |           |G|K|H|T|N|N|                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |           Checksum            |         Urgent Pointer        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                    Options                    |    Padding    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                             data                              |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Source Port: 源端口,16位
Destination Port: 目的端口,16位
Sequence Number:序列号,32位,TCP用它来保证有序传输数据
Acknowledgment Number:确认号,32位,指明希望对方发送数据的序列号,以前的数据已经正确接收
Data Offset:数据偏移量,4位,指名数据相对于TCP头的偏移量,可理解为TCP头长度,和IP头长度一样,也是以4个字节为一个单位,最小为5,最大15,分别表示头长为20,60字节
Reserved:保留位
URG:紧急标志,1位,有该标志时Urgent Pointer通常不为0
ACK:确认标志,1位,有该标志时Acknowledgment Number通常不为0
PSH:PUSH“推”标志,1位,有该标志时data长度通常不为0
RST:重置标志,1位,用于异常断开TCP连接
SYN:同步标志,1位,用于TCP连接
FIN:结束标志,1位,表示不再发送数据
Window:窗口大小,16位,表示目前接收缓冲区大小,用于流量控制
Checksum: 校验和,16位,校验范围为伪IP头+TCP头+数据
Urgent Pointer:紧急指针,16位,用于指示紧急数据位置
Options: IP选项,长度从0到40字节
Padding: 填充字节,TCP头都要是4的倍数,不够的以0填充


下面是RFC768定义的UDP头结构:
                  0      7 8     15 16    23 24    31
                 +--------+--------+--------+--------+
                 |     Source      |   Destination   |
                 |      Port       |      Port       |
                 +--------+--------+--------+--------+
                 |                 |                 |
                 |     Length      |    Checksum     |
                 +--------+--------+--------+--------+
                 |                                   
                 |          data octets ...          
                 +---------------- ...               
Source Port: 源端口,16位
Destination Port: 目的端口,16位
Length:长度,16位,包括UDP头和数据总长
Checksum: 校验和,16位,校验范围为伪IP头+UDP头+数据,也可以为0,表示不进行校验

注:伪IP头是计算TCP、UDP校验和需要用到的IP头数据,包括源地址(32位)、目的地址(32位)、协议(8位)和TCP、UDP长度(16位)这4个字段,其他字段置0。


1. 异常包
TCP/UDP:端口值为0的包;校验和错误的包

TCP标志位异常包:SYN只能单独存在或只能和ACK共存,和其他标志共存就是异常包;没有标志或标志全置的包;有ACK标志但 Acknowledgment Number为0的包;有SYN标志但Sequence Number为0的包;有URG标志但Urgent Pointer为0,或没有URG标志但Urgent Pointer不为0的包;RST和除ACK标志之外的其他标志共存的包;这种攻击标志很明显,防御也很容易,可以做到100%检测并阻断;

2. LAND攻击
TCP层的攻击了,不过在网络层就可以防护;攻击方发送源地址和目的地址相同的TCP SYN包,对老的某些操作系统就会发SYNACK包给自身,建立空连接,最终消耗尽自身资源,现在的操作系统已经不会那么傻了,这种攻击也可以做到100%检测并阻断;

3. Flood攻击
syn flood:是TCP协议的最大弱点了,对syn flood攻击的分析在另一篇文章中详细说明了,理论上是无法真正防御的,只能进行一定程度的缓解;

UDP flood:就是发送大量UDP包阻塞目的机通信,由于UDP是非连接协议,因此只能通过统计的方法来判断,很难通过状态检测来发现,只能通过流量限制和统计的方法缓解;对于有些协议,服务器部分的计算量会远大于客户端的计算量,如DNS,野蛮模式的IKE等,这些情况下flood攻击更容易形成DOS。

4. 端口扫描
端口扫描往往是网络入侵的前奏,通过端口扫描,可以了解目标机器上打开哪些服务,有的服务是本来就是公开的,但可能有些端口是管理不善误打开的或专门打开作为特殊控制使用但不想公开的,通过端口扫描可以找到这些端口,而且根据目标机返回包的信息,甚至可以进一步确定目标机的操作系统类型,从而展开下一步的入侵。

4.1 TCP扫描
按照RFC,当试图连接一个没有打开的TCP端口时,服务器会返回RST包;连接打开的TCP端口时,服务器会返回SYNACK包

合法连接扫描:
connect扫描:如果是打开的端口,攻击机调用connect函数完成三次握手后再主动断开;关闭的端口会连接识别
SYN扫描:攻击机只发送SYN包,如果打开的端口服务器会返回SYNACK,攻击机可能会再发送RST断开;关闭的端口返回RST;

异常包扫描:
FIN扫描:攻击机发送FIN标志包,Windows系统不论端口是否打开都回复RST;但UNIX系统端口关闭时会回复RST,打开时会忽略该包;可以用来区别Windows和UNIX系统;
ACK扫描:攻击机发送ACK标志包,目标系统虽然都会返回RST包,但两种RST包有差异;

对于合法连接扫描,如果SYN包确实正确的话,是可以通过防火墙的,防火墙只能根据一定的统计信息来判断,在服务器上可以通过netstat查看连接状态来判断是否有来自同一地址的TIME_WAIT或SYN_RECV状态来判断。

对于异常包扫描,如果没有安装防火墙,确实会得到相当好的扫描结果,在服务器上也看不到相应的连接状态;但如果安装了防火墙的话,由于这些包都不是合法连接的包,通过状态检测的方法很容易识别出来(注意:对于标准的Linux内核所带防火墙netfilter的TCP状态检测的实现,ACK和FIN 扫描是可以通过的,需要修改才能防御)。

4.2 UDP扫描
当试图连接一个没有打开的UDP端口时,大部分类型的服务器可能会返回一个ICMP的端口不可达包,但也可能无任何回应,由系统具体实现决定;对于打开的端口,服务器可能会有包返回,如DNS,但也可能没有任何响应。

UDP扫描是可以越过防火墙的状态检测的,由于UDP是非连接的,防火墙会把UDP扫描包作为连接的第一个包而允许通过,所以防火墙只能通过统计的方式来判断是否有UDP扫描。

5. TCP紧急指针攻击
Winnuke:对老的Windows系统,对TCP139端口发送带URG标志的包,会造成系统的崩溃,特征明显,防火墙可以100%防御,但也可能误伤;

6. TCP选项攻击
相对IP选项,TCP选项利用率要高很多,很多正常包中都要用到,TCP选项攻击包括:

1) 非法类型选项:正常的选项类型值为0、1、2、3、8、11、23、13,其他类型的出现是可疑的(类型4,5,6,7虽然定义了但被类型8取代,正常情况下也是不用的);
2) 时间戳:用于搜集目的机的信息;
3) 选项长度不匹配:选项中的长度和TCP头中说明的TCP头长度计算出的选项长度不一致;
4) 选项长度为0:非0、1类型的选项长度为0,是非法的;
5) 选项缺失,一般SYN包中都要有MSS选项,没有的话反而不正常;

6. 总结
传输层的攻击也属于特征比较明显的类型,除 syn flood外防护也比较容易,由于模式固定,也适合硬件实现。syn flood是TCP永远的痛,是TCP设计之初没有仔细考虑到的,在一些新的协议如SCTP(132),已经考虑到此因素,但由于TCP应用太广泛,要取代TCP基本不太可能。