“我想,我们应该烧掉这个东西。”3000多年前,面对希腊人突然遗留在战场废墟上的这只巨大的木马,特洛伊王国的小王子帕里斯对他的父王说。因为他有一种不安的感觉,这个突然出现的物体会带来厄运。然而没有人听他的话,整个军队固执的把这只庞然大物作为战利品运回了城里。几天后的夜里,藏在木马里的希腊士兵从内部打开了特洛伊那坚不可摧的城门――特洛伊因此沦陷。如果帕里斯仍有灵魂存在的话,他也许会苦苦思索这个问题:如果当初我坚持把这个带来厄运的东西焚烧掉,那么特洛伊将会是怎样一种结局呢?
请允许我改编情感作家姜汤的一句话:“二十一世纪的网络是木马横行的世界,人类在解决病毒战争之后,最大的困惑就是木马后门的攻防难题。”
众所周知,木马(Trojan,或称后门“BackDoor”)是一种危害巨大的程序,它们让被害的计算机对着未知的入侵者敞开了大门,使得受害者的系统和数据暴露在混乱的网络世界里。和病毒一样,木马也经历了好几代的演变,使得它越藏越深,成为另一种难以揪除的寄生虫。
――如果,我们趁早把木马焚烧掉呢?
认识木马
简言之,信息领域的木马,就是一种能潜伏在受害者计算机里,并且秘密开放一个甚至多个数据传输通道的远程控制程序,它由两部分组成:客户端(Client)和服务器端(Server),客户端也称为控制端。木马的传播感染其实指的就是服务器端,入侵者必须通过各种手段把服务器端程序传送给受害者运行,才能达到木马传播的目的。当服务器端被受害者计算机执行时,便将自己复制到系统目录,并把运行代码加入系统启动时会自动调用的区域里,借以达到跟随系统启动而运行,这一区域通常称为“启动项”。当木马完成这部分操作后,便进入潜伏期――偷偷开放系统端口,等待入侵者连接。到此为止,木马还只处于被特洛伊的市民拉入城内的阶段,是不会进行破坏行动的。
当入侵者使用客户端连接上木马服务器端开放的端口后,特洛伊的城门就被打开了,到这里,木马的噩梦才正式开始……
所以,在木马屠城的军号吹响之前,如果帕里斯及时点燃了这只庞然大物,特洛伊也许就不会消失――至少,它不会是被一只木马给毁掉的。
阻止木马进城――不同时期的木马形态与相应的系统保护
特洛伊被木马计的前提是因为特洛伊人自己把藏有希腊士兵的木马运进了城内,让木马计得以成功实施,换个角度,如果当初特洛伊人任凭木马搁在海滩上发霉发臭,或者直接焚烧了这只装载着厄运的东西,那么“特洛伊木马”将会被作为与“马奇诺防线”同样性质的著名无效战略而被列入史册,而且后世可能再也不会采用这种攻击手段。
但是希腊人的木马计成功了,正如现在数以千计的现代网络木马计成功了一样。现代的希腊人――入侵者积极使用各种手段让现代的特洛伊人――受害者把那只木马程序高高兴兴的领回家去。
早期的防病毒思想并不盛行,那时候的网民也比较单纯,使用网络防火墙的人也只有少数,所以那时候的入侵者可以算是幸福的,他们只需要一点简单的社会工程学手段就能把木马程序传输给对方执行,这一时期的木马种植手段(如今的普遍称谓为“下马”)基本上不需要牵涉到技术,也许唯一需要的技术就是如何配置和使用一个木马,因为那时候木马也还是个新产物而已。那时候的网民,只能依靠自己的判断和技术,才能免受或摆脱木马之害。因此,当木马技术刚在国内开始的时候,任意一个IP段都有可能存在超过40%的受害计算机开放着大门等待入侵者进攻,可以毫不夸张的说,那时候是木马的第一黄金时期,惟一美中不足的制约条件就是当时的网络速度普遍太慢了。
随着时间的流逝,木马技术发展日益成熟,但网民的安全意识也普遍提高,更出现了初期的病毒防火墙概念,这个时期的入侵者必须掌握更高级的社会工程学手段和初期的入侵技术才能让对方受害了,这时期的木马虽然隐蔽性有了相对提高,但仍然是基于客户端寻找连接服务器端的模式。由于出现了病毒防火墙,网民判断和查杀木马的效率大大提高,而且大部分人也知道“人心不古”了,不再轻易接收陌生人给的程序,使得木马不再像上时期那样肆无忌弹的横行,但是因为病毒防火墙是个新兴产物,仍然有相对多的人没有安装使用,以至于许多老旧的木马依然可以横行无忌。
再后来,随着网络防火墙技术诞生和病毒防火墙技术的成熟,木马作者被迫紧跟着防病毒厂商的脚步更新他们的作品以避免马儿过早“殉职”,同时由于网络防火墙技术的出现,让计算机与网络之间不再直接,尤其是网络防火墙实现的“拦截外部数据连接请求”与“审核内部程序访问网络请求”的策略,导致大部分木马纷纷失效,这时期的木马逐渐分裂成两个派别:一种依然采用客户端连接服务器端的方式,只是改为了其他传输途径,如E-MAIL、FTP等,或者在内部除掉网络防火墙,以便自己畅通无阻;另一种则改变了入侵的思维,把“客户端连接服务器端”变为“服务器端连接客户端”,再加上一点社会工程学技术,从而突破了网络防火墙的限制,也因此诞生了一种新的木马技术――“反弹型”木马。这一时期里,入侵者与受害者之间的战争终于提升到技术级别,若想保护自己,除了安装网络防火墙和病毒防火墙,以及接触网络攻防技术以外别无他法,这个“基础互动”一直保持到今天的XP时代。
到了XP时代,网络速度有了质的飞跃,黑客攻防战更是越来越多的浮上水面,因为系统变了,一个专门为网络应用而诞生的操作系统,必定会存在与网络有关的缺陷。没错,WinXP相对于Win9x的弱点就是它的网络漏洞太多了,无论是利用MIME漏洞传播的信件木马,还是通过LSASS溢出而放下的木马,都能在XP系统上分到一块肉。你也许会说,Win9x同样有许多漏洞,但是为什么它没有XP的烦恼?这是因为Win9x的网络功能太弱了,几乎没有什么系统组件需要依靠网络运行!所以现在的用户,除了使用网络防火墙和病毒防火墙把自己包裹得严严实实以外,还要三天两头去微软的系统更新站点安装各种漏洞修复程序……
别让士兵们下马!――防止木马启动
话说藏在木马里的希腊士兵入城以后,并没有急着下马屠城,而是待到夜深人静之时,才出来打开了牢固的城门,为特洛伊的毁灭奏响了哀歌。而计算机内部没有人类社会的地理和时间关系,即使你的硬盘里现在就存放着100个木马程序,它们也比特洛伊海滩上那只大木马的处境好不到哪里去,因为对于操作系统来说,任何有害程序只要没有运行,它就可以等同于那些未能下马的士兵,一律视为无害。要让系统变成特洛伊城的黑夜,唯一的方法只能是启动木马的服务器端,而启动木马的最简单途径,就是通过“启动项”加载运行。
任何操作系统都会在启动时自动运行一些程序,用以初始化系统环境或额外功能等,这些被允许跟随系统启动而运行的程序被放置在专门的区域里供系统启动时加载运行,这些区域就是“启动项”,不同的系统提供的“启动项”数量也不同,对于Win9x来说,它提供了至少5个“启动项”:DOS环境下的Autoexec.bat、Config.sys,Windows环境下的“启动”程序组、注册表的2个Run项和1个RunServices项,分别是:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunServices
到了2000/XP系统时代,DOS环境被取消,却新增了一种称之为“服务”的启动区域,注册表也在保持原项目不变的基础上增加了2个“启动项”:
项目 键名
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows AppInit_DLLs
HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows run
这么多的启动入口,木马自然不会放过,于是我们经常在一些计算机的启动项里发现陌生的程序名,这时候就只能交由你或者病毒防火墙来判断了,毕竟系统自身会在这里放置一些必要的初始化程序,还有一些正常工具,包括病毒防火墙和网络防火墙,它们也必须通过启动项来实现跟随系统启动。
此外还有一种不需要通过启动项也能达到跟随系统启动的卑劣手法,那就是“系统路径遍历优先级欺骗”,Windows系统搜寻一个不带路径信息的文件时遵循一种“从外到里”的规则,它会由系统所在盘符的根目录开始向系统目录深处递进查找,而不是精确定位的,这就意味着,如果有两个同样名称的文件分别放在C:\和C:\Windows下,Windows会执行C:\下的程序,而不是C:\Windows下的。这样的搜寻逻辑就给入侵者提供了一个机会,木马可以把自己改为系统启动时必定会调用的某个文件名,并复制到比原文件要浅一级以上的目录里,Windows就会想当然的执行了木马程序,系统的噩梦就此拉开序幕。这种手法常被用于“internat.exe”,因为无论哪个Windows版本的启动项里,它都是没有设置路径的。
要提防这种占用启动项而做到自动运行的木马,用户必须了解自己机器里所有正常的启动项信息,才能知道木马有没有混进来。至于利用系统路径漏洞的木马,则只能靠用户自己的细心了。
为什么它无法根除?――文件并联型木马的查杀
某些用户经常会很郁闷,自己明明已经删除了木马文件和相应的启动项,可是不知道什么时候它自己又原封不动的回来了,这还不算,更悲惨的是有时候杀掉某个木马后,系统也出了故障:所有应用程序都打不开了。这时候,如果用户对计算机技术的了解仅限于使用杀毒软件,那可只能哭哭啼啼的重装系统了!
为什么会这样?难道这种木马还恶意修改了系统核心?其实答案很简单,因为这种木马修改了应用程序(EXE文件)的并联方式。
什么是“并联方式”呢?在Windows系统里,文件的打开操作是通过注册表内相应键值指定的应用程序来执行的,这个部分位于注册表的“HKEY_CLASSES_ROOT”主键内,当系统收到一个文件名请求时,会以它的后缀名为依据在这里识别文件类型,进而调用相应的程序打开。而应用程序自身也被视为一个文件,它也属于一种文件类型,同样可以用其他方式开启,只不过Windows设置它的调用程序为“"%1" %*”,让系统内核理解为“可执行请求”,它就会为使用这种打开方式的文件创建进程,最终文件就被加载执行了,如果有另外的程序更改了这个键值,Windows就会调用那个指定的文件来开启它。一些木马程序把EXE后缀名对应的exefile类型的“打开方式”改成了“木马程序 "%1" %*”,运行程序时系统就会先为“木马程序”创建进程,把紧跟着的文件名作为参数传递给它执行,于是在我们看来程序被正常启动了。因为木马程序被作为所有EXE文件的调用程序,使得它可以长期驻留内存,每次都能恢复自身文件,所以在一般用户看来,这个木马就做到了“永生不死”。然而一旦木马程序被删除,Windows就会找不到相应的调用程序,于是正常程序就无法执行了,这就是所谓的“所有程序都无法运行”的情况来源,并不是木马更改了系统核心,更没必要因此重装整个系统。
根除这种木马的最简单方法只需要查看EXE文件的打开方式被指向了什么程序,立即停止这个程序的进程,如果它还产生了其他木马文件的话,也一起停止,然后在保持注册表编辑器开启着的情况下(否则你的所有程序都会打不开了)删除掉所有木马文件,把exefile的“打开方式”项(HKEY_CLASSES_ROOT\exefile\shell\open\command)改回原来的“”%1” %*”即可。
如果删除木马前忘记把并联方式改回来,就会发现程序打不开了,这时候不要着急,如果你是Win9x用户,请使用“外壳替换大法”:重启后按F8进入启动菜单选择MS-DOS模式,把Explorer.exe随便改个名字,再把REGEDIT.EXE改名为Explorer.exe,再次重启后会发现进入Windows只剩下一个注册表编辑器了,赶快把并联方式改回来吧!重启后别忘记恢复以前的Explorer.exe。
对于Win2000/XP用户而言,这个操作更简单了,只要在开机时按F8进入启动菜单,选“命令提示符的安全模式”,系统就会自动调用命令提示符界面作为外壳,直接在里面输入REGEDIT即可打开注册表编辑器!XP用户甚至不需要重启,直接在“打开方式”里浏览到CMD.EXE就能打开“命令提示符”界面运行注册表编辑器REGEDIT.EXE了。
偷梁换柱――追回被盗的系统文件
除了添加自己到启动项、路径欺骗和更改文件并联以外,一般的木马还有一种计俩可以使用,那就是替换系统文件。由于如今的操作系统都是由许多文件共同构造的,并不是所有用户都能明白系统文件夹里每个文件的作用,这就给了木马可乘之机,它们盯上了系统里那些换嵛:Φ较低痴?T诵卸?志?;岜坏饔玫某绦蛭募??袷淙敕ㄖ甘境绦蜷nternat.exe、让动态链接库可以像程序一样运行的rundll32.exe等。木马先把系统原来的文件改名成只有它们自己知道的一个偏僻文件名,再把自己改名成那个被替换的文件,这样就完成了隐藏极深的感染工作,从此只要系统需要调用那个被替换的程序进行工作,木马就能继续驻留内存了。那么文件被替换会不会导致系统异常呢?只要木马没有被删除,就不会造成系统异常,因为木马在作为原来的程序而被系统启动时,会获得一个由系统传递来的运行参数,这就是系统要求该程序工作的关键所在,木马会直接把这个参数传递给被改名的程序执行,像接力比赛那样完成数据操作,这样在系统看来就是命令被正常执行了,自然不会出现异常。但是也因为这样的特性导致木马被查杀后,系统的某些命令无法传递到本该执行操作的程序中,反而让系统出错了。
要修复它其实很简单,只要记住这个木马的文件名,在删除它之后再从系统光盘复制一个“原配”文件就可以了,如果没有系统光盘,就必须通过工具追踪木马传递参数的目标程序名,再把它改回来。
结束语
木马的发展促进了安全技术的提高,而安全技术的提高又迫使木马必须往更高的级别发展,到现在木马已经形成了多个派系的共存,侦测它们的方法也不能再像以前那样简单了,例如检测异常端口的方法对于反弹木马而言是无效的,它并不在本机开放端口;就算防火墙能阻止内部未授权程序访问网络,但那只能针对TCP/UDP协议的木马,别忘记了还有ICMP后门的存在,防火墙通常不会阻止这类报文的。虽然ICMP协议的数据报文能完成的事情相对较少,但是对于一般的命令控制,它已经足够了……