汇编网首页登录博客注册
240420643的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态
好友圈
文章收藏

[2010-01-21 10:57] 《网络对抗原理》第八章笔记——网络协议攻协

图片载入中
第三部分 网络攻击
第8章 网络协议攻击
因特网(Internet)依赖于一组成为tcp/ip的协议组。TCP/IP是一组通信协议集的缩写,它包含了一组互补和合作的协议。所有这些协议共同工作以便在因特网上传输信息。所有协议规范均以RFC(request for comment)文档给出。由于规范的不完善和实现上的缺陷使得针对网络协议的攻击成为可能。本章将介绍针对不同层次上典型网络协议的攻击手段。
8.1 TCP/IP协议栈
ISO/OSI模型将网络表示为一个垂直的模块(或分层协议栈)。每层完成特定的功能。TCP/IP协议栈只是许多支持ISO/OSI分层模型的协议栈的一种。TCP/IP通常被认为是以个四层协议系统,如图8-1所示。
 
ISO/OSI参考模型将网络设计划分成七个功能层。但此模型只起到一个指导作用,它本身并并不是一个规范。例如,ICP/IP网络只使用ISO/OSI模型中的五层。图8-2显示了以个简单的五层网络模型,其中每层都采用了TCP/IP协议。网络层和相应的协议形成了以个模型,数据通过此模型在应用程序和网络硬件之间进行传递。
 
图8-2中,有箭头的线表示不同的网络软件和硬件之间可能的通信信道。例如,为了和传输层通信,应用程序必须与用户数据报协议(UDP)或传递控制协议(TCP)模块对话。为了和网络层通信,应用程序必须与互联网控制报文协议(ICMP)或者互联网协议(IP)模块对话。但是,不管数据通过什么路径从应用层到网络层,数据都必须经过IP模块才能到达网络硬件。
在TCP/IP协议体系结构中,每层各自负责不同的网络通信功能。
(一)        链路层:有时也称作数据链路层或网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。它们一起处理与电缆(或其他任何传输媒介)的物理接口细节,以及数据帧(FRAME)的组装。典型的协议包括ARP(地址解析协议)和RARP。
(二)        网络层:有时也称作互联网层,处理分组(PACKEt)在网络中的活动,例如分组的选路。在TCP/IP协议族中,网络层协议包括IP协议(网际协议),ICMP协议(互联网控制报文协议),以及IGMP协议(因特网组管理协议)。
(三)        传输层:主要为两台主机上的应用程序提供端到端的通信。在TCP/IP协议族中,有两个互不相同的传输协议:TCP(传输控制协议)和UDP(用户数据报协议)。TCP为两台主机提供高可靠性的数据通信。它所做的工作包括把应用程序交给它的数据分成合适的小块(段:segment)交给下面的网络层,确认接收到的分组报文,设置发送最后确认分组的超时时钟等。由于传输层提供了高可靠性的端到端的通信,设置发送最后确认分组的超时时钟等。由于传输层提供了高可靠性的端到端的通信,因此应用层可以忽略所有这些细节。而另一方面,UDP则为应用层提供一种非常简单的服务。它只是把称作数据报(datagram)的分组从一台主机发送到另一台主机,但并不保证该数据报到达另一端。任何必要的可靠性必须由应用层自己负责提供。
(四)        应用层:负责处理特定的应用程序细节。几乎各种不同的TCP/IP实现都会提供以下这些通用的应用程序:
1)        telnet远程登录;
2)        FTP文件传输协议;
3)        SMTP简单邮件传输协议;
4)        SNMP简单网络管理协议。
下面将以图8-2的层次依次介绍对各层典型协议的攻击。
8.2 链路层协议攻击
8.2.1 ARP简介
IP包是被封装在以太网帧内的。以太网硬件并不知道有IP地址,也不理解IP地址的格式。以太网有它自己的地址方案,它采用的是6字节48bit的惟一硬件(MAC)地址。以太网数据报头包含源和目的硬件地址。以太网帧通过电缆从源接口送到目标接口,目标接口几乎总是在同一本地网络内,因为路由是在IP层完成的,而不是以太网层。
IP对目标接口的硬件地址一无所知,它只知道分配给接口的IP地址(一个硬件接口可以有多个地址,但是同一网络内的多个接口不能共享同一个IP地址)。实现IP地址和硬件地址之间的转换包括ARP协议和与之对应的RARP协议。
为了提高效率,ARP使用了告诉缓存技术(Cache),即在主机中保留一个专用的内存区,存储最近获得的IP/MAC地址对。在发送报文之前,为了获得目标IP地址对应MAC地址,会首先在告诉缓存中查找相应的MAC地址,如果找不到,则发送一个目的MAC地址为FF:FF:FF:FF:FF:FF(即广播地址)的ARP请求数据包,请求地址解析,如图8-3所示。主机A要向主机B建立通信连接,当主机A的ARP缓存中没有主机B的IP—MAC映射记录时,主机A在网络中广播ARP请求数据包。该数据包被本地网段的所有主机(主机B、C、D)接收,这些主机将主机A的IP地址(10.10.10.1)和对应的MAC地址(aa.bb.cc.dd.ee.aa)保存在各自的ARP缓存中;同时主机B发现该数据包中的目的IP地址(10.10.10.2)与自身IP地址一致,对该数据包响应,如图8-4所示;其他主机(C、D)不响应。主机A接收到ARP响应后获得主机B的IP-MAC映射,刷新ARP缓存。
 
 
8.2.2 ARP欺骗
前面提到,网段上的主机接收到ARP请求包后,将请求包中的源IP和源MAC取出并刷新Cache;同时接收到ARP响应时,也会刷新Cache.但ARP本身是无类协议,本身不携带任何状态信息。当主机收到ARP数据包时,不会进行任何的认证就刷新Cache。利用这一点可以实现ARP欺骗,造成ARP缓存中毒(Cache poisoning)。
所谓的ARP缓存中毒就是用错误的IP-MAC映射刷新主机的ARP缓存。有两种攻击方式:
1)        当目标发送ARP响应时,会完全相信ARP响应来自于正确的设备。这样,当目标A(如图8-3、8-4)发送ARP请求以获得主机B的MAC地址时,在B响应前,主机C以某个IP-MAC映射对作出响应,则主机A的缓存设置了错误的MAC地址。从而实现ARP欺骗。利用这种方式的ARP欺骗可实现中间人攻击(MAN IN THE middle),如图8-5所示。
在图中,攻击者接入本地网络,分别向主机A和B发送适当伪造的ARP响应包,使A、B之间的通信都经过攻击者,同时,攻击者建立转发规则,实现A与B之间的数据通信。通过ARPTOOL可以实现这类入侵方式,对应图8-5,依次执行如下命令:
 
 
采用这种攻击方式,可以监听、修改、切断、劫持主机A、B之间的通信。
需要注意的是,ARP缓存有一定的有效期。针对这一点,可以编写简单的软件,给目标机器一直发送ARP响应,保证目标机器的ARP缓存有效。某些ARP实现会试着给缓存中的各个映射发送请求。这将给攻击者带来一定的麻烦,因为真正的IP地址会对请求做出响应。不过ARP系统的无状态本性再次帮了黑客的忙,也就是在请求被发送之前,黑客先对请求做出响应从而防止请求被发送。
2)        发送ARP请求,源IP地址为目标的IP地址,二源MAC地址填充目标MAC地址以外的其他MAC地址。这种方式将刷新所有网段内主机的Cache,同时,目标主机将弹出如下对话框如图8-6所示。因为目标发现网段内存在一IP地址与本机IP地址相同的主机。
 
利用前面介绍的ARP欺骗还可以演变很多种攻击方式,如拒绝服务攻击等。
虽然,ARP攻击被说得很神奇,但是仔细想一下,就可以知道ARP攻击只能用于本地网络的假冒。这意味着黑客必须已经获得网络中某台机器的访问权。另外,ARP请求从来不会被送到路由器以外。因此,被假冒的机器必须同黑客所控制的机器位于同一网段内,也就是通过集线器或者令牌环网络连接。
针对ARP重定向攻击的最好方法是利用硬件和入侵检测系统,使用交换机而不是集线器。很多交换机可以被配置成硬件地址同特定端口关联,而入侵检测系统可以识别LAN中的IP攻击。
8.3 网络层协议攻击
8.3.1 简介
网际协议IP是TCP/IP的核心,也是网络层中最重要的协议。IP层接收更低层(网络接口层,例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层——TCP或UDP层;相反,IP层也把从TCP或UDP层接收来的数据包传送到更低层。IP协议时不可靠的协议,因为IP并没有做任何事情来确认数据包时按顺序发送的或者是没有破坏的。IP数据包中含有发送它的主机的IP地址(源地址)和接收它的主机的IP地址(目的地址)。
ICMP与IP位于同一层,它通常被认为是IP层的一个组成部分。它传递差错报文以及其他需要注意的控制信息。ICMP数据包是封装在IP数据包的数据部分中进行传输的。有关ICMP的协议格式及数据包类型可参考RFC792。
在网络层实施网络攻击造成的主要后果是拒绝服务(DOS),此外就是IP欺骗。下面介绍几种典型的网络层攻击方式。
8.3.2 网络层协议攻击
1)        Smurf攻击
Smurf攻击时以最初发动这种攻击的程序名Smurf来命名的。这种攻击方法结合IP地址欺骗和ICMP恢复方法使大量网络通信充斥目标系统,引起目标系统拒绝为正常系统提供服务。
当路由器收到一个发送给IP广播地址(如206.121.73.255)的分组后,把以太网广播地址FF:FF:FF:FF:FF:FF映射过来。这样路由器从因特网上接收到该分组,会对本地网段中的所有主机进行广播,本地网段接收到广播分组后就对该分组响应。基于此可以通过如图8-7过程实施攻击。
 
攻击者向一个具有大量主机和因特网连接的网络的广播地址发送一个欺骗性PING分组(ECHO请求,类型8,代码0),这个目标网络被称为反弹站点,而欺骗性ping分组的源地址就是attacker希望攻击的目标系统。
由于多数系统都会尽快地处理ICMP传输信息,攻击者把分组的源地址设置为目标系统,因此目标系统很快就会被大量的ECHO信息吞没,这样轻而易举地就能够阻止该系统处理其他任何网络传输,从而拒绝为正常系统服务。
这种攻击不仅影响目标系统,还影响目标系统所在的因特网连接。如果反弹站点具有T3连接(45MB/S),而目标系统所在的公司使用的是租用线路(56KB/S),则所有进出该公司的通信都会停下来。
Smurf攻击的核心C代码如下:
Void smurf(int sock,struct sockaddr_in sin,u_long dest,int psize)
{
  Struct iphdr *ip;
  Struct icmphdr *icmp;
  Char *packet;
  
  Packet=malloc(sizeof(struct iphdr)+sizeof(struct icmphdr)+psize);
  Ip=(struct iphdr *)packet;
  Icmp=(struct icmphdr *)(packet+sizeof(struct iphdr));

  Memset(packet,0,sizeof(struct iphdr)+sizeof(struct icmphdr)+psize);
  

  Ip->tot_len=htons(sizeof(struct iphdr)+sizeof(struct icmphdr)+psize);
  Ip->ihl=5;
  Ip->version=4;
  Ip->ttl=255;
  Ip->tos=0;
  Ip->protocol=IPPROTO_ICMP;
  Ip->frag_off=0;
  Ip->saddr=dest;
  Ip->check=in_chksum((u_short *)ip,sizeof(struct iphdr));
  Icmp->type=8;
  Icmp->code=0;
  Icmp->checksum=in_chksum((u_short *)icmp,sizeof(struct icmphdr)+psize);
  Sendto(sock,packet,sizeof(struct iphdr)+sizeof(struct icmphdr)+psize,0,(struct sockaddr *)&sin,sizeof(struct sockaddr));
  Free(packet);
}
由以上代码可以看出,Smurf攻击实现非常简单。
在SMURF攻击中还利用了ip欺骗的技术。所谓欺骗(Spoofing),也就是造一个假的原IP地址的数据包,当另外的主机接收到这个包,会以为包是来自假冒的发送者,这个过程成为欺骗目标机器。
2)        IP碎片攻击
链路层具有最大传输单元MTU这个特性,它限制了数据帧的最大长度,不同的网络类型都有一个上限值。以太网的MTU是1500,可以用netstat –i
命令查看MTU。如果IP层有数据包要传,而且数据包的长度超过了MTU,那么IP层就要对数据包进行分片(Fragmentation)操作,使每一片的长度都小于或等于MTU。假设要传输一个UDP数据包,以太网的MTU为1500字节,一般IP首部为20字节,UDP首部为8字节,数据的净荷(PAYLOAD)部分预留是1500-20-8=1472字节。如果数据部分大于1472字节,就会出现分片现象。IP首部包含了分片和重组所需的信息。
每一IP分片都各自路由,到达目的主机后在IP层根据首部中的信息完成数据重组。但是在协议实现过程中,对特定分片的重组会造成错误。利用这些错误可实现网络攻击。
首先介绍的碎片攻击方式为ping of death。在IP首部中有两个字节表示整个IP数据包的长度,所以IP数据包最长只能为0XFFFF,即65536字节。攻击者发送一个长度超过65535字节的Eecho Request数据包,目标主机在重组分片的时候会造成实现分配的65535字节缓存区一处,系统通常会崩溃或挂起。
接下来介绍另一种碎片攻击方式:泪滴(Teardrop)攻击。首先从ip协议实现上来分析这种漏洞。
在Linux系统中,对IP分片重新组装时通过一个循环来吧有序的分片的有效数据部分拷贝到新分配的buffer中(Linux系统源代码ip _fragment.c 第376行):
fp=qp->fragments;
While(fp!=null)
{
  If(count+fp->len>skb->len)
  {
    Error_to_big;
}
Memcpy((ptr+fp->offset),fp->ptr,fp->len);
Count+=fp->len;
Fp=fp->next;
}
从上面可以看出,该程序检查了每段数据是否过长,因为如果数据部分过长,将会向内核拷贝过多的数据,引起内核发生某种危险。然而在程序中并没有检查包中有效数据长度是够过分小,例如,当表示包中数据长度的标量变成了以个负数时(例如fp->len<0),对这种情况,并没有进行检查,结果是系统将过多的数据拷贝到内核中去了。
接下来看Linux是如何将收到的IP数据加入到组装队列中去的。首先计算该fragmentat的末尾位置(Linux系统源代码ip_fragment.c 第502行):
End=offset+ntohs(iph->tot-len)-ihl;
在正常情况下一切正常。但是,当我们精心准备这样的数据包,让前后分片包并非首尾相连,二是存在重叠现象。这时程序采用如下方式处理(ip_fragment.c 第531行):
If(prev!=NULL&&offset)
{
  I=prev->end-offset;
  Offset+=I;
  Ptr+=I;
}
如果我们发现当钱包的段偏移在前一包数据内部,也就是说根据偏移字段的值, 两数据包的数据部分有重叠。组装程序试图正确对其它们的边界,程序代码如上所示。但是当当前分片包中的有效数据没有足够长度的数据来满足对齐的要求时,则经过上述代码处理后,“offset”域中的值就会比“end”域中的值大。当两个数值被交给“ip_frag_create()”模块计算当钱包的长度时,计算出来的fp-len竟变成了以个负数:
Fp->offset=offset;
Fp->end=end;
Fp->len=end-offset;
这样,memcpy()最终将会把大量的数据拷贝到内核中,因为memcpy()中的计数器是以个反码,是以个非常大的数值。根据使用的内存管理机制的不同,将会引起系统重启或停机。
这种情况可以通过编程来实现,例如可以发送两个特殊的数据包,第一个包中的“offset”域置为0,数据包中有效数据(IP数据)长度为N,MF位置为1,第二个包中MF位置为0,“offset”为一个小于N的数,设为M,包中的IP数据为K。
当将收到的两个数据包组装时,先将第一个数据包拷贝到一个缓冲区中区,然后拷贝第二个数据包。这时存在重叠(OFFSET<N),首先对齐:
重叠量=第一个分片包的末尾-第二个分片包的偏移
对齐后第二个分片包的偏移=对其前第二个分片包的偏移+重叠量=M+(N-M)=N
第二个分片包的末尾=对其前第二个分片包的偏移+(ip数据包总长-ip首部长度)=M+K
待拷贝第二个分片包的长度=第二个分片包的末尾-对齐后第二个分片包的偏移=M+K-N
当K<N-M时,错误就发生了。此时,待拷贝第二个分片包的长度为负数。该过程可用如下两图表述:图8-8为正常情况,图8-9为发生错误的情况。
 
需要说明的是泪滴攻击针对的应当说不是IP协议本身的问题,而是协议实现的漏洞。
3.ICMP路由欺骗
微软的windows 98和windows NT系统都保持着一张已知的路由器列表,列表中位于第一项的路由器是默认路由器,如果默认路由器关闭,则位于第二项的路由器成为缺省路由器。
缺省路由可通过ICMP重定向来向发送者报告另一条到特定主机的更短路由。除了路由器,主机必须服从ICMP重定向。攻击者可以利用ICMP重定向报文破坏路由,并以此增强其窃听能力。如果一台机器向网络中的另一台机器发送了一个ICMP重定向消息,就可能引起其他机器具有一张无效的路由表。如果一台机器伪装成路由器截获所有到某些目标网络或全部目标网络的IP数据包,这样就形成了窃听。
通过ICMP重定向技术还可实现对防火墙后的机器进行攻击和窃听。在一些网络协议中,IP源路径选项允许IP数据报告自己选择一条通往目的主机的路径。攻击者试图与防火墙后面的一个不可到达的主机A连接,只需在送出的ICMP报文中设置ip源路径选项,使报文有一个目的地址指向防火墙,而最终地址是主机A。当报文到达防火墙时背允许通过,因为它指向防火墙而不是主机A。防火墙的IP层处理该报文的源路径域并被发送到内部网上,报文就这样到达了不可到达的主机A了。
8.4 传输层协议攻击
8.4.1 简介
传输层提供了两种类型的服务:TCP协议和UDP协议。如果IP数据包中有意境封号的TCP数据包,那么IP将把它们向“上”传送到TCP层。TCP将包排序并进行错误检查,同时实现虚电路间的连接。TCP数据包中包含序列号和应答,所以未按照顺序收到的包可以被排序,而损坏的包可以被重传。如果IP数据包中封装的是UDP数据包,则IP将其向“上”传送到UDP层。UDP是以个简单的协议,提供给应用程序的服务时一种不可靠的、无连接的分组传输服务。
8.4.2 传输层协议攻击
(一)        SYN Flood攻击
SYN Flood是当前最流行的DOS攻击与DDOS(分布式拒绝服务)攻击的方式之一,这是一种利用TCP协议缺陷的方法。它通过发送大量伪造的TCP连接请求,从而使得被攻击方资源耗尽(CPU满负荷或内存不足)的攻击方式。
当采用TCP协议传输数据时,在数据传输前,需先建立连接,这是通过所谓的TCP三次握手过来来完成的:
第一步,请求端(客户端)发送一个初始序号ISN(C)的SYN报文;
第二步,服务器在收到客户端的SYN报文后,将给客户端发送自己的初始序列号ISN(S),同时将ISN(C)+1作为确认的SYN+ACK报文。
第三步,客户端对SYN+ACK报文确认,同时ISN(S)+1,ISN(C)+1到此一个TCP连接完成。
一次正常的三次握手过程可用图8-10来描述。
 
在TCP连接的三次握手中,假设一个用户向服务器发送了SYN报文后突然死机或掉线,那么服务器在发出SYN+ACK应答报文后是无法收到客户端的ACK报文的(第三次握手无法完成),这种情况下服务器端一般会重试(再次发送SYN+ACK给客户端)并等待一段时间后丢弃这个未完成的连接,这段时间的长度我们称为SYN Timeout,一般来说这个时间是分众的数量级(大约为0.5-2min);一个用户出现异常导致服务器的一个线程等待1分钟并不是什么很大的问题,但如果有一个恶意的攻击者大量模拟这种情况,服务器端将为了维护一个非常大的半连接列表而消耗非常多的资源。最后的结果往往是堆栈溢出崩溃。即使服务器端的系统足够强大,服务器端也将忙于处理攻击者伪造的TCP连接请求而无暇理睬客户的正常请求(毕竟客户端的正常请求比率非常之小),此时从正常客户的角度看来,服务器失去响应。这就是所谓的SYN Flood攻击。
2.LAN攻击
LAND攻击时最简单的一种TCP攻击方法:把TCP包的源地址和目的地址,源端口和目的端口都设置成相同即可。其中地址字段设置为目标机器的IP地址,需要注意的是对应的端口所提供的服务器必须是激活的。LAND攻击可以非常有效地使目标机器重新启动或者死机。
前面提到,TCP连接的可靠性是通过三次握手实现初始化连接和应答每个接受到的数据包(如果在规定时间内应答没有被接收到,包被重传)来实现的。
LAND攻击利用TCP初始连接建立期间的应答方式存在的问题,攻击的关键在于服务器端和客户端有各自的序列号如图8-10所示。当目标机器吧包发送给了自己(源和目的地址IP地址是相同的),目标机器等待自己的序列号得到应答,二这个应答却是它自己刚刚才发送出去的,而且其应答序列号是攻击者的序列号(1002)。由于这个序列号同目标机器所期望的序列号差别太大(不再接受窗口范围内),TCP认为这个包有问题,被丢弃。这样目标机器再次重发数据包。这对于TCP来说,意味着“那不是我所期望的包,请重传”。这将导致无限循环:目标机器一直给自己发送错误应答,并希望能够看到具有正确序列号的应答返回。图8-11形象地描绘了此情景。
 
由于TCP具有高优先权的内核级进程,这也意味着TCP相对其它非内核应用程序有更高的权限。基本上,它将中断其它的正常系统操作以声明更多的内核资源来处理进入的数据。这样,无限循环很快会消耗完系统资源,引起大多数系统死机。只有少数系统在内核资源耗尽情况下还可以继续稳定运行。
3.序列号猜测
 在很多攻击方式中,攻击者要冒充为另一个主机与服务器进行TCP通信。这时攻击者X首先以第三方T的身份向服务器S发起连接,即以T作为源地址发送一个ISN(X)的SYN数据包:
 
服务器接收到请求后,给T响应SYN+ACK请求:
 
数据虽然没有发送到X,但X可以通过数据包截获等方式得到其内容;但X要想继续以T的身份向S发送数据,就必须得到初始序列号ISN(S),然后对S的SYN+ACK数据包作出响应,再发送数据:
 
因此,这一类的攻击中,攻击者需要预测服务器的初始序列号ISN。初始序列号是以个随机数,但是在Berkeley系统中,ISN变量每秒钟增加的量为一个常数,每一次初始化连接后ISN增加的量为该常数的一半。为了预测ISN,可以先向服务器请求合法的连接来获得当前服务器使用的ISN,这样就可计算出下一连接请求将使用的ISN。
需要注意的是,在上面描述的连接过程中,主机T将收到数据包:
 
由于T没有发送连接请求,从而会发送RST数据包终止连接。为了防止这种情况的发生,可以通过洪水攻击的方法把T淹没,以达到冒充的目的。
4.TCP会话劫持
前面介绍的序列号猜测是TCP主动攻击的前奏。下面将详细介绍一种主动攻击的方法:TCP会话劫持。攻击者重定向客户和服务器之间的数据流,使之经过攻击者的机器,就可以截获到他们之间的通信。在攻击过程中,可以采取被动攻击以免引起注意,即客户的所有命令保持原样被发送到服务器,服务器的响应也不加修改地发送给客户。对于客户和服务器来说,它们都认为是在直接进行通信。由于攻击者可以看到序列号,有必要的话,它可以把伪造的数据包放到TCP流中。这将允许攻击者以北欺骗的客户具有的特权来访问服务器。攻击者同样也可以查看所有同攻击相关的输出而且不把它们送往客户机,这样的攻击时透明的。在这种情况下,攻击者甚至于不需要知道访问机器所需的口令。攻击者只需简单地等待用户登录到服务器,然后劫持(Hijack)会话数据流即可。图8-12显示了攻击者是如何劫持一个TCP会话的。
 
可以看出,TCP会话劫持能成功的前提首先是TCP建立连接的三次握手过程中没有任何的认证机制。TCP假定只要接收到的数据包包含正确的序列号就认为数据时可以接受的。一旦连接建立,服务器将无法确定进入的数据包是确实来自真正的客户机而不是某一台假冒的机器;当然,攻击要成功还需要能准确地获得服务器的ISN。
为了更好地描述这种攻击的原理和方法,首先定义如下表8-1的术语:
 
在数据交换前和连接处于稳定状态(双方没有数据要发送)时,有等式:
 
当有数据要发送时,等式不再成立。一般情况下,有不等式:
 
如果用上表中的术语来描述正常的TCP三次握手的话,有如下过程:
1)        客户端发起连接请求:SEG_SEQ=CLT_SEQ_0,SEG_FLAG=SYN。此时为SYN发送状态。
2)        服务器响应请求:SEG_SEQ=SVR_SEQ_0,SEQ_ACK=CLT_SEQ_0+1,SEG_FLAG=SYN,SVR_ACK=CLT_SEQ_0+1。SYN接收状态。
3)        客户端确认:SEG_SEQ=CLT_SEQ_0+1,SEQ_ACK=SVR_SEQ_0+1,CLT_ACK=SVR_SEQ_0+1。连接建立。
在连接已建立的状态,当一个数据包的序列号落在区间:[SVR_ACK,SVR_ACK+SVR_WIND](服务器端)或[CLT_ACK,CLT_ACK+CLT_WIND](客户端)时,将被接收,否则丢弃并发送确认。
在三次握手过程中,有一种状态,我们称“去同步状态”。所谓的“去同步状态”指的是通信双方均处于连接已建立状态,没有数据要发送(稳定状态),同时有:
SVR_SEQ!=CLT_ACK
CLT_SEQ!=SVR_ACK
这状态只要没有数据发送就是稳定的。如果有数据要发送,可能有两重情况:
1)        如果CLT_SEQ<SVR_ACK+SVR_WIND且CLT_SEQ>SVR_ACK,则包是可接收的,数据也将被存储以备后用(依赖于实现)但不发送给用户,因为数据流的开始部分(从序列号SVR_ACK开始)丢失了
2)        如果CLT_SEQ>SVR_ACK+SVR_WIND或CLT_SEQ<SVR_ACL,包是不可接受的而被丢弃。
在这两种情况下即使还处于连接建立状态也不可能进行数据交换。
有了以上的概念,就可以介绍与此有关的攻击。在攻击前,要TCP连接双方建立一个去同步状态,这样它们就不可能再交换数据。然后攻击者可以产生和服务器双方都可以接受的包。
假定TCP会话是处于去同步状态,客户所发送包的序列号是:
 
由于CLT_SEQ!=SVR_ACK,数据将不被接受而被丢弃。攻击者然后发送同样的包,但改变SEG_SEQ和SEG_ACK的值(校验和也要作相应的计算)是
SEG_SEQ=SVR_ACK(Attack_SEQ+1);
SEG_ACK=New_SVR_SEQ+1;
它就被服务器所接受,数据被处理。当服务器进行响应时,客户端将忽略应答包,因为客户期望的应答序列号是SVR_SEQ+1,而实际返回的是NEW_SVR_SEQ+1。同样攻击者可以在包被送往客户之前进行修改,以便客户能够接受我们的包。
不过需要注意的是,客户端和服务器并非对包含不正确序列号的数据包都采取忽略不计的方法,相反,会对这些数据包进行应答,并要求重发。由于客户和服务器之间处于去同步状态,相互之间的序列号差别太大,各自的应答都不是对方期望的,因此有可能产生大量的要求对方重发的TCP ACK(应答)包,形成TCP ACK风暴。不过幸运的是,攻击者可以伪造这些应答包,从而结束TCP ACK风暴。
TCP会话劫持攻击假定攻击者可以对网络通信进行窃听,从而确定序列号。在下面即将描述的另外一种攻击中,我们将看到,即使无法对网络通信进行窃听,也可能对目标主机进行攻击。例如,攻击者可以假冒一台“信任主机”,而且在看不到服务器应答包的情况下建立连接。这是通过猜测服务器的序列号来完成的。一旦连接建立,攻击者可以执行命令,从而打造更加灵活的安全漏洞。
5.FRAGGLE拒绝服务攻击
FRAGGLE拒绝服务攻击时一种类似Smurf的攻击方式。只是此时FRAGGLE拒绝服务攻击发送的数据包是UDP数据包。
8.5 应用层协议攻击
基于TCP/IP协议模型的应用层提供了各种各样的服务,在这里,我们只简单介绍域名系统(DNS)以及针对DNS的攻击技术。
8.5.1 简洁
我们知道互联网是基于TCP/IP协议的,要进行通信必须获得对方的IP地址,这是通过DNS服务器来实现的。域名系统(DNS)是一种用于TCP/IP应用程序的分布式数据库,它提供主机名字和IP地址之间的转换及有关电子邮件的选路信息。
DNS定义了一个用于查询和响应的报文格式。图8-13显示了这个报文的总体格式。
 
有两种类型DNS查询:A类型和PTR类型。A类型查询表示希望获得被查询域名的IP地址;PTR查询(也称为指针查询)则请求获得一个IP地址对应的域名。
8.5.2 DNS攻击
1.DNS欺骗
在DNS的缓存还没有过期之前,如果在DNS的缓存中已经存在记录,一旦有客户查询,DNS服务器将会直接返回缓存中的记录。
下面我们来看一个例子,如图8-14所示。
 
一台运行着UNIX的Internet主机,并且提供rlogin服务,它的IP地址为123.45.67.89,它使用的DNS服务器(即/etc/resolv.conf)的IP地址为98.76.54.32,某个客户端(IP地址为38.222.74.2)试图连接到UNIX主机的rlogin端口,假设Unix主机的/etc/hosts.equiv文件中使用的是DNS名称来允许目标主机的访问,那么UNIX主机会向IP为98.76.54.32的DNS服务器发出一个PTR记录的查询(获得一个IP地址对应的域名):
 
IP为98.76.54.32的DNS服务器中没有这个反向查询域的信息,经过一番查询,这个DNS服务器找到38.222.74.2和38.222.74.10为74.222.38.in_addr.arpa的权威DNS服务器,所以它会向38.222.74.2发出PTR查询:
 
请注意,38.222.74.2是我们的客户端IP,也就是说这台机子是完全掌握在我们手中的。我们可以更改它的DNS记录,让它返回我们所需要的结果:
 
当98.76.54.32的DNS服务器收到这个应答后,会把结果转发给123.45.67.98,就是那台有rlogin服务的Unix主机(也就是我们的目标),并且98.76.54.32这台DNS服务器会把这次的查询结果缓存起来。
这时Unix主机就认为IP地址为38.222.74.2的主机名为trusted.host.com,然后Unix主机查询本地的/etc/hosts.equiv文件,看这台主机是否被允许使用rlogin服务,很显然,我们的欺骗目的达到了。
在Unix的环境中,有另外一种技术来防止这种欺骗的发生,就是查询PTR记录后,也查询PTR返回的A记录,然后比较两个IP地址是否相同:
 
很不幸,在98.76.54.32的DNS服务器不会去查询这个记录,而会直接返回在查询2.74.222.38.in-addr.arpa时得到的并且存在缓存中的信息:
 
那么现在Unix主机就认为38.222.74.2就是真正的trusted.host.com了,我们的目的也就达到了。
这种IP欺骗的条件是:你必须有一台Internet上的授权的DNS服务器,并且你能控制这台服务器,至少要能修改这台服务器DNS记录,我们的欺骗才能进行。
2.拒绝服务攻击
还是上面的例子,如果我们更改位于38.222.74.2的记录,然后对位于98.76.54.32的DNS服务器发出2.74.222.38.in-addr.arpa的查询,并使得查询结果如下:
 
因为74.222.38.in-addr.arpa完全由我们控制,所以我们能很方便地修改这些信息来实现我们的目的。
这样一来,使用98.76.54.32这台DNS服务器的用户就不能访问www.company.com站点了,因为这个IP根本就不存在。
3.偷取服务
还是上面的例子,只是更改的查询结果如下:
 
这样一来,一个本想访问http://www.competitor.com的用户会被带到另外一个地方,甚至是敌对的公司的主页,并且发给company.com的邮件会被发送给mail.competitor.com。
评论次数(0)  |  浏览次数(1076)  |  类型(网络对抗原理笔记) |  收藏此文  | 
 
 请输入验证码  (提示:点击验证码输入框,以获取验证码