书籍详情
《Rootkit:系统灰色地带的潜伏者》[53M]百度网盘|亲测有效|pdf下载
  • Rootkit:系统灰色地带的潜伏者

  • 出版社:机械工业出版社自营官方旗舰店
  • 出版时间:2013-10
  • 热度:4493
  • 上架时间:2024-06-30 09:08:33
  • 价格:0.0
书籍下载
书籍预览
免责声明

本站支持尊重有效期内的版权/著作权,所有的资源均来自于互联网网友分享或网盘资源,一旦发现资源涉及侵权,将立即删除。希望所有用户一同监督并反馈问题,如有侵权请联系站长或发送邮件到ebook666@outlook.com,本站将立马改正

内容介绍

编辑推荐

  

  rootkit领域的重要著作,计算机安全领域公认经典
  《Rootkit:系统灰色地带的潜伏者》从反取证角度,深入、系统解读rootkit的本质和核心技术,以及如何构建属于自己的Rootkit武器,包含大量模块化示例,行文风趣幽默,颇具实战性和可读性。
  

海报:

内容简介

  《Rootkit:系统灰色地带的潜伏者》共分四部分。第一部分(第1~6章),全新阐释rootkit本质、rootkit与反取证关系、安全领域态势,以及反取证技术的策略、应对建议和攻击优势。之后,从硬件、软件(系统)、行业工具和内核空间方面介绍rootkit调查过程和利用反取证技术破坏调查过程的策略,使你对取证和反取证有全新了解。第二部分(第7~8章),主要介绍rootkit如何阻止磁盘分析和可执行文件的分析,而调查人员如何利用有效的工具和策略来分析辅助存储器(例如磁盘分析、卷分析、文件系统分析以及未知二进制分析)中可能留下的rootkit痕迹,并对内存驻留和多级释放器技术及用户态Exec(UserlandExec)理念进行了深入剖析。第三部分(第9~15章)主要详解攻击者利用rootkit破坏数据收集过程和造成“一切安好”的假象的前沿实用策略:阻止在线取证、内核模式策略、更改调用表、更改代码、更改内核对象、创建隐秘通道和部署带外rootkit。第四部分(第16章),高屋建瓴地重新总结了rootkit的核心策略,以及如何识别隐藏的rootkit、注意事项和如何处理感染等。

作者简介

  Bill Blunden,资深计算机安全专家,从事相关研究10余年,对rootkit有非常深入的研究。目前从事网络安全设备代码和ERP中间件的相关工作。活跃于计算机安全类社区,常与计算机安全领域多名世界级安全专家交流探讨。在学术生涯中走过不少弯路,因此对计算机安全有异于常人的观察角度和体会。

目录

译者序
献给“孙悟空”
前言

第一部分基础知识

第1章 清空思想
1.1不速之客
1.2提炼一个更确切的定义
1.2.1攻击循环
1.2.2rootkit在攻击循环中的角色
1.2.3单级释放器与多级释放器
1.2.4其他部署方法
1.2.5确切的学术性定义
1.2.6不要混淆设计目标与实现
1.2.7rootkit技术--力量倍增器
1.2.8金·费尔比式比喻:破坏与毁坏
1.2.9为何使用隐身技术?rootkit不能被发现吗
1.3rootkit不等于恶意软件
1.3.1感染源
1.3.2广告软件和间谍软件
1.3.3僵尸网络的兴起
1.3.4引入:愚人飞客病毒
1.3.5恶意软件与rootkit
1.4谁在开发和使用rootkit
1.4.1市场营销
1.4.2数字版权管理
1.4.3不是rootkit,而是种功能
1.4.4法律实施
1.4.5商业间谍
1.4.6政治间谍
1.4.7网络犯罪
1.4.8谁开发了颇具艺术感的rootkit
1.4.9rootkit的道德性
1.5慑魄惊魂:战场伤员分类
1.6总结

第2章 反取证综述
2.1事件响应
2.1.1入侵检测系统(和入侵防御系统)
2.1.2异常行为
2.1.3发生故障
2.2计算机取证
2.2.1rootkit不是隐身的吗?为什么还要进行反取证
2.2.2假定最糟糕案例的场景
2.2.3取证技术分类:第一种方法
2.2.4取证技术分类:第二种方法
2.2.5在线取证
2.2.6当关机不再是种选择
2.2.7关于拔掉电源插头的争论
2.2.8崩溃转储或者不进行崩溃转储
2.2.9事后检查分析
2.2.10非本地数据
2.3AF策略
2.3.1数据销毁
2.3.2数据隐藏
2.3.3数据转换
2.3.4数据伪造
2.3.5数据源消除
2.4AF技术的总体建议
2.4.1使用定制工具
2.4.2低且慢与焦土策略
2.4.3避免特定实例攻击
2.4.4使用分层防御
2.5不明身份者具有优势
2.5.1攻击者能够专注于攻击
2.5.2防御者面临制度性挑战
2.5.3安全是一种过程(而且还是一种令人讨厌的过程)
2.5.4持续增加的复杂度
2.6总结

第3章 硬件概述
3.1物理内存
3.2IA-32内存模型
3.2.1平面内存模型
3.2.2分段内存模型
3.2.3操作模式
3.3实模式
3.3.1案例研究:MS-DOS
3.3.2这不是浪费时间吗?为什么学习实模式
3.3.3实模式执行环境
3.3.4实模式中断
3.3.5分段和程序控制
3.3.6案例研究:转储IVT
3.3.7案例研究:用TSR记录击键
3.3.8案例研究:隐藏TSR
3.3.9案例研究:为TREE.COM命令打补丁
3.3.10小结
3.4保护模式
3.4.1保护模式执行环境
3.4.2保护模式分段
3.4.3保护模式分页
3.4.4地址扩展分页
3.4.5进一步研究页表
3.4.6进一步研究控制寄存器
3.5实现内存保护
3.5.1通过分段实现保护
3.5.2界限检查
3.5.3类型检查
3.5.4特权检查
3.5.5受限指令检查
3.5.6门描述符
3.5.7保护模式中断表
3.5.8分页保护
3.5.9总结

第4章 系统概述
4.1Windows系统下的物理内存
4.1.1失落的大陆(内存)
4.1.2Windows如何使用物理地址扩展
4.1.3页、页帧、页帧号
4.2Windows下的分段和分页
4.2.1分段
4.2.2分页
4.2.3线性地址到物理地址的转换
4.2.4一个更快的方法
4.2.5关于EPROCESS和KPROCESS的讨论
4.3用户空间和内核空间
4.3.14GB调优(4GT)
4.3.2各得其所
4.3.3跨越篱笆
4.3.4用户空间剖析
4.3.5内核空间动态分配
4.3.6地址窗口化扩展
4.3.7PAE、4GT和AWE的对比
4.4用户模式和内核模式
4.4.1执行方式与执行位置
4.4.2内核模式组件
4.4.3用户模式组件
4.5其他内存保护特征
4.5.1数据执行保护
4.5.2地址空间布局随机化
4.5.3GS 编译选项
4.5.4SAFESEH链接器选项
4.6本机API
4.6.1中断向量表的发展
4.6.2进一步研究中断描述表
4.6.3通过中断进行系统调用
4.6.4SYSENTER指令
4.6.5系统服务调度表
4.6.6枚举本机API
4.6.7Nt*( )系统调用与Zw*( )系统调用
4.6.8系统调用的生命周期
4.6.9其他内核模式例程
4.6.10内核模式API文档
4.7引导过程
4.7.1BIOS固件启动
4.7.2EFI固件启动
4.7.3Windows启动管理器
4.7.4Windows启动加载器
4.7.5初始化执行体
4.7.6会话管理器
4.7.7wininit.exe
4.7.8winlogon.exe
4.7.9启动过程概括
4.8设计决策
4.8.1藏在人群中:类型0
4.8.2主动隐藏:类型1和类型2
4.8.3跳出边界:类型3
4.8.4前景展望

第5章 行业工具
5.1开发工具
5.1.1诊断工具
5.1.2磁盘映像工具
5.1.3更快速救灾:虚拟机
5.1.4工具综述
5.2调试器
5.2.1配置CDB.exe
5.2.2符号文件
5.2.3Windows符号
5.2.4激活CDB.exe
5.2.5控制CDB.exe
5.2.6有用的调试器命令
5.2.7检查符号命令(x)
5.2.8列举已加载的模块(lm和!lmi)
5.2.9显示类型命令(dt)
5.2.10反汇编命令(u)
5.2.11显示命令(d*)
5.2.12寄存器命令(r)
5.3KD.exe内核调试器
5.3.1使用内核调试器的不同方法
5.3.2物理宿主机-目标机配置
5.3.3准备硬件
5.3.4准备软件
5.3.5启动内核调试会话
5.3.6控制目标机
5.3.7虚拟宿主机-目标机配置
5.3.8 有用的内核模式调试器命令
5.3.9列举已加载模块命令
5.3.10!process扩展命令
5.3.11寄存器命令(r)
5.3.12使用崩溃转储
5.3.13方法1:PS2键盘技巧
5.3.14方法2:KD.exe命令
5.3.15方法3:NotMyFault.exe
5.3.16崩溃转储分析

第6章 内核空间中的玄机
6.1KMD模板
6.1.1内核模式驱动程序:全局概览
6.1.2WDK框架
6.1.3真正最小的KMD
6.1.4处理IRP
6.1.5与用户模式代码通信
6.1.6从用户模式发送命令
6.2加载内核模式驱动程序
6.3服务控制管理器
6.3.1在命令行使用sc.exe
6.3.2编程使用SCM
6.3.3注册表踪迹
6.4使用导出驱动程序
6.5综合利用内核中的漏洞
6.6Windows内核模式安全
6.6.1内核模式代码签名
6.6.2KMCS的应对措施
6.6.3内核补丁保护
6.6.4KPP的应对措施
6.7同步
6.7.1中断请求级
6.7.2延迟过程调用
6.7.3实现
6.8总结

第二部分事 后 分 析

第7章 阻止磁盘分析
7.1事后调查:概述
7.2取证副本
7.3卷分析
7.3.1Windows下的存储卷
7.3.2手工分析卷
7.3.3应对措施:破坏分区表
7.3.4Windows下的原始磁盘访问
7.3.5原始磁盘访问:突破常规
7.4文件系统分析
7.4.1恢复删除的文件
7.4.2恢复删除的文件:应对措施
7.4.3枚举可选数据流
7.4.4枚举可选数据流: 应对措施
7.4.5恢复文件系统对象
7.4.6恢复文件系统对象:应对措施
7.4.7带外隐藏
7.4.8带内隐藏
7.4.9引入:FragFS
7.4.10应用层隐藏
7.4.11获取元数据
7.4.12获取元数据:应对措施
7.4.13改变时间戳
7.4.14改变校验和
7.4.15识别已知文件
7.4.16交叉时间差异与交叉视图差异
7.4.17识别已知文件:应对措施
7.5文件签名分析
7.6总结

第8章 阻止可执行文件分析
8.1 静态分析
8.1.1扫描相关人工痕迹
8.1.2验证数字签名
8.1.3转储字符串数据
8.1.4检查文件头
8.1.5反汇编和反编译
8.2破坏静态分析
8.2.1数据转换:加壳
8.2.2加壳:加密程序
8.2.3密钥管理
8.2.4加壳:压缩程序
8.2.5加壳:变形代码
8.2.6定制工具的需求
8.2.7关于加壳的争论
8.2.8数据伪造
8.2.9虚旗攻击
8.2.10数据源清除:多级加载器
8.2.11深度防御
8.3运行时分析
8.3.1运行环境
8.3.2手工与自动运行时分析
8.3.3手工分析:基本概要
8.3.4手工分析:跟踪
8.3.5手工分析:内存转储
8.3.6手工分析:捕捉网络活动
8.3.7自动化分析
8.3.8运行时复合分析
8.4破坏运行时分析
8.4.1跟踪的应对措施
8.4.2API跟踪:规避迂回补丁
8.4.3API跟踪:多级加载器
8.4.4指令级跟踪:攻击调试器
8.4.5断点
8.4.6检测用户模式调试器
8.4.7检测内核模式调试器
8.4.8检测用户模式调试器或者内核模式调试器
8.4.9通过代码校验和检测调试器
8.4.10关于反调试器技术的争论
8.4.11指令级跟踪:混淆
8.4.12混淆应用数据
8.4.13混淆应用代码
8.4.14阻止自动化
8.4.15应对运行时复合分析
8.5总结

第三部分在 线 取 证

第9章 阻止在线取证
9.1在线取证:基本过程
9.2用户模式加载器
9.2.1UML破坏现有的API
9.2.2关于加载器API模块的争论
9.2.3纵览Windows PE文件格式
9.2.4相对虚拟地址
9.2.5PE文件头
9.2.6导入数据节(.idata)
9.2.7基址重定位节(.reloc)
9.2.8实现独立的UML
9.3最小化加载器踪迹
9.3.1数据节育:献给The Grugq的颂歌
9.3.2下一步:通过漏洞利用程序加载
9.4关于独立PE加载器的争论

第10章 用C语言创建shellcode
10.1用户模式shellcode
10.1.1Visual Studio工程设置
10.1.2使用相对地址
10.1.3寻找kernel32.dll:通往TEB和PEB的旅程
10.1.4扩展地址表
10.1.5解析kernel32.dll导出表
10.1.6提取shellcode
10.1.7危险空间
10.1.8构建自动化
10.2内核模式shellcode
10.2.1工程设置:$(NTMAKEENV)\makefile.new
10.2.2工程设置:SOURCES
10.2.3地址解析
10.2.4加载内核模式shellcode
10.3特殊武器和策略
10.4展望

第11章 更改调用表
11.1在用户空间挂钩:IAT
11.1.1DLL基础
11.1.2访问导出例程
11.1.3注入DLL
11.1.4走查磁盘上PE文件的IAT
11.1.5挂钩IAT
11.2内核空间的调用表
11.3挂钩IDT
11.3.1处理多处理器:方案#1
11.3.2裸例程
11.3.3关于挂钩IDT的问题
11.4挂钩处理器MSR
11.5挂钩SSDT
11.5.1禁用WP位:技巧#1
11.5.2禁用WP位:技巧#2
11.5.3挂钩SSDT项
11.5.4SSDT示例:跟踪系统调用
11.5.5SSDT示例:隐藏进程
11.5.6SSDT示例:隐藏网络连接
11.6挂钩IRP处理程序
11.7挂钩GDT:安装调用门
11.8挂钩的应对措施
11.8.1检查内核模式挂钩
11.8.2检查IA32_SYSENTER_EIP
11.8.3检查 INT 0x2E
11.8.4检查 SSDT
11.8.5检查IRP处理程序
11.8.6检查用户模式钩子
11.8.7解析PEB:
第1部分
11.8.8解析PEB:
第2部分
11.9反应对措施
11.9.1假设最坏的案例
11.9.2最坏案例应对措施#1
11.9.3最坏案例应对措施#2

第12章 更改代码
12.1跟踪调用
12.1.1迂回实现
12.1.2获取NtSetValueKey()的地址
12.1.3初始化补丁元数据结构
12.1.4对照已知签名核实原始机器码
12.1.5保存原始序言和尾声代码
12.1.6更新补丁元数据结构
12.1.7锁定访问并禁用写保护
12.1.8注入迂回
12.1.9序言迂回
12.1.10尾声迂回
12.1.11事后总结
12.2破坏组策略
12.2.1迂回实现
12.2.2初始化补丁元数据结构
12.2.3尾声迂回
12.2.4将注册表值映射到组策略
12.3绕过内核模式API记录器
12.3.1故障安全规避
12.3.2更上一层楼
12.4指令补丁应对措施

第13章 更改内核对象
13.1隐形的代价
13.1.1问题#1:陡峭的学习曲线
13.1.2问题#2:并发性
13.1.3问题#3:可移植性和指针运算
13.1.4特有技术:DKOM
13.1.5对象
13.2再访EPROCESS对象
13.2.1获取EPROCESS指针
13.2.2EPROCESS相关域
13.2.3UniqueProcessId
13.2.4ActiveProcessLinks
13.2.5Token
13.2.6ImageFileName
13.3DRIVER_SECTION对象
13.4令牌对象
13.4.1Windows授权
13.4.2定位令牌对象
13.4.3令牌对象中的相关域
13.5隐藏进程
13.6隐藏驱动程序
13.7操纵访问令牌
13.8使用No-FU
13.9内核模式回调
13.10应对措施
13.10.1交叉视图检测
13.10.2高级枚举:CreateToolhelp32Snapshot()
13.10.3高级枚举:PID暴力
13.10.4低级枚举:进程
13.10.5低级枚举:线程
13.10.6相关软件
13.10.7域校验和
13.11反应对措施
13.11.1最好的防护:饿死对手
13.11.2评论:超越双环模型
13.11.3最后一道防线

第14章 隐秘通道
14.1普通恶意软件通道
14.1.1互联网中继聊天
14.1.2对等通信
14.1.3HTTP
14.2最坏案例场景:截获所有数据内容
14.2.1协议隧道
14.2.2DNS
14.2.3ICMP
14.2.4外围设备问题
14.3Windows TCPIP栈
14.3.1Windows Sockets 2
14.3.2原始套接字
14.3.3Winsock内核API
14.3.4NDIS
14.3.5不同任务使用不同的工具
14.4DNS隧道
14.4.1DNS查询
14.4.2DNS应答
14.5DNS隧道:用户模式
14.6DNS隧道:WSK实现
14.6.1初始化应用程序的上下文
14.6.2创建内核模式套接字
14.6.3确定本地传输地址
14.6.4绑定套接字与传输地址
14.6.5设置远程地址(C2客户端)
14.6.6发送DNS查询
14.6.7接收DNS应答
14.7NDIS协议驱动程序
14.7.1创建并运行NDISProt6.0示例
14.7.2客户端代码概要
14.7.3驱动程序代码概要
14.7.4Protocol*()例程
14.7.5缺失的特征
14.8被动的隐秘通道

第15章 转到带外
15.1 附加处理器模式
15.1.1系统管理模式
15.1.2流氓管理程序
15.1.3白帽成员对策
15.1.4流氓管理程序与SMM rootkit
15.2固件
15.2.1主板BIOS
15.2.2ACPI组件
15.2.3扩展ROM
15.2.4UEFI固件
15.3远程管理设施
15.4不太明显的备用方案
15.4.1板载闪存
15.4.2电路级伎俩
15.5总结

第四部分结 束 语

第16章 rootkit之道
16.1核心策略
16.1.1尊重你的对手
16.1.2五指穿心掌
16.1.3忍耐强行夺取的欲望
16.1.4研究你的目标
16.2识别隐藏之门
16.2.1对付专有系统
16.2.2监视内核
16.2.3重要特点:硬件是新软件
16.2.4充分利用现有研究
16.3建筑领域的训诫
16.3.1首先加载,深度加载
16.3.2为自主性而奋斗
16.3.3Butler Lampson:策略与机制分离
16.4设计rootkit
16.4.1隐身与开发努力
16.4.2使用定制工具
16.4.3稳定性很重要:致力于最佳实践
16.4.4逐步提高
16.4.5容错移转:自我修复的rootkit
16.5处理感染

精彩书摘

  第一部分
  基 础 知 识
  第1章 清 空 思 想
  各位,抛弃你过去的思想,这是学习本书的起点。沿着本书指明的道路前进吧,很快你将见到美好而可畏的奥兹国。在本章中,我们将总体介绍rootkit相关情况,讨论“rootkit”这个词的词源,以及怎样把rootkit技术运用于攻击循环的基本框架和相应的领域。为了突出rootkit的独特特征,我们将把该技术和几种恶意软件进行对比,并纠正一些常见的错误观念。
  1.1 不速之客
  几年前,媒体报道了一位独居在日本福冈市中年男子的故事。该男子几个月以来发现,厨房里的一些食物不见了。这是个有启发意义的教训:如果你感觉什么东西不对,相信自己的直觉。
  那么,这个日本单身汉怎么做的呢?他架起一个监控摄像头并把监控图像传到自己的手机上 。某一天,摄像头捕捉到一个人在他的公寓里走动。他认为那是小偷,立即打电话报了警,于是警察就冲向他的公寓去抓那个小偷。当警察来到他家后,发现家中所有的门窗紧锁。警察在公寓内搜查后发现一个名叫Tatsuko Horikawa的58岁妇女蜷缩在衣柜底部。根据警方调查,她无家可归并至少在衣柜里住了半年之久。
  该妇女向警察解释道,某一天,当这个单身汉离家而没锁门时,她得以第一次进入这个公寓。日本当局怀疑,为了将被抓获的风险降到最低,这个妇女只是有时住在这个公寓,并往返于不同的公寓之间居住 。当她隐藏在公寓时,一般会洗个澡,然后在她睡的衣柜里铺上垫子,并喝上几瓶水以渡过难关。警方发言人Horiki Itakura称该妇女“既整洁又干净”。
  从某种意义上说,这就是rootkit:一位不速之客,非常整洁、干净且难以发现。
  1.2 提炼一个更确切的定义
  虽然将入侵者比喻为既整洁又干净的不速之客的确有助于我们的理解,但还是让我们通过这个词的起源来追踪该词更加确切的定义。按照UNIX领域内的说法,系统管理员账户(即安全限制最少的用户账户)通常称为root账户。这个特殊账户有时在字面上称为“root”,但是这种叫法更多的是历史习惯而不是规定。
  “攻陷”一台电脑并取得该电脑的管理员权限称为root一台机器。取得root账户权限的攻击者就可以称他已经root了该机器。另外一种描述你已经root一台电脑的说法是你own(拥有)了它,这种说法的本意是指你可以对这台电脑为所欲为,因为你已经完全控制了这台机器。按照因特网上的说法,在标准的计算机键盘上,由于字母p和o毗邻,致使一些人用pwn代替own。
  严格地说,你并不需要通过取得管理员账户权限来root电脑。root电脑的最终目的是取得与管理员同级别的原始访问权限。例如,在安装有Windows系统的机器中,SYSTEM账户表示操作系统本身,实际上SYSTEM账户比管理员组中的账户拥有更高的权限。如果你能攻陷一个运行在SYSTEM账户下的Windows程序,这和拥有管理员权限具有同样的效果(有过之而无不及)。事实上,有些人认为在SYSTEM账户下运行是非常高级的,因为追踪一个使用SYSTEM账户的入侵者极度困难,系统产生的日志条目如此之多,很难区分哪些是由攻击者产生的。
  然而,root一台机器与保持访问权限有所区别(如同挣到一百万美元和保管一百万美元的区别)。有一些工具可以由有经验的系统管理员来用于发现入侵者,并将他们踢出被攻陷的机器。一些新取得权限而大肆声张的入侵者将会引起管理员的注意,失去他们的权限。对入侵者来说,关键是进入机器、取得权限、监控机器的状态,然后隐藏起来享受他们的劳动成果。
  《计算机行话辞典》 把rootkit定义为“能保持root权限的一套工具”。换句话说,
  rootkit是由二进制代码、脚本和配置文件组成的集合体(例如,一套工具),人们能够使用它隐秘地保持对计算机的访问权限,以便在不引起系统管理员注意的情况下发布命令、搜索数据。
  设计良好的rootkit可以让一台被攻陷的机器看起来没有任何异常,并使攻击者在系统管理员的眼皮底下保持一个据点,而且他想待多久就待多久。
  1.2.1 攻击循环
  现在你可能会想:“好吧,root机器第一步该干什么呢?”要回答这个问题所涉及的话题可能几本书都写不完 。出于简洁的目的,我将提供一个简要概述(可能有些不全面)。
  假定一个精准攻击的场景,大多数入侵者都会从搜集目标组织的概要情报开始。在这个攻击阶段中,将涉及信息筛选,例如筛选该组织的域名注册信息、分配的公共IP地址范围信息,也有可能要查阅证券交易委员会(Securities and Exchange Commission,SEC)的文件、年报和媒体信息以确定该组织办公地点的位置。
  如果攻击者决定使用基于漏洞的方法进行攻击,他们将通过情报搜集初期发现的目标组织的因特网踪迹来枚举主机,主要的枚举方法有ping扫描或目标IP扫描,然后检查发现的每台存活主机运行的标准网络服务。因此,像nmap这样的工具就显得必不可少 。
  当攻击者识别到一台特定的计算机并搜集一系列监听服务后,将试图寻找获取shell访问的方法,使他能够执行任意的命令并可能进一步提升权限,甚至是取得root账户访问权限(虽然有时在运行Windows的机器上取得超级用户权限就足够了)。例如,受攻击的机器是网站服务器,攻击者可能对开发拙劣的网站应用程序发起结构化查询语言(Structured Query Language,SQL)注入攻击,以突破与其相关联的数据库服务器的安全防护。然后,他能够访问数据库服务器以获取管理员权限,或许root账户密码和数据库管理员密码是一样的呢?
  基于漏洞的方法并不是唯一的攻击方式,有无数的方式可以进行访问并获取权限。最后,一切都在于取得一些通往目标的接口(参见图1.1),然后提升你的权限 。
  这个接口不一定是传统的命令行shell,它也有可能是攻击者设计的专用API。你可以通过装扮成修电脑的技术人员或通过肩窥(shoulder surfing)来建立接口。因此,用于root机器的工具范围很广:从社会工程学(例如鱼叉式网络钓鱼、恐吓性软件、假托电话等),到密码蛮力破解、偷窃备份,再到像Joanna Rutkowska的“Evil Maid”之类的离线攻击 。基于我个人的经验和同行们提供的信息,在大规模攻击中,软件漏洞和社会工程学是经常采用的两类入侵方法。
  1.2.2 rootkit在攻击循环中的角色
  rootkit通常在攻击循环的最后阶段发挥作用,这就是为什么称它们为post-exploit工具的原因。你一旦获得接口并(用某种方式)提升为root权限,接下来自然就是要保持已攻陷机器的访问权限(也称为驻扎场地或据点),rootkit有助于实现持续性访问。至此,攻击者就可以从目标主机上挖掘有价值的信息了,如社会保险号、相关账户细节信息或者CVV2码(即完整信用卡号码、相应到期日期、账单地址以及3位数的保险码)。
  或者,攻击者可以简单地运用当前据点来攻击目标网络内不能直接路由的其他机器,以扩大影响范围,这种行为叫做支点攻击(pivoting),这种攻击有助于混淆入侵源(参见图1.2)。
  注意,图1.2中的最后一步为何不属于支点攻击。我在本书的前言就解释过了,本书的侧重点是台式计算机,因为在很多情况下,攻击者通过攻击能够访问目标数据的客户机以取得所需信息。当你能够通过攻陷一些主管的台式计算机系统以取得同样的基本结果时,为什么还要花数天时间突破加固的企业级大型机的安全防护层呢?这是Pete的最爱,去摘树上低悬的水果!正如Richard Bejtlich所说:“一旦没有了其他选择,攻击数据的最终点将落在对授权用户有用的地方”。
  1.2.3 单级释放器与多级释放器
  在目标机器上安装rootkit的方式各种各样,有时它被安装成一个由漏洞利用程序释放的载荷。在此载荷中有个特殊程序叫做释放器(dropper),由它完成实际的安装任务(参见图1.3)。
  释放器的作用很多,例如帮助rootkit通过网关安全扫描,释放器能够变换rootkit(例如对rootkit进行压缩、编码或者加密),然后把rootkit封装成内部数据结构。当释放器最终执行时,它将释放(例如解压缩、解码、解密和安装)rootkit。表现良好的释放器事后会删除自身,只留下rootkit所需的内容。
  多级释放器并不会将rootkit列为字节流的一部分,相反,它们将搭载在一些小程序上,例如定制的FTP客户端、浏览器插件或存根程序,这些程序存在的唯一目的就是从远程网络上下载rootkit(参见图1.4)。在更极端的情况下,最初的存根程序可能会下载第二个更大的存根程序,然后第二个存根程序下载rootkit,通过两个独立的阶段完成rootkit的安装。
  多级释放器的思想在于最小化释放器留下的取证证据数量。按这种方式,如果调查人员一旦发现一个未能恰当地触发并执行自毁的释放器,也无法分析你的rootkit代码。例如,他试图在一个独立的沙盒环境中运行释放器,但存根程序甚至无法下载rootkit。在最坏的案例场景中,存根程序将认识到那是个虚拟的环境而什么都不做。这个思路完全符合The Grugq的数据节育(data contraception)策略,我们将在本书的后面讲述这一点。
  ……

前言/序言

  信息技术(IT)的困惑在于一切事物都处于变化之中。这是不可避免的。高新技术领域的事物日新月异,计算机安全领域更是如此。随着攻击者不断发现破坏计算机的新方法,进攻策略随之发展,防御策略也相应地跟着进步。作为一名信息技术领域的专业人士,你会面临一个抉择:要么主动了解你的安全工具存在的固有缺陷;要么在遭受入侵者攻击后,吃到苦头时才发现工具存在的缺点。
  在本书中,我充当“黑帽”(即黑帽黑客)这一角色,是希望能够从一个攻击的优势位置观察隐身技术,阐明存在于事件响应领域内的挑战。在这个过程中,我颇费周折地查阅了大量记载糟糕、内容不全和未公开的资料。本书为你快速上手并轻易获取信息提供了机会,而不再需要努力成为triple-fault俱乐部的终身会员。
  本书的目的不是让坏人去做坏事,我碰到的恶意软件专业开发人员已经熟练掌握了反取证知识。(你认为还能有谁为本书提供材料和灵感呢?)相反,总结这些破坏性思想的目的在于正当地服务于“好人”。我的目标是不仅能够使调查人员意识到潜在的盲点,而且能够促使软件开发商进步以应对正在兴起的大规模网络安全威胁。这里讨论的是“高级持续性威胁”(Advanced Persistent Threat,APT) 。
  APT:低且慢,而非强行夺取
  “高级持续性威胁”是美国空军于2006年创造的一个术语。APT代表有组织的入侵者团体进行的一类攻击(通常称为“入侵团伙”),这些团体拥有大量的资金和装备支持。这类特殊的黑帽分子对高价值的设施谨慎地进行有目的性的攻击,他们持续地对有价值的目标发起攻击,直到建立一个稳固的、可运作的据点。国防工业、高技术供应商以及金融机构的人员都是APT的攻击对象。
  根据部署的防护措施的差异,如应对定制的0-Day漏洞攻击和伪造证书攻击,APT事件可能会涉及更加复杂的工具。在极端情况下,一个入侵者团伙或许会进一步从物理层面上渗透目标(例如,回应工作公告、贿赂内部人员、假装电信维修人员、直接非法入侵等)以获取设备的访问权。简而言之,这些团伙能够绕过当前的任何障碍来获得授权和资源。
  因为APT经常试图在被攻击者的地盘建立长期的据点,所以隐身技术至关重要。与通常强行夺取式的网络入侵而留下明显的二进制踪迹和网络数据包不同,这更接近于白蚁虫害。它更像是一种低且慢的秘密入侵,无形地从一台电脑传播到下一台电脑,低调潜行并不让外人发现任何异常的征兆,直到最后一切都晚了,这就是rootkit的作案风格。
  第2版新增内容
  本书不仅做了全面的细微调整,如在每章增加一节或两节来体现最新的发展,还对全书进行了重大修订。新增内容汇集了我从专业研究者那里得到的意见、读者的反馈、同行的评论以及我自己的研究成果。
  推陈出新
  简单地说,本书增加了新的内容,删除了过时的内容。具体地讲,本书删除了那些由于技术发展而被证明不够有效的技术。例如,本书不再过多地介绍bootkit(bootkit很容易被检测到),而是花费更多篇幅介绍如shellcode和内存驻留软件这样的主题。本书还删除了第1版中只能在Windows XP环境下运行的示例。此外,应广大读者要求,本书还包含了驻留于较低环中(例如,环 -1、环 -2和环 -3)的rootkit信息。
  反取证相关内容
  在我写本书的第1版期间,我认识到rootkit本身是反取证的。毕竟,正如The Grugq所说,反取证主要是为了限制入侵者留下的可取证数据的数量和质量。隐身技术就是这种方法的一个例子。无论是在目标机器运行还是在关闭的状态下,都应尽可能少地为调查人员留下你出现的踪迹。鉴于此,本书重新组织了反取证的相关内容,以便读者能够明白rootkit如何适合反取证的全面要求。
  方法
  隐身技术汲取了数个相关研究领域的思想(例如,系统结构、逆向工程以及安全等)。为最大限度地提高读者阅读本书所花精力的投资回报率(Return On Investment,ROI),我只好做出一系列决定来限定本书涉及的主题范围,具体如下所示。
  ● 聚焦反取证而非取证
  ● 针对台式计算机
  ● 重点关注构建定制工具
  ● 适当回顾必备资料
  ● 采用模块化示例论证观点
  聚焦反取证而非取证
  一本讲述rootkit的书最终很可能成为关于取证的书。当然,关于取证,我必须深入到某一细节层次,否则,反取证就无从谈起。与此同时,如果对“如何”以及“为什么”取证(“取证”非常诱人,因为这个学科领域的内容是如此丰富)讨论过多,将没有足够篇幅来讲述本书的核心内容。因此,我决定只涉及取证分析的基本步骤,并把它简单地作为研究应对措施的起点。
  我深刻地意识到,本书涵盖的内容对一些读者而言可能是不够的。对于那些希望学习更多取证分析基本原则的读者,有大量其他资源可用于深入研究。
  针对台式计算机
  在信息经济时代,数据就是一切。只要问一问任何一位投资银行家、参议员、记者、四星上将或者间谍就可得知,国家兴盛和衰败是以他们的领袖可访问的数据的完整性和准确性为基础的 。
  鉴于有价值数据的极端重要性,有人会天真地认为阻止攻击者只是“保护数据”这样一件简单的事情。换句话说,就像把你的鸡蛋放进篮子,然后看好篮子。
  Richard Bejtlich这样的安全专家已经对这种观点表示了反对。正如Richard指出的那样,仅仅保护数据的问题在于:容器中的数据并不是静止的,当人们访问和更新数据时,数据在网络上从一台机器传输到另一台机器。此外,如果一个授权用户能够访问数据,那么一个未经授权的入侵者同样可以。所有攻击者所要做的就是找到一种将自己冒充为合法用户的方法(例如,窃取证书、创建一个新的用户账户或者加载在已有会话中)。
  Richard针对“保护数据”争议性的思想引出了一个有趣的问题:当能够通过攻击特权用户的台式计算机而获得同样的信息,为什么还要去攻击一台被安全加固并处于周密监控和维护的数据库服务器呢?为什么不去摘低悬的水果?
  在许多情况下,访问敏感数据的人们不一定注意安全。这里讨论的是通过政治影响力或企业号召力优势获得本地管理员权限的高级管理人员,他们被授予客户账户数据库的所有读写权限,显然这样他们可以做自己想做的工作。这些人往往理所当然地“破坏”他们的机器,安装各种浏览器插件和小工具,毫无顾忌地上网。他们将自己的机器推入第三方二进制数据和随机网络会话的沼泽中,而这种环境就是那种攻击者可以与背景噪声融合在一起的地方。
  简而言之,台式计算机是一个软目标。此外,就台式计算机操作系统而言,微软拥有超过90%的市场占有率。因此,全书的实践示例将针对运行在32位英特尔硬件上的Windows操作系统。
  重点关注构建定制工具
  目前,许多安全相关书籍的普遍趋势是提供一系列可用的工具,并介绍这些工具的使用方法。
  然而,对于rootkit相关书籍而言,我认为如果还只是介绍广泛使用的工具,对读者来说是不利的。这是因为公开工具是人们广泛知晓的,白帽成员对它们进行了仔细研究,可以识别出其鲜明特征并开发出自动应对措施,终极可执行文件压缩器(Ultimate Packing Executable,UPX)和宙斯(Zeus)恶意软件套装就是最好的例子。普通的取证调查人员能够轻松地识别这些工具留下的证据。
  鉴于此,保持低调且尽量减少被发现几率的最好方法是使用自己的工具。只简单学习已有技术是不够的,你必须理解隐身技术底层的工作原理,以便拥有必要的技能来构造自己的武器。它强调了这样一个事实:一些你从未听说过的富有创造力的黑帽分子也是熟练的开发者。
  在日常运行过程中,普通计算机会以这样或那样的形式产生上千兆字节的数据(日志项、注册表编辑以及文件系统变化等)。调查人员既能筛选这些数据又能保持清醒状态的唯一方法就是过度依赖自动化。通过使用定制软件,调查人员利用现有软件的成效大大降低,从而显著增加你从中获益的可能性。
  适当回顾必要知识
  处理系统级代码很像第一次在工地周围散步。内核模式代码真的是罪无可恕,这块顽固区域的特性是:庇护谨慎者而惩罚蛮干者。在这样的环境中,有助于人们了解这块区域并能指出危险点。为此,我花了大量精力讲述英特尔硬件的细节,解释晦涩的设备驱动程序的概念,剖析特定的系统级应用程序编程接口(Application Programming Interface,API)。我想涵盖足够的背景资料,这样你就不必在阅读这本书的同时再阅读其他的书籍。
  采用模块化示例论证观点
  本书不是单纯地介绍rootkit技术,而是教授你实现rootkit的思想。
  本书的重点在于学习概念,因此,我尽量把示例代码拆分成许多小型的、易于消化吸收的示例程序。我认为,与其让读者大费周折地阅读20 000行的产品代码,还不如使其将更多的精力放在一些密切相关的技术问题上,这样可以降低学习的门槛。在源代码谱系中(参见图1),本书的示例基本上都属于“训练代码”。在编写示例代码时,我严格地在之前提供的代码基础上逐渐增加,以便只提供当前讨论所需的代码,同时又与之前的代码保持较强的连贯性。
  图1 源代码分类
  通过多年阅读计算机方面的书籍我发现,如果使用较少的代码来阐明一个概念,将会为理解带来困难。反之,如果使用太多的代码,那将冒这样的风险:要么迷失在具体的细节中,要么惹恼读者。好在我已经找到了一个合适的中庸路径,就像禅宗里说的那样。
  本书结构
  正如我之前提到的那样,一切事物都在变化,rootit的战斗前线也在移动。在我看来,“坏蛋们”已经找到了相当有效的方法来阻止磁盘分析以及此类操作。这就是说,使用事后检查有点过时,一些比较有经验的攻击者已经解决了这个难题。于是,内存分析、固件检查以及网络抓包之类的方法就成为最后的防线。
  从一个典型事件响应的发展时序看,本书将按照倒序的方式来讨论这些主题。通常情况下,首先调查人员进行在线取证,然后进行事后检查(假定关机状态下也是可行的)。我选择了另外一条路径,采用军备竞赛中间谍对间谍的方式,在策略和反策略出现时再介绍这些知识。具体地讲,本书分为以下四个部分:
  ● 第一部分:基础知识
  ● 第二部分:事后检查
  ● 第三部分:在线取证
  ● 第四部分:结束语
  在介绍完基础知识后,我将开始介绍事后检查分析的过程,这是反取证技术最初关注的重点。之后,本书涵盖试图破坏在线取证的最新技术。
  第一部分:基础知识
  第一部分主要为后续内容的学习奠定基础。首先,概述了计算机安全领域目前的形势以及反取证技术如何适应当前的环境。其次,简要描述了调查的过程以及反取证技术破坏调查过程的策略。第二部分构建了本书的核心框架,而后续章节则包括具体策略以及实现细节。
  第二部分:事后检查
  第二部分主要针对辅助存储器的分析(例如磁盘分析、卷分析、文件系统分析以及未知二进制分析)。这些工具针对那些修改了现有文件或留下人为痕迹的攻击者非常有效。即使在如今这个时代,一次全面的事后检查依然能够发现有用的信息。
  攻击者利用内存驻留和多级释放器技术对其进行回应。因此,第二部分研究的领域涉及用户态Exec(Userland Exec)理念,该理念是对通过网络连接来接收可执行代码且不依赖操作系统本机加载器的机制的发展。
  第三部分:在线取证
  在线取证的困难在于调查人员在其要检查的环境中操作,这就意味着经验丰富的入侵者可以干扰数据收集的过程,并给取证人员制造错误信息。本书的第三部分介绍了攻击者过去使用的两种rootkit策略:既要在计算机运行时拒绝向对方提供信息,又要消除响应者对可能存在的问题的怀疑。
  第四部分:结束语
  如果你准备爬一座山,那么登上山顶后,最好花一些时间在山顶欣赏山下的景色。最后这一部分,我回顾了rootkit的细枝末节,以便高屋建瓴地重新看待这个话题。对普通的取证调查人员来说,由于受到体制制约和有限资源的限制,我敢肯定周围的景色都会变得非常荒凉。为了给这些和我们一同站在山顶上被围攻的白帽成员一线希望,我在本书的结尾探讨了一些常用策略以应对攻击者造成的险境,并介绍了攻击者使用的隐藏方法。
  指出一项技术的缺点是一回事(嘿,这很容易),认识到这些问题并寻求真正能够解决它们的建设性方案是另外一回事,这是作为一名白帽成员应该接受的挑战。我们必须做一些不值得羡慕的工作来堵住漏洞,否则黑帽分子会利用它们来破坏我们的生活。我能感受到你的痛苦,兄弟!
  本书读者
  大约20年前,当我还是研究生的时候,克里夫兰当地一家银行的一位性格执拗、年老的执行总裁曾对我畅谈道:“从商学院出来的工商管理硕士都会认为自己已经掌握了所有的事情”。这种现象在任何一个培训项目中都存在,因为学生总会错误地认为,他们所读的教科书以及他们完成的课程能够涵盖现实世界中将要面临的所有事件,任何一个已经走出校门而踏入社会的人都知道这是不可能的。经验是不可缺少的,并且在学术界也不可能复制。
  另一个令人沮丧的事实是,为了取得既得利益,供应商总是过分吹嘘他们产品的功效。他们大肆宣传“我们已经找到了灵丹妙药”。我的意思是,有谁会要求一位客户大手笔地花100 000美元来买最新的、杰出的安全套件,然后告诉客户还不能完全放心呢?
  鉴于这些老生常谈的问题,本书主要针对新进入安全领域的专业人士。我的目的是鼓励他们意识到一些工具的局限性,这样他们就能够脱离工具而独立思考。你不能成为自己的工具。工具仅仅是用来节省力气的装备,但前提是使用工具的人必须久经沙场,只有这样才能有效地发挥其功效。
  总之,在过去,安全是一个模糊的专业领域,一种附带的特征,如果你愿意的话,也可以把它看做后来添加的东西。但是,随着人人都热衷于使用互联网,事情就不再是这样的了。每个人都需要意识到安全的必要性。当前,使用宽带连接的用户越来越多,当我看到许多年轻人大胆地点击链接并激活浏览器插件时,我无能为力,只能畏畏缩缩。天呐,恐怖,恐怖。我想大声喊出来:“喂,还不赶紧离开社交网络!你在做什么?傻瓜!”为此,本书还要为那些有足够好奇心(或者被激发出好奇心)的人解释为什么根除rootkit如此艰难。
  预备知识
  大多数隐身技术都是针对目标系统级结构来实现的。自从UNIX出现后,C语言就成为传统操作系统的母语。从文件系统、线程调度器到硬件驱动程序,都是使用C语言实现的。为此,本书中的所有示例代码都是用C语言或Intel汇编语言实现的。
  出于篇幅考虑,假设读者对这两种语言都十分熟悉。如果事实不是这样的,那么建议读者找本书学习一下这两种语言。
  约定
  本书包含了源代码、屏幕输出、十六进制转储以及隐藏消息等。为了区分这些内容,我采用了一些版式规则。
  值得注意的代码部分,我们使用黑色背景以示强调,这样它们就比较显眼。
  屏幕输出采用的是类似DOS的黑色背景。
  注册表名按照下面的标准约定进行缩略。
  注册表键以反斜杠后缀标示,注册表键值不加反斜杠后缀。
  书中出现的数值有几种不同的形式。十六进制值采用前缀“0x”或以“H”结尾。C语言的源代码倾向于使用前者,IA-32汇编代码倾向于使用后者。
  二进制值采用显式的或隐式的后缀字母“B”,汇编代码里的数字主要以这种形式标志。
  感谢
  安全社区全体人员感谢那些与我们慷慨分享发现成果的先驱者,诸如David Aitel、Jamie Butler、Maximiliano Cáceres、Lo?c Duflot、Shawn Embleton、The Grugq、Holy Father、Nick Harbour、John Heasman、Elias Levy、Vinnie Liu、Mark Ludwig、Wesley McGrew、H.D.Moore、Gary Nebbett、Matt Pietrek、Mark Russinovich、Joanna Rutkowska、Bruce Schneier、Peter Silberman、Sherri Sparks、Sven Schreiber、Arrigo Triulzi等。我在此所做的大多数工作都是在他们研究成果的基础上进行的,因此我觉得有义务向他们表示感谢,我只希望本书能够做到实质上的正义。
  现在将关注点转移到另一个层面,像Richard Bejtlich、Michael Ligh和Harlan Carvey这样的专家,在创建应对安全领域内的事件框架方面发挥了出色的作用。从调查的情况看,我认为反取证领域出现的“他们都是傻瓜”的想法十分幼稚,低估一名调查人员的天赋或执著是很有问题的。一名资源丰富、训练有素并遵循一套严谨方法的分析人员将会是一位值得尊敬的对手,即使是对最有经验的攻击者也不例外。
  别说我没有警告过你。
  我要感谢一位名为Alex Keller的服务器管理员,多年之前,我在旧金山州立大学遇到他。我曾与他共处半天,观察他清理我们的主域控制器,这半天时间花得很值。我手拿纸和笔,在他解释具体操作及其原因时,匆匆地记录下来。在处理在线取证方面,我不再需要更好的老师了。
  再次感谢Alex的慷慨,他是如此友善,耐心地为我讲解间谍情报技术,并鼓励我多学习,这已远超出他的职责范围。旧金山州立大学能有你这样的老师真是幸运。
  此外,我还要感谢相关领域内的杰出专家。感谢他们能够容忍我,并不厌其烦地回答我的问题,尤其要感谢Noam Chomsky、Norman Matloff、John Young和George Ledin。
  最后,我同样要衷心地感谢Jones & Bartlett Learning公司所有努力工作的职员们。正是他们的辛勤努力才有了本书,他们是高级策划编辑Tim Anderson、制作总监Amy Rose以及执行编辑Amy Bloom。
  Bill Blunden