它们的屠城史--木马技术发展趋势与回顾(转贴36)

一. 跟不上时代的安全教科书
    新的学期开始了,某大学网络管理专业三年级的同学们显得特别兴奋,这个学期的课程安排里终于出现了“网络安全”课程,一直对安全技术甚至黑客攻防手段感兴趣的同学更是对这门课程充满了期待,可是在几天的课程下来以后,同学们的兴奋之火却被浇熄了不少:首先学校颁发的教材书籍里的示例系统是Windows NT 4.0和Windows 98的安全攻防和简单的木马检测,而同学们用的都是Windows XP,和NT的简陋界面怎么都联系不到一块;其次负责此课程的老师完全是属于依葫芦画瓢的教学模式,甚至某次一个同学提问如何检测查杀灰鸽子木马的时候,老师足足盯了该同学5分钟以后才冒出一句“用正版杀毒软件啊!”。

    如此几次下来,同学们已经明白,他们接触到的所谓网络安全教育,已经是被这个社会淘汰了的东西,一段时间后,网络安全课创下了学生逃课最多、学生最不配合教师工作的记录,在面对辅导员在班会上的批评时,他们只能默默的在心里念叨:学这些被淘汰的东西,会在实际生活中真实有用的吗?我们连自己机器上的木马病毒都不知道怎么找出来,何况更深入的网络安全学习?

    这是一个疯狂的网络时代,每隔一段时间就有大量新的漏洞被发掘出来,公开的、未公开的、地下流通的,最终都被别有用心的人制成入侵工具、新型后门、蠕虫、流氓软件等,在广大对计算机处于懵懂状态的用户看来,这么多术语他们并不去关心,他们所关心的是,自己正在用的防火墙产品有效吗?而大量事实却告诉我们,近年来反病毒产品的有效率正在逐步降低,在一部分用户眼里,如何配合第三方工具手工检测查杀木马正是他们迫切需要了解的,而这一切的基础,却又要涉及到各种基础概念的理解消化,以及,木马等恶意软件的发展过程……

二. 近代木马与恶意程序发展史

    自BO、冰河诞生以来,国内的木马历史便正式展开了,下面我们以技术的发展突破作为界限,分别说说他们的历史和发展趋势。

混沌时代:单打独斗的后台运行程序

    早期的特洛伊木马后门先驱可以追溯到1997年那个网络在国内还未大量普及的时代,在当时,初期阶段的特洛伊木马技术在国外早已热火朝天,而国内众多用户却还在用着拨号上网偶尔浏览新闻和下载文件,只有少数用户知道并研究外国传入的英文界面特洛伊木马程序BO、SubSeven等,木马技术始终属于少数人手里的“高科技”入侵工具,直到国产木马“冰河”的出现和随后的几个版本升级,才标志着国内用户迎来了网络木马的混沌时代。冰河在2000年停止更新时放出的最后一个版本更是让大家第一次体会到了远程控制他人计算机的心跳感觉,于是冰河在短时间内就掀起了一股热潮,一时之间国内许多计算机都对外开放了被冰河驻扎的标志——7626端口,并且大量的扫描报告也都指向7626端口,随后众多带有模仿性质和改良优化的其他后门也相应出事,这个时代的后门入侵是极其简单的,究其原因,是由于那时候网络防火墙的雏形仍在探索发展阶段,大部分网络用户都是处于毫无防备的状态下,而且那时候又有几个人明白所谓的“安全问题”是什么东西呢?于是许多人依靠这些木马入了门。

    这一时期的木马在现在的时代眼光看来,都是及其简单的入门级产品了,但是由于当时的主流系统是安全性马马虎虎的Windows 9x系列,这些木马只需要简单的一些功能函数就实现了在任务管理器中的隐藏,而且由于当时并没有太多相对强大的第三方任务管理器,加上用户自身安全意识比现在相对更低,于是造就了一个木马招摇过市的时代。

    从技术上看,这时期的木马后门普遍都是运行于用户层(Ring3)上的隐藏了窗体并将自己在Windows9x中注册为“服务程序”(RegisterAsService)的后台网络应用程序,而且大部分并不存在自我保护功能,就连冰河的自我保护也是更改了一些常用文件如文本文件等类型的打开方式以实现的;这一时代的木马启动项也非常简单易找,就现在的木马发展程度来说,它们充其量只能作为初学者的木马查杀防范入门练习教材罢了,首先这些木马的标准运行环境是毫无安全防御可言的Windows 9x系统,到了NT架构系统上甚至会直接报错退出运行了,只有少数木马对NT架构系统做了一点额外设置以便绕过Win9x专有的系统函数来确保运行顺利,但是这样的后果就是它们直接在NT系统自带的任务管理器中暴露并简单终结掉了;其次,用户只需要找到它的进程并终结,然后简单的清理一下启动项残留数据就完成了木马的查杀——大部分此类型的木马的全部家当就是一个能够自我复制到系统目录并设置自启动项的可执行程序而已,只要这个程序消失,就等于把整个木马扫地出门了。然而,由于这一时期的用户群体几乎没有安全意识和相应反病毒产品领域的空白,这一批木马技术先驱却为后面的木马发展打下了不可忽视的基础。

    对于第一代木马的查杀十分简单,使用现在的任意一个任务管理器甚至Windows 2000/XP自带的任务管理器就能发现其进程,通过与注册表启动项Run、RunServices的对比判断即可找出,然后直接终结其进程,删除对应文件和启动项信息,并检查EXE和TXT等文件的关联方式是否被“后门恢复程序”更改即可。
__page_break__
探索时代:被网络防火墙信任的内部间谍

    好景不长,随着越来越多用户对信息安全有了隐隐约约的需求和安全厂商适时推出了用于屏蔽过滤外部异常访问扫描的网络防火墙产品以后,许多用户即使对计算机处于朦胧状态,也会给自己安装一个网络防火墙产品——虽然用户可能根本连它的用处是什么都不知道;其次,网吧作为一种大众普遍上网场所也开始流行起来,初涉木马的试探者们很快发现他们无法成功对网吧里的电脑进行连接控制了,但是在网吧里使用木马连接Internet上的受感染机器却又不存在这个问题,这是为什么?因为网吧的内部网络环境是一个局域网,它使用私有IP地址进行通讯,对外部网络的访问出口是通过代理服务器(Proxy)或路由器NAT(网络地址转换,Network Address Translation)方式实现的,这两种方法都会屏蔽掉内部网络,所有内部网络中的计算机对于公共网络来说都是不可见的,也就是说,无论用户在网吧内部什么机器上种植了木马,那么只要他离开了网吧到外面的公共网络中意图对这个木马进行连接控制,他就会发现无论如何努力都做不到了,这是由于网吧对外提供的只是一个由网络接口设备负责通讯和地址转换的公共网络IP,用户在公共网络中执行的访问操作都只会被视为对这个网络接口设备的访问,而这个网络接口设备上是不可能存在用户刚才在网吧内部机器中设置的木马的,而且由于连接条件匹配不充分,它也不会把这个连接请求转交给内部网络中任何一台计算机,所以网吧内部网络里植入的木马根本就收不到来自外部的连接控制请求,自然也就无法工作了。

    这个现象直接导致了基于C/S(客户端/服务端)模式的传统木马在遇到网吧或者类似的局域网环境时无功而返,同时一部分安装了网络防火墙的用户也由于防火墙默认屏蔽了外部网络访问的大部分端口而幸免于难,在相当一段时间内造成了传统木马一蹶不振的局面,然而好景不长,在经过一段时间的沉寂后,一种新型的木马连接概念被提出来了,虽然其原理也是基于C/S模式的网络连接,但是在连接时却将态度转了180度:这次的入侵,发出第一个连接请求的不再是远程控制者使用的客户端,而是受害者的木马服务器端。第一个使用此概念的木马名为“网络神偷”,被设计用来从局域网内往外盗取文件数据。

    这个概念被业界称为“端口反弹”,它的实现思路是将以往的C/S模式来了个逆转:客户端开启一个本地端口来监听远方连接请求,而服务端却是通过一些方法获得客户端IP以后主动来连接它,最终实现远程控制。这个思路一下子就把网络防火墙打个措手不及,因为早期的防火墙开发者并未考虑过通过本机主动发起的连接也会出现这种意料之外的情况,而对于网吧等局域网环境,它们更只是会把这一行为视作用户发出的一次正常网络请求,于是,这个来自心灵地狱的连接请求最终和入侵者碰了头,连接成功后发生的事情就和传统木马所要做的所有事情一模一样了。

    在早期网络防火墙尚未出现记录本机主动连接请求的功能之前,要判断自己的机器上是否存在反弹型木马是一件比较困难的事情,因为使用端口反弹概念的服务端并不主动开放任何端口连接,在其未发起入侵连接之前,用户无法得知自己机器进程里是否有异常,直到它与远方入侵者建立了连接,用户才有可能在网络程序状态检测工具里看到一些对外连接的进程信息,可是这样主动对外连接的进程也太多了,如Internet Explorer、Foxmail、QQ等也都是主动对外连接的,一般的用户根本就无法将其判断分析出来。端口反弹型木马的出现虽然让入侵的隐蔽等级又提高了一个层次,但是它也不是无懈可击的,由于木马需要实现主动连接客户端的功能,而大部分入侵者是不会使用固定IP的,在生成木马服务端的时候就必须使用一个相对固定的公共网络连接方式让服务端以后能通过这个途径得到客户端的控制请求,这一途径经常是公共网络上的HTTP空间或FTP空间,随着技术发展还出现过依赖动态域名直达客户端的端口反弹型木马,它们与客户端建立连接的步骤是:
1.服务端根据入侵者预设的反弹依据,连接到一个指定的公共网络空间里,通过读取某个数据文件获得客户端的当前IP地址,这个数据文件是通过客户端的自动更新上传实现的。
2.获得IP地址数据后,服务端尝试与之建立连接
3.如果连接成功,则开始控制行为

   从上述步骤可以看出,反弹木马的连接过程相比于其它正常程序的网络连接,要多出一个获取客户端地址的步骤,这正是我们判断一个程序是否反弹木马的重要依据,针对这个特性,用户可以使用以下步骤判断一个程序是否反弹木马:
1.安装Iris、Ethereal等工具,然后重启计算机,重启完毕后不要进行网络连接,直接运行监听工具并设置Filter为监视端口80和21的TCP通讯
2.连接网络,查看监听工具的数据包捕获情况
3.如果出现HTTP或FTP请求,及时查看其报文内容,如果没有采取简单的加密文本,一般能直接看到发出的报文连接请求得到了一个带有IP地址的回应数据,记录其本机端口和远程地址端口信息
4.查看天网等防火墙的网络应用程序端口情况,找到匹配以上记录的那个进程,这个进程有超过80%的几率属于反弹木马

    如果是新类型的直接使用动态DNS解析IP地址的反弹木马呢?这种木马其实更好发现,只要设置监听工具的Filter为监听53端口,即可迅速发现这些特殊的域名解析包,由于动态域名的命名方式都具有一定的个性特征,而且它们的厂商信息都可以在网络上直接查到,这样一来即可迅速判断机器上是否存在反弹木马。

__page_break__
锋芒小露:“无进程”木马后门

    在2002年和2003年间,网络上出现了3款令当时的用户和安全技术者大呼头痛的木马作品“广外系列”,分别是“广外男生”、“广外女生”以及“广外幽灵”,这3个作品都使用了在当时颇感新鲜的技术“远程线程注射”,做到了国内真正意义上的第一款“无进程”木马——DLL木马。

    “广外男生”的主体是一个可执行程序EXE和一个动态链接库DLL,而EXE只是用于在开机时调用这个DLL执行木马主线程并使用“远程线程注射”(RemoteThread Inject)技术将DLL与这个EXE脱离开来,然后DLL的线程进入系统里现有的任意一个进程的内存空间中维持运行,而用于执行最初的DLL启动工作并实现在DLL被破坏时复活它的EXE会在DLL成功插入其他进程后自动退出,这种传统的DLL启动方式成为早期大量DLL木马的加载方式,所以它存在一个弱点:在计算机启动时用户如果查看任务管理器的速度稍微快一些,他就能看到一个迅速消失的进程,而且这时期的DLL木马虽然实施了无进程启动,但却是被动的加载方式,在如今可以枚举并终止进程中相关DLL模块的程序遍天下的现状中,任意一款具备进程模块查找功能的程序如Process Explorer、IceSword等都能将它们清理干净——它们的文件名太明显了。

    但是不得不否认,早期的DLL木马技术虽然只是个雏形,但它却是为如今到处横行的真正无第三方EXE加载项(使用特殊技术令系统外壳程序加载它)的众多恶意软件和木马的DLL主体的技术实现做了铺垫。从最初的第三方EXE加载DLL启动方式开始,到随后的使用rundll32.exe加载运行,再到利用NT服务的宿主程序svchost.exe实现启动,直到现在的技术巅峰——使用“ShellExecuteHook”(执行挂钩)技术。

    经常关注安全的用户或许会见到过“ShellExecuteHook”,如今许多木马和恶意程序都在用户层使用它作为启动方式了,但这是一种什么技术,大家可能又会迷惑不解了,究竟这个技术和木马有什么联系?其实这是一种正常的系统功能,名为“执行挂钩”,操作系统厂商开发它的初衷十分简单:为程序提供一个额外的通知功能,以实现系统中任何程序启动时都提前让使用了“执行挂钩”的程序收到新程序的启动通知,简单的说,这是操作系统在出于某种程序交互需求的考虑下所衍生的技术,它的作用就是让一部分程序能够在其他程序开始运行之前就得知有新程序即将运行的通知,以及这个程序的映像文件名称等信息,用于接收通知的程序必须遵循COM对象编程标准编写。
    这个技术是通过外壳程序Explorer.exe实现的,它的加载项被指定在系统注册表“HKLMSoftwareMicrosoftWindowsCurrentVersionExplorerShellExecuteHooks”内,用户浏览这里会发现里面并不是熟悉的路径和文件名,而是一堆奇怪组合的数字和字符串,这些字符串被称为“Class ID”(类唯一标识符,CLSID),每一个DLL模块都拥有属于它自己的唯一CLSID,操作系统自身是通过CLSID获得这个DLL的详细文件位置并加载它的。在执行挂钩技术里,这个注册表键里的数据就代表了申请接受通知的DLL模块的CLSID,当一个新程序执行时,系统会将这个消息通过注册表的执行挂钩入口派发出去,而后系统会载入这些符合COM对象标准的DLL文件以执行它预先定义的线程代码对消息进行处理,换句话说,也就是系统自己启动了声明为“执行挂钩”对象的DLL模块,它们的初次加载程序是外壳Explorer.exe。看到这里,各位是不是觉得这个过程很熟悉?没错,这简直就是第一代DLL木马依靠第三方EXE实现自启动的翻版,所不同的是,这次的DLL启动宿主是系统外壳自身,而且它还拥有一个任何第三方EXE宿主都无法具备的功能:确保DLL在每一个进程启动时自动加载运行。

    这个技术最早被杀毒软件用于实现提前检测功能,然而现在它却被恶意软件、木马后门等程序编写者大量的用在了不法行为之上,与IFEO的初衷一样,它们的功能都被曲解应用了。

    由于这个技术的执行逻辑使得木马主体DLL可以在每一个程序运行时也随着它执行并随之进入它的内存空间,成为其模块之一,也就是说,这个技术使得做了保护措施的DLL木马变得难以彻底查杀,而且它不会产生任何敏感位置的启动项,也不需要指明一个加载器——它的加载器就是Explorer.exe自身。而广大用户中,能够理解并找到这个注册表项的人不多。

    使用这个技术的木马如何查杀?其实别看它似乎很可怕,它也是有弱点的:由于这是Explorer实现的功能,它就必须依靠Explorer的存在而产生通知行为,一旦Explorer被终止执行,这类木马也就没有了加载器。大部分手工查杀木马的用户都发现使用这个技术的木马无法彻底删除,其实这与他们的使用习惯有关,大部分用户都是在需要用到什么工具的时候才会去运行它,那么回到开头对这个技术的解释来重新理解一下,你就会明白,这是因为你在其后运行其他工具的时候,执行挂钩又将木马DLL启动了一次,并可能产生了另一个随机字符串组合的DLL文件名来添加新的加载项,如此恶意循环,最终便无法彻底查杀。正确的做法是,在运行了一堆自己预料到会用上的功能以后,将Explorer.exe终止,避免执行挂钩再次被调用,随后使用工具争取一次就能把位于注册表入口ShellExecuteHooks 内的DLL注册信息和文件本体共同删除,这样一来即可将木马逐出机器。在工具的选择上我推荐Sysinternal的Autoruns,它提供的ShellExecuteHooks清理一体化功能非常不错。

__page_break__
漏洞先锋:网页木马

    网页木马并不是指使用网页编写的木马程序,也不是一种新的木马类型,而是一种通过浏览器漏洞实现普通木马传播的感染手段,这个时代里浏览器已经成为众多入侵途径的窗口,它们都是通过一些嵌入了特殊构造的漏洞执行代码的网页和脚本进行入侵的,其后果是浏览器代替用户自动运行了之前下载的木马程序,这一切,让人防不胜防。

    其实不仅仅是浏览器自身漏洞可以引发木马危机,各种以浏览器为执行宿主的BHO控件漏洞也同样可以导致浏览器崩溃或自行下载执行入侵者指定的页面,如支付宝、Web迅雷、百度搜霸、蓝天语音聊天室插件等IE控件都出现过危害程度高的漏洞。

    当一个被载入浏览器的控件出现漏洞时,对用户而言就等于是浏览器自身出了漏洞,因为它们形成了宿主关系,其影响已经形成一体了,当入侵者使用特殊编写的脚本诱使存在漏洞的控件发生溢出时,轻则控件发生崩溃直接导致浏览器也跟着崩溃,重则发生缓冲区溢出,执行来自浏览器传递的攻击代码ShellCode而导致用户机器变成一个“木马下载器”(Trojan-Downloader),自动下载执行木马等危害程序。

    网页木马的历史非常悠久,自从1999年MIME执行漏洞被公开后,早期的网页木马便宣告出世,如果你是那个时代就走过来的用户,你一定听说过“求职信”,它就是使用浏览器MIME漏洞传播的早期恶意程序之一,随后的“大无极”更是把漏洞影响扩散到了严重危害的程度。

    大部分网页木马的共同点都是依赖于用户机器的浏览器漏洞来实现下载木马本体执行的功能,在相关厂商未出有效的安全补丁之前,我们能做的只有通过某种手段预防漏洞危害,那就是利用浏览器自身提供的一个小功能将问题控件暂时屏蔽。细心的用户在阅读一些安全小组的漏洞分析报告时,经常会看到这么一句:“在软件厂商未发布安全补丁之前,我们建议用户对该控件设置Killbit”。那么,什么是“Killbit”?微软编号Q240797的知识库文章《如何禁止 ActiveX 控件在 Internet Explorer 中运行》一文对此做出了诠释:Internet Explorer 有一项安全功能,可用于禁止 Internet Explorer HTML 呈现引擎加载某个 ActiveX 控件。此功能可通过进行注册表设置来完成,这种设置叫做设置“killbit”。一旦设置了“killbit”,该控件即永远不可加载,即使将其完全安装也是如此。此设置可以确保,即使有漏洞的组件被引入或重新引入系统中,它也不具活性,没有破坏力。

    实际上,这一设置的本质是将存在漏洞的控件在浏览器里的兼容性标识设置为“不安全”,于是在预先设定的浏览器加载逻辑里,这一“不安全”的控件就不会被加载,从而保证浏览器不会携带着这个问题控件运行,其相关漏洞自然也就没有了入口。

    兼容性标识位于系统注册表的HKEY_LOCAL_MACHINESOFTWAREMicrosoftInternet ExplorerActiveX Compatibility下,其子键为各个ActiveX控件的CLSID(有关CLSID概念请参见本文上半部分),每个CLSID项里都有一个名为“Compatibility Flags”的DWORD类型值,当它的值为“0x00000400”即十六进制400或十进制1024时,浏览器就会认为这个控件不安全而将其忽略,同时微软还提供了“兼容的安全CLSID替代”功能,用于在对某个问题控件使用Killbit后指定的另一个功能替代控件,它是通过用户建立一个名为“AlternateCLSID”的字符串实现的,其内容为功能替代控件的CLSID。

地下工事破坏者:如今的主流技术“Rootkit”

    上面提到的木马和恶意程序手段其实都是在用户层Ring3级别运行的应用程序,所以它们无法做得非常厉害,只要用户使用适当的安全工具即可检测并除去,然而现在,技术的战斗转入了系统核心层Ring0。

    从最初的Rootkit概念提出到现在短短几年的时间里,Rootkit已经从一个神秘高深的危险技术变成了今天臭大街的东西,尤其是流氓软件更是争先恐后的使用这一技术达到自己无法被消灭的目的。用《大腕》里的一句经典台词评价,那就是“如果你写的恶意代码不到Rootkit级别,那你都不好意思发布出来炫耀!”,如果当初说Rootkit是木马界里的艾滋病,那么今天的网络世界早已成为一个艾滋病村。

    Rootkit技术是如今这个时代的研究主流,从最初的可以在安全模式里轻易发现并删除的灰鸽子保护驱动、3721保护驱动等,到现在的无视安全模式照常运行的驱动,它们在Ring0层里实现的功能早已不再是简单的文件隐藏保护手段,而是到了全面负责的地步,例如有一种Rootkit分为Ring3层执行程序和Ring0驱动两部分,而它的Ring3启动项是一般用户无论如何也找不出来的,因为它的驱动实现的功能是在用户系统每次启动进入桌面,所有启动项都未加载时将Ring3层可执行程序的路径写入启动项,当桌面加载完毕、所有启动项都执行完毕后,驱动又做了一件事情,它将刚才自己写入的启动项删除了,如此一来,不知情的用户根本就不知道自己机器上存在过如此险恶的东西。

. 结语:我们还能做什么

    毫无疑问,虽然每个时代的用户都在经历着木马的来袭,但是很明显,早期的用户要过得更舒服一些,因为那时候还没有Rootkit,还没有这么多DLL木马,更没有现在这种满大街会武术的流氓景象。时代在发展,这些技术也会在彼此争斗之中各自获得突破口而往更高的等级发展,只是每个时代的初级用户都不可能和当今的技术同步,于是用户成了技术发展的受害方。并非每个用户都是安全专家,所以我们寄希望于反病毒产品,但它毕竟是商业的产品,并非所有用户都能获得足够的更新,如果有一天用户机器上的反病毒产品成为了傀儡,而用户仍在毫不知情的信任它的扫描结果,那会是什么样的一种情形呢?在这个相对险恶的网络环境里,我们还能怎样做?





以下说明属本文之一部分:
转载请保持完整并注明:转自 金刀客[www.daokers.com]


[本日志由 admin 于 2008-02-20 07:27 PM 编辑]
相关日志:
在线RSS阅读器订阅:
feedsky
抓虾 pageflakes Rojo google reader
my yahoo newsgator bloglines 有道
鲜果 飞豆 哪吒 Netvibes
Netvibes Netvibes

手机订阅:


本站订阅地址:
RSS2:点击复制
Atom:点击复制
        本站所有原创文章均遵循 [创作共用协议]
        本站原创文章可以转载,但须保持完整性并注明出处。
        COPYRIGHT 2008-2010  §  HTTP://WWW.DAOKERS.COM  §    ALL RIGHTS
评论: 2 | 引用: 0 | 查看次数: -
回复回复我最笨[2009-12-31 04:00 PM | del]
受益匪浅,虽然迷茫,还是顶了,100.1
回复来自 金刀客 的评论 金刀客 于 2009-12-31 09:34 PM 回复
呵呵,100.1,欢迎多来顶顶
回复回复504048981[2009-12-29 00:19 AM | del]
Microsoft JET Database Engine 错误 '80004005'

不能使用 '';文件已在使用中。

回复来自 金刀客 的评论 金刀客 于 2009-12-29 09:06 AM 回复
,郁闷,调试几次了还有这个问题,我再看看,谢谢了

回复来自 金刀客 的评论 金刀客 于 2009-12-29 10:02 AM 回复
找到问题了,没有给目录适当的权限,谢谢提醒,:-D
发表评论
昵 称:
密 码: 游客发言不需要密码.
验证码: 验证码提示:单击自动获取验证码
内 容:
最多可输入,当前共,还可输入
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.