首先,像Back Orifice和NetBus都不属于Rootkit。它们是具有和PC-Anywhere,SMS或其他的商用程序相同功能的业余版本。如果你想远程控制一台工作站,可以向微软购买一套功能强大的SMS系统。一个远程桌面/管理应用程序不是Rootkit。
什么是Rootkit?
Rootkit是修改已经存在于系统内的可执行路径并具有特洛伊功能的程序集。这些进程侵犯信任处理基础(TCB)的完整性。换句话说,Rootkit就是那些插入后门到已经存在的程序,修改或损坏已经存在的安全的系统。
- Rootkit可能会破坏一个用户在登录时的审核;
- Rootkit允许任何人登录进系统,如果他们使用一个后门密码;
- Rootkit可能会修改内核,它会允许任何人执行具有特别文件名的特权代码。
所有的可能性无法想像,没有边际,但是有一点可以肯定的就是“RootKit”将自己与已经存在的系统结构联系起来,因此它往往是在暗地里运行的。而PC Anywhere那样的远程管理应用程序就仅仅是一个严密的应用程序。另一方面,RootKit在特定目标操作系统里修改已经存在的可执行路径。
为了解决这点,我在这篇文章里包含了4字节的补丁给NT的内核,它会删除在NT域内的所有的对象安全限制。如果这个补丁被运用到一个活动的主域控制器(PDC)上,那么整个域的完整性将受到侵犯。如果这个补丁在不知不觉中运行了数个星期,甚至是几个月,那时你所受到的损害将是无法确定的!
基于网络的安全与Windows NT信任域
-------------------------------
如果你对NT内核比较了解,那么你就应该知道其中的一个执行组件叫做安全参考监视器(SRM)。在DoD的红皮书中也已定义了一个“安全参考监视器”。我们现在讨论的是一个相同的话题,在红皮书中,一个安全域被一个单一的实体所管理。
引用:
“一个单一的信任系统犹如一个单一的实体一样,通过一个单一的信任证据所接受。一个单一信任系统网络执行相关的参考监视器来加强对对象访问时所应遵循的清晰的和良好定义的网络安全政策。[DoD红皮书]”
在NT中的说法就是主域控制器(PDC)。记住每一个系统都有本地安全和域安全。在这种情况下,我们只讨论域安全。PDC的安全参考监视器负责管理域内的所有对象。与此同时,它创建了一个单一的控制点,和一个单一信任系统网络。
如何侵犯系统的完整性
-------------------
我知道这些都是书中的理论,但请容忍我再罗嗦一点。DoD红皮书同样定义了“信任处理基础”(TCB)。如果你是一个NT程序员,你可能曾经使用过安全特权SE_TCB_PRIVILEGE。这个特权和“担当操作系统一部分”的用户权利非常相似。你可以通过使用管理员权限来将这个安全特权添加给某一个用户。
如果你有权担当TCB的一部分,你几乎可以做任何事情。现在在你的进程和剩下系统之间几乎没有安全措施。如果TCB不再被信任了,那么整个网络系统的完整性也已受到攻击。我将要向你展示的就是这样的一个例子,如果它被安装在一个工作站上,就会侵犯一个网络分区。如果它被安装在主域控制器上,将会侵犯整个网络的完整性。
什么是一个分区?
红皮书将网络分成NTCB(网络信任处理基础)“分区”。在网络中的任一组件或主机可以被认为是一个“分区”,这将会方便我们的分析和讨论。
引用:
“一个NTCB被分散为与分区相关的一些网络组件,并且NTCB部分所存在的组件也与NTCB分区相关。一个网络主机可能占有一个先前被我们认为是单机系统的TCB。这样的TCB没有必要与在主机内的NTCB分区相一致,它们拥有相同的安全周期[DoD红皮书]。”
在一个相同的主机里,你可能拥有两个唯一的区域:TCB在传统的红皮书里被评价为受信任处理基础和NTCB。这些分区没有必要相互交迭,但是它们可以这样做。如果任何的一个组件被侵犯了,那么看上去其他的也同样被侵犯了。换句话说,如果一台主机受到了危害,那么NTCB可能也受到了危害。
很显然,在TCB上安装一个补丁,你必须是管理员,或拥有安装设备驱动程序的能力。为了使木马或病毒正常的执行,依靠某人的知识来安装这些补丁是很简单的事情。
设想一个exploit
--------------
在我离题到那些严肃的混淆的技术前,思考一些基于修改NT内核的攻击。所有的一切都是因为我们已经侵犯了TCB:
1. 插入无效的数据。无效的数据可以被插入到任何的网络流中。同样可以插入一些错误数据到固定的存储系统中,可能是敏锐的时间信息等,这样可能会破坏系统的备份。这样将会侵犯系统的可靠性和完整性。
2. 修改进入的ICMP数据报。使用ICMP作为隐藏的渠道,补丁可以读取进入到核心的ICMP数据报内部的命令。
3. 修改进入的以太网数据报。在不使用任何驱动组件的情况下担当嗅探器的角色。如果它已经修改了以太网,那么同样可以发送/接收与外网的数据报。它还可以嗅探秘密的关键字。
4. 修改已经存在的动态链接库,比如wininet.dll,追踪进入的数据。
5. 修改入侵检测系统。它可以修改如Tripwire或RealSecure等程序来破坏它们的完整性,这样这些系统就无法探测到一些“污秽”的行动……
6. 修改审核系统,如系统事件日志来忽略一些事件日志消息。
现在为了稀有的“牛排”,让我们深入研究一个实际的内核补丁。如果你已经对保护模式和全局描述符表非常了解,你可以跳过下一节。否则,穿上你旅行的靴子,前面还有很多弯曲的路要走呢!
Rings的力量
-----------
Windows NT不像DOS或Windows 95,而是拥有自己的进程空间安全措施。每个用户模式的进程有一个被安全描述符保护的存储器空间。通常这个SD(安全描述符)由用户启动进程里的访问令牌所决定。所有对对象的访问都是通过“访问控制列表”来实现的。在Windows NT中被称为“任意访问控制”。就个人而言,我发现如果我不能了解它最基本的细节,那是很难理解其他东西的。所以在下一节里将描述使得x86结构安全成为可能的基本信息。
首先,了解“保护模式”是非常重要的。保护模式只有通过地址映射才能被很好的了解。几乎x86的所有的扩展访问能力都是建立在存储器寻址之上了。保护模式使得你可以寻址4GB的存储空间。多任务和特权等级都是建立在存储器寻址之上的把戏。这些讨论仅仅应用于386及更高级的处理器结构。
存储器被分为代码和数据段。在保护模式中,所有的存储器以段地址 + 偏移量的方式寻址的。相反地,在实模式下所有的东西都被翻译为一个实际的地址。在我们的讨论中,大家只关注保护模式。在保护模式中,所有的事情变得更加的复杂。我们必须先寻找段地址,然后是紧跟其后的偏移量。它被分成了两步来实现。为什么这个如此的让人感兴趣呢?那是因为几乎所有的现代操作系统都是这样工作的,并且它对exploits和病毒都是如此的重要。现在任何可移植的代码必须能够在这个舞台里正常运行。
什么是选择器?
选择器就是存储器段的另一个奇特的名称。存储器段通过一个表组织起来,那些表单元通常称为描述符。所以,记住一个选择器就是一个段,也就是一个描述符。它们都是一回事。
如果你了解存储器段是怎么回事,那么你就懂得整个等式!每个存储器段首先是由一个虚拟地址(16位)加上一个地址的偏移量(32位)。一个段并不像实模式那样是一个实际的地址,但是那却是需要使用的选择器的数字。这个小数字是一个描述符表的偏移量。依次,描述符自己拥有存储器段开始处的实际的线性地址。并且,描述符拥有存储器段的访问权限。
描述符被存储在称为全局描述符表(GDT)里。每个描述符有一个描述符特权等级(DPL),指示存储器段运行在哪个Ring中。
可以这样说,选择器就是你的媒介物。在NT和95下,所有的选择器覆盖了整个4GB的地址空间。如果你要使用其中的某个选择器,你要遍历存储器映射从0开始到任何地方。所有的选择器都存在,并且它们被0级DPL所保护。在Windows 9x下,选择器28对应覆盖了整个4GB区域的Ring 0级;在NT下,选择器8和10达到了同样的目的。
通过SoftIce转储GDT将构建一个类似下面的列表:
GDTBase=80036000 Limit=0x03FF
0008 Code32 00000000 FFFFFFFF 0 P RE
0010 Data32 00000000 FFFFFFFF 0 P RW
001B Code32 00000000 FFFFFFFF 3 P RE
0023 Data32 00000000 FFFFFFFF 3 P RW
0028 TSS32 8001D000 000020AB 0 P B
0048 Reserved 00000000 00000000 0 NP
0060 Data16 00000400 0000FFFF 3 P RW
......
你可以通过查看CPU的寄存器发现你当前正在使用的是哪个存储器段。寄存器SS,DS和CS表明哪个选择器正在用来指示堆栈段,代码段,和数据段。堆栈段和代码段必须处于相同的Ring级下。
段可以和其他的段相互交迭。换句话说,可以不只一个段能够对应相同的地址空间。段可以完全被另一个所交迭,也可以只是一部分而已。所以地址范围是很重要的,但是现在我们正关注另一个可口的信息。例如,一个段同样拥有一个特权等级(DPL)。
---- ----
│ │ │ │
│ │ │ │
│ │ ----
│ │ ----
│ │ │ │
│ │ │ │
---- │ │
│ │
----
什么是DLP?
描述符特权等级,了解这一点是很重要的。每个存储段被一个特权等级所保护,通常称为“Ring”。Intel的处理器有4个等级的Ring,从0到3,但通常只是用0和3。低的Ring等级拥有更高的特权。为