
本书是目前第一本关于rootkit的详尽指南,包括rootkit的概念、它们是怎样工作的、如何构建和检测它们。 世界顶级软件安全专家、rootkit.com创始人Greg Hoglund和James Butler向大家详细介绍攻击者是如何进入系统并长期驻留而不会被检测到的,以及黑客是如何摧毁Windows XP和Windows 2000内核系统的,其概念可以应用于现代任何主流操作系统。通过本书,读者可以全面掌握rootkit,提升自己的安全防范能力。
前 言
rootkit是持久且无法察觉地存在于计算机之上的一组程序和代码。
历史背景
我们对rootkit产生兴趣来自于我们在计算机安全领域的本职工作,但对于该主题的探索迅速发展成为一种个人使命。这导致了Hoglund建立rootkit.com网站,一个致力于反向工程和rootkit开发的论坛。我们两人都深深投入到了rootkit.com中。Butler首先通过该网站在线联系上了Hoglund,因为Butler得到一个需要测试的强大的新rootkit1,名为FU。他向Hoglund发送了一些源代码和预编译的二进制代码,然而疏忽中却没有发送内核驱动程序的源代码。令Butler惊奇的是,Hoglund成功地将预编译的rootkit加载到自己的工作站上,并报告说FU似乎运行良好。之后我们彼此的信任才不断加深2。
我们两人都长期受到一种几乎执拗的想法的驱使,即对Windows内核进行反向工程。就像当有人说我们无法做成某事时,我们就一定要完成它。了解所谓的计算机安全产品如何工作并发现它们的原理会令人感到非常满足。这必然导致更好的保护机制。
某种产品声称提供了某种级别的保护并不一定意味着它实际能够如此。在扮演攻击者的角色时,我们总是占据着优势。作为攻击者,我们只需想到防御者没有考虑的一件事即可。而另一方面,防御者必须考虑到攻击者能够完成的所有可能的事。这个数量对比有利于攻击者。
几年前,我们联合开设了培训课程“rootkit技术的攻击问题”。该课程最初只准备了一天的材料,现在已发展为数百页的笔记和示例代码。该课程的素材最终成为本书的基础。现在我们每年在Black Hat安全大会上以及私下场合多次提供rootkit培训课程。
在培训一段时间后,我们决定加强联系,现在共同就职于HBGary公司。在这里,我们每天都要处理非常复杂的rootkit问题。本书中,我们基于自身经验涵盖了当今Windows用户所面临的并且很可能在将来会继续增长的威胁。
读者对象
本书面向对计算机安全感兴趣并希望对安全威胁获得更真实感受的读者。关于入侵者如何获取计算机系统访问权的问题已有大量著作面世,但关于入侵者进行了这种初始访问之后会发生什么情况的问题还鲜有涉及。如书名所示,本书介绍了入侵者能够执行哪些工作来掩护其在被攻陷机器上的存在。
我们认为,包括微软公司在内的大多数软件供应商都没有严肃地对待rootkit。这是我们出版本书的目的。本书中的素材对于多年从事于rootkit或操作系统领域的一些人员来说并不是爆炸性的—— 但对于大部分人来说,本书应该能够表明rootkit是一种严重的威胁。它应该证明了扫描器或桌面防火墙从未提供足够的保护;还能够证明rootkit可以闯入您的计算机并在其中驻留多年,而您对此却一无所知。
为了更好地传播rootkit知识,我们从攻击者角度撰写了本书的大部分内容,但以防御者的姿态结束本书内容。开始了解攻击者的目标和技术之时即是了解自己系统的脆弱点以及如何消除其缺陷之时。阅读本书有助于您改进自身系统的安全或者在购买安全软件时做出明智的决策。
预备知识
由于所有代码示例是使用C语言编写的,因此掌握基本的C语言概念(尤其是指针概念)有助于获得更深入的理解。若不具备编程知识,仍应该能够继续学习并理解所有威胁,但无需理解特定的实现细节。本书的某些内容依赖于Windows设备驱动程序体系结构的原理,但无需设备驱动程序的编写经验。我们将带领您编写第一个Windows设备驱动程序,由此继续学习。
本书适用范围
本书介绍Windows系统的rootkit,但大多数概念也适用于其他操作系统,如LINUX。重点是内核rootkit,因为它们最难以检测。Windows的许多公开rootkit都是用户空间的3,由于它们不必理解在文档中未说明的内核是如何工作的,因此最易于实现。
本书并不针对现实中的特定rootkit,而是描述了所有rootkit使用的一般方法。每一章引入一种基本技术,解释其目的,并通过代码示例演示如何实现它。基于这些信息,应该能够以无尽的方式对示例进行扩展,以便执行各种任务。在内核中工作时,您实际上只受自己的想像力所囿。
本书中的大部分代码可以从rootkit.com网站下载。在整本书中,对每个示例都给出了具体的URL。其他rootkit作者也在rootkit.com公布了有助于跟踪最新研究发现的成果。
1 Butler对rootkit的恶意用途不感兴趣。相反,他迷恋于内核修改所产生的作用。这导致他开发了最早的rootkit检测程序之一VICE。
2 Hoglund有时仍在怀疑,该原始版本的FU是否仍在他的工作站上运行。
3 用户空间rootkit不利用内核层次上的改动,而是只依赖于用户程序的改动。
目 录
第1章 销声匿迹 1
1.1 攻击者的动机 1
1.1.1 潜行的角色 2
1.1.2 不需潜行的情况 3
1.2 rootkit的定义 3
1.3 rootkit存在的原因 4
1.3.1 远程命令和控制 4
1.3.2 软件窃听 5
1.3.3 rootkit的合法使用 5
1.4 rootkit的存在历史 6
1.5 rootkit的工作方式 7
1.5.1 打补丁 7
1.5.2 复活节彩蛋 7
1.5.3 间谍件修改 7
1.5.4 源代码修改 8
1.5.5 软件修改的合法性 8
1.6 rootkit与其他技术的区别 9
1.6.1 rootkit不是软件利用工具 9
1.6.2 rootkit不是病毒 10
1.7 rootkit与软件利用工具 11
1.8 攻击型rootkit技术 14
1.8.1 HIPS 14
1.8.2 NIDS 15
1.8.3 绕过IDS/IPS 15
1.8.4 绕过取证分析工具 16
1.9 小结 17
第2章 破坏内核 19
2.1 重要的内核组件 20
2.2 rootkit的结构设计 20
2.3 在内核中引入代码 23
2.4 构建Windows设备驱动程序 24
2.4.1 设备驱动程序开发工具包 24
2.4.2 构建环境 24
2.4.3 文件 25
2.5 加载和卸载驱动程序 28
2.6 对调试语句进行日志记录 28
2.7 融合rootkit:用户和内核模式的融合 29
2.7.1 I/O请求报文 30
2.7.2 创建文件句柄 33
2.7.3 添加符号链接 35
2.8 加载rootkit 36
2.8.1 草率方式 36
2.8.2 正确方式 38
2.9 从资源中解压缩.sys文件 40
2.10 系统重启后的考验 42
2.11 小结 43
第3章 硬件相关问题 45
3.1 环0级 46
3.2 CPU表和系统表 47
3.3 内存页 48
3.3.1 内存访问检查 49
3.3.2 分页和地址转换 50
3.3.3 页表查询 51
3.3.4 页项 52
3.3.5 页表项 53
3.3.6 重要表的只读访问 53
3.3.7 多个进程使用多个页 54
3.3.8 进程和线程 54
3.4 内存描述符表 55
3.4.1 全局描述符表 55
3.4.2 本地描述符表 56
3.4.3 代码段 56
3.4.4 调用门 56
3.5 中断描述符表 56
3.6 系统服务调度表 60
3.7 控制寄存器 60
3.7.1 控制寄存器0 60
3.7.2 其他控制寄存器 61
3.7.3 EFlags寄存器 61
3.8 多处理器系统 61
3.9 小结 63
第4章 古老的钩子艺术 65
4.1 用户空间钩子 65
4.1.1 导入地址表钩子 67
4.1.2 内联函数钩子 68
4.1.3 将DLL注入到用户空间进程中 70
4.2 内核钩子 74
4.2.1 钩住系统服务描述符表 75
4.2.2 修改SSDT内存保护机制 76
4.2.3 钩住SSDT 79
4.3 混合式钩子方法 99
4.3.1 进入进程的地址空间 99
4.3.2 钩子的内存空间 103
4.4 小结 105
第5章 运行时补丁 107
5.1 detour补丁 108
5.1.1 用MigBot重定控制流程路径 109
5.1.2 检查函数字节 110
5.1.3 记录被重写的指令 112
5.1.4 使用NonPagedPool内存 114
5.1.5 运行时地址修正 115
5.2 跳转模板 119
5.3 补丁方法的变型 126
5.4 小结 127
第6章 分层驱动程序 129
6.1 键盘嗅探器 130
6.2 剖析KLOG rootkit 134
6.3 文件过滤器驱动程序 146
6.4 小结 161
第7章 直接内核对象操作 163
7.1 DKOM的优缺点 163
7.2 确定操作系统的版本 165
7.2.1 用户模式的自确定 165
7.2.2 内核模式的自确定 167
7.2.3 在注册表中查询操作系统版本 167
7.3 用户空间与设备驱动程序的通信 169
7.4 DKOM隐藏技术 173
7.4.1 隐藏进程 173
7.4.2 隐藏设备驱动程序 179
7.4.3 同步问题 183
7.5 使用DKOM提升令牌权限和组 187
7.5.1 修改进程令牌 187
7.5.2 伪造Windows Event Viewer 201
7.6 小结 203
第8章 操纵硬件 205
8.1 为何使用硬件 206
8.2 修改固件 207
8.3 访问硬件 208
8.3.1 硬件地址 208
8.3.2 访问硬件与访问RAM的区别 209
8.3.3 定时问题 210
8.3.4 I/O总线 210
8.3.5 访问BIOS 212
8.3.6 访问PCI和PCMCIA设备 213
8.4 访问键盘控制器示例 213
8.4.1 8259键盘控制器 213
8.4.2 修改LED指示器 214
8.4.3 强制重启 220
8.4.4 击键监视器 220
8.5 微码更新 227
8.6 小结 228
第9章 隐秘通道 229
9.1 远程命令、控制和数据窃取 230
9.2 伪装TCP/IP协议 231
9.2.1 注意通信量模式 231
9.2.2 不以明文发送数据 232
9.2.3 充分利用时间因素 232
9.2.4 隐藏在DNS请求中 233
9.2.5 对ASCII编码有效负载进行隐写操作 233
9.2.6 使用其他TCP/IP通道 234
9.3 TCP/IP内核中支持rootkit的TDI接口 235
9.3.1 构建地址结构 235
9.3.2 创建本地地址对象 237
9.3.3 根据上下文创建TDI端点 240
9.3.4 将端点与本地地址进行关联 243
9.3.5 连接到远程服务器(发送TCP握手消息) 245
9.3.6 将数据发送到远程服务器 247
9.4 原始网络操作 250
9.4.1 在Windows XP上实现原始套接字 250
9.4.2 绑定到接口 251
9.4.3 使用原始套接字进行嗅探 252
9.4.4 使用原始套接字进行杂乱嗅探 253
9.4.5 使用原始套接字发送报文 254
9.4.6 伪造源信息 254
9.4.7 弹回报文 254
9.5 TCP/IP内核中支持rootkit的NDIS接口 255
9.5.1 注册协议 255
9.5.2 协议驱动程序回调函数 260
9.5.3 移动完整报文 266
9.6 主机仿真 273
9.6.1 创建MAC地址 273
9.6.2 处理ARP协议 273
9.6.3 IP网关 276
9.6.4 发送报文 276
9.7 小结 280
第10章 rootkit检测 281
10.1 检测rootkit的存在 281
10.1.1 守护门口 282
10.1.2 扫描“空间” 284
10.1.3 查找钩子 284
10.2 检测rootkit的行为 293
10.2.1 检测隐藏的文件和注册表键 294
10.2.2 检测隐藏的进程 294
10.3 小结 297