论文部分内容阅读
摘要:介绍了Windows NT平台下RootKit实现的基本原理及步骤,探讨了在Windows平台下进行Ring0级编程的实现及如何修改安全参考监视器来彻底突破NT的安全防御系统,并给出了整个RootKit的部分核心汇编源代码。
关键词:RootKit;Windows NT;Ring 0;安全参考监视器
中图分类号:TP309文献标识码:A文章编号:1009-3044(2008)35-2550-03
NT Operating System Kernel Based on the Realization of the RootKit
ZHAO Xiao-juan
(HuNan Urban Construction College,Xiangtan 41110 )
Abstract: Introduced the Windows NT platform RootKit to achieve the basic principles and steps on the Windows platform under Ring0-level programming to achieve security and how to modify the reference to thoroughly monitor the safety of NT breakthrough defense system, and gives the whole RootKit The core part of the compilation of source code.
Keywords: rootkit; windows NT; ring 0; security reference monitor
1 引言
Rootkit最初指被修改和重新编译后用来隐藏入侵者活动痕迹的一组Unix 工具(典型的工具有ps、netstate 和passwd)。现在,Rootkit 是入侵者或非法的黑客为了隐藏它存在的痕迹和使用其系统而执行未经许可的功能,用来破坏计算机获取目录使用权的一套软件工具。Rootkit的存在可追溯到上个世纪90年代初,那时Solaris 和Linux 操作系统是Rootkit主要的攻击对象。而现在Rootkit不再局限于像Unix这样的系统,其他的操作系统,如Microsoft Windows也已成为入侵者的目标。
RootKit的目的是保留持续的系统访问权和在计算机中隐藏自己, 它可以通过两种不同层次来实现,一种是修改或者替换和包装系统中用户包括管理员运行的可执行文件和库文件,在操作系统的用户态下执行, 这种方式的被称为“ 用户模式” 另一种是控制和修改操作系统内核,运行在操作系统的内核态,这种方式是“ 内核模式”。[1]
Windows 下应用程序有自己的地址空间,只能调用自己地址空间中的函数,所以,在挂钩API函数之前,必须将一个可以替代API 执行的函数的执行代码注入到目标进程,然后再想办法将目标进程对该API 的调用改为对注入到目标进程中自定义函数的调用。[2]
2 NT的安全保护措施
2.1 基于网络的安全与Windows NT信任域
NT内核中有一个执行组件叫做安全参考监视器(SRM)。在DoD的红皮书中也已定义了一个“安全参考监视器”。在红皮书中,一个安全域被一个单一的实体所管理。
“一个单一的信任系统犹如一个单一的实体一样,通过一个单一的信任证据所接受。一个单一信任系统网络执行相关的参考监视器来加强对对象访问时所应遵循的清晰的和良好定义的网络安全政策。[2]”
以上描述在NT中就是主域控制器(PDC),记住每一个系统都有本地安全和域安全。PDC的安全参考监视器负责管理域内的所有对象,与此同时,它创建了一个单一的控制点,和一个单一信任系统网络。
2.2 如何侵犯系统的完整性
DoD红皮书定义了“信任处理基础”(TCB)。在Windows NT中使用安全特权SE_TCB_PRIVILEGE指令和“担当操作系统一部分”的用户权利非常相似,可以通过使用管理员权限来将这个安全特权添加给某一个用户。
如果有权担当TCB的一部分,几乎可以做任何事情。现在在进程和剩下系统之间几乎没有安全措施。如果TCB不再被信任了,那么整个网络系统的完整性也已受到攻击。将要展示的就是这样的一个例子,如果它被安装在一个工作站上,就会侵犯一个网络分区。如果它被安装在主域控制器上,将会侵犯整个网络的完整性。
在一个相同的主机里,可能拥有两个唯一的区域:TCB在传统的红皮书里被评价为受信任处理基础和NTCB。这些分区没有必要相互交迭,但是可以这样做。如果任何的一个组件被侵犯了,那么看上去其他的也同样被侵犯了。换句话说,如果一台主机受到了危害,那么NTCB可能也受到了危害。
很显然,只有管理员才能在TCB上安装一个补丁,或拥有安装设备驱动程序的能力。为了使木马或病毒正常的执行,依靠某人的知识来安装这些补丁是很简单的事情。
2.3 NT下Ring0特权级保护机制
Windows操作系统运行在保护模式下,严格将用户权限分为内核模式和用户模式[3]。在Win9X和Windows NT操作系统中,为了充分利用虚拟空间并保证多任务的正常运行,应用程序都运行在保护模式。为了管理临界段资源,系统使用了特权级的概念。Intel X86处理器支持四个特权级,即Ring0 级到Ring3级。但Windows操作系统只使用了其中两个特权级:Ring0 作为“内核模式”,Ring3 作为“用户模式”。Ring0 级是最高等级的特权级, 所有内核状态执行线程在这一级执行,这就有效地保护了操作系统不受任何应用程序的损害。而所有应用程序都在Ring3 特权级内运行,这样可以避免影响系统内核的运行。
2.4 安全参考监视器
安全参考监视器负责加强访问控制。在NT下,所有的SRM函数都由ntoskrnl。exe传递。如果这些代码的完整性受到了侵犯,那么安全参看监视器也不再是受信任的了。整个安全系统就等于失败了。安全参考监视器负责对任何对象的访问提出同意或否定。它参考一个进程表来获取当前运行进程的访问令牌。然后它会比较访问令牌和对象的访问需求。每个对象都有一个安全描述(SD)。比较这两个结构,SRM就可以拒绝或允许访问这个对象。
参考确认机制必须面对的三个设计需求条件:1)参考确认机制必须提供篡改证据;2)参考确认机制必须总是被调用;3)参考确认机制必须足够小到经受起分析和测试,它的完全性必须被确认。
安全参考监视器不能提供篡改证据。它可能被TCB安全特权所保护,但是真正的能提供篡改证据的SRM应该使用加密机制。使用一个攻击工具如病毒或木马,一个补丁可以轻易的在TCB的环境下被安装。
如果对存储器映射有访问权限,可以修改安全参考监视器。这样,可以插入一个特别的用户ID可以随时访问的后门,这只是一个可以运用到NT RootKit中的一个小技巧。
3 NT平台上RootKit的实现
3.1 RootKit实现步骤
1) 插入无效的数据。无效的数据可以被插入到任何的网络流中,同样可以插入一些错误数据到固定的存储系统中,可能是敏锐的时间信息等,这样可能会破坏系统的备份。这样将会侵犯系统的可靠性和完整性。
2) 修改进入的ICMP数据报。使用ICMP作为隐藏的渠道,补丁可以读取进入到核心的ICMP数据报内部的命令。
3) 修改进入的以太网数据报。在不使用任何驱动组件的情况下担当嗅探器的角色。如果它已经修改了以太网,那么同样可以发送/接收与外网的数据报。它还可以嗅探秘密的关键字。
4) 修改已经存在的动态链接库,比如wininet.dll,追踪进入的数据。
5) 修改入侵检测系统。它可以修改如Tripwire或RealSecure等程序来破坏它们的完整性。
6) 修改审核系统,如系统事件日志来忽略一些事件日志消息。
3.2 获得Ring 0特权
在Windows NT下,普通用户没有直接写物理内存的权限"因此不能直接修改GDT或IDT。要获取Ring 0 权限,首先要求用户有写物理内存的权限,然后修改GDT,构造一个调用门,最后访问该调用门,执行Ring 0 代码[4]。 实现思路如下:
1) 使用户可读写\Device\PhysicalMemory对象GDT位于内核区域, 普通Ring 3 级应用程序无权直接访问该内存区域,Windows NT提供了一个名为PhysicalMemory 的Section对象, 通过该对象可以读写物理内存。通过分析,正常情况下只有SYSTEM用户才有对该对象的读写权限,administrator用户只有读权限。要使特定普通用户有写该对象的权限,需要以administrator用户身份增加另一个访问控制列表(ACL)到\Device\PhysicalMemory对象:首先打开一个\Device\PhysicalMemory对象的句柄并获得其安全描述符(GetSecurityInfo),接着在当前ACL中增加读写权限(SetEntriesInAcl),最后更新安全描述符(Set-SecurityInfo)。
2) 构造调用门:根据ntddk.h中的定义,当selector=8时,该调用门指向的处理代码以Ring 0 权限运行。函数地址低16位和函数地址高16位分别为Ring 0 代码的地址的高低16位。 Dpl位为调用该门的代码的最低权限,应设为3,present应设为1,表明该调用门可用。
3) 将调用门写入GDT中:从GDT尾部开始循环查找GDT中每一项,当找到一个不存在的描述符 (paresent=0)时停止,并将该描述符的各项修改为前面构造的调用门结构。
4) 访问调用门,运行Ring 0 代码:常规访问该调用门的方法不可行"因为当前应用程序运行在用户态,即Ring 3 级必须通过远调用far call来访问该调用门。
3.3 核心代码实现
首先对函数SeAccessCheck()进行逆向分析,通过使用IDA对函数进行了反汇编,部分代码如下所示。
8019A20C push [ebp arg_24]
8019A20F push [ebp arg_14]
8019A212 push edi
8019A213 push [ebp arg_1C]
8019A216 push [ebp arg_10]
8019A219 push [ebp arg_18]
8019A21C push ebx
8019A21D push dword ptr [esi]
8019A21F push dword ptr [esi 8]
8019A222 push [ebp arg_0]
8019A225 call sub_80199836
8019A22A cmp [ebp arg_8], 0
8019A22E mov bl, al
8019A230 jnz short loc_8019A238
8019A232 push esi
8019A233 call SeUnlockSubjectContext
8019A238 mov al, bl
8019A23A pop edi
8019A23B pop esi
8019A23C pop ebx
8019A23D pop ebp
8019A23E retn 28h
8019A23E SeAccessCheck endp
子程序被SeAccessCheck所调用。大多数的工作都是在此完成,因此对该函数进行了修改。
80199AD3 mov [ebp var_C], 0
80199ADA add esi, 8
80199ADD cmp [ebp var_10], 0
80199AE1 jz loc_80199B79
80199AE7 test edi, edi ;
80199AE9 jz loc_80199B79
80199AEF test byte ptr [esi 1], 8
80199AF3 jnz short loc_80199B64
80199AF5 mov al, [esi]
80199AF7 test al, al
80199AF9 jnz short loc_80199B14
80199AFB lea eax, [esi 8]
80199AFE push eax
80199AFF push [ebp var_8]
80199B02 call sub_801997C2
80199B07 test al, al
80199B09 jz short loc_80199B64
80199B0B mov eax, [esi 4]
80199B0E not eax
80199B10 and edi, eax
80199B12 jmp short loc_80199B64
4 总结
介绍了RootKit技术及Windows NT平台如何实现RootKit,探讨了NT平台的安全措施,以及绕过安全措施的方法。给出了具体实现RootKit的思路及方法,并给出了部分核心汇编代码。随着Windows平台安全性的提升,要实现RootKit也越来越难,但是越是难以实现的RootKit,一旦实现了就越具有隐蔽性,因此对RootKit技术的探讨有助于信息安全技术的不断更新与发展。
参考文献:
[1] 雷校勇,黄小平.Windows RootKit技术原理及防御策略[D].上海:上海交通大学,2006.
[2] 程彦,杨建召.Win32 中API拦截技术及其应用[J].长春工业大学学报:自然科学版,2006(04):99-101.
[3] 黄华星,舒辉,谢余强,等.Win32下ring0级保护机制的安全隐患研究 [A].全国网络与信息安全技术研讨会2004论文集[C],2004.
[4] 唐俊.一种基于行为的RootKit检测方法[J].计算机与数字工程,2008(9):32-34.
关键词:RootKit;Windows NT;Ring 0;安全参考监视器
中图分类号:TP309文献标识码:A文章编号:1009-3044(2008)35-2550-03
NT Operating System Kernel Based on the Realization of the RootKit
ZHAO Xiao-juan
(HuNan Urban Construction College,Xiangtan 41110 )
Abstract: Introduced the Windows NT platform RootKit to achieve the basic principles and steps on the Windows platform under Ring0-level programming to achieve security and how to modify the reference to thoroughly monitor the safety of NT breakthrough defense system, and gives the whole RootKit The core part of the compilation of source code.
Keywords: rootkit; windows NT; ring 0; security reference monitor
1 引言
Rootkit最初指被修改和重新编译后用来隐藏入侵者活动痕迹的一组Unix 工具(典型的工具有ps、netstate 和passwd)。现在,Rootkit 是入侵者或非法的黑客为了隐藏它存在的痕迹和使用其系统而执行未经许可的功能,用来破坏计算机获取目录使用权的一套软件工具。Rootkit的存在可追溯到上个世纪90年代初,那时Solaris 和Linux 操作系统是Rootkit主要的攻击对象。而现在Rootkit不再局限于像Unix这样的系统,其他的操作系统,如Microsoft Windows也已成为入侵者的目标。
RootKit的目的是保留持续的系统访问权和在计算机中隐藏自己, 它可以通过两种不同层次来实现,一种是修改或者替换和包装系统中用户包括管理员运行的可执行文件和库文件,在操作系统的用户态下执行, 这种方式的被称为“ 用户模式” 另一种是控制和修改操作系统内核,运行在操作系统的内核态,这种方式是“ 内核模式”。[1]
Windows 下应用程序有自己的地址空间,只能调用自己地址空间中的函数,所以,在挂钩API函数之前,必须将一个可以替代API 执行的函数的执行代码注入到目标进程,然后再想办法将目标进程对该API 的调用改为对注入到目标进程中自定义函数的调用。[2]
2 NT的安全保护措施
2.1 基于网络的安全与Windows NT信任域
NT内核中有一个执行组件叫做安全参考监视器(SRM)。在DoD的红皮书中也已定义了一个“安全参考监视器”。在红皮书中,一个安全域被一个单一的实体所管理。
“一个单一的信任系统犹如一个单一的实体一样,通过一个单一的信任证据所接受。一个单一信任系统网络执行相关的参考监视器来加强对对象访问时所应遵循的清晰的和良好定义的网络安全政策。[2]”
以上描述在NT中就是主域控制器(PDC),记住每一个系统都有本地安全和域安全。PDC的安全参考监视器负责管理域内的所有对象,与此同时,它创建了一个单一的控制点,和一个单一信任系统网络。
2.2 如何侵犯系统的完整性
DoD红皮书定义了“信任处理基础”(TCB)。在Windows NT中使用安全特权SE_TCB_PRIVILEGE指令和“担当操作系统一部分”的用户权利非常相似,可以通过使用管理员权限来将这个安全特权添加给某一个用户。
如果有权担当TCB的一部分,几乎可以做任何事情。现在在进程和剩下系统之间几乎没有安全措施。如果TCB不再被信任了,那么整个网络系统的完整性也已受到攻击。将要展示的就是这样的一个例子,如果它被安装在一个工作站上,就会侵犯一个网络分区。如果它被安装在主域控制器上,将会侵犯整个网络的完整性。
在一个相同的主机里,可能拥有两个唯一的区域:TCB在传统的红皮书里被评价为受信任处理基础和NTCB。这些分区没有必要相互交迭,但是可以这样做。如果任何的一个组件被侵犯了,那么看上去其他的也同样被侵犯了。换句话说,如果一台主机受到了危害,那么NTCB可能也受到了危害。
很显然,只有管理员才能在TCB上安装一个补丁,或拥有安装设备驱动程序的能力。为了使木马或病毒正常的执行,依靠某人的知识来安装这些补丁是很简单的事情。
2.3 NT下Ring0特权级保护机制
Windows操作系统运行在保护模式下,严格将用户权限分为内核模式和用户模式[3]。在Win9X和Windows NT操作系统中,为了充分利用虚拟空间并保证多任务的正常运行,应用程序都运行在保护模式。为了管理临界段资源,系统使用了特权级的概念。Intel X86处理器支持四个特权级,即Ring0 级到Ring3级。但Windows操作系统只使用了其中两个特权级:Ring0 作为“内核模式”,Ring3 作为“用户模式”。Ring0 级是最高等级的特权级, 所有内核状态执行线程在这一级执行,这就有效地保护了操作系统不受任何应用程序的损害。而所有应用程序都在Ring3 特权级内运行,这样可以避免影响系统内核的运行。
2.4 安全参考监视器
安全参考监视器负责加强访问控制。在NT下,所有的SRM函数都由ntoskrnl。exe传递。如果这些代码的完整性受到了侵犯,那么安全参看监视器也不再是受信任的了。整个安全系统就等于失败了。安全参考监视器负责对任何对象的访问提出同意或否定。它参考一个进程表来获取当前运行进程的访问令牌。然后它会比较访问令牌和对象的访问需求。每个对象都有一个安全描述(SD)。比较这两个结构,SRM就可以拒绝或允许访问这个对象。
参考确认机制必须面对的三个设计需求条件:1)参考确认机制必须提供篡改证据;2)参考确认机制必须总是被调用;3)参考确认机制必须足够小到经受起分析和测试,它的完全性必须被确认。
安全参考监视器不能提供篡改证据。它可能被TCB安全特权所保护,但是真正的能提供篡改证据的SRM应该使用加密机制。使用一个攻击工具如病毒或木马,一个补丁可以轻易的在TCB的环境下被安装。
如果对存储器映射有访问权限,可以修改安全参考监视器。这样,可以插入一个特别的用户ID可以随时访问的后门,这只是一个可以运用到NT RootKit中的一个小技巧。
3 NT平台上RootKit的实现
3.1 RootKit实现步骤
1) 插入无效的数据。无效的数据可以被插入到任何的网络流中,同样可以插入一些错误数据到固定的存储系统中,可能是敏锐的时间信息等,这样可能会破坏系统的备份。这样将会侵犯系统的可靠性和完整性。
2) 修改进入的ICMP数据报。使用ICMP作为隐藏的渠道,补丁可以读取进入到核心的ICMP数据报内部的命令。
3) 修改进入的以太网数据报。在不使用任何驱动组件的情况下担当嗅探器的角色。如果它已经修改了以太网,那么同样可以发送/接收与外网的数据报。它还可以嗅探秘密的关键字。
4) 修改已经存在的动态链接库,比如wininet.dll,追踪进入的数据。
5) 修改入侵检测系统。它可以修改如Tripwire或RealSecure等程序来破坏它们的完整性。
6) 修改审核系统,如系统事件日志来忽略一些事件日志消息。
3.2 获得Ring 0特权
在Windows NT下,普通用户没有直接写物理内存的权限"因此不能直接修改GDT或IDT。要获取Ring 0 权限,首先要求用户有写物理内存的权限,然后修改GDT,构造一个调用门,最后访问该调用门,执行Ring 0 代码[4]。 实现思路如下:
1) 使用户可读写\Device\PhysicalMemory对象GDT位于内核区域, 普通Ring 3 级应用程序无权直接访问该内存区域,Windows NT提供了一个名为PhysicalMemory 的Section对象, 通过该对象可以读写物理内存。通过分析,正常情况下只有SYSTEM用户才有对该对象的读写权限,administrator用户只有读权限。要使特定普通用户有写该对象的权限,需要以administrator用户身份增加另一个访问控制列表(ACL)到\Device\PhysicalMemory对象:首先打开一个\Device\PhysicalMemory对象的句柄并获得其安全描述符(GetSecurityInfo),接着在当前ACL中增加读写权限(SetEntriesInAcl),最后更新安全描述符(Set-SecurityInfo)。
2) 构造调用门:根据ntddk.h中的定义,当selector=8时,该调用门指向的处理代码以Ring 0 权限运行。函数地址低16位和函数地址高16位分别为Ring 0 代码的地址的高低16位。 Dpl位为调用该门的代码的最低权限,应设为3,present应设为1,表明该调用门可用。
3) 将调用门写入GDT中:从GDT尾部开始循环查找GDT中每一项,当找到一个不存在的描述符 (paresent=0)时停止,并将该描述符的各项修改为前面构造的调用门结构。
4) 访问调用门,运行Ring 0 代码:常规访问该调用门的方法不可行"因为当前应用程序运行在用户态,即Ring 3 级必须通过远调用far call来访问该调用门。
3.3 核心代码实现
首先对函数SeAccessCheck()进行逆向分析,通过使用IDA对函数进行了反汇编,部分代码如下所示。
8019A20C push [ebp arg_24]
8019A20F push [ebp arg_14]
8019A212 push edi
8019A213 push [ebp arg_1C]
8019A216 push [ebp arg_10]
8019A219 push [ebp arg_18]
8019A21C push ebx
8019A21D push dword ptr [esi]
8019A21F push dword ptr [esi 8]
8019A222 push [ebp arg_0]
8019A225 call sub_80199836
8019A22A cmp [ebp arg_8], 0
8019A22E mov bl, al
8019A230 jnz short loc_8019A238
8019A232 push esi
8019A233 call SeUnlockSubjectContext
8019A238 mov al, bl
8019A23A pop edi
8019A23B pop esi
8019A23C pop ebx
8019A23D pop ebp
8019A23E retn 28h
8019A23E SeAccessCheck endp
子程序被SeAccessCheck所调用。大多数的工作都是在此完成,因此对该函数进行了修改。
80199AD3 mov [ebp var_C], 0
80199ADA add esi, 8
80199ADD cmp [ebp var_10], 0
80199AE1 jz loc_80199B79
80199AE7 test edi, edi ;
80199AE9 jz loc_80199B79
80199AEF test byte ptr [esi 1], 8
80199AF3 jnz short loc_80199B64
80199AF5 mov al, [esi]
80199AF7 test al, al
80199AF9 jnz short loc_80199B14
80199AFB lea eax, [esi 8]
80199AFE push eax
80199AFF push [ebp var_8]
80199B02 call sub_801997C2
80199B07 test al, al
80199B09 jz short loc_80199B64
80199B0B mov eax, [esi 4]
80199B0E not eax
80199B10 and edi, eax
80199B12 jmp short loc_80199B64
4 总结
介绍了RootKit技术及Windows NT平台如何实现RootKit,探讨了NT平台的安全措施,以及绕过安全措施的方法。给出了具体实现RootKit的思路及方法,并给出了部分核心汇编代码。随着Windows平台安全性的提升,要实现RootKit也越来越难,但是越是难以实现的RootKit,一旦实现了就越具有隐蔽性,因此对RootKit技术的探讨有助于信息安全技术的不断更新与发展。
参考文献:
[1] 雷校勇,黄小平.Windows RootKit技术原理及防御策略[D].上海:上海交通大学,2006.
[2] 程彦,杨建召.Win32 中API拦截技术及其应用[J].长春工业大学学报:自然科学版,2006(04):99-101.
[3] 黄华星,舒辉,谢余强,等.Win32下ring0级保护机制的安全隐患研究 [A].全国网络与信息安全技术研讨会2004论文集[C],2004.
[4] 唐俊.一种基于行为的RootKit检测方法[J].计算机与数字工程,2008(9):32-34.