以下的文章主要描述的是黑客中级技术 缓冲区溢出攻击,缓冲区溢出是一种很危险的漏洞,在各种操作系统、应用软件中存在很广泛。利用缓冲区溢出攻击,可以导致程序运行失败、系统当机、重新启动等后果。
更为严重的是,可以利用它执行非授权指令,甚至可以取得系统特权,进而进行各种非法操作。
缓冲区溢出是一种非常普遍、非常危险的漏洞,在各种操作系统、应用软件中广泛存在。利用缓冲区溢出攻击,可以导致程序运行失败、系统当机、重新启动等后果。更为严重的是,可以利用它执行非授权指令,甚至可以取得系统特权,进而进行各种非法操作。缓冲区溢出攻击有多种英文名称:buffer overflow,buffer overrun,smash the stack,trash the stack,scribble the stack, mangle the stack, memory leak,overrun screw;它们指的都是同一种攻击手段。第一个缓冲区溢出攻击--Morris蠕虫,发生在十年前,它曾造成了全世界6000多台网络服务器瘫痪。
本文将分析缓冲区溢出的原理;研究各种类型的缓冲区溢出漏洞和攻击手段;最后,还将着重研究各种防御手段,用来消除这些漏洞所造成的影响。
一、 缓冲区溢出的原理
通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。例如下面程序:
void function(char *str) {
char buffer[16];
strcpy(buffer,str);
}
上面的strcpy()将直接吧str中的内容copy到buffer中。这样只要str的长度大于16,就会造成buffer的溢出,使程序运行出错。存在象strcpy这样的问题的标准函数还有strcat(),sprintf(),vsprintf(),gets(),scanf()等。
当然,随便往缓冲区中填东西造成它溢出一般只会出现“分段错误”(Segmentation fault),而不能达到攻击的目的。最常见的手段是通过制造缓冲区溢出使程序运行一个用户shell,再通过shell执行其它命令。如果该程序属于root且有suid权限的话,攻击者就获得了一个有root权限的shell,可以对系统进行任意操作了。
缓冲区溢出攻击之所以成为一种常见安全攻击手段其原因在于缓冲区溢出漏洞太普遍了,并且易于实现。而且,缓冲区溢出成为远程攻击的主要手段其原因在于缓冲区溢出漏洞给予了攻击者他所想要的一切:植入并且执行攻击代码。被植入的攻击代码以一定的权限运行有缓冲区溢出漏洞的程序,从而得到被攻击主机的控制权。
在1998年Lincoln实验室用来评估入侵检测的的5种远程攻击中,有2种是缓冲区溢出。而在1998年CERT的13份建议中,有9份是是与缓冲区溢出有关的,在1999年,至少有半数的建议是和缓冲区溢出有关的。在Bugtraq的调查中,有2/3的被调查者认为缓冲区溢出漏洞是一个很严重的安全问题。
缓冲区溢出漏洞和攻击有很多种形式,会在第二节对他们进行描述和分类。相应地防卫手段也随者攻击方法的不同而不同,将在第四节描述,它的内容包括针对每种攻击类型的有效的防卫手段。
二、缓冲区溢出的漏洞和攻击
缓冲区溢出攻击的目的在于扰乱具有某些特权运行的程序的功能,这样可以使得攻击者取得程序的控制权,如果该程序具有足够的权限,那么整个主机就被控制了。一般而言,攻击者攻击root程序,然后执行类似“exec(sh)”的执行代码来获得root权限的shell。为了达到这个目的,攻击者必须达到如下的两个目标:
1. 在程序的地址空间里安排适当的代码。
2. 通过适当的初始化寄存器和内存,让程序跳转到入侵者安排的地址空间执行。
根据这两个目标来对缓冲区溢出攻击进行分类。在二.1节,将描述攻击代码是如何放入被攻击程序的地址空间的。在二.2节,将介绍攻击者如何使一个程序的缓冲区溢出,并且执行转移到攻击代码(这个就是“溢出”的由来)。在二.3节,将综合前两节所讨论的代码安排和控制程序执行流程的技术。
二.1 在程序的地址空间里安排适当的代码的方法
有两种在被攻击程序地址空间里安排攻击代码的方法:
1、植入法:
攻击者向被攻击的程序输入一个字符串,程序会把这个字符串放到缓冲区里。这个字符串包含的资料是可以在这个被攻击的硬件平台上运行的指令序列。在这里,攻击者用被攻击程序的缓冲区来存放攻击代码。缓冲区可以设在任何地方:堆栈(stack,自动变量)、堆(heap,动态分配的内存区)和静态资料区。
2、利用已经存在的代码:
有时,攻击者想要的代码已经在被攻击的程序中了,攻击者所要
后门程序知识完全解析,后门程序又称特洛伊木马,其用途在于潜伏在电脑中,从事搜集信息或便于黑客进入的动作。后程序和电脑病毒最大的差别,在于后门程序不一定有自我复制的动作,也就是后门程序不一定会“感染”其他电脑。
什么是后门程序
后门程序又称特洛伊木马,其用途在于潜伏在电脑中,从事搜集信息或便于黑客进入的动作。后程序和电脑病毒最大的差别,在于后门程序不一定有自我复制的动作,也就是后门程序不一定会“感染”其他电脑。
后门是一种登录系统的方法,它不仅绕过系统已有的安全设置,而且还 能挫败系统上各种增强的安全设置。
后门是一种登录系统的方法,它不仅绕过系统已有的安全设置,而且还能挫败系统上各种增强的安全设置。
后门包括从简单到奇特,有很多的类型。简单的后门可能只是建立一个新的账号,或者接管一个很少使用的账号;复杂的后门(包括木马)可能会绕过系统的安全认证而对系统有安全存取权。例如一个login程序,你当输入特定的密码时,你就能以管理员的权限来存取系统。
后门能相互关联,而且这个 技术被许多黑客所使用。例如,黑客可能使用密码破解一个或多个账号密码,黑客可能会建立一个或多个账号。一个黑客可以存取这个系统,黑客可能使用一些 技术或利用系统的某个漏洞来提升权限。黑客可能使用一些技术或利用系统的某个漏洞庭湖来提升权限。黑客可能会对系统的配置文件进行小部分的修改,以降低系统的防卫性能。也可能会安装一个木马程序,使系统打开一个安全漏洞,以利于黑客完全掌握系统。
以上是在网络上常见的对“后门”的解释,其实我们可以用很简单的一句话来概括它:后门就是留在计算机系统中,供某位特殊使用都通过某种特殊方式控制计算机系统的途径!——很显然,掌握好后门技术是每个网络安全爱好者不可或缺的一项基本技能!它能让你牢牢抓住肉鸡,让它永远飞不出你的五指山!
下文将以笔者从事网络安全多年的工作经验为基础,给广大的网络初级安全爱好者讲解一些网络上常 用的后门的种类和使用方法以及技巧,希望大家能在最短的时间内学习到最好的技术,提升自己的网络安全技术水平!
后门的分类
后门可以按照很多方式来分类,标准不同自然分类就不同,为了便于大家理解,我们从技术方面来考虑后门程序的分类方法:
1.网页后门
此类后门程序一般都是服务器上正常 的web服务来构造自己的连接方式,比如现在非常流行的ASP、cgi脚本后门等。
2。线程插入后门
利用系统自身的某个服务或者线程,将后门程序插入到其中,具体原理原来《黑客防线》曾具体讲解过,感兴趣的朋友可以查阅。这也是现在最流行的一个后门技术。
3扩展后门
所谓的“扩展”,是指在功能上有大的提升,比普通的单一功能的后门有很强的使用性,这种后门本身就相当于一个小的安全工具包,能实现非常多的常驻见安全功能,适合新手使用————但是,功能越强,个人觉得反而脱郭后门“隐蔽”的初衷,具体看法就看各位使用都的喜好了。
4.c/s后门
和传统的木马程序类似的控制方法,采用“客记端/服务端”的控制方式,通过某种特定的访问方式来启动后门进而控制服务器。
5.root kit 6o f3H3B
这个需要单独说明,其实把它单独列一个类在这里是不太恰当的,但是,root kit 的出现大大改变了后门程序的思维角度和使用理念,可以说一个好的root kit就是一个完全的系统杀手!后文我们讲涉及到这方面,想念一定不会让大家失望!
上面是按照技术做的分类,除了这些方面,正向连接后门、反向连接后门程序等分类也是很常见的,其实如何分类是编程者考虑的事,广大的使用者就不用考虑那么多了,我们看重的,只是功能! Oi-)G!12
入侵法定————精品后门
上面的“废话”想念大家都看累了吧?好,下面我们来看看现在网络中浒的后门究竟长什么模样想学习网络安全并想提高的朋友看清楚了哦,这可是让你的肉鸡逃不出你的五指山的大好途径! 66 _}=`W/k
1.网页后门
近段时间网络上针对系统漏洞的攻击事件渐渐少了,因为大家在认识到网络安全的重要性之后,最简单却又最有效的防护办法:升级,都被大家所认同,所以系统漏洞在以后的岁月中存活的周期会越来越短,而从最近的趋势来看,肢本漏洞已经渐渐取代了系统漏洞的地位,非常多的人开始研究起却本漏洞来,sql注入也开始成为各大安全站点首要关注热点,而说到脚本、网页后门当然就是不得不说的重头戏了,现在国内入侵的主流趋势是先利用某种脚本漏洞上传脚本后门,然后浏览服务器内安装和程序,找到提升权限的突破口,进而拿到服务器的系统权限。
现在asp、CGI、PHP这三个脚本大类在网络上的普遍运用带来了脚本后门在这三方面的发展,下面我们一一道来:
海阳顶端ASP木马
这是ASP脚本方面流传非常广的一个脚本后门了,在经过几次大的改革后,推出了“海阳顶端ASP木马XP版”、“海阳顶端ASP木马红粉佳人版”等功能强大、使用方便的后门,想念经常接解脚步本安全的朋友对这些都不会陌生。
类型:网页木马
使用范围:支持ASP、WEB访问
使用难度:★☆☆☆☆
危害程序:★★★☆☆
查杀难度:★★★☆☆
现在的服务器系统配置都相对安全,公开的系统漏洞存在的机会很少,于是脚本方面的漏洞就开始火起来。首先我们通过某种途径获得一个服务器的页面权限(比如利用论坛上传达室类型未严格设置、SQL注入后获得ASP系统的上传权限、对已知物理路径的服务器上传特定程序),然后我们可以通过简单的上传ASP程序或者是直接复制海阳项端的代码,然后通过WEB访问这个程序,就能很方便地查阅服务器上的资料了,下面举个简单的便子(由于只是简单的介绍,下文便子不会太难或者太普遍,希望大家理解)。
运用举便
leadbbs2.77曾经风靡网络,它是个很典型的ASP论坛,屏蔽了很多可以SQL注入的寺方,但是很多傻瓜级别的网络管理员总是喜欢默认安装,然后启用论坛,我们只需要很简单地在IE中输入:WWW。***。COM/BBS/DATA/LEADBBS。MDB就能够直接下载该论坛的数据库了,而且没有MD5加密哦!,我们直接找到管理员的账户和密码,然后登录论坛,到管理界面将论坛的“联系我们”、“帮助”等ASP文件替换成我们的海阳项端代码,然后执行GUEST权限的CMD命令,方便的上传/下载将定程序、远程执行程序等,这样一个隐藏的后门就建好了!取得服务器的SYSTEM权限就看大家自己的办法了。
一般来讲,海洋的功能是非常强大的,而且不容易被查杀(一个朋友采取的方式是:先利用某个脚本漏洞上传网页后门程序,再通过海洋上传另一个后门到隐蔽的路径,然后通过最后上传的后门来删除第一次上传的海洋,这样后门的存放路径就可以放得非常深了,普通管理员是很难发现的),如果管理员觉得自己可能中了这里边样的后门,可以利用论坛备份来恢复自己的页面系统,再配合系统日志、论坛日志等程序检查系统,发现可疑ASP文件打开看看海洋是很好识别的,再删除就可以了。
脚本方面的后门还有CGI和PHP两面三刀大类,使用原理都差不多,这里就不再多介绍,在黑防论坛也收录了这三种后门,大家可以下载后自己研究。
【编辑推荐】
做的只是对代码传递一些参数。比如,攻击代码要求执行“exec (“/bin/sh”)”,而在libc库中的代码执行“exec (arg)”,其中arg使一个指向一个字符串的指针参数,那么攻击者只要把传入的参数指针改向指向”/bin/sh”。
二.2 控制程序转移到攻击代码的方法
所有的这些方法都是在寻求改变程序的执行流程,使之跳转到攻击代码。最基本的就是溢出一个没有边界检查或者其它弱点的缓冲区,这样就扰乱了程序的正常的执行顺序。通过溢出一个缓冲区,攻击者可以用暴力的方法改写相邻的程序空间而直接跳过了系统的检查。
分类的基准是攻击者所寻求的缓冲区溢出的程序空间类型。原则上是可以任意的空间。实际上,许多的缓冲区溢出是用暴力的方法来寻求改变程序指针的。这类程序的不同之处就是程序空间的突破和内存空间的定位不同。主要有以下三种: 1、活动纪录(Activation Records):
每当一个函数调用发生时,调用者会在堆栈中留下一个活动纪录,它包含了函数结束时返回的地址。攻击者通过溢出堆栈中的自动变量,使返回地址指向攻击代码。通过改变程序的返回地址,当函数调用结束时,程序就跳转到攻击者设定的地址,而不是原先的地址。这类的缓冲区溢出被称为堆栈溢出攻击(Stack Smashing Attack),是目前最常用的缓冲区溢出攻击方式。
2、函数指针(Function Pointers):
函数指针可以用来定位任何地址空间。例如:“void (* foo)()”声明了一个返回值为void的函数指针变量foo。所以攻击者只需在任何空间内的函数指针附近找到一个能够溢出的缓冲区,然后溢出这个缓冲区来改变函数指针。在某一时刻,当程序通过函数指针调用函数时,程序的流程就按攻击者的意图实现了。它的一个攻击范例就是在Linux系统下的superprobe程序。
3、长跳转缓冲区(Longjmp buffers):
在C语言中包含了一个简单的检验/恢复系统,称为setjmp/longjmp。意思是在检验点设定“setjmp(buffer)”,用“longjmp(buffer)”来恢复检验点。然而,如果攻击者能够进入缓冲区的空间,那么“longjmp(buffer)”实际上是跳转到攻击者的代码。象函数指针一样,longjmp缓冲区能够指向任何地方,所以攻击者所要做的就是找到一个可供溢出的缓冲区。一个典型的例子就是Perl 5.003的缓冲区溢出漏洞;攻击者首先进入用来恢复缓冲区溢出的的longjmp缓冲区,然后诱导进入恢复模式,这样就使Perl的解释器跳转到攻击代码上了。
二.3代码植入和流程控制技术的综合分析
最简单和常见的缓冲区溢出攻击类型就是在一个字符串里综合了代码植入和活动纪录技术。攻击者定位一个可供溢出的自动变量,然后向程序传递一个很大的字符串,在引发缓冲区溢出,改变活动纪录的同时植入了代码。这个是由Levy指出的攻击的模板。因为C在习惯上只为用户和参数开辟很小的缓冲区,因此这种漏洞攻击的实例十分常见。
代码植入和缓冲区溢出不一定要在在一次动作内完成。攻击者可以在一个缓冲区内放置代码,这是不能溢出的缓冲区。然后,攻击者通过溢出另外一个缓冲区来转移程序的指针。这种方法一般用来解决可供溢出的缓冲区不够大(不能放下全部的代码)的情况。
如果攻击者试图使用已经常驻的代码而不是从外部植入代码,他们通常必须把代码作为参数调用。举例来说,在libc(几乎所有的C程序都要它来连接)中的部分代码段会执行“exec(something)”,其中somthing就是参数。攻击者然后使用缓冲区溢出改变程序的参数,然后利用另一个缓冲区溢出使程序指针指向libc中的特定的代码段。
三、 缓冲区溢出攻击的实验分析
2000年1月,Cerberus 安全小组发布了微软的IIS 4/5存在的一个缓冲区溢出漏洞。攻击该漏洞,可以使Web服务器崩溃,甚至获取超级权限执行任意的代码。目前,微软的IIS 4/5 是一种主流的Web服务器程序;因而,该缓冲区溢出漏洞对于网站的安全构成了极大的威胁;它的描述如下:
浏览器向IIS提出一个HTTP请求,在域名(或IP地址)后,加上一个文件名,该文件名以“.htr”做后缀。于是IIS认为客户端正在请求一个“.htr”文件,“.htr”扩展文件被映像成ISAPI(Internet Service API)应用程序,IIS会复位向所有针对“.htr”资源的请求到 ISM.DLL程序 ,ISM.DLL 打开这个文件并执行之。
浏览器提交的请求中包含的文件名存储在局部变量缓冲区中,若它很长,超过600个字符时,会导致局部变量缓冲区溢出,覆盖返回地址空间,使IIS崩溃。更进一步,在如图1所示的2K缓冲区中植入一段精心设计的代码,可以使之以系统超级权限运行。
四、缓冲区溢出攻击的防范方法
缓冲区溢出攻击占了远程网络攻击的绝大多数,这种攻击可以使得一个匿名的Internet用户有机会获得一台主机的部分或全部的控制权。如果能有效地消除缓冲区溢出的漏洞,则很大一部分的安全威胁可以得到缓解。
目前有四种基本的方法保护缓冲区免受缓冲区溢出的攻击和影响。在四.1中介绍了通过操作系统使得缓冲区不可执行,从而阻止攻击者植入攻击代码。在四.2中介绍了强制写正确的代码的方法。在四.3中介绍了利用编译器的边界检查来实现缓冲区的保护。这个方法使得缓冲区溢出不可能出现,从而完全消除了缓冲区溢出的威胁,但是相对而言。
【编辑推荐】