一、传输层及其协议
传输层向其上的应用层提供通信服务,属于通信部分的最高层,同时也是用户功能中的最低层。只有位于网络边缘的主机才有传输层,网络核心部分的路由器只用到下三层的功能。
传输层为应用进程之间提供端到端的逻辑通信(网络层为主机之间提供逻辑通信)。
传输层需要对收到的报文进行差错检测。
运输层需要有两种不同的运输协议,即面向连接的 TCP 和无连接的 UDP。
传输控制协议(Transmission Control Protocol,TCP)
TCP是一种面向连接(连接导向)的、可靠的、基于IP的传输层协议。TCP的可靠性和流控制服务能够确保数据不丢失和不会遭受破坏。
用户数据报协议(User Datagram Protocol,UDP)
UDP 是一种无连接的传输层协议,提供面向事务的简单、不可靠的信息传送服务。
二、TCP协议的安全缺陷
1、TCP数据段格式
TCP是工作在传输层的主要协议之一,是有连接的传输协议。
和IP协议不同,TCP是面向进程的协议,面临更加复杂多变的安全环境。
每一条TCP连接分别连接客户端和服务器端的两个进程。端口可以理解成为是TCP连接于应用程序进程之间的连接界面。
端口的分配并没有严格的规定,一般分为三类:
熟知端口(Well Known Ports): 0~1023,公认这些端口绑定哪些服务。例如:80端口实际上表明了使用HTTP协议。
登记端口号(Registered Ports):1024~49151,为没有熟知端口号的应用程序使用,必须在 IANA (The Internet Assigned Numbers Authority,互联网数字分配机构)登记,防止重复。
动态端口(Dynamic Ports):49152-65535,用户应用程序临时使用。
***:4字节。TCP连接中传送的每一个字节都会占用一个***。***字段的值指的是本报文段所发送的数据的第一个字节的***。
确认号:4字节,期望收到对方的下一个报文段数据的第一个字节的***。 通常:收到的上一个数据包中的***+该数据包中数据的字节数。
数据偏移(也称首部长度):4位,表明了TCP 报文的数据起始处距离 TCP 报文段的起始处有多远。计量单位是 32 位字(以 4 字节为计算单位)。
保留:6位,未使用,全为0。
2、TCP连接的建立和释放过程
3、TCP协议的安全缺陷
TCP协议规定了通信双方必须事先建立连接,并且通过规定***的方式确保数据传输的有效性和有序性。
建立了多个状态,以描述处于不同阶段的TCP过程。
设置了多个定时器,以配合状态之间的转移,如:
连接定时器、FIN-WAIT-2定时器、TIME-WAIT定时器、维持连接定时器等。一旦超过这些定时器设置的时间,通常就会放弃对应的连接,并释放资源。然而,这些看起来很美很严密的规则都需要消耗相应的系统资源加以维持,并且这些严密的规则只是对正常TCP行为进行规范。
对应那些根本就不可能遵守规范的攻击者来说,这些严密规范就成为他们可以钻的空子。也就是说,如果不遵守规范,系统将会发生什么?也许就会发生一些攻击者们希望看到的情况发生。
4、TCP SYN泛洪攻击
TCP SYN泛洪(TCP SYN Flood)攻击是一种不遵守TCP协议规定的三次握手而出现的攻击行为,其目的是旨在造成攻击目标的瘫痪,无法响应正常的TCP连接请求,即所谓的拒绝服务攻击。
TCP SYN泛洪攻击原理
在TCP连接时,首先进行的是三次握手操作。如果发起连接请求的主机(客户端)在发出第一个连接请求的SYN包后突然掉线或者宕机,则被请求端(服务器端)在发出响应这个请求的SYN/ACK包后会因为得不到确认包而处于等待状态,称为半连接握手。
在服务器端,通常有一个专门用于处理这种半连接的缓存(堆栈),所有未完成握手的连接会在缓存中排队,服务器端会不断重新尝试着发出SYN/ACK包,只有在等待一段时间后仍然得不到客户端的确认包,服务器才关闭这个连接。
如果在短时间内大量出现这样的半连接握手,服务器就会忙于应付而无法响应正常的SYN请求,当这种半连接足够多时,服务器会因为堆栈溢出而崩溃。
TCP SYN泛洪过程
从上述原理可以看出,实现TCP***泛洪的关键是能够发出足够多的半连接请求。
1.构造足够的IP地址。构造IP地址的目的一是为了防止被追踪,一是为了避开被攻击主机的IP地址过滤。
2.在攻击主机上设置过滤规则,丢弃一切来自被攻击主机的SYN/ACK包。
如果攻击主机有足够强大的性能和足够的带宽,并且被攻击主机没有对发出请求包的IP地址进行过滤,那么在理论上就可以仅依靠一台攻击主机瘫痪被攻击主机。
为了达到攻击的目的,攻击主机通常会寻找许多在线的主机,通过植入木马的方式,使这些主机成为攻击主机的“僵尸”,也称为“肉鸡”,并且让这些僵尸主机同时发起攻击。
TCP SYN泛洪防范
1.缩短等待时间:当发现有大量半连接时,将等待时间缩短,减少保持半连接的时间。
2.设置SYN Cookie:当收到SYN请求时,服务器按照源IP地址、源端囗、目的IP地址和目的端囗以及其他一些安全数值等要素进行hash运算并加密,称之为cookie。服务器不再为每个请求开辟缓存空间保持半连接。当收到来自客户端的ACK回复时再次计算cookie值并和原来的cookie值进行比较,若一致则完成连接,若不一致则丢弃。这样可以极大地减少由于堆栈溢出而使服务器崩溃的可能性。
3.设置SYN防火墙:由防火墙回应SYN请求,只有得到客户端的ACK后,再转交服务器进行连接。
TCP SYN泛洪仍然是一个难以防范的攻击,设置SYN cookie虽然避免了半连接,但也带来了ACK泛洪的可能性,也会因为增加了计算时间而导致响应时间延迟,同时也会导致许多TCP特性丢失,特别是在IPv6网络中。设置SYN防火墙只是保证了服务器不崩溃,而防火墙依然可能会崩溃。
5、LAND攻击
LAND攻击也是一种利用TCP三次握手机制的不完善,通过简单的将目标IP地址、源IP地址设置为攻击对象主机的IP地址,源端口和目的端口设置为攻击对象主机开放的同一个端口,即可非常有效地使目标机器重新启动或者死机。
TCP LAND攻击原理
TCP传输的可靠性依赖于三次握手所实现的事先连接和收发双方不断的相互确认。如果在规定时间内没有收到确认数据包,那么原先传输的数据包为被重新传输。
如果攻击者通过某种方法使得目标主机无法收到通信对方的确认数据包,那么目标主机会一直不断重新发出数据包,并一直等待,直到资源耗尽而崩溃。
TCP LAND攻击过程
攻击者向目标主机发出一个目标地址和源地址都是目标主机的IP地址,并且源端口和目的端口都是目标主机某个开放的端口的TCP同步报文。
假设攻击者主机的TCP***为x。
目标主机在收到攻击主机的同步报文后,会向自己发送一个确认号为x+1,***为自身按照某种规律产生(假设为y)的同步确认报文。
目标主机很快就收到自己发来的同步确认报文。然而,由于y不是目标主机希望的x+1,因此会发出一个确认报文,并建立和保持一个空连接,等待***为x+1的报文。
至此,目标主机陷入死循环。不同的操作系统在受到Land攻击时的反应有所不同。如果是Unix或类Unix,大部分会崩溃;如果是Windows系统则会变得极其缓慢。这是因为TCP是有着很高优先级的内核进程,大部分进程会因为系统要处理TCP进程而不得不中断并交出资源。
当资源耗尽,系统就会崩溃。
TCP LAND攻击防范
防御的方法也是非常简单,只要在防火墙上禁止那些来自于外网且源地址又是内网的数据包,特别是目标地址和源地址完全相同的数据包。
6、TCP***欺骗
无论是IP欺骗还是TCP会话劫持,都离不正确的TCP***的获得。TCP***欺骗(TCP Sequence Number Spoofing)的目的就是为了通过某种手段猜测可能的TCP***。
每个操作系统在实现TCP时,采用的算法不尽相同,初始***的产生方法更是千差万别。
TCP初始***产生原理
虽然准确猜测主机B的初始***是困难的(因为每种操作系统在具体实现TCP/IP时会采用不同的算法),但是可以获得其变化规律。
初始***取值范围:0232-1,也就是04294967295。具体取值算法与不同的系统相关,TCP/IP标准规定每4微秒加1,即每秒增加250000,计数满232-1归0。
在早期的Free BSD等操作系统中,ISN按照每秒增加128000,若有连接时增加64000;在Windows系统中,ISN的增加等于两次连接之间时间差的毫秒数。其中,ISNn是下一个ISN值, ISNc是当前的ISN值,RTT(Round Trip Time)是指两台主机之间数据包的往返时间,简单的可以用Ping命令获得。
TCP***欺骗原理
TCP***欺骗是指攻击者在冒充第三方被信任主机时,需要获得目标主机与被信任主机之间建立TCP连接时采用的***,也称为TCP会话劫持。
由于初始***产生的随机性和较高的变化频率,使得攻击者通过截获A和B之间的报文获得***非常困难。因此,攻击者采用参与连接建立过程,通过冒充主机A与主机B建立连接,这样初始***就由攻击者所掌握,从而可以随心所欲的获得来自主机B的数据。TCP***欺骗过程
攻击主机X向主机B发起正常的TCP连接,并接收来自主机B的确认包,记录下确认包的***,假设为ISNb#。
攻击主机冒充主机A向主机B发起TCP连接。其中,***为ISNx,源IP地址为A。
主机B会向主机A发送确认包,这个确认包攻击主机是收不到的。其中包括了主机B的***ISNb,并将ISNb$作为确认号向主机B发送确认包,连接即成功建立。为了防止被冒充主机A收到来自主机B的确认包,通常还需要向主机A进行DOS攻击,或者选择没有上线的主机作为被冒充对象。
TCP***欺骗防范
1.在边界路由器上配置丢弃所有来自外网又声称自己是内部主机的数据包
2.改进ISN生成算法,增加计算ISN的难度,比如通过(真)随机增量等方法。
三、UDP协议的安全缺陷
1、UDP数据段格式2、UDP协议的特点
3、Fraggle攻击
Fraggle攻击是Smurf攻击的简单改进,原理完全一样,利用对广播数据的应答而实现攻击。因为采用的是UDP协议,故而可以攻击那些屏蔽ICMP应请求包的防火墙。
Fraggle攻击原理
在很多操作系统中,为了方便测试而开放了7号端口(echo)和19号端口( chargen )。7号端口会将收到的字符一字不差的送回去,如果其中遇到回车符号,则会双倍返还。
攻击者首先构造一个目标端口号为7的UDP包,将其封装在一个源地址为目标主机、目标地址是目标主机所在网络的广播地址的IP包内并将其发出。目标网络路由器接收到这样的广播包后会向网络中的所有主机都转发这个数据包,因为目标端口是7号端口,因此所有收到广播报文的主机都会向目标主机发出回送报文,只要目标网络内主机数量足够多,就可以很快淹没目标主机,从而达到攻击的目的。
有趣的攻击行为
根据协议规定,19号端口产生的随机字符数量在1-512字节之间。然而,不同操作系统在实现是并没有严格遵守。
如果将目标端口和源端口分别设置为7号和19号,目标地址和源地址都是目标主机,则目标主机在收到这样的报文就会自己开始攻击。
如果将源地址设为目标主机地址,源端口设为19号,目标地址设为目标主机所在网络的广播地址,目标端口7号。当目标网络路由器在收到这个报文后会向网络内的所有主机发送报文,由于目标端口为7,源端口号19,所有就会有巨量的垃圾流量发送到目标主机。
防范
1.关闭7号和19号端口。
2.防火墙上设置策略,禁止那些源地址为内网实质是从外网进入的数据包。