TCP协议及其安全缺陷

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

3.3 TCP协议及其安全缺陷
TCP 提供面向连接的服务,例如为Telnet、FTP、SMTP等需要高度可靠性的服务。

(RefB_p287_传输层端到端通信的基本结构)
(RefB_p288_TPDU结构与IP分组、帧结构的关系)
IP数据包中若有已封装好的TCP数据包,则IP将它们向上传送到TCP层。

TCP将包进行排序并进行差错检测,同时实现虚电路(VC)间的连接。

TCP将数据包中含序列号(SequenceNum)和应答号/确认号(Acknowledgement),对
未按顺序收到的包可以被排序,损坏的包要求被重传。

(复习:协议封装)
(RefC_p66_以太网上使用TCP进行数据封装)
(RefC_p70_TCP首部)
1)端口号( SrcPort, DstPort):包括源端口号和目的端口号。

每个端口号的字段长为16比特,它分别表示发送该报文段的应用程序的端口号与接收该报文段的应用程序的
端口号。

IP地址没有提供表明某个特定应用的信息,即同一个IP 地址可以同众多服务“绑定”,因此需要额外的头(header)信息。

端口号用于标示传输层协议和应用层的应用程序之间的接口(interface)。

TCP端口号可以提供运行在某台机器上每个应用服务的地址(服务器的服务地址)。

通过使用端口号,可以标识一台机器上的多个目的进程。

每个端口均被赋予一个小整数以便识别。

IP地址加上端口号构成一个套节字(Socket),即构成一个特定的TCP连接。

客户端的端口号由TCP协议独立分配,本地唯一。

服务器端口号被标准化。

常见的服务器的“大众端口“:
FTP: 20, 21
POP: 110
Email: 25
WWW: 80
Telnet: 23
DNS: 53
当各服务器程序运行后,在各自的大众端口上等待。

如果服务器收到用户请求使用某台主机的服务后,则服务器则向该服务的套节字发送数据。

例如,用户希望远程登录到一台服务器上,则向该服务器的23号端口发送message。

服务器收到后,TCP根据端
口号将message发送到Telnet的服务程序上去。

在实际情况中,TCP将端点(endpoint)定义为一对整数(IP, port)。

2)序列号(SequenceNum):32比特。

由于TCP协议是面向数据流(data stream)的, 它所传送的报文段可视为连续的数据流,因此它需要被发送的每一个字节编上号。

序列号为报文段数据的第一个字节的顺序号。

3)应答(确认)号(Acknowledgement):32比特。

表示接收端希望收到的下一个报文段的第一个字节的序号。

4)首部长度(HdrLen):4比特。

TCP报头(首部)以4字节(32比特)来计算,实际报头长度为20~40字节,则这个字段的为5~15。

5)保留:6比特。

保留为今后使用,目前全部设为0。

6)标志(Flags):6比特。

用来在TCP对等实体间传递控制信息。

i) URG:当被设置时,紧急指针有效。

意味本数据
包包含紧急数据,UrgPtr字段指明本数据段的非
紧急数据从什么位置开始,而紧急数据包含在数
据段体的前部,直到包括UrgPtr所指的字节数为止。

ii) Ack: 当被设置时,确认序列号有效。

iii) Psh: 当被设置时,发送方调用了push操作,告诉接收方应当尽快将这个报文上交给应用层。

i)RST: 连接复位reset。

当被设置时,说明接受方已经出现混乱,例如收到并不希望收到的数据段等,提出终止连接。

ii)SYN:同步序列号,用于发起一个连接。

iii)FIN:当被设置时,表明发送端完成发送任务。

7)窗口大小(AdvertizedWindow):16比特。

以字节为单位,窗口对应的最大数为65,535字节。

8)校验和(checksum):计算整个TCP的首部、TCP 数据、IP首部的源地址和目的地址以及长度字段构成的伪首部(后见UDP介绍)。

(复习:三次握手)
(RefF_p227_三次握手算法的时间线)
典型的TCP协议攻击/安全缺陷
1)LAND攻击:
将TCP包中的源地址、端口号和目的地址、端口号设成相同。

将地址字段均设成目的机器的IP地址。

若对应的端口号处于激活(等待)状态,LAND攻击可使目的机器死机或重新启动。

攻击奏效的原因出于TCP的可靠性。

攻击利用TCP初始连接建立期间的应答方式存在的问题。

攻击的关键在于server和client由各自的序列号。

注:i) 初始序列号各方随机自选。

ii) 己方针对对方序列号发出的应答(确认)号=对方上次的序列号+1.
iii) 己方发出的(非初始)序列号=己方上次的序列号+1=己方收到的应答号。

iv)各方每次发送以上iii) 和ii)。

例:正常情况下的三次握手与通信:
客户端服务端
(1)===============>
客SequenceNum=1001 (初始)
(2)<==============
服Ack=1001+1=1002
服SequenceNum=4999 (初始)(3)===============>
客SequenceNum=1001+1=1002
客Ack=4999+1=5000
(以上完成三次握手)
(4)<==============
服Ack=1002+1=1003
服SequenceNum=4999+1=5000(5)===============>
客SequenceNum=1002+1=1003
客Ack=5000+1=5001
(6)<==============
服Ack=1003+1=1004
服SequenceNum=5000+1=5001。

(RefC_p73_LAND攻击示意图)
从第三次握手开始,因为每次服务器均得到自己的应答/确认号,即1002,而非5000,而该确认号为自己上次发出的,认为有错,则重发(非超时所致),由此无限循环。

由于TCP是具有高优先权的内核级进程,可中断其它的正常操作系统以获得更多的内核资源来处理进入的数据。

这样,无限循环很快就会消耗完系统资源而引起大多数系统死机。

TCP在此的安全缺陷还在于:在连接初始化成功之后无任何形式的认证机制。

TCP收到的数据包只要有正确的序
列号就认为数据是可以接受的。

一旦建立连接,就无法确定数据包源IP地址的真伪。

2)去同步攻击(Desynchronization):
复习:帧滑动窗口算法
(RefF_p58_滑动窗口算法)
发送方维持三个变量:
- SWS (send window size): 发送窗口大小, 能够
发送未被确认的帧数目的上界,发送缓冲
区。

- LAR (last acknowledgment arrived): 最近收到
的应答号
- LFS (last frame sent): 最近发送的帧序号。

发送方维持下列不等式:
LFS - LAR <= SWS
(RefF_p58_发送方的滑动窗口)
接收方维持三个变量:
- RWS (receive window size): 接收窗口大小, 能
够接收无序帧数目的上界,接收缓冲区。

- LAF (last acceptable frame): 最大可接收帧的
序号
- LFR (last frame received): 最后收到的帧序号。

接收方维持下列不等式:
LAF - LFR <= RWS
(RefF_p58_接收方的滑动窗口)
复习:TCP字节滑动窗口算法
与帧滑动窗口算法的不同之处:
-增加流量控制功能。

-滑动窗口的尺寸不固定,由接受方向发送方通知(advertise)其窗口的大小,发送方在任意给定时刻
未被确认(应答)的字节数就不能超过
AdvertisedWindow字段的值。

接收方根据分配给
连接用于缓存数据的内存数量(缓冲区buffer),
为AdvertisedWindow选择一个合适的值,用于存
放那些到达的错序数据以及那些按正确顺序到达
但应用进程无暇读出的数据。

讨论1:用滑动窗口实现可靠有序的传输
发送方:维护三个指针(序号)
LastByteAcked
LastByteSent
LastByteWritten
显然LastByteAcked <= LastByteSent
LastByteSent <= LastByteWritten
接收方:维护三个指针(序号)
LastByteRead
NextByteExpected
LastByteRcvd
存在关系LastByteRead < NextByteExpected
NextByteExpected <= LastByteRcvd+1
(RefF_p230_TCP接收和发送缓存)
讨论2:流量控制
接收方通知发送方一个不大于它能存放数据量的窗口,控制发送方的发送速度。

接收方避免缓冲区溢出,其TCP必须保持
LastByteRcvd – LastByteRead <= MaxRcvBuffer 通知窗口(缓冲区剩余空间)大小为
AdvertisedWindow = MaxRcvBuffer – [ (NextByteExpected-1) – LastByteRead] 发送方TCP必须保持
LastByteSent – LastByteAcked <= AdvertisedWindow

EffectiveWindow =
AdvertisedWindow – (LastByteSent – LastByteAcked)
发送方避免缓冲区溢出,其TCP必须保持
LastByteWritten – LastByteAcked <= MaxSendBuffer
如果发送进程试图向TCP写入y字节,造成(LastByteWritten – LastByteAcked)+ y >= MaxSendBuffer 则TCP将阻塞发送进程,不让其产生新的数据。

注:发送方周期性地发送探测数据段。

去同步攻击机理:
客户程序通过TCP与服务器进行通信之际,攻击者截获和重新定向客户与服务器之间的数据流,使之经过攻击者的机器,攻击者采用被动攻击,即不修改客户和服务器之间的通信数据而使客户和服务器认为它们在直接进行通信。

由于攻击者可以看到序列号,他可以把伪造的数据包放到TCP 数据流中去,这样攻击者可以以被欺骗客户具有的特权来访
问服务器。

在这种情况下,攻击者甚至不需要目标机器所需的口令,只需简单地等待客户登录到服务器,然后劫持会话数据流即可。

(RefC_p74_TCP会话劫持)
握手1:客户端===============> 服务端
SYN, CLT_SEQ (初始)
客户等待服务器应答。

握手2:客户端<=============== 服务端
ACK= CLT_SEQ+1
SVR_SEQ (初始)
服务器等待客户应答。

握手3:攻击者出现,以客户端身份向服务器发送连接复位包(RST)。

服务器收到该包后,认为握手过程出错而中断与
客户端的连接,并侦听新的连接请求。

客户端由于不知连接已关闭,向服务器发送握手3的应答包,被服务器忽略。

客户状态:认为连接已经建立,自己处于连接状态,认为服务器处于激活状态。

服务器状态:认为客户端出了问题(收到攻击者的RST包),关闭连接,但客户端并没有关闭连接。

攻击者现可以假冒客户端身份进行三次握手过程:
握手1:攻击者(假冒客户端) ===============> 服务端
Attack_SEQ
握手2:真客户端<=============== 服务端
ACK= Attack_SEQ+1
New_SVR_SEQ
由于应答号与真客户等待的不符,ACK被真客户端忽略。

握手3:攻击者(假冒客户端) ===============> 服务端
ACK= New_SVR_SEQ +1
Attack_SEQ=Attack_SEQ +1
至此,服务器和客户端一样也处于连接状态。

但由于客户和服务器之间的序列号无法一致,它们之间不能真正进行通信,各自发往对方的数据包均将被忽略。

攻击过程:
(1)造成去同步状态
去同步状态指双方都处于连接建立状态,但还没有数据要发送,并且
SVR_SEQ != CLT_ACK
CLT _SEQ != SVR _ACK
此时只要没有数据发送就是稳定的。

若有数据要发送,则存在两种情况:
(i)若CLT _SEQ < SVR _ACK + SVR_WIND 以及CLT _SEQ > SVR _ACK
则数据包是可以接收的,但被存储已备后用,这
是因为数据流的开始部分(从序列号SVR _ACK
开始)丢失了。

(ii)若CLT _SEQ > SVR _ACK + SVR_WIND 或
CLT _SEQ < SVR _ACK
包不可接收,被丢弃。

在以上两种情况下,虽然处于连接建立状态,数据交换不可能。

(2)实施攻击
攻击者使连接双方处于一个去同步状态,使它们不可能进行数据交换,然后攻击者可以产生客户和服务器均能接受的包。

攻击者假冒客户向服务器发送包
SEG_SEQ=SVR_ACK=(Attack_SEQ+1)
SEG_ACK= New_SVR_SEQ +1
服务器接受,数据被处理。

攻击者假冒服务器向客户发送包
SEG_SEQ= SVR_SEQ+1
SEG_ACK= 上次的客户发送的CLT_SEQ + 1
客户接受,数据被处理。

注:去同步攻击(TCP会话劫持攻击)假定攻击者能够对网络通信进行侦听,从而确定序列号。

3)IP欺骗攻击(IP Spoofing)
伪造源于一个可信任地址的数据包,以便使一台机器认证另一台机器。

攻击机制:
利用应用程序之间基于IP地址的认证机制,攻击者通过IP地址欺骗获得远程系统的非法授权访问。

设三台主机A、B和攻击者的主机X。

B 授予A某些访问特权,X的目标是获得同A相同的权利。

(RefC_p78_攻击所使用的网络模型)
攻击步骤:
1)X造假A的IP地址,与建立一个虚假连接,使B认为发来的包是由发出的。

2)B对X的应答将发送到A,X必须阻止A向B
报告网络认证系统出现的问题。

A、B之间的通信遵守的TCP/IP的三次握手机制
(RefC_p78_三次握手)
X伪造A的IP地址步骤:
1)X冒充A,X向B发送一个带有随机序列号M
的SYN包。

2)B响应,向A发送一个应答号的SYN+ACK包,并发送自己的序列号N。

3)X为了完成三次机握手,需向B回送一个应答包。

设X与A、B不在一个子网内,则不能检测到B
发往A的包。

这迫使X猜测B的序列号才能建
立TCP连接。

过程如下:
1)X -> B: SYN (序列号=M),SRC IP = A.
2) B -> A: SYN (序列号=N),ACK(应答序列号=M+1).
由于A并没有同B启动连接,则A收到B的应答包
后,会发送RST置位的包给B。

攻击者事先让A无
法对来自B的任何数据包进行应答。

3)X -> B: ACK(应答序列号=N+1), SRC IP = A。


这里,X需要猜测B发给A的包里头的序列号(N+1)。

若猜测成功,将获得赋予信任主机的特权。

序列号猜测:
虽然B关闭了对的连接,但A仍可以响应(应答)B
发出的包。

攻击者可用同步Flood攻击法(下介绍)来阻止A对B的响应,然后开始猜测。

1)X以另一IP同B进行连接。

2)B应答。

3)X记录应答包内的序列号,继续1)进行测试。

随后X对记录进行分析,寻找B的序号产生模式。

一旦猜中,X就可以向主机B发送命令,B将执行认为来自于合法主机A的命令。

4)同步Flood攻击
利用实现三次握手协议所存在的漏洞进行攻击。

X首先发起对A的连接,当A收到X的SYN请求时,它在侦听队列中对X的连接请求保持75秒的跟踪。

由于系统资源有限,能够打开的连接有限,因此X可以同时向A发送多个SYN请求,同时对返回的不作应答,使侦听队列很快被阻塞,从而A拒绝接收其它新的连接请求,直到部分已打开的连接完成或超时。

在此攻击中,使A无法响应来自B的包,作为IP欺骗攻击的辅助手段,趁机猜测的序列号。

(RefC_p79_SYN FLOODING 示意图)。

相关文档
最新文档