-
利用线程注射技术隐藏自己的病毒
来源:赛迪网病毒求助专区 作者:sunlizc
隐藏是病毒的天性,在业界对病毒的定义里,“隐蔽性”就是病毒的一个最基本特征,任何病毒都希望在被感染的计算机中隐藏起来不被发现,因为病毒都只有在不被发现的情况下,才能实施其破坏行为。为了达到这个目的,许多病毒使用了各种不同的技术来躲避反病毒软件的检验,这样就产生了各种各样令普通用户头痛的病毒隐藏形式。由于木马后门的行为特征已具备病毒条件,因此这里把木马后门也统一归纳为病毒来描述。
开山鼻祖:隐藏窗口 & 隐藏进程 & 隐藏文件
在计算机流行的早期,计算机病毒和木马后门等危害程序在普通用户范围的普及并不是很广泛,这个时期的用户群对计算机和网络安全的防范意识可以说是几乎没有的,普通用户的系统也多为脆弱的Windows 95/98系列和电话线拨号的慢速网络,而那一段时间正是外国木马“bo”和国产木马雏形“冰河”、“netspy”等在如今看来各方面技术都颇为简单的远程控制软件大行其道的黄金时期,很多用户根本就没有防火墙和杀毒软件(即使有,也是以杀cih的为主),即使远方的黑客把用户的计算机翻了个底朝天,用户也不会有所察觉,这一时期接触此类技术的人相对较少,因此并未造成如今这个病毒到处蔓延的局面。
因为这个阶段国内用户的机器环境仍然以Windows 9x为主流,所以病毒编写者们并不需要消耗太多的脑筋就可以做到让病毒悄无声息运行的效果,并让它在alt+del+ctrl呼出的任务管理器中不可见。
我们都知道,在Windows下运行的程序界面都被定义为“窗口”,程序通过这个途径与用户产生交互,每个完整的程序都必须拥有至少一个窗口,但是如果编写者将这个窗口在运行期间设置为“不可见”呢?这样一来,用户就不会察觉到这个程序在桌面上运行了,但是如果有一定经验的用户打开任务管理器,他就会因为发现系统里多出来的进程而产生怀疑,因此病毒编写者在这个时期采取了初级形式的隐藏手段:隐藏进程。
其实所谓隐藏进程,是利用微软未公开的一个api(application programming interface,应用程序接口)函数“registerserviceprocess”将自身注册为“服务进程”,而恰巧Windows 9x中的任务管理器是不会显示此类进程的,结果就被病毒钻了空子,让“冰河”等木马在国内大部分普通用户的机器上安家落户。
而早期后门技术里,还有一个最基本的行为就是隐藏文件,与今天的各种隐藏手段相比,它可谓是“不入流”级别了——这里提到的“隐藏”,就是简单的将文件属性设置为“隐藏”而已,除此之外,再无别的保护手段了,然而,由于系统设计时为了避免初学者胡乱删除文件而默认“不显示系统和隐藏文件”的做法(到了Windows 2000/xp时代,这个做法更升级到“隐藏受保护的系统文件”了),却恰好给这些病毒提供了天然的隐身场所——大部分对电脑操作不熟悉的用户根本不知道“隐藏文件”的含义,更别提设置为“显示所有文件”了,在那个安全软件厂商刚开始探索市场的时代,用户更是不会留意太多安全产品及其实际含义,因而这个时期成了各种初期木马技术发展的重要阶段,利用这种手段制作的木马被统称为“第一代木马”。
以现在的技术和眼光看来,这些早期技术作品的发现和清理是相对较简单的了,因为它们采用的“进程隐藏”技术在nt体系上的Windows2000/xp/2003等操作系统上已经无效了,直接使用系统自带的任务管理器便能发现和迅速终止进程运行,而后在“控制面板”——“文件夹选项”里面设置“显示所有文件”和取消“隐藏受保护的系统文件”,就能发现那个被隐藏起来的木马程序了。对于Windows 9x用户,使用任意一款第三方的进程管理工具如“Windows优化大师”的进程管理组件即可轻松发现。
继续发展:使用线程注射技术的dll木马
虽然现在使用“线程注射”的木马病毒和流氓软件已经遍地开花了,但是从那个混沌时代经历过来的人都不会忘记首个采用“线程注射”的dll木马“广外幽灵”在当时所带来的恐惧,“线程注射”到底是种什么东西呢?下面就让我们来详细讲解一下。
首先,用户可能不会了解“线程”(thread)的意思,而要讲解“线程”,就不能不先提到“进程”(process)的概念。许多刚接触计算机的用户无法理解“进程”是什么东西:常常听到高手说打开任务管理器关闭某某进程,但是一看到任务管理器列表里的一堆东西,头就大了。许多用户知道使用任务管理器关闭一些失去响应的任务,但是如果某个任务没有在“应用程序”列表里出现,用户就不知所措了。到底什么是“进程”呢?“进程”是指一个可执行文件在运行期间请求系统在内存里开辟给它的数据信息块,系统通过控制这个数据块为运行中的程序提供数据交换和决定程序生存期限,任何程序都必须拥有至少一个进程,否则它不被系统承认。进程从某一方面而言就是可执行文件把自身从存储介质复制在内存中的映像,它通常和某个在磁盘上的文件保持着对应关系,一个完整的进程信息包括很多方面的数据,我们使用进程查看工具看到的“应用程序”选项卡包含的是进程的标题,而“进程”选项卡包含的是进程文件名、进程标识符、占用内存等,其中“进程文件名”和“进程标识符”是必须掌握的关键,“进程标识符”是系统分配给进程内存空间时指定的唯一数字,进程从载入内存到结束运行的期间里这个数字都是保持不变的,而“进程文件名”则是对应着的介质存储文件名称,根据“进程文件名”我们就可以找到最初的可执行文件位置。
任务管理器的“应用程序”项里列出来的“任务”,是指进程在桌面上显示出来的窗口对象,例如用户打开word 2003撰写文档,它的进程“winword.exe”会创建一个在桌面上显示的前台窗口,这个窗口就是任务管理器里看得见的“任务”了,而实际上真正在运行的是进程“winword.exe”。并不是所有的进程都会在任务管理器里留下“任务”的,像qq、msn和所有后台程序,它们并不会在任务列表里出现,但是你会在进程列表里找到它们,如果要它们在任务列表里出现该怎么办呢?只要让它们产生一个在桌面上出现的窗体就可以了,随便打开一个好友聊天,就会发现任务列表里终于出现了qq的任务。因此,真正科学的终止程序执行方案是针对“进程”来结束程序的运行,而不是在任务列表里关闭程序,因为木马作者们是不会让自己的木马在任务列表里出现的,但是进程列表里一般人都是逃不过的。
而“线程”,则是在一个进程里产生的多个执行进度实例,举个简单例子,一个网络文件传输程序如果只有一个线程(单线程)运作,那么它的执行效率会非常低下,因为它既需要从网络上读取文件数据,又需要把文件保存到磁盘,同时还需要绘制当前传输进度条,由于在代码的角度里这些操作只能一条条的顺序执行,程序就不能很好的做到在保存数据的同时绘制传输进度条,即使程序员将其勉强凑到一块执行,在用户方面看来,这个程序的响应会非常缓慢甚至直接崩溃,而“多线程”技术则是为了解决这种问题而产生的,采用“多线程”技术编写的应用程序在运行时可以产生多个同时执行的操作实例,例如一个采用“多线程”技术的网络文件传输程序就能同时分出三个进度来同时执行网络数据传输、文件保存操作和绘制传输进度条的操作,于是在用户看来,这个程序运行非常流畅,这就是线程的作用。在程序运行时,只能产生一个进程,但是在这个进程的内存空间(系统为程序能正常执行而开辟的独立内存领域)里,可以产生多个线程,其中至少有一个默认的线程,被称为“主线程”,它是程序主要代码的运行部分。
那么,“线程注射”又是什么含义呢?其实它的全称是“远程线程注射”(remotethread injection),通常情况下,各个进程的内存空间是不可以相互访问的,这也是为程序能够稳定运行打下基础,这个访问限制让所有进程之间互相独立,这样一来,任何一个非系统关键进程发生崩溃时都不会影响到其他内存空间里的进程执行,从而使nt架构的稳定性远远高于win9x架构。但是在一些特定的场合里,必须让进程之间可以互相访问和管理,这就是“远程线程”技术的初衷,这个技术实现了进程之间的跨内存空间访问,其核心是产生一个特殊的线程,这个线程能够将一段执行代码连接到另一个进程所处的内存空间里,作为另一个进程的其中一个非核心线程来运行,从而达到交换数据的目的,这个连接的过程被称为“注射”(injection)。远程线程技术好比一棵寄生在大树上的蔓藤,一旦目标进程被注射,这段新生的线程就成为目标进程的一部分代码了,只要目标进程不被终止,原进程无论是否还在运行都不会再影响到执行结果了。
与“线程注射”离不开的是“hook”技术,这个“hook”,又是什么呢?其官方定义如下:
钩子(hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。
钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。
在这里,木马编写者首先把一个实际为木马主体的dll文件载入内存,然后通过“线程注射”技术将其注入其他进程的内存空间,最后这个dll里的代码就成为其他进程的一部分来实现了自身的隐藏执行,通过调用“hook”机制,这个dll木马便实现了监视用户的输入输出操作,截取有用的资料等操作。这种木马的实际执行体是一个dll文件,由于Windows系统自身就包含着大量的dll文件,谁也无法一眼看出哪个dll文件不是系统自带的,所以这种木马的隐蔽性又提高了一级,而且它的执行方式也更加隐蔽,这是由Windows系统自身特性决定的,Windows自身就是大量使用dll的系统,许多dll文件在启动时便被相关的应用程序加载进内存里执行了,可是有谁在进程里直接看到过某个dll在运行的?因为系统是把dll视为一种模块性质的执行体来调用的,它内部只包含了一堆以函数形式输出的模块,也就是说每个dll都需要由一个用到它的某个函数的exe来加载,当dll里的函数执行完毕后就会返回一个运行结果给调用它的exe,然后dll进程退出内存结束这次执行过程,这就是标准的dll运行周期,而采用了“线程注射”技术的dll则不是这样,它们自身虽然也是导出函数,但是它们的代码是具备执行逻辑的,这种模块就像一个普通exe,只是它不能直接由自身启动,而是需要有一个特殊作用的程序(称为加载者)产生的进程把这个dll的主体函数载入内存中执行,从而让它成为一个运行中的木马程序。了解Windows的用户都知道,模块是紧紧依赖于进程的,调用了某个模块的进程一旦退出执行,其加载的dll模块也就被迫终止了,但是在dll木马里,这个情况是不会因为最早启动的exe被终止而发生的,因为它使用了“远程线程注射”技术,所以,在用户发现异常时,dll木马早就不知道被注入哪个正常进程里了,即使用户发现了这个木马dll,也无法把它终止,因为要关闭它就必须在那么多的系统进程里找到被它注射的进程,并将其终止,对一般用户来说,这是个不可能完成的任务。 反黑知识:认识使用 Rootkit技术的木马
来源:赛迪网病毒求助专区 作者:sunlizc
【编者按:一旦木马利用了Rootkit技术,就变得十分难以辨认清除。】
自从“广外幽灵”开创了dll木马时代的先河以来,现在采用线程注射的dll木马和恶意程序已经随处可见了,除了普遍被采用的另行编写dll加载器程序躲在启动项里运行加载dll主体之外,“求职信”还带来了一种比较少见的通过注册表“hkey_local_machine\software\microsoft\windows nt\currentversion\windows\appinit_dlls”项目加载自身dll的启动方法,而相对于以上几种早期方法,现在更有一种直接利用系统服务启动自身的木马程序,这才是真正的难缠!
“服务”是windows系统的一大核心部分,在nt架构系统中,服务是指执行指定系统功能的程序、例程或进程,以便支持其他程序,尤其是底层(接近硬件)程序。通过网络提供服务时,服务可以在active directory中发布,从而促进了以服务为中心的管理和使用。服务是一种应用程序类型,它在后台运行。服务应用程序通常可以在本地和通过网络为用户提供一些功能,例如客户端/服务器应用程序、web服务器、数据库服务器以及其他基于服务器的应用程序。 “服务”自身也是一种程序,由于使用的领域和作用不同,服务程序也有两种形式:exe和dll,采用dll形式的服务是因为dll能实现hook,这是一些服务必需的数据交换行为,而nt架构系统采用一个被称为“svchost.exe”的程序来执行dll的加载过程,所有服务dll都统一由这个程序根据特定分组载入内存,然而,如今越来越多病毒作者瞄上了这个系统自带的加载器,因为它永远也不能被查杀。
病毒作者将木马主体写成一个符合微软开发文档规范的服务性质dll模块文件,然后通过一段安装程序,将木马dll放入系统目录,并在服务管理器(scm)里注册自身为通过svchost.exe加载的服务dll组件之一,为了提高隐蔽性,病毒作者甚至直接替换系统里某些不太重要而默认开启的服务加载代码,如“distributed link tracking client”,其默认的启动命令是“svchost -k netsvcs”,如果有个病毒替换了启动命令为自己建立的分组“netsvsc”,即“svchost -k netsvsc”,在这种旁门左道加社会工程学的攻势下,即使是具备一般查毒经验的用户也难以在第一时间内察觉到问题出自服务项,于是病毒得以成功逃离各种查杀。
目前被发现使用此方法的木马已经出现,其中一个进程名为“ad1.exe”的广告程序就是典型例子,它通过替换“distributed link tracking client”服务的svchost启动项来躲过一般的手工查杀,同时它自身还是个病毒下载器,一旦系统感染了这个恶意程序,各种木马都有可能光临你的机器。
要清理dll木马,用户需要借助于sysinternals出品的第三方进程管理工具“process explorer”,利用它的“find handle or dll”功能,能迅速搜索到某个dll依附的进程信息并终结,让dll失去载体后就能成功删除,而dll木马的文件名为了避免和系统dll发生冲突,一般不会起得太专业,甚至有“safaf.dll”、“est.dll”这样的命名出现,或者在某些系统下根本不会出现的文件名,如“kernel.dll”、“rundll32.dll”等。除了使用“process explorer”查找并终止进程以外,还可以用icesword强行卸载某个进程里的dll模块来达到效果。
对于服务性质的dll,我们仍然使用“process explorer”进行查杀,由于它的层次结构,用户可以很直观的看到进程的启动联系,如果一台机器感染了杀不掉的顽固木马,有经验的用户做的第一件事情就是禁止掉不相关或者不重要的程序和服务在开机时运行,然后使用“process explorer”观察各个进程的情况,通过svchost.exe启动的dll木马虽然狡猾,但是它释放出exe文件运行时,一切都暴露了:一个svchost.exe服务进程执行了一个ad1.exe,还有比这更明显的吗?
svchost的分组信息位于注册表的“hkey_local_machine\software\microsoft\windows nt\currentversion\svchost”项目,这是svchost加载dll时的分组依据,如果用户发现了一个奇怪的分组信息,那就要提高警惕了。
隐藏技术发展的颠峰:Rootkit木马
随着安全技术的发展和计算机用户群的技术提高,一般的木马后门越来越难生存,于是一部分有能力的后门作者把眼光投向了系统底层——ring 0。位于ring 0层的是系统核心模块和各种驱动程序模块,所以位于这一层的木马也是以驱动的形式生存的,而不是一般的exe。后门作者把后门写成符合wdm规范(windows driver model)的驱动程序模块,把自身添加进注册表的驱动程序加载入口,便实现了“无启动项”运行。一般的进程查看器都只能枚举可执行文件exe的信息,所以通过驱动模块和执行文件结合的后门程序便得以生存下来,由于它运行在ring 0级别,拥有与系统核心同等级的权限,因此它可以更轻易的把自己隐藏起来,无论是进程信息还是文件体,甚至通讯的端口和流量也能被隐藏起来,在如此强大的隐藏技术面前,无论是任务管理器还是系统配置实用程序,甚至系统自带的注册表工具都失去了效果,这种木马,就是让人问之色变的Rootkit。
要了解Rootkit木马的原理,就必须从系统原理说起,我们知道,操作系统是由内核(kernel)和外壳(shell)两部分组成的,内核负责一切实际的工作,包括cpu任务调度、内存分配管理、设备管理、文件操作等,外壳是基于内核提供的交互功能而存在的界面,它负责指令传递和解释。由于内核和外壳负责的任务不同,它们的处理环境也不同,因此处理器提供了多个不同的处理环境,把它们称为运行级别(ring),ring让程序指令能访问的计算机资源依次逐级递减,目的在于保护计算机遭受意外损害——内核运行于ring 0级别,拥有最完全最底层的管理功能,而到了外壳部分,它只能拥有ring 3级别,这个级别能操作的功能极少,几乎所有指令都需要传递给内核来决定能否执行,一旦发现有可能对系统造成破坏的指令传递(例如超越指定范围的内存读写),内核便返回一个“非法越权”标志,发送这个指令的程序就有可能被终止运行,这就是大部分常见的“非法操作”的由来,这样做的目的是为了保护计算机免遭破坏,如果外壳和内核的运行级别一样,用户一个不经意的点击都有可能破坏整个系统。
由于ring的存在,除了由系统内核加载的程序以外,由外壳调用执行的一般程序都只能运行在ring 3级别,也就是说,它们的操作指令全部依赖于内核授权的功能,一般的进程查看工具和杀毒软件也不例外,由于这层机制的存在,我们能看到的进程其实是内核“看到”并通过相关接口指令(还记得api吗?)反馈到应用程序的,这样就不可避免的存在一条数据通道,虽然在一般情况下它是难以被篡改的,但是不能避免意外的发生,Rootkit正是“制造”这种意外的程序。简单的说,Rootkit实质是一种“越权执行”的应用程序,它设法让自己达到和内核一样的运行级别,甚至进入内核空间,这样它就拥有了和内核一样的访问权限,因而可以对内核指令进行修改,最常见的是修改内核枚举进程的api,让它们返回的数据始终“遗漏”Rootkit自身进程的信息,一般的进程工具自然就“看”不到Rootkit了。更高级的Rootkit还篡改更多api,这样,用户就看不到进程(进程api被拦截),看不到文件(文件读写api被拦截),看不到被打开的端口(网络组件sock api被拦截),更拦截不到相关的网络数据包(网络组件ndis api被拦截)了,我们使用的系统是在内核功能支持下运作的,如果内核变得不可信任了,依赖它运行的程序还能信任吗?
但即使是Rootkit这一类恐怖的寄生虫,它们也并非所向无敌的,要知道,既然Rootkit是利用内核和ring 0配合的欺骗,那么我们同样也能使用可以“越权”的检查程序,绕过api提供的数据,直接从内核领域里读取进程列表,因为所有进程在这里都不可能把自己隐藏,除非它已经不想运行了。也就是说,内核始终拥有最真实的进程列表和主宰权,只要能读取这个原始的进程列表,再和进程api枚举的进程列表对比,便能发现Rootkit进程,由于这类工具也“越权”了,因而对Rootkit进行查杀也就不再是难事,而Rootkit进程一旦被清除,它隐藏自身的措施也就不复存在,内核就能把它“供”出来了,用户会突然发现那个一直“找不到”的Rootkit程序文件已经老实的呆在文件管理器的视图里了。这类工具现在已经很多,例如icesword、patchfinder、gdb等。
道高一尺,魔高一丈,因为目前的主流Rootkit检测工具已经能检测出许多Rootkit木马的存在,因此一部分Rootkit作者转而研究Rootkit检测工具的运行检测算法机制,从而制作出新一代更难被检测到的木马——futo Rootkit。
国产优秀检测工具icesword在futo面前败下阵来,因为futo编写者研究的检测工具原型就是一款与之类似的black & light,所以我们只能换用另一款Rootkit检测工具darkspy,并开启“强力模式”,方可正常查杀Rootkit。
但是由于检测机制的变化,darkspy要检测到futo的存在,就必须保证自己的驱动比futo提前加载运行,这就涉及到优先级的问题,也是让业界感觉不太满意的一种方式,因为这样做的后果会导致系统运行效率下降,不到紧急关头,都不要轻易采用这种方法,然而现在的瑞星卡卡助手所推广的“破甲”技术,实现原理是与之类似的,它也会对系统造成一定影响,因而,这个介于安全和效率之间的选择,唯有留给用户自己思考了。
-
来源:赛迪网安全社区 作者:dingdd
链级测试 (Link Testing)
多数的追踪技术都是从最接近victim的路由器开始,然后开始检查上流数据链,直到找到攻击流量发起源。理想情况下,这种过程可以递归执行直到找到攻击源头。这种技术假设攻击一直保持活动直到完成追踪,因此很难在攻击结束后、间歇性攻击或对追踪进行攻击调整等情况进行追踪。包括下面两种链级测试:
1、Input debugging
很多路由器都提供Input debugging特性,这能让管理员在一些出口端过滤特定的数据包,而且能决定可以达到那些入口。这种特性就被用来作traceback:首先,victim在确定被攻击时,要从所有的数据包中描述出攻击包标志。通过这些标志,管理员在上流的出口端配置合适的Input debugging。这个过滤会体现出相关的input端口,这个过滤过程可以一直朝上流进行,直到能够到达最初的源头。当然这种工作很多依靠手工,一些国外的ISP联合开发的工具能够在它们的网络中进行自动的追踪。
但是这种办法最大的问题就是管理花费。联系多个ISP并同他们合作需要时间。因此这种办法需要大量的时间,而且几乎不可能完成。
2、Controlled flooding
Burch和 Cheswick提出的方法。这种方法实际上就是制造flood攻击,通过观察路由器的状态来判断攻击路径。首先应该有一张上游的路径图,当受到攻击的时候,可以从victim的上级路由器开始依照路径图对上游的路由器进行控制的flood,因为这些数据包同攻击者发起的数据包同时共享了路由器,因此增加了路由器丢包的可能性。通过这种沿路径图不断向上进行,就能够接近攻击发起的源头。
这种想法很有独创性而且也很实际,但是有几个缺点和限制。最大的缺点就是这种办法本身就是一种DOS攻击,会对一些信任路径也进行DOS,这个缺点也很难用程序实施。而且,Controlled flooding要求有一个几乎覆盖整个网络的拓扑图。Burch和 Cheswick也指出,这种办法很难用于DDOS攻击的追踪。这种方法也只能对正在进行攻击的情况有效。
现在CISCO的路由器的CEF(Cisco Express Forwarding)实际上就是一种链级测试,也就是说,要用CEF追踪到最终源头的话,那么整个链路上的路由器都得使用CISCO的路由器,而且支持CEF。就得要Cisco 12000或者7500系列的路由器了。(不知道现在怎么样,没查最新的CISCO文档),但是要用这个功能是很费资源的。
在CISCO路由器(支持ip source-track的路由器)上IP源追踪以下面的步骤实现:
1、当发现目的被攻击,打开整个路由器上对目的地址的追踪,输入命令 ip source-track。
2、每个Line Card为要追踪的目的地址创建特定的CEF队列。对于line card或者端口适配器用特定的ASIC作包转换,CEF队列用于将包置入line card或者port adapter的CPU。
3、每个line card CPU收集关于要追踪目的的通讯信息。
4、所产生的数据定时导出到路由器。要现实这些流信息的摘要,输入命令:show ip source-track summary。要显示每个输入接口的更多的细节信息,输入命令show ip source-track。
5、统计被追踪的IP地址的细目表。这可用于上游路由器继续分析。可以在当前路由器上关闭IP source tracker,输入命令:no ip source-track。然后在上游路由器上再打开这个功能。
6、重复步骤1到5,直到找到攻击源。
Logging
这种方法通过在主路由器上记录数据包,然后通过数据采集技术来决定这些数据包的穿越路径。虽然这种办法可以用于对攻击后的数据进行追踪,它也有很明显的缺点,比如可能要求大量的资源(或者取样),并且对付大量数据的综合问题。
ICMP追踪
这种方法主要依靠路由器自身产生的ICMP跟踪消息。每个路由器都有很低的概率(比如:1/200000),数据包可能会把内容复制到一个ICMP消息包中,并且包含了到临近源地址的路由器信息。当flood攻击开始的时候,victim就可以利用这些ICMP消息来重新构造攻击者的路径。这种方式同上面介绍的比较,有很多优点,但是也有一些缺点。比如:ICMP可能被从普通流量中过滤掉,并且,ICMP追踪消息还要同input debugging特性(将数据包同数据包input端口和/或者要到达的MAC地址关联的能力)相关,但是,可能一些路由器就没有这样的功能。同时,这种办法还必须有一种办法来处理攻击者可能发送的伪造ICMP Traceback消息。也就是说,我们可以把这种方式同其他办法一起使用来让跟踪机制更有效。(IETF iTrace)
这就是yawl说的IETF的工作组研究的内容,当时我给Bellovin提出一些意见,但是没有得到答案。比如:
1、尽管是随机1/20000发送追踪包,但是,对于伪造TRACEBACK的包情况下,对路由器的效率将有一定的影响。
2、追踪包的认证并不能解决伪造问题。因为要判别是否是伪造包,那么必须去认证,加大了工作量。
3、即便使用NULL 认证,同样能够达到目的(有认证的情况下)。而且也不会有太大影响。
4、Itrace的本来目的是去对付DOS的欺骗源问题,但是现在的设计仿佛让我们更关心的是路径而不是源头。难道路径比源头更对我们解决DOS问题有用么?
等等,还有一堆问题,都是我觉得iTrace将会面临的很难处理的问题。
数据包标记
这种技术构想(因为现在没有实用)就是要在现有协议的基础上进行修改,而且修改很小,不象iTrace的想法,个人认为比iTrace更好一些。
这种追踪技术有很多细节研究,形成多种标记算法,但是最好的还是经过压缩的边缘取样算法。
这种技术原理就是修改IP头中,重载其中的identification域。也就是如果没有使用到identification域的话,将这个域定义为标记。
将16bit的idnetification分成:3bit的offset(可允许8次分片),5bit的distance,以及8bit的边缘分片。5bit的distance可以允许31级路由,这对于目前的网络来说已经足够了。 标记和重构路径的算法是:
Marking procedure at router R: let R' = BitIntereave(R, Hash(R)) let k be the number of
none-overlappling fragments in R' for
each packet w let x be a random number from [0..1) if xlet o be a random integer from
[0..k-1] let f be the fragment of R' at
offset o write f into w.frag write 0 into w.distance wirte o into w.offset else if
w.distance=0 then let f be the fragment of
R' at offset w.offset write f?w.frag into w.frag increment w.distance Path reconstruction
procedure at victim v: let FragTbl
be a table of tuples(frag,offset,distance) let G be a tree with root v let edges in G be
tuples(start,end,distance) let
maxd:=0 let last:=v for each packet w from attacker FragTbl.Insert
(w.frag,w.offset,w.distance) if w.distance>maxd then
maxd:=w.distance for d:=0 to maxd for all ordered combinations of fragments at distance d
construct edge z if d!=0 then z:=
z?last if Hash(EvenBits(z))=OddBits(z) then insert edge(z,EvenBits(z),d) into G
last:=EvenBits(z); remove any edge(x,y,d)
with d!=distance from x to v in G extract path(Ri..Rj) by enumerating acyclic paths in G
实验室情况下这种标记技术只需要victim能够抓到1000到2500个包就能够重构整个路径了,应该说结果是很好的,但是没有投入到实用中,主要是需要路由器厂商和ISP支持。
差不多ip traceback的已经实用的技术和实验室技术,或者已经死掉的,就主要是这些,虽然还有其他的一些。
已经很长时间没有搞DDOS防范这一块了,国内也有黑洞这样的产品,以前也了解一些国外的,比如floodguard、toplayer、radware等。受securitytest提示,又了解到riverhead的,我就立刻看了看他们的白皮书。
因为前面bigfoot提出的主要是ip traceback的题目,securitytest也又到防御的问题。针对DDOS的问题ip traceback和Mitigation是不一样的,ip traceback主要是进行追踪,因为DDOS主要是spoof,而很难判别到真正的攻击源,而且如果能够很容易找到真正的攻击源,不仅仅对付DDOS,对付其他的攻击也很有帮助,比如法律问题等。而Mitigation是从受害者的角度,因为victim一般是没有能力去调查整个网络,找出source,而且,即便能够找到source,也得有法律或者一些沟通的手段来让source停下来(攻击的source并不是source的攻击者),这种意味着大量的沟通、跨ISP、跨过等类似的非技术问题,所以,通常很难处理。但是从victim的角度来说,必须得有所解决办法,所以就需要Mitigation。
这又正好是我以前研究的范围,所以,又会说出一大堆。对于Mitigation,其实,技术的根本就是要能从众多的流量中将攻击包和合法包分离出来,把攻击包抛弃掉,让合法包通过就性了。这就是根本,所以实际运用的技术就是要如何尽可能识别出攻击包,而又尽可能小地影响正常包。这又得来分析DDOS(甚至DOS)的方式和原理。基本又下面几种形式:
1、系统漏洞形成的DOS。这种特征固定,检测和防御也容易。
2、协议攻击(一些跟系统处理相关,一些跟协议相关)。比如SYN FLOOD,碎片等。特征还好识别,检测和防御相对容易。比如SYN COOKIE、SYN CACHE,碎片可以抛弃。比如land攻击、smurf、teardrop等。
3、bandwidth FLOOD。垃圾流量堵塞带宽,特征不好识别,防御不容易。
4、基本合法的FLOOD。比3更难了,比如分布的Slashdot。
实际的DDOS,一般都是多种方式结合的。比如SYNFLOOD,可能同时是bandwidth FLOOD。
影响防御的主要因素就是看特征是否能得到,比如1、2就相对好解决,一些基本不影响的使用的FLOOD,则可以很好被抛弃,比如ICMP FLOOD。
但是,攻击发包工具如果将数据包更能伪装成合法包,那么就很难识别出来了。
一般的Mitigation方法也就是:
1、Filter。对于特征明显的,比如一些蠕虫等,在路由器上就可以搞定。当然,过滤是最终解决办法,只要识别出了攻击包,就是要把这些包过滤掉。
2、随机丢包。跟随机算法相关,好的算法可以让合法包受到更小影响。
3、SYN COOKIE、SYN CACHE等特定防御办法。针对一些固定的攻击手段来防御和过滤。比如ICMP FLOOD、UDP FLOOD。SYN COOKIE等都是避免spoof问题,至少TCP还有三次握手,所以还好判断SPOOF。
4、被动消极忽略。可以说也是一种确认是否被欺骗的办法。一般正常连接失败会重新尝试,但是攻击者一般不会尝试的。所以可以临时抛弃第一次连接请求而接受第二次或者第三次连接请求。
5、主动发送RST。对付SYN FLOOD的,比如一些IDS上。当然,实际不是有效的。
6、统计分析和指纹。这本来是研究的主要内容,但是最后陷入了算法牛角尖,因为主要是一个算法问题。通过统计分析的角度来得到指纹,然后根据指纹来抛弃攻击包,也是一种异常检测的技术。说得很简单,但是要不影响合法包也不容易,不至于变成了随机丢包。(其实当时考虑太过复杂,非得要详细分析出攻击包和合法包,实际不需要,只要过滤掉足够的攻击包,即便让攻击包通过,但只要不造成DOS就可以了。)这也是很多研究者研究的主要课题,目的也就是识别攻击包。
现在在回到securitytest提到的riverhead。关于riverhead的技术,我都只是从他们的白皮书上了解到的,但根据我的分析技术方法都没有超出上面提到的范围。
Riverhead的核心方案就是检测 Detection、转移 Diversion 和 缓解 Mitigation,也就是检测到攻击,然后将流量转移到他们的产品guard上,然后通过guard进行Mitigation。
它的实现步骤,就是:
因为没有图,所以先定义一下,才能说清楚:
#靠近分布式拒绝服务源头的路由器为 远端路由器
#靠近受害者的路由器为 近端路由器
#Riverhead的Guard设备附属安装的路由器为 附属路由器
防御的步骤
1、首先检测到有DDOS发生,并了解到victim。
2、Guard发送BGP通告到远端路由器(在victim的BGP通告设置前缀,并得到比原始BGP通告更高的优先权),表示从远端路由器到victim有新的路由,并且路由到Guard的loopback interface,所有到victim的都经过附属路由器转移到了Guard上。
3、Guard检查流量,并且清除其中的攻击流量,然后把安全的流量转发到附属路由器上,在回到victim其中核心就是Guard,技术就是白皮书中描述的MVP架构(Multi-Verification Process),也就是下面5个层次过滤(Filtering) :这个模块包含静态和动态的DDOS过滤。静态过滤,拦截non-esse ntial流量,可以是用户定义的,或者是riverhead默认提供的。动态过滤则基于行为分析和流量的细节分析,通过增加对可疑流量的确认或拦截已经确认的恶意流量,来进行实时更新反欺骗(Anti-Spoofing):这个模块验证进入系统的数据包是否被欺骗的。Guard使用了独有的、有专利的源验证机制来避免欺骗。也通过一些机制来确认合法流量,消除合法数据包被抛弃异常检测(Anomaly Recognition):该模块监视所有没有被过滤和反欺骗模块抛弃的流量,将流量同平常纪录的基线行为进行比较,发现异常。基本原理就是通过模式匹配,区别来自black-hat和合法通讯之间的不同。该原理用来识别攻击源和类型,而且提出拦截这类流量的指南。
异常检测包括: 攻击流量速率大小 包大小和端口的分布 包到达时间的分布 并发流量数 高级协议特征 出、入的速率 流量分类: 源IP 源端口 目的端口 协议类型 连接量(每天、每周) 协议分析(Protocol Analysis):本模块处理异常检测中发现的可疑的应用方面的攻击,比如http攻击。协议分析也检测一些协议错误行为。
流量限制(Rate Limiting):主要是处理那些消耗太多资源的源头流量。
所以,实际上最主要的内容就是异常检测中的统计分析,但是从上面看似乎没有多少特别的地方,但是,一定有很好的算法。比如FILTER,实际是对付一些很熟悉的有明显特征的攻击,反欺骗,就是对付syn flood这样的,说不定也是一个syn cookie模块,,但也许有更专利的技术。
协议分析其实应该来说就比较弱了,但可以针对一些常见协议中的特定攻击,检测识别一些协议错误行为只是协议校验,这个很简单。流量限制则就是一种随机丢包,最无奈的办法,所以也是最后一个层次了。
因为这个产品主要是作Mitigation的,而不是ip traceback。但是可以判定还是有重要的问题,比如:
1、如何对付真正的bandwidth flood。如果路由器是千兆的,但是,攻击流量已经占了90%,只流下10%让合法使用,路由器已经先与Guard开始进行随机丢包了。(没办法,这是所有防御技术的瓶颈)
2、真正的攻击。真正的攻击是很难或者无法识别的。比如,基本跟正常形式一样的,如果和统计数据很接近,那么很难区别出来。还有一些攻击,比如反射式的邮件攻击等,这是完全合法的,但是很难分类出来。
-
-
Windows Vista九则加速技巧
相信现在使用Windows Vista的用户已经不在少数了,但对于它像以前在XP时代的加速教程并不多,刚好发现了一篇Speed Up Windows Vista ,简要整理如下:
1、更新你的硬件驱动
比如显卡,主板的显示芯片等等。这个很关键,因为开始我自己的vista并不支持Aero主题,在更新了主板显示芯片后便可以了。所以多去检查一下自己的硬件有没有驱动更新。
2、取消Windows部分程序
打开控制面板,选择卸载程序,点击左侧列表中的打开或关闭Windows功能,之后清除不必要的功能选项,鼠标移动上去时会有功能提示。
我自己只留下了:XPS Viewer, 可移动存储管理,远程差分压缩三个。设置完成后需要重启,先取消完成下面步骤再说。
3、关闭部分服务
在开始菜单中输入 services.msc 打开服务列表,对于每项服务可以选择右键,属性中启动类型设置是否自动运行或者手动和禁用。原文作者推荐关闭:
Computer Browser
Distributed Link Tracking Client
IKE and AuthIP IP Keying Modules
Offline Files
Remote Registry
Tablet PC Input Service (unless you’re using a tablet PC)
Windows Error Reporting
4、关闭自动运行程序
开始菜单中输入msconfig,选择启用,其中为随电脑启动自动运行的程序列表。我是只勾选了Windows Defender和声卡程序(4.1的声卡不打开只能双声道,驱动程序的bug)。当然杀毒软件也是不能取消的。
5、关闭系统托盘程序
除了随机启动的程序,有些程序是在系统托盘加入图标的,而相当一部分却没有什么用途,比如网络连接,QuickTime的图标等,可以在上一步骤中去除,同时这里也可以右键在选项里进行设置不自动运行,或者不加载。
6、使用ReadyBoost
如果你有大容量USB Flash闪存,那么插入它在右键属性里设置吧,可以当成虚拟内存来使用,比硬盘的虚拟内存要快得多。东芝新出了个16G的,高兴了弄个吧。不过有那钱你不如直接买内存来的快。
7、加速系统界面
Vista的广告WOW便是炫耀它有多华丽,但代价便是高配置和高系统消耗,关掉些效果会加速不少。右键选择个性化,在Windows 颜色和外观中取消”启用透明效果”,或者干脆换掉Aero为Vista基本或者标准。Sidebar就关了吧,没用。右键选择计算机,选择属性,点击左侧的”高级系统设置”,”高级”,”设置”,”视觉效果”这个里面能关啥就关啥吧,设在难看得受不了再打开。
8、高级设置
如果你的主板和硬盘支持SATA,那么在驱动器的属性里设置打开高级效果吧,我没有。。。
update: 桌面或者开始菜单中的计算机右键选择属性,之后在左侧选择“设备管理器”,在列表磁盘驱动器里找到支持SATA的硬盘驱动器,右键选择属性,在“策略”中选择“启用高级性能”,当然上面的“启用缓存”也要选中。
关闭Vista自动扫描驱动器并且在容量过小时的警告:备份注册表,然后开始菜单输入regedit,KEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies中,右侧右键选择新建项,名称为Explorer,在其下,右侧右键选择新建”DWORD (32-bit)值“,名称为NoLowDiskSpaceChecks,双击修改数值为”1″。
9、整理磁盘
作者推荐使用AusLogics 来整理硬盘,如果你平时用电脑复制删除什么的挺频繁,那还是每隔几个月弄下吧,很有效果,跟在家里乱丢东西一样,时间长了当然找到它要慢,所以要定期整理。
新手入门:Windows故障简单恢复技巧
Windows XP是目前大家普遍使用的操作系统,其稳定性和易用性不容置疑。但是它也像人一样会闹个头疼脑热,出现点“感冒”症状,严重时得了重感冒一病不起也是不鲜见的事,这时很多人就会想到重装系统,但重装系统有一个最大的麻烦,就是需要之前备份,否则恢复到以前的使用习惯很难,一旦遇到一系统启动不起来,想备份也没了机会,这时你该 怎么办呢?在这里我给你一个比较好的答案:
一、Windows环境下
如果你的计算机还可以进入Windows环境中,那么恭喜你,这种情况下即使系统出现了问题,仍然不会是大问题。在这种情况通常会出现以下几种方法:
1.从安装光盘解压缺少的一些重要文件
如果WindowsXP已经进入,但却发现少了某些文件,其中最常见的是Rundll32.exe的丢失。下面就以恢复这个文件为例来说明:单击“开始”/“运行”,在该窗口中输入expand x:\i386\Rundll32..ex_ c:\windows\system32\Rundll32.exe(x代表光驱盘符,rundll.ex_代表需要解压的文件,c:\windows\system32指的是目标文件夹,这些都要根据具体情况来定),即可将丢失的文件恢复至系统。当然也可以直接从其他正常运行的机器复制该文件至本机的相应目录下。
另外,对于丢失的dll链接文件,还可以通过Regsvr32这个程序文件来恢复,恢复的时候需要在运行窗口中输入Regsvr32 a.dll(a.dll代表丢失的链接文件),回车后即会在注册表中注册该文件,然后在弹出的对话框中点“确定”即可。 2.DLL文件的恢复
DLL文件的名称为动态链接库文件,一般存在于Windows\system32文件夹下,该文件丢失或者被替换,一般也可进入Windows,但是执行应用程序时往往会出现系统报错。这种错误通常可以通过Sfc(系统文件检查器)。sfc是一个命令行程序,必须在WindowsXP的“命令提示符”窗口下才能运行,为了实现多种功能,sfc提供了多个参数,使用格式为:sfc/参数1 /参数2……,各个参数之间要用一个空格隔开。下面介绍一下其几个主要的参数,以方便大家使用:
/scannow:用来扫描所有受保护的系统文件,也是应用比较广的一个参数,它主要是通过正确的系统文件代替错误的系统文件。该参数还可以将最新版本的受保护系统文件放入DLLCache文件夹,而且在操作过程中可能需要WindowsXP的安装光盘,以及其补丁文件,如果你没有该光盘,而是在硬盘上备份了安装文件,可以通过修改注册表来完成该项功能。在运行窗口键入Regedit命令进入注册表编辑器窗口,找到HKey_Local_Machine\software\Microsoft\Windows\CurrentVersion\setup项,在右侧的窗口中修改Installation Sources、ServicePacksourcePath和SoutcePath三个键值为硬盘上的系统安装程序路径,这样在修复时就不用再插入WindowsXP安装光盘了。
/scanonce:下次启动时执行受保护系统文件的扫描,也需要读取安装光盘和补丁文件。这个命令常常在执行/scannow命令出现错误提示时才使用。
/scanboot:每次启动系统时都扫描所受保护的系统文件,这可能大大降低启动速度,一般不用,使用情况同/scanonce参数。
/purgecache:用来清除文件缓存(该文件默认情况下是在%systemroot%\system32\dllcache下)并立即扫描所有受保护的系统文件,常在其后还要加上“/cachesize=x”这个参数,这个参数是用来设置文件缓存大小的,以MB为单位,该参数如果设置较小可以节省硬盘空间,如果设置大一些可以保护系统文件,则可能尽可能地恢复更多的系统文件。
一般情况下执行sfc/scannow就可以对系统文件进行恢复了,时间一般在10分钟左右。
3.系统还原显身手
如果用sfc/scannow还是出错的话,则可能想到用系统还原功能来恢复系统。特别是在增删某些软件后出现了系统故障的时候,这种方法就显得尤为方便。
依次单击“开始→所有程序→附件→系统工具→系统还原”,运行“系统还原”命令,打开“系统还原向导”,选择“恢复我的计算机到一个较早的时间”,点击“下一步”,选择好日期后再跟着向导还原即可。
上文所讲系统还原功能是Windows XP中操作的,如果不能进入Windows XP系统,可以通过如下方法解决:
⑴安全模式运行系统还原
如果Windows XP能进入安全模式的话,则可在安全模式下进行系统恢复,步骤同“恢复还原点”。
⑵DOS模式进行系统还原
如果系统无法进入安全模式,则在启动时按F8,选“Safe Mode with Command Prompt”,用管理员身份登录,进入%systemroot%\windows\system32\restore目录,找到rstrui文件,直接运行rstrui文件,按照提示操作即可。
⑶在丢失还原点的情况下进行系统还原
在Windows XP预设了System Volume Information文件夹,通常是隐藏的,它保存了系统还原的备份信息。打开查看“显示所有文件和文件夹”属性,取消“隐藏受保护的系统文件”前有选择,会在每个盘中看到“System Volume Information”文件夹。利用这个文件夹可以进行数据恢复。鼠标右击“我的电脑”,选择“属性”/“系统还原”,取消“在所有驱动器上关闭系统还原”复选框,单击“应用”按钮。这样做是为了重建一个还原点。再打开“系统还原”命令,就可以找到丢失的还原点了。
上面的叙述是针对FAT32分区,如果系统分区为NTFS,那么在启动System Volume Information文件夹时会遇到一点麻烦。因为你可能并没有被加入到System Volume Information安全属性中,访问不到该文件。鼠标右击该文件夹,在弹出的菜单中选择“属性”,打开System Volume Information属性对话框,选中“安全”选项卡,单击“添加”按钮,打开“选择用户或组”窗口,点击该窗口右下角的“高级”按钮,然后单击“立即查找”按钮,这时会列出计算机上所有的用户和组,选中自己当前的账户或账户所在组的名称后“确定”。这样选中的账户被添加到System Volume Information安全属性中,就可以访问该文件夹了。
二、在DOS环境下
如果电脑已经进入不了WindowsXP,那么也不用太着急重装系统,因为这时还是有些方法的。
1.安全模式
在WindowsXP启动时按F8键,选择“安全模式”,如果能启动成功,则退出后再正常启动。
2.最后一次正确的配置
其基本操作同安全模式,但需要说明的是选择该项回车前要确保关闭了键盘上的NumLock指示灯。
3.故障恢复台
⑴控制台的安装
①控制台硬盘安装
插入WindowsXP安装光盘,单击“开始”/“运行”,输入\i386\winnt32.exe/cmdcons命令后回车,在出现的对话框中显示了“故障恢复控制台”安装选项,单击“是”后确认,重新启动计算机即会在启动菜单中看到“Microsoft Windows Recovery Console”菜单,选中后即可进入“故障恢复控制台”。
②控制台光盘安装
首先在BIOS中将启动顺序设置为CD-ROM,再在光驱中插入WindowsXP安装光盘启动系统,在屏幕显示“欢迎使用安装程序”时,按R启动故障恢复控制台。接着系统会要求输入管理员密码,输入后即可进入故障恢复台。若安装了多系统,则需要通过光标键来选择故障恢复台项,对于使用了SCSI或RAID的硬盘,则在其启动时要按F6键。若要担心忘记管理员密码,可在WindowsXP正常启动时,运行Gpedit.msc进入策略编辑器,再依次选择“本地计算机策略”/“计算机配置”/Windows设置/“安全设置”/“本地策略”/“安全选项”,在右侧的窗口的双击“故障恢复控制台:允许自动系统管理级登录”项,鼠标右击,选择“启动”,单击“确定”按钮后保存设置,进入故障恢复控制台就不用输入密码了。
⑵“故障恢复控制台”应用
①修复受损的多启动菜单
如果多操作系统菜单因为某种原因丢失,则可以进入“故障恢复控制台”,输入Bootcfg/scan命令,会自动扫描所安装的操作系统并显示出来,完成后再输入Bootcfg/rebuild命令,出现提示后按Y键,在“输入加载识别符”提示后输入丢失的启动菜单项,在“输入OS加载选项”后输入fastdetect后回车,即可找到多系统菜单。另外输入Bootcfg/add命令也可以向启动菜单中添加菜单项,使用方法基本同上。
②修复系统引导区
当系统引导区因为某种原因造成损坏而不能启动时,可以进入故障恢复控制台,在命令行下输入Fixboot可以修复引导区。
③恢复系统重要文件
系统中有一些重要的文件直接关系着是否能启动成功,如Ntldr这个文件丢失,系统就启动不起来,这时可以进入控制台,键入命令行copy x:\i386\ntldr*.* c:\后回车即可,重新启动后会发现能够正常进入WindowsXP了。如果丢失的是一些压缩文件,还可以在控制台输入expand x:\i386\a.ex_ c:\windows\(x代表光驱盘符,a.ex_代表需要解压的文件,c:\windows指的是目标文件夹,这些都要根据具体情况来定),即可将丢失的文件恢复至系统。
④启用或禁用某些服务或驱动程序
这一功能主要应用于由于安装某些新的程序造成系统无法启动的情况,我们可能通过在故障恢复控制台中去掉该项服务或程序以达到系统起死回生的目的。具体操作如下:
进入控制台,输入Listsvc命令后回车,在屏幕上会出现当前系统中已有的所有服务和驱动程序以及其状态说明。找到需要禁用的可疑服务或驱动程序,输入命令 disable 需要禁用的程序或服务,回车后屏幕上会显示出该服务以前的状态和完成后的状态;如果想雇用某个程序或服务,则需要键入Enable 需要禁用的程序或服务,回车后即可。
-
Lessons by English, baby!
随时随地看wap