第五章 攻击-直捣龙门(上)yeti_第1页
第五章 攻击-直捣龙门(上)yeti_第2页
第五章 攻击-直捣龙门(上)yeti_第3页
第五章 攻击-直捣龙门(上)yeti_第4页
第五章 攻击-直捣龙门(上)yeti_第5页
已阅读5页,还剩124页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第五章攻击——直捣龙门(上)5.1简介5.2一般的攻击方法本章重点和复习要点本章重点和复习要点描述PingofDeath攻击的实现原理?描述TearDrop攻击的实现原理?描述SYNFlood攻击的实现原理?如何防范?描述LandAttack攻击的实现原理?描述SmurfAttack攻击的实现原理?什么是DDoS攻击,画出相应的攻击模型?详细描述反射式DDoS攻击的攻击原理。网络蠕虫型DDoS攻击的入侵机制是什么?反弹端口型DDoS攻击的入侵机制是什么?返回首页本章重点和复习要点基于IP地址的认证(即基于信任的认证)与基于口令的认证有什么不同?详细描述IP欺骗攻击的详细实现过程?如果黑客已经控制了本地的DNS服务器,如何伪造DNS应答信息?如果黑客没有办法可以控制本地的DNS服务器,那应该如何通过伪造DNS应答信息实现DNS欺骗?什么是会话劫持?它大体上分为哪两类?有什么不同?中间人攻击类型的会话劫持一般使用哪些欺骗技术实现?本章重点和复习要点什么是缓冲区溢出?缓冲区溢出如何进行分类?对一个程序设置SUID位的含义是什么?为什么我们一般会寻找如下一个程序的漏洞进行缓冲区溢出攻击:具有root执行权限且设置了SUID位?简单说明在什么情况下就能实现堆/BSS缓冲区溢出攻击的?如何实现的?分别利用类printf函数的哪几个特性就能实现格式化串溢出攻击?针对缓冲区溢出攻击有哪些对策?5.1简介

从黑客攻击的目的来看,无非两种:一种是给目标以致命打击,虽然黑客自己不一定能得到直接利益,但能让目标系统受损,甚至瘫痪。另一种攻击,其目的在于获取直接的利益,比如截取到目标系统的机密信息,或者得到目标系统的最高控制权。在此过程中,黑客无意对目标系统的正常工作能力进行破坏,他可能更希望非常隐蔽地实现自己的目的。返回首页5.2一般的攻击方法

5.2.1拒绝服务攻击只要网络系统或应用程序还存在漏洞,只要网络协议的实现还存在隐患,甚至只要提供服务的系统仍然具有网络开放的特性,拒绝服务攻击就会存在。拒绝服务攻击并非某一种具体的攻击方式,而是攻击所表现出来的结果。黑客可以采用种种手段,最终使得目标系统因遭受某种程度的破坏而不能继续提供正常的服务,甚至导致物理上的瘫痪或崩溃。具体的操作方法可以是多种多样,但其最终目的就是导致目标系统无法正常的运行或处理正常的服务请求。返回首页1.PingOfDeath(死亡之Ping)

一个完整的IP数据包最大为65535Byte,ICMP(Ping使用的协议)作为内嵌于IP中的协议,其所允许的最大数据量应该是65535-20-8=65507Byte,其中20为IP头大小,8为ICMP头大小。如果底层协议的MTU(最大传输单元)小于上层IP数据包的大小,IP包就应该分片,并由接收者进行重组,典型的以太网的MTU为1500Byte。

在早期操作系统TCP/IP协议栈实现中,对单个IP报文的处理过程中通常是设置有一定大小的缓冲区(65535Byte),以应付IP分片的情况。接收数据包时,网络层协议要对IP分片进行重组。但如果重组后的数据报文长度超过了IP报文缓冲区的上限时,就出现溢出现象,导致TCP/IP协议栈的崩溃。

早期的Ping工具有个特点,允许任意设置发送数据的字节数,于是黑客只需要简单地利用Ping工具就可以让目标主机拒绝服务。当然,这个问题并不局限于Ping,黑客发送其他类型的数据包(包括TCP和UDP)时,只要能让IP分片重组后超过正常IP数据包的大小限制,会导致同样结果。

目前,所有标准TCP/IP协议栈已经具备了对付超大尺寸包的能力。另外多数防火墙都可自动过滤掉这种攻击行为。现在,Windows2000中的Ping命令最多只允许发送65500Byte大小的数据,Linux则一律是84Byte。2.IGMPFlood

与PingOfDeath类似,都是利用IP分片进行攻击的。所不同的是,IGMPFlood利用的是IGMP协议,IGMP类型为0(不可识别),但它并不使用多播的D类IP地址,而是将目的IP地址设置为被攻击目标的IP地址。许多OS并不能很好地处理这样的IGMP报文,包括Windows95/98/NT4等,一旦遭受攻击,受害主机的反应会明显变慢,甚至蓝屏。3.WindowsOOBAttack

专门针对Windows3.1/95/NT的攻击,受攻击的主机可以在片刻间出现蓝屏现象(系统崩溃)。原因是系统中某些端口的监听程序不能处理“意外”来临的带外数据,从而造成严重的非法操作。通常黑客最多选择的目标是TCP139端口,黑客只要先跟目标主机的139端口建立连接,继而发送一个带URG标志的带外数据报文,目标系统即告崩溃。

所谓带外(Out-Of-Band,OOB)数据,是指在网络通信中,当某一方有重要信息需要告知另一方时所采用的不同于正常数据的模式。这些信息可以被快速地递交给另一方并被特殊处理。通常,传输这种数据信息所采用的传输通道与普通数据的是不同的,这就是带外数据的来历。

在TCP协议中,传输带外数据并没有使用特殊的通道,而是使用与普通数据传输相同的连接,只不过传输的机制不同而已。TCP协议提供了一个紧急模式的带外数据传输机制,通过设置TCP头中的URG标志,接收方可以对数据中的某些信息进行特殊处理。TCP协议只支持一个字节的带外数据,并用紧急指针标识出带外数据字节的偏移位置。网络上这类攻击工具很多(通过perl脚本程序即可实现),多是以Winnuke冠名,又称为蓝屏炸弹。4.Teardrop(泪滴)利用早期某些OS中TCP/IP协议栈IP分片包进行重组时的漏洞(没有考虑到一种特殊的分片重叠,导致系统非法操作)进行的攻击,受影响的系统包括Windows3.1/95/NT以及Linux2.1.63之前的版本,其结果是直接导致系统崩溃,Windows系统则表现为典型的蓝屏症状。

协议栈在处理IP分片时,要对收到的相同ID的分片进行重组,这时免不了出现一些重叠现象,分片重组程序要对此进行处理。对一个分片的标识,可以用offset表示其在整个包中的开始偏移,用end表示其结束偏移。对于其他一些重叠情况,分片重组程序都能很好地处理,但对于一种特殊情况,分片重组程序就会出现致命失误,即第二个分片的位置整个包含在第一个分片之内。

分片重组程序中,当发现offset2小于end1时,会将offset2调整到和end1相同,然后更改len2:len2=end2-offset2,在这里,分片重组程序想当然地认为分片2的末尾偏移肯定是大于其起始偏移的,但在这种情况下,分片2的新长度len2变成了一个负值,这在随后的处理过程中将会产生致命的操作失误。

后来还有一些拒绝服务攻击利用的也是IP分片重组过程中的众多漏洞,例如Jolt2攻击,其原理是所有IP分片的偏移经过叠加后超出了正常IP包的最大限制,受影响的系统包括Windows95/98/NT/2000,以及一些Linux内核版本。对IP分片包的处理也是防火墙需要解决的一个问题,现在状态检测类型的防火墙,对异常分片的出现都有相应的一些处理方法,如对特殊重叠分片的丢弃等。5.UDPFlood

有些系统在安装后,没有对缺省配置进行必要的修改,使得一些容易遭受攻击的服务端口对外敞开着。UDPFlood利用的就是Echo和Chargen(CharacterGenerator)这两种UDP服务。

Echo服务(TCP7和UDP7)对接收到的每个字符进行回送;Chargen(TCP19和UDP19)对每个接收到的数据包都返回一些随机生成的字符(如果是与Chargen服务在TCP19端口建立了连接,它会不断返回乱字符直到连接中断)。

黑客一般会选择两个远程目标,生成伪造的UDP数据包,目的地是一台主机的Chargen服务端口,来源地假冒为另一台主机的Echo服务端口。这样,第一台主机上的Chargen服务返回的随机字符就发送给第二台主机的Echo服务了,第二台主机再回送收到的字符,如此反复,最终导致这两台主机应接不暇而拒绝服务,同时造成网络带宽的损耗。

现在的大多数OS即便提供这两种服务,但对于1024以下的源端口,Echo和Chargen都“置之不理”。最好的方法是尽量减少不必要的网络服务。在Windows2000安装好之后,应禁止掉“SimpleTCP/IPServices”服务,包括Echo、Discard(9)、Daytime(13)、Quote(17)、Chargen等。6.SYNFlood

•攻击原理是较为流行的DoS攻击方式之一,当然,在单机上实行SYNFlood早已经“过时”了,但将它应用到DDoS攻击中,其后果往往是很严重的。一个正常的TCP连接,需要经过三次握手过程才能真正建立。但是如果客户端不按常规办事(假定源IP根本就是一个不会产生响应的虚假地址),并不向服务器最终返回三次握手所必须的ACK包,这种情况下服务器对于未完成连接队列中的每个连接表项都设置一个超时定时器,一旦超时时间到,则丢弃该表项。

但黑客并不会只发送一次这样的SYN包,如果他源源不断发送,每个SYN包的源IP都是随机产生的一些虚假地址(导致受害者不可能再进行IP过滤或追查攻击源),受害者的目标端口未完成队列就不断壮大,因为超时丢弃总没有新接收的速度快,所以直到该队列满为止,正常的连接请求将不会得到响应。•攻击的简单检测通过简单的netstat命令,如果发现系统中存在大量的SYN_RECEIVED的网络连接,就基本上可以断定系统正在遭受SYNFlood攻击。

netstat–n–ptcp•攻击的防御防御起来不是很容易:一是因为这种攻击使用的是正常TCP网络服务都不会禁止的SYN类型数据包,而且因为数据包很小,黑客可以在短时间内产生大量这样的数据包;二是黑客根本不需要得到目标主机的返回信息,所以他可以伪造数据包的源IP和源端口,让目标主机无法追查攻击来源,也很难对随机产生的源IP和源端口进行过滤。

有两类可以防止SYNFlood攻击的方法。主机系统中可以采取下列措施(重新设置TCP/IP协议栈的参数):

•增加TCP监听套接字未完成连接队列的最大长度;

•减少未完成队列的超时等待时间;

•使用诸如SYNCookies这样的特殊措施。这种方法是Linux内核特有的机制,服务器并不是一收到SYN包就建立一个半连接(即在未完成队列中添加一个表项),而是先向SYN请求的发送方返回一个附带Cookies的SYN/ACK包,如果收到客户端的响应,才真正建立连接。

这种方法可以一定程度上抵御攻击,但不是根本的办法。因为系统资源有限,增加了连接队列长度,消耗的内存资源就更多。黑客发动攻击的效率总比系统资源的调整更高一些,如果黑客发动DDoS攻击,系统还是无法抵御。上述这些方法并不能从本质上提高抵御SYNFlood攻击的能力。

现在成熟的防火墙产品,基本上都有针对SYNFlood攻击的防御措施,其技术实现可以分为3类:•SYNThreshold

设定一个未完成连接队列的限定值,如果超过了该值,则丢弃SYN数据报文,最有代表性的就是Cisco的PIX防火墙。

•SYNDefender

防火墙在转发客户端到服务器的SYN请求并收到服务器返回的SYN/ACK之后,立刻向服务器返回ACK,而不是等待客户端的最后应答。最有代表性的就是CheckPoint的Firewall-1防火墙。它比SYNThreshold更有效,但也存在自身的缺陷:一方面,可能造成服务器的资源浪费;另一方面,防火墙本身成了可被利用的一个潜在的弱点。•SYNProxy

是对SYNDefender的一种改进机制。防火墙在收到客户端的SYN请求后,不会立即转发给服务器,它会在代表服务器建立了完整的TCP连接后,才向服务器转发真正的连接请求。最有代表性的就是Netscreen防火墙和天网防火墙。

采用SYNDefender机制的防火墙,能够抵御每秒发送500个以内SYN包的SYNFlood攻击,而采用SYNProxy机制的防火墙,能够有效抵御每秒发送20000个以内SYN包的SYNFlood攻击。通常情况下,即便黑客占用了所有ISDN的有限带宽,发送SYN包的频率也不会超过200个/秒,所以利用防火墙来防御SYNFlood攻击,一般情况下都是比较有效的,但如果黑客采用大规模的DDoS攻击,恐怕任何防御措施都不能完全有效。7.LandAttack

如果向Windows95的某开放端口(例如139端口)发送一个包含SYN标识的特殊的TCP数据包,将导致目标系统立即崩溃。做法很简单,就是设置该SYN包的源IP为目标主机的IP,源端口为目标主机受攻击的端口。(WindowsNT4.0+SP3、Windows3.11、某些FreeBSD系统、CISCOIOS11.3之前的版本)因试图与自己连接而陷入死循环。该方法如今也比较陈旧,对于WinowsNT4.0来说,只要安装了SP4就可以防止这种攻击。

Land攻击利用TCP初始连接建立期间的应答方式存在的问题,攻击的关键在于服务器端和客户端有各自的序列号。当目标机器把包发送给自己,目标机器等待自己的序列号(如5000)得到应答,而这个应答却是它自己刚刚才发送出去的,而且其应答序列号是攻击者的序列号(如1002)。由于这个序列号同目标机器所期望的序列号相差太大(不在接收窗口范围内),TCP认为这个包有问题,被丢弃。这样目标机器再次重发数据包,将导致无限循环:目标机器一直给自己发送错误应答,并希望能够看到具有正确序列号的应答返回。8.SmurfAttack

黑客以受害主机的名义向某个网络地址发送ICMPecho请求广播,收到该ICMPecho请求的网络中的所有主机都会向“无辜”的受害主机返回ICMPecho响应,使得受害主机应接不暇,导致其对正常的网络应用拒绝服务。之所以Smurf攻击屡屡奏效,并非受害主机的OS或网络协议有什么问题,而在于这种攻击的“借力”效果。黑客可以利用自己有限的带宽,同时找到一个高带宽的网络作为“反弹攻击跳板”,转而攻击一个有限带宽的受害系统。

要防御Smurf攻击,通常需要从3方面来考虑:1)为了防止本网络内某个主机发动Smurf攻击,在网络的边界网关(路由器)就应该设置过滤规则,禁止源地址非本网络IP的数据包出去。2)设置防火墙禁止可疑的ICMP数据包进入本网络(例如,某些状态监测防火墙,可以对非本地请求却返回给本地的ICMPecho响应进行过滤),或者干脆屏蔽ICMP。3)设置路由器,使其禁止对定向广播的支持(防止成为跳板)。9.FraggleAttack

与Smurf类似,所有伪造了源IP地址的UDP包,都被发送到一个支持定向广播的网络,其目标端口为UDP7,也就是Echo服务的端口,如果该网络的一些主机开启了Echo服务(对于没有开启Echo服务的主机,因为收到返回的ICMP不可达信息,也会造成大量的网络流量),依据Echo服务的特性,它们都会向源主机回送接收到的数据,最终效果与返回ICMPecho响应是相同的,会导致受害主机停止服务。拒绝服务攻击并不是一个组织一个网络就可以解决的问题,它需要的是整个网络环境的同步改善。10.垃圾邮件攻击(邮件炸弹)

基于标准SMTP协议的邮件服务器,在客户端请求发送邮件时,是不对其身份进行验证的。另外,许多邮件服务器都允许邮件中继(对任何接收者地址非本地的邮件提供转发服务),这两点给邮件炸弹的传播带来了方便。

黑客利用某个“无辜”的邮件服务器,持续不断地向攻击目标(邮件地址)发送垃圾邮件,很可能“撑破”用户的信箱,导致正常邮件的丢失。这种方法简单但很“奏效”,一方面它导致用户正常通信的中断,另一方面,也会给垃圾邮件“策源地”的邮件服务器带来沉重负担。如果该服务器被受害的邮件服务器列入过滤名单,损失就更为惨重。5.2.2分布式拒绝服务攻击1.简介DDoS攻击是DoS攻击的一种延伸,它之所以威力巨大,是因为其协同攻击的能力。黑客使用DDoS工具,往往可以同时控制成百上千台攻击源,向某个单点目标发动攻击,它还可以将各种传统的DoS攻击手段结合使用。对DDoS的防御,至今没有一个很好的解决方法。

2.DDoS攻击模型有4种不同的角色:•黑客(Intruder):黑客亲自操作的主机用户接口(Netcat或Telnet),其作用是向Master发送各种命令,包括攻击指令等。•主控端(Master):监听来自Intruder的命令,并向网络上分布的各个Daemon发起攻击命令,使其真正开始攻击。•守护进程端(Daemon):接收和响应来自Master的攻击命令,是真正实施攻击的前锋。•受害者(Victim):即被攻击的目标主机。4.DDoS攻击对策最基本的攻击对策,还是要解决好OS、协议栈,以及各种网络服务和应用系统的漏洞问题。及时安装补丁程序,进行合理配置,对网络流量以及通信过程进行监视(IDS),设置严格的过滤规则(路由器和防火墙)。广泛的合作和协同一致。为了及时发现自己的系统是否被种植了DDoS工具,使用find_ddos系列工具,这些工具针对不同种类的系统类型,可以帮助管理员发现多种常见的DDoS工具(包括其Master端以及Daemon端)。5.2.4网络欺骗类型的攻击1.IP欺骗攻击(1)IP欺骗原理

IP欺骗就是伪造数据包源IP地址的攻击,基于两个前提:一是目前的TCP/IP网络在路由数据包时,不对源IP地址进行判断,这就给伪造IP包创造了条件;二是两台主机之间,存在着基于IP地址的认证授权访问,就可以进行“会话劫持”。

一:UNIX平台的主机对外提供某些网络服务,都是基于简单的IP地址来进行认证的,最有代表性的就是rlogin、rsh、rcp等。当客户端要求建立这些服务连接时,如果服务器主机上设置有/etc/hosts.equiv或$HOME/.rhosts这样的文件,往往就不需要进行身份验证。正是基于这种简单的信任关系,黑客只要知道哪台主机是受目标主机信任的(最好是对root用户的信任),就可以冒充受信任主机,进行rlogin登录,但是,对黑客来说,目标主机作出的任何反应他都是看不见的。1)信任和认证是一种相反的关系,信任关系越强,认证的严格性越低。2)最初的认证是由基于信任关系的源地址来进行的。3)由于IP地址(以及IP头中的大部分域)可以伪造,因此基于IP源地址的认证是不可靠的。4)要进行欺骗攻击,必须要有某种信任关系存在。使用IP欺骗技术以后,攻击过程再也不必使用任何用户名和口令了。

IP欺骗受欢迎的另一个原因是它是其它攻击形式(如“会话劫持”)的重要基础。二:另一个技术上的难点,在于对TCP连接的初始序列号ISN的精确猜测。如果序列号不正确,所传输的报文就不能被正确接收。在IP欺骗过程中,黑客只是单方面向目标主机发送数据包(因为黑客使用的是假冒的源IP地址),不可能收到目标主机的会应,所以确定目标主机的ISN就是关键了。在TCP报文头部,ISN是一个32位的值,TCP协议为每一个连接选择一个ISN,为了防止因为延迟、重传等扰乱三次握手,ISN不能随便选取。理解TCP如何分配ISN以及ISN随时间的变化规律,对于成功的进行IP欺骗很重要。

通常,ISN的取值每秒增加128000,如果有新的连接,每次连接ISN的值增加64000。黑客可以先与目标主机建立正常的TCP连接,提取其ISN值,并且多次尝试,以找到稳定的规律,将最近一次的ISN记录下来。此外,黑客还需要掌握到目标主机的往返时间(RTT),这样的话,所估算的目标主机的ISN就是最近一次的记录加上128000*(RTT/2)。当然,如果在黑客两次反应之间,目标主机又建立了新的连接,所估算的ISN还要加上64000。可见猜测ISN并不容易。

猜测的序列号有出入三:黑客发送给目标主机的数据包,目标主机的回应都返回给受信任的主机。正常情况下,受信任主机会立刻返回给目标主机RST报文而终止连接。所以还有一个先决条件,就是不能让被冒充的主机对外界产生任何响应。如果被冒充的主机处于关机状态,就不必理会;否则黑客就要想办法使其停止响应,最常用的就是SYNFlooding等拒绝服务攻击。(2)IP欺骗攻击过程(3)IP欺骗攻击对策原理较简单,但实施起来难度相当大。而且现在大多数OS使用较强壮的随机序列号生成器,要准确猜测TCP连接的ISN几乎不可能。

•在边界路由器上进行源地址过滤,也就是说,对进入本网络的IP包,要检查其源IP地址,禁止外来的却使用本地IP的数据包进入,这也是大多数路由器的缺省配置。

•禁止r-类型的服务,用SSH代替Telnet、rlogin这样的不安全的网络服务。

•如果是Linux系统,可以借助路由模块的源地址过滤功能防止IP欺骗。

•TCP的序列号不是随机选择的或者随机增加的。Bellovin描述了一种弥补TCP不足的方法,就是分割序列号空间,每一个连接都将有自己独立的序列号空间。2.DNS欺骗攻击(1)DNS欺骗攻击原理针对DNS服务器向另一个DNS服务器发送某个解析请求,黑客冒充被请求方,向请求方返回一个被篡改了的应答。

DNS欺骗能够成功,首先一个条件就是DNS服务器会在本地Cache中进行缓存(有可能是被黑客篡改了的信息),以后向该DNS服务器发送的对同一域名的解析请求,得到的结果都将被篡改(在该条目被缓存的生存期内)。

其实这样的欺骗并不局限于正常的域名解析,反向域名解析(PTR)和邮件交换解析(MX),都可能被欺骗利用,可能导致的结果是:利用域名进行访问认证的服务将允许黑客登录,而邮件中继的过程,也可能因为MX欺骗而将邮件投递到了伪造的邮件服务器中。有了进行欺骗的可能,问题焦点是怎样伪造DNS应答信息。

一:黑客可以控制本地的域名服务器,在其数据库中增加一个附加条目,将攻击目标的域名指向黑客自己的IP。......最后将在本地域名服务器上伪造的该条目“注射”到攻击目标的域名服务器的Cache中。

二:更为现实的情况,就是黑客并不能控制任何DNS服务器,但它可以控制该服务器所在网络的某台主机,并可以通过Sniffer监听所有该网络中的通信情况。这时候,黑客要对远程的DNS服务器进行欺骗攻击,所采用的手段很象IP欺骗攻击:首先黑客要冒充某个域名服务器的IP地址;其次黑客要能预测某个目标域名服务器所发送DNS数据包的ID号。DNS服务器之间同时可能会进行多个解析过程,而不同的过程使用的是相同的端口号(53),是通过DNS报文中的ID号来彼此区分的。不同的解析会话,采用不同的ID号。如果黑客所伪造的DNS应答包中含有正确的ID号,并且抢在被假冒DNS服务器之前向目标DNS服务器返回伪造信息,攻击就是成功的。而多数DNS服务器采用一种有规律的ID生成机制,对于每次发送的域名解析请求,DNS服务器都会将数据包中的ID加1。如此一来,黑客如果可以在DNS服务器的网络中进行嗅探,他只要向攻击目标DNS服务器发送一个对本地某域名的解析请求,通过嗅探得到的来自目标DNS服务器的请求数据包(因为远程DNS服务器肯定会转而请求本地的DNS服务器),黑客就可以得到想要的ID号了。知道了ID号和ID增长的规律,以下的过程类似于IP欺骗攻击。(2)DNS欺骗攻击过程(3)DNS欺骗攻击对策现在大多数DNS服务器软件,都有防御DNS欺骗的相应措施,不过在配置DNS服务器时还应该注意:•使用最新版本的DNS服务器软件(BIND),并及时安装补丁。

•限制区域传输的范围。

•限制动态更新。

•采用分层的DNS体系结构。

DNSExpert是DNS服务器分析工具,运行于Windows系统,可以对各种类型和版本的DNS服务器进行全面分析,扫描其安全问题,并给出直接的解决方法。5.2.5会话劫持攻击1.会话劫持原理所谓会话劫持(SessionHijack),就是在一次正常的通信过程中,黑客作为第三方参与到其中,或者是在数据流里注射额外的信息,或者是将双方的通信模式暗中改变,即从直接联系变成交由黑客中转。

一、中间人攻击(ManInTheMiddle,MITM)

通过ARP欺骗进行的MITM攻击,要求黑客必须置身于通信双方任意一方的网络中(共享式/交换式),他通过构造假的ARP响应包,污染受害主机的ARP缓冲区,使受害主机彼此之间发送的数据包先到达黑客的主机(但IP地址正确),再由黑客重新构造转发(改变MAC地址)。

对于DNS欺骗,因为是基于IP地址的,所以在广域网内也可以操作进行,例如Web服务器重定向。MITM攻击相当于在通信双方之间加入了一个透明的代理,而且这种攻击方式不仅对常规的通信协议有效(明文传输),对于配置不当的加密协议也有利用的可能,如SSH和SSL协议。

二、注射式会话劫持不需要改变通信双方数据的流向,只是在正常的数据流中插入黑客填充的内容。涉及到两种技术:IP欺骗和序列号判断(仅TCP通信需要)。黑客首先要能够对被攻击对象的网络通信进行监听,其次,他要等待一次TCP会话连接完全建立之后(成功地进行了身份认证)。他没有必要猜测序列号,因为他可以根据嗅探得到的数据来构造正确的序列号。

有一个致命的弱点,就是可能导致ACK风暴(Storm),但如果源主机是Linux系统,就不会导致ACK风暴。黑客的注射数据会导致双方通信的不同步,并最终导致会话失败,当然黑客只要略施技巧就能恢复原有会话通信的同步。

MITM和注射式会话劫持并没有清晰区别,两种机制往往紧密结合在一起。

2.会话劫持工具及实例

Hunt可以在共享式/交换式网络中工作,在混杂模式或ARP欺骗条件下进行嗅探,可进行注射式会话劫持或MITM。也可以中断指定的连接会话,让紊乱的会话恢复同步。Juggernaut基于传统的Sniffer技术,可以监视网络中所有的TCP会话,特性在于还可以主动劫持会话。由于攻击者可以看到序列号,有必要的话,它可以把伪造的数据包放到TCP流中。这将允许攻击者以被欺骗的客户具有的特权来访问服务器。攻击者同样也可以查看所有同攻击相关的输出,而且不把它们送往客户机,这样的攻击是透明的。在这种情况下,攻击者甚至不需要知道访问机器所需的口令。攻击者只需简单地等待用户登录到服务器,然后劫持会话数据流即可。

TCP会话劫持能成功的前提首先是TCP建立连接的三次握手过程中没有任何的认证机制。TCP假定只要接收的数据包包含正确的序列号就认为数据是可接受的。一旦连接建立,服务器将无法确定进入的数据包是确实来自真实的客户机器而不是某一台假冒的机器。

即使攻击者无法进行窃听,可以通过IP地址欺骗方法来猜测服务器的序列号完成会话劫持。当然有可能猜错序列号,真正的客户和服务器会对这些数据包进行应答,并要求重发。有可能产生大量的要求对方重发的TCPACK应答包,形成TCPACK风暴。攻击者就可能不能完成会话劫持,并可能被发现。5.2.6缓冲区溢出攻击1.缓冲区溢出概述十多年来应用非常广泛的一种攻击手段,近年来,许多著名的安全漏洞都与缓冲区溢出有关。所谓缓冲区溢出,就是由于填充数据越界而导致程序原有流程的改变,黑客借此精心构造填充数据,让程序转而执行特殊的代码,最终获得系统的控制权。

栈溢出(格式化字符串溢出)按填充数据溢出的缓冲区位置:堆溢出

BSS溢出按黑客重定向程序流程的方式:直接植入黑客自己代码;跳转执行系统中已经加载的代码。按利用的外部条件的不同:本地缓冲区溢出;远程缓冲区溢出。(1)堆栈概念基础与栈帧相关的3个寄存器:SP(ESP):栈顶指针,它随着数据入栈出栈而发生变化;BP(EBP):基地址指针,它用于标识栈中一个相对稳定的位置,通过BP,可以方便地引用函数参数以及局部变量;IP(EIP):函数调用返回后下一个执行语句的地址。

在函数调用之前,堆栈中首先被压入所传递的参数,然后是返回地址(当前IP的值);进入函数后,由所调用的函数负责,将BP值入栈(并将SP的值赋给BP,作为新的栈帧基地址),接着为函数中的局部变量留出空间。函数执行完毕,在返回之前,要将局部变量所占用的栈空间清除,然后弹出保存的BP值(即恢复前一个栈帧的基地址),最后,利用弹出的IP值,程序执行又恢复到原有的流程。

栈是从内存高地址向内存低地址增长的,在函数的栈帧中,很重要的就是给函数局部变量留出的空间,通常函数中会通过类似“charbuffer[20]”之类的C语言语句定义一个缓冲区,如果要向该缓冲区中填充数据,其增长方向将是由低地址到高地址的。

这样一来,就存在问题,如果给缓冲区填充的数据超过了预先分配给它的空间大小,即发生这种缓冲区“溢出”,很有可能覆盖掉EBP甚至RET(返回地址),这也正是缓冲区溢出攻击的“奥秘”所在。黑客只要特殊构造传递给程序的参数字串,使其缓冲区溢出,用黑客自己的代码覆盖原有的返回地址,就可以实现改变程序流程的目的,让进程转而执行黑客特意设定的代码。(2)关于SUID/SGID

一般来讲,用户执行某个程序,系统中相应的进程将以该用户的身份运行,继而就要遵循对该用户的权限设置,就算能够让进程转向运行任意设定的代码,还是无法突破这种限制,因为无论怎样,进程始终是以该用户身份运行的。

在UNIX系统中,程序在没有运行前,作为一个静态的文件,属于某个创建它的用户,因此也就具有属主的UID和GID。为了规定不同用户的访问权限,还可以设定文件的存取模式。存取模式中除了3个表示不同用户权限的数字外,还有一个可设置文件特性的数字,它也是八进制数,其中2表示设定了SGID,4表示设定了SUID,而SGID和SUID的特性正是缓冲区溢出攻击所要利用的。

一旦程序开始执行,就变成了动态的进程,系统会给该进程分配进程标识号(PID)。此外进程还具有两组特殊的标识号,一组是真实(Real)UID和GID,另一组是有效(Effective)UID和GID。真实UID和GID用于标识运行该进程的用户,而有效UID和GID则是真正用于存取权限判断的标识号。

一般来讲,如果该进程对应的程序文件并没有设置SUID或SGID,进程的真实UID与其有效UID就是相同的,都等于运行该程序的用户的UID,组标识也是如此。但是如果程序设置了SUID,那对应进程的有效UID就不是运行该进程的用户了,而是该程序本身属主的UID。即设置了SUID位的X程序,无论谁运行它,都仿佛是X的属主自己运行。

如果某个设置了SUID位的程序属于root用户所有,那无论谁执行它,都相当于用root身份在运行。进而可以想到,如果该程序具有缓冲区溢出漏洞,黑客就可以利用这一漏洞,以root的权限来运行自己设定的代码了。2.UNIX中的栈溢出攻击voidfunction(inta,intb,intc){charbuffer1[5];charbuffer2[10];int*ret=buffer1+12;(*ret)+=8;}voidmain(){intx=0;function(1,2,3);x=1;printf{“%d\n”,x);}在这个程序中,“ret=buffer1+12”语句用于读取栈中存放的function函数的返回地址,而“(*ret)+=8”语句则是将该返回地址加8并重新赋值。function函数返回时,将越过其下一条语句“x=1”,转而直接执行“printf(“%d\n”,x)”语句,最终x的值将是0,而不是1。这是一个典型的修改函数返回地址的例子。通常存在缓冲区溢出漏洞的程序又是怎样“无意中”修改了函数返回地址的呢?

voidfunction(char*str){voidmain(){charbuffer[16];charlarge_string[256];strcpy(buffer,str);inti;}for(i=0;i<255;i++)large_string[i]=‘A’;function(large_string);}

buffer后面的栈内容将被该字串覆盖掉(包括ebp和ret)。因为我们填充的是‘A’,最终函数返回地址将变成“0x41414141”,如果执行这个程序,由于该地址不在程序有效虚拟内存范围内,系统会报告一个“SegmentationViolation”错误。

gets、strcat、spintf、vsprintf、scanf都能导致缓冲区溢出。通常利用此类漏洞进行攻击时,这种植入的字串都是通过命令行参数传递给程序的主函数的,再传给被调函数的。

通常植入缓冲区的代码执行的是一个Shell,如果缓冲区溢出的程序本身是SUID的,其属主是root,那黑客得到的Shell也就具有root权限了。鉴于代码的目的性非常明确,人们就将这段代码叫做“Shellcode”(不同的系统,其Shellcode也各不相同)。下面是一个典型的Shellcode源程序,使用execve函数来执行/bin/sh命令,也就是得到一个Shell。#include<stdio.h>voidmain(){char*name[2];name[0]=“/bin/sh”;name[1]=NULL;execve(name[0],name,NULL);}

但是,要将Shellcode植入缓冲区中,它必须作为可直接执行的机器代码才行,所以要先将该程序编译成汇编代码,然后经过适当的调整,最后得到适合系统类型的机器代码。

有了这段代码,黑客就可以设计自己的攻击程序了。在该程序中,他要构造一个特殊的字串,该字串中包含Shellcode,也包含Shellcode的地址(用该地址覆盖函数的返回地址)。然后,攻击程序调用execve之类的函数来执行有缓冲区溢出漏洞的命令程序,并将构造好的字串作为参数传递给命令程序。这样的程序,通常被称为exploit程序。

那么,Shellcode的地址又是怎样确定的呢?因为Shellcode是被植入到栈缓冲区的,所以,定位Shellcode,也就是定位内存中栈的地址了。下面的程序说明怎样将包含地址和Shellcode的字串植入缓冲区的。charshellcode[]=“\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b”“\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd”“\x80\xe8\xdc\xff\xff\xff/bin/sh”;

charlarge_string[128];voidmain(){charbuffer[96];inti;long*long_ptr=(long*)large_string;

for(i=0;i<32;i++)*(long_ptr+i)=(int)buffer;for(i=0;i<strlen(shellcode);i++)large_string[i]=shellcode[i];strcpy(buffer,large_string);}

首先,在large_string中填充buffer的地址;然后,将Shellcode放到large_string的最前面;最后,将这个超长的字串拷贝到狭小的缓冲区中。其结果是,main函数的正常返回地址被buffer的地址所取代,而buffer开始处,正好是Shellcode,main函数不能正常退出,strcpy执行之后将会转而执行Shellcode。当缓冲区空间很小时(容纳

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论