当前位置: 首页 > 图文教程 > 网络安全 > 安全基础 > 高级WIN2K ROOTKIT检测技术

安全基础
可以用于交换环境下SNIFFER的几种攻击技术手段
嗅探的时候,防火墙能发现吗?
wincap and sniffer(1)
wincap and sniffer(2)
客户端登录到Win 2000域
网络故障问答集萃
软件开发项目控制浅谈(1)
软件开发项目控制浅谈(2)
软件开发项目控制浅谈(3)
软件开发项目控制浅谈(4)
用Telnet快速收发电子邮件(1)
用Telnet快速收发电子邮件(2)
Windows XP系统启动提速专题
让Google长个好“记性”
恢复EXE文件关联补完版
真真假假的安全警告
网络安全应急三观
全力打造个人网络安全
系统自动启动程序之十大藏身之所
访问权限问题问答集锦

安全基础 中的 高级WIN2K ROOTKIT检测技术


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-28   浏览: 59 ::
收藏到网摘: n/a

摘要:本文描述了一种检测内核与用户级rootkit的新技术.此技术利用处理器的单步执行模式,来测定系统内核与DLL中执行指令的数量,从而达到检测rootkit和后门的目的.同时还讨论了其在Win2k下的代码实现.

--背景知识

一个在计算机安全领域中重要的问题是,如何判断给定的主机是否已被入侵.由于以下两点这项工作变的非常困难:
1.攻击者可以利用未知漏洞进入系统.
2.当进入系统后,入侵者可通过安装rootkit和后门来隐藏自身(例如:隐藏进程,通讯渠道,文件等).本文将集中讨论在Win2K系统下rootkit的检测问题.

--传统rootkit检测技术中的一些问题

传统的rootkit检测程序(那些我们经常在UNIX系统中见到的)只能检测一些已知的rootkit(这点使它变的像反病毒程序)或进行一些内核存储的扫描.例如Linux中就有一些工具扫描内核中的syscall table.这显然不够好,因为已经有了很多并不更改syscall table的rootkit,而Win2k下也可开发出类似的rootkit.

那检测程序是不是还应该扫描内核代码空间?这样我们就有了一个运行在内核模式中的Tripwire.但这还不够好,因为在大多数的操作系统中,我们可以写出即不更改SST(syscall table)也不更改代码的内核级rootkit.在系统中有很多可以勾连的函数指针(例见).

以我看,存储扫描技术决不会成为rootkit检测的终结.这主要是因为我们不能确定具体的监测存储区域.

那到底怎样检测出我们系统中的入侵者呢?

首先我们以rootkit中所使用的技术,将其分为两类:
*通过更改系统结构来隐藏某对象的(如运行的进程)和
*更改内核执行路径(例:勾连那些负责枚举活动进程的内核函数)来达到同样目的的.

--更改系统数据结构的rootkit

这类的rootkit不太多.有意思的例子包括fu rootkit(见),通过删除内核中PsActiveProcessList链上的进程对象来隐藏进程.ZwQuerySystemInformation等函数是不能发现这些隐藏进程的.但同时,因为Windows的线程分派器(dispatcher, scheduler)使用另外的数据结构,这些"隐藏"进程仍可运行(被分配到CPU使用时间).Windows的线程分派器使用以下三个(注1)数据结构:

*pKiDispatcherReadyListHead
*pKiWaitInListHead
*pKiWaitOutListHead

后两个是处于"等待"状态的线程链头.他们之间稍有不同,但对我们来说并不重要.

从上面的信息我们可以找到一种检测隐藏进程的方法.及读取线程分派器使用的数据结构,而不是PsActiveProcessList.

当检测rootkit时我们应该尽可能的触及更底层的内核数据结构.

有一点应该注意,直接从线程分派器使用的链中删除要隐藏的进程是不可能的,因为隐藏的进程将分配不到CPU使用时间.

--更改执行路径的rootkit

这类的rootkit较为普及.他们通过修改或增加内核或系统DLL中的指令来达到目的.检测这类rootkit的问题是,我们不知道rootkit在什么地方做了那些修改.它可以勾连DLL中的函数,系统服务列表(System Service Table),改变内核函数的内容或修改内核中一些奇怪的函数指针.

--执行路径分析(Execution Path Analysis)

EPA关注这样一个事实:如果入侵者通过修改执行路径隐藏了一些对象,那么当调用一些典型的系统和库的函数时,系统将运行一些多余的指令.

举个例子,如果入侵者为了隐藏文件和进程而修改了ZwQueryDirectoryFile()和ZwQuerySysteminformation(),那样和干净的系统相比,这些系统函数就会执行更多的指令.不管入侵者采用勾连或在代码中加入jmp指令,或其他任何方法.指令增加的原因是rootkit必须进行它的任务(在这个例子中是隐藏文件和进程).

但是Windows 2000的内核是一个非常复杂的程序,即使在干净的系统中,某些系统函数每次运行的指令个数也是不同的.然而我们可以用统计学来解决这个问题.但首先,我们需要一种测定指令个数的方法......

--指令计数器的实现

单步执行模式是Intel处理器的一个好的特性,我们可以用它来实现指令计数.当处理器处在这个模式时,每执行完一条指令,系统将产生一个除错异常(debug exception, #DB).要进入这个模式,需要设置EFLAGS寄存器中的TF位(详见).

当执行int指令时,处理器会自动清TF位并进行权限切换.这意味着,如果要进行内核模式下的指令计数,则必须在中断处理程序开头设置TF位.因为我们将要测定一些系统服务中的指令个数,勾连中断向量0x2e,也就是Windows 2000下的系统服务调用门会变得很有效.

但是,因为存在用户模式的rootkit,也应该测定在ring3级运行的指令个数.只要在用户模式下设置TF位一次就可以了,从内核返回时,处理器会自动恢复这一位.

以上的计数方法通过内核驱动器实现.如图2所示,驱动加载后勾连IDT 0x1和0x2e.为和用户级程序交互.驱动勾连一个系统调用,用户级程序通过这个特定的系统调用来开关计数器.

--一些测试

我们可以使用上一段中描述的方法来测定任意系统服务中执行的指令个数.

例如,来检查是否有人试图隐藏任意文件,我们可以开始一个简单的测试:

pfS