千古简谱钢琴阿兰:黑客攻击技术概要--溢出攻击法

来源:百度文库 编辑:偶看新闻 时间:2024/04/29 01:02:50

[2006-01-10 22:09:22] [来源: 不详] [我要投稿]

本文章地址:http://www.jztop.com/net/hack/hkdh/2006-01-10/5388.html [点此复制地址]

转载:黑客海岸线

原理:一碗水,望一个杯子里灌,杯子装不下了,我们会说,水溢出了。因此溢出在现实中可以描述为,当液体被倒入容器中,而超过了容器的限制时,就会造成溢出。黑客技术所描述的溢出,含义基本是一样的。当某个数据,超过了处理程序限制的范围时,该数据就会造成程序的执行溢出(overflow)。
通常一些系统在未对接收数据进行严格判断的情况下,都有可能造成溢出,对于一些无心的操作者,溢出最多会造成该处理进程报错或者异常终止,并不是很严重的事情,有人奇怪,异常终止还不严重吗?实际是这样的,这里我们面对的多人共享服务的应用,通常一个服务进程在接收一个用户请求时,会创建一个子进程去进行应答和服务,如果这个子进程接收了一些无特别含义的超过限制的数据,通常会终止,而服务的父进程和其他子进程并不受影响,因此对系统的危害实际上并不大。但是如果这个数据包是被精心构造的(参见上文,特殊字符构造法),那么在溢出点后面的就可能是精心策划的代码,从而进行服务端的代码执行,进而有可能控制系统。
溢出攻击法的危险在于,大部分系统设计者在设计初都无法完全预料和防范溢出攻击的各种可能性,因此事实上任何具有一定复杂性的服务系统几乎都肯定有遭受溢出攻击的危险,只是有的已经被发现,有的尚未被发现而已。从Wu-ftp,Sendmail,IIS,qmail,到Apache,几乎全部世界上最通用的网络服务系统,都曾出现过能够导致溢出攻击的漏洞。而且每个漏洞都是极端高危险的(可被攻击者获得对服务系统的控制),这种危险是如何实现的呢?
一个程序被执行,代码段(这里的代码段通常不是程序员编写的源代码,而是经过编译和处理后的汇编指令)会放到内存里,代码段所处理的数据也会放在内存里,通常数据段会在代码段前面,这里明确一点,电脑并不认识谁是代码,谁是数据,在它眼里,只有0和1,也就是高电平和低电平。通常数据和代码都会相安无事,但是如果数据超过了数据段的限制,占用了代码段的位置,那就不一样了,如果是数据提交者无意造成的,通常是造成代码无法执行,该子进程的崩溃。但是如果是精心构造的,那么就有可能改写代码段的执行命令(通过汇编),从而让代码段(请记住这个代码段是在服务器的内存上)执行攻击者所期望执行的操作,这样,入侵者就可以在随心所欲的让服务器执行自己要执行的操作,也就是控制服务器的整个系统(而不是单纯的应用服务)!

攻击方式:
1.测试溢出点
假设我们针对一个服务系统进行数据包的构造和发送,通常,服务系统溢出的错误显示和录入错误的显示是显著不同的,录入错误的提示是服务系统程序所产生的相关信息,而溢出的提示是操作系统所产生的相关信息,根据错误信息的差异,有经验的黑客可以很快判断该应用系统是否存在溢出点,这个过程通常是一个程序循环执行,用各种长度或格式的报文进行测试,并比较系统返回的信息,通过逐步细化范围,有经验的黑客可以测算中具体溢出点(也就是可以放置攻击代码的临界点,如果放置错了哪怕一个位置,都不可能被系统执行,这种放在内存里的汇编和用开发工具写原程序对格式的要求,位置的要求都是极高的)
2.构造攻击代码
这要看攻击者的目的和企图了,没有定论,但是有几点要强调的,第一是代码格式和规范必须与受攻击系统的相关汇编指令完全一致,第二是代码结束要干净,比如中断进程,如果结束不干净,又和人家原来系统的代码搅在一起,执行过程就可能会偏离攻击者的意图。
3.进行控制和入侵
如果相关攻击代码加载了后门,开辟了专门的shell, 那么这名攻击者就可以方便的进出该系统,实现更方便的控制。

防护方式:
对于系统的设计者,必须对太多地方考虑周详才可能避免这种方式的入侵,实际上所谓超过限制,有时候不一定是超过长度,一个长度标记位的改写就可能逃避长度检查,达到溢出攻击效果。
对于系统维护者,那没有办法,只能天天多看相关安全网站的最新问题,一旦确认和自己系统所处的服务环境有关,就一定要立即去相关站点下载补丁,进行防护,不过还有一些其他办法可以尽量减少攻击者的攻击:
第一,除非一定需要,尽量少开服务。少开服务的意思就是让攻击者缺少与系统进行沟通和数据交互的通道,减少被攻击的可能。
第二,如果是专有的服务,使用IP屏蔽技术。如果某些服务(如telnet,ftp),仅面向有限人群,而这些人群的IP地址相对集中,可以使用IP屏蔽方式让其他IP用户无法访问,这样其他IP地址的用户就无法和该系统进行数据交互了。
第三,如果是面向有限人群服务,可以使用改变服务端口的方式,比如你的FTP服务仅限于一些比较熟悉的朋友,如果他们上网环境无法固定(无法提供IP屏蔽),可以将相关服务端口改变并通知他们,这样可以使大部分网络上的扫描器无法发现的该服务的存在,也就使那些比较懒(没有太多时间做全端口扫描)的黑客放弃对你站点的纠缠。
第四,如果有特殊兴趣,可以使用端口伪装技术,让黑客进入你的圈套,被假象迷惑,从而保护你真实的服务。这样你还可以偷偷对黑客的入侵和攻击行为进行跟踪和分析。

经典案例:
如果有人说,我控制了全球50%的web服务器,你一定以为他疯了,而apache Chunk分段溢出漏洞的发布,真的让使句话成为了事实!
Apache一直是自由主义者,共享主义者的一面大期,很少有商业公司,能够在microsoft的奋力追赶下,不会失去市场优势的,不管是Apple(他们的视窗操作系统,windows的前身),NetScape(被IE两三年内轻松击败),
Borland(borland C++被后来居上的Visual C++轻松击败), 硕果仅存的Oracle还被老巨无霸IBM干到了老二的位置上,而一个非商业组织的Apache Web Server能够立压微软大力推广的IIS多年,一直保持应用服务器全球使用率50%以上的比例,甚至于不少人在windows主机上用apache做web服务器(他们通常都是被IIS漏洞搞的心力憔悴了),这不能不算一个奇迹了,在IIS千疮百孔的时代,虽然apache也有一些诸如phf.cgi,nph-test.cgi等有名的漏洞,但是还都停留在附属配套软件身上,本身一直还都没出过太出格的问题,也深受全球用户的好评,但是这次,micro$oft的fans们终于可以长出一口气了,"看看,敢情apache也有这毛病不是"。
bug起源是这样的,本身apache对chunk数据分段的支持是有长度验证的,但是由于对无符号数意识不够,导致攻击者精心构造的分段数据包可以在逃避验证后,造成内存分配的溢出!从而执行攻击者精心构造的代码。涉及范畴包括了绝大部分的apache版本,也就是相当于全世界50%以上的Web Server都有这个问题!

与此类似的还有以前Sendmail各个版本屡补不净的溢出问题(弄的我现在看到senmail的就怕怕),几个全球流行的ftp软件屡补不净的溢出漏洞。甚至一些路由设备,乃至防火墙,也常常暴露出同样问题,真是一言难尽。

总结:
溢出攻击法的特点是,只要用足够的技术,对系统有足够的认识和分析,就能够通过溢出攻击获得对系统的控制,从而达到攻击的最高目标,而这个过程中,不需要依赖于密码的破解,嗅探,侦听等手段,也不需要任何非技术的手段和骗局,事实上,如果能够成功实施溢出攻击,即便是面对一个已知的漏洞,在没有特别傻瓜化的工具情况下,也需要非常高的系统认识能力和低层编程素质,一些精深的老黑客乐于此道而不思其余,是很有道理的。

溢出攻击法所以前文章所言,仍然属于特殊字符构造范畴,所不同的是,其攻击的思想已经不在简单是面向应用程序本身的程序设计问题,而是更多进入了系统级的考虑,包括内存段的分配,不同系统下汇编的规范,协议层的报文规范,这些都是其他特殊字符构造法所没有涉及的。精通溢出攻击并能通过该领域进行问题研究者,是最容易让全世界网管都吓一跳的人