针对TCP协议的攻击与检测、预防方法

Land 攻击

通过发送源地址和目的地址相同,源端口和目的端口相同的ICMP echo 报文或TCP syn 请求报文,可以导致主机不断地向自己发送报文,最终导致系统崩溃。只要检查报文的源地址和目的地址是否相等、源端口和目的端口是否相等,就可以判断出是否为Land攻击。

Syn Flooding

利用TCP协议三次握手机制而发动的攻击。当Server(B)收到Client(A)syn请求报文时,将发送一个(ack,syn)应答报文,同时创建一个控制结构,将其加入到一个队列中,等待对方的ack报文。接收到ack报文后,双方都进入连接状态,就可以发送数据。如果Server在一段时间内没有收到应答信息,则控制块将被释放。在TCP协议软件中,通常对每个端口等待建立连接的数目(Backlog)有一定限制(Windows NT4.0 : 6 , Solaris : 32) ,当队列长度到达设定的阈值时,将丢弃后面到达的TCP Syn请求报文。如果攻击者不断发送大量的TCP syn报文,其他用户就无法再连接到被攻击主机。增加Backlog数目、减少连接等待时间等措施都无法阻止此种攻击。虽然连接代理技术可以保护网络内部主机不受攻击,但连接代理无法阻止本身受到Syn Flooding 攻击,而且由于所有的数据都要经过连接代理处理,总的网络延迟将会增加。实时地监测TCP连接请求,过滤TCP Syn Flooding攻击报文,是阻止此攻击的较为有效的方法。本文给出的TCP Syn Flooding检测算法(算法1),运行入侵检测系统上,可以检测多种类型的Syn Flooding 攻击,包括固定的源IP地址,随机变化的源地址等。

算法1 TCP Syn Flooding 检测算法

time window:时间窗口                     packet set :syn ,syn &ack ,ack 报文集合

source ip :报文源IP 地址

destination ip :报文目的IP 地址

syn flood threshold :判断syn flood 攻击的阈值

current time :当前系统时间

sys number = 0 ;

ack number = 0 ;

ack Syn number = 0 ;

for (packetx packet set) {

if (packetx. time2current time > = time window) {

Delete packetx from packet set ;

Continue ;

}

      if (packetx. syn == 1)AND(packetx. ack == 0)

 syn number ++ ;

else if (packetx. syn == 0)AND(packetx. ack == 1)

ack number ++ ;

else

ack syn number ++ ;

 }

if ( (syn number >= syn flood threshold) AND( ( syn number > = 3 3

ack number)OR(syn number > = 3 3 syn ack number) ) )

syn flood attack = TURE;

else

syn flood attack = FALSE;

end

TCP 会话劫持

利用TCP 会话劫持,攻击者可以方便地修改、伪造数据。

它的基本原理如下:

TCP 通过三次握手建立连接以后,主要采用滑动窗口机制来验证对方发送的数据。如果对方发送的数据不在自己的接收窗口内,则丢弃此数据,这种发送序号不在对方接收窗口的状态称为非同步状态。当通信双方进入非同步状态后,攻击者可以伪造发送序号在有效接收窗口内的报文,也可以截获报文,篡改内容后,再修改发送序号,而接收方会认为数据是有效数据。TCP 劫持的关键在于使通信双方进入非同步状态。有多种方法可以达到此目的。如图2 所示,在主机A 发送syn 请求后,B 发送ack & syn 进行应答,A 认为连接已经建立。此时,攻击者伪装成A B发送一个rst 报文,B 释放连接,攻击者继续伪装成A 用自己的初始序列号和B 建立新的连接,A B 对此毫不觉察。当攻击者伪装成A B 建立连接后,A B 就已经进入了非同步状态。利用Telnet 协议的NOP 命令也可以使通信双方进入非同步状态。主机B 接收到NOP 命令后,并不进行任何操作,但确认序列号将会加1。如果攻击者伪装成A B 发送大量的NOP 命令,则会造成A B 的非同步状态。

检测TCP 劫持的关键在于检测非同步状态。如果不断收到在接收窗口之外的数据或确认报文,则可以确定遭到TCP 劫持攻击。

TCP 伪装

利用TCP 劫持进行攻击时,攻击者必须能监测到双方的通信报文,才能得到双方的发送序号,但进行TCP 伪装攻击时,攻击者不需要监测到双方的通信报文,就可以发动攻击,攻击者首先用真实的地址访问V 提供的服务如WWW,获得V 的当前TCP 初始序列号,然后伪装成C 尝试建立到主机V Telent 端口的连接(攻击者要确保C 关机或被攻击,无法响应外部报文) 。连接建立以后,攻击者就可以向V 发送一系列命令。此种攻击可以绕过防火墙或主机对IP 地址的检查。

由于攻击者收不到来自V 的任何信息,要成功进行攻击,必须满足两个条件:

1) 建立连接时,攻击者需要知道V 的当前初始序列号;

2) 发送命令时,攻击者需要知道V 的响应报文的数据长度。

条件2) 可轻易满足。攻击者只要在能合法访问的主机上进行测试,就可以知道响应信息的内容和长度。TCP 协议规定所有TCP 连接使用同一个初始序列号计数器,4us 1。当发送一个TCP 连接请求时,使用计数器的当前值。由于初始序列号计数器随时间线性增加,因此,可以按照下式计算序列号的值:Seq(t) = Seq(t0) + (t - t0) 3 r其中,t 为当前时间,t0 为过去某一时间,r为序列号按时间增加的速率。由于很容易能得到t0 ,Seq(t0) ,攻击者只需要测量攻击主机和V 之间的网络传输时延就可以成功地进行攻击。虽然网络的延迟总是在随机变化,但在短时间内,仍然是相对稳定的。攻击者经过测量延迟的平均值,就可以估计出V使用的初始序列号。减小计数器的时间间隔,可以增加攻击的难度,但无法从根本上阻止此类攻击。如果初始序列号使用随机值,或在初始序列号中加入秘密信息, 比如IP 地址的HASH 值等,就可以防止此种攻击。文献[8 讨论了预防TCP 序列号猜测的方法。在应用层使用认证的办法,也可以防止TCP 伪装攻击。检测TCP 伪装只能在进行连接时进行,当连接成功后,就无法再进行检测。当攻击者进行TCP 伪装攻击时,首先需要探测TCP 初始序列号的生成机制、测试网络延迟,然后再尝试建立连接。如果收到多个含有错误的确认序列号的ack 报文,则可以断定受到了TCP 伪装攻击。

你可能感兴趣的:(Network,Security)