图像取证实践指南-全-

图像取证实践指南(全)

原文:zh.annas-archive.org/md5/bd0b2a2d01c99c8a7ed16da81ef544e8

译者:飞龙

协议:CC BY-NC-SA 4.0

前言

欢迎阅读 实用法医影像:使用 Linux 工具保障数字证据。本书涵盖了一系列用于获取和管理数字证据磁盘镜像的命令行技术。获取磁盘镜像是保存数字法医证据、为事后检验和分析做准备的第一步。

我为何写这本书

目前市场上有许多数字法医书籍。然而,法医获取和证据保存的重要性往往得到的关注较少。通常,这个话题只在较大的书籍中的小章节或子章节中简要介绍。我认为,获取和证据保存的主题足够庞大,值得单独成书,本书正是填补了这一领域的空白。

写这本书的另一个动机是我希望以某种方式回馈社区。在数字法医实验室工作了十多年,定期使用开源工具进行各种任务(除了其他商业工具)后,我想为我的同事和其他专业人士提供额外的资源。

第三个动机是保存法医证据在私营部门日益重要的现实。调查不当行为、欺诈、恶意软件、网络攻击和其他滥用行为在私营行业变得越来越普遍。然而,关于获取和保存证据所需步骤的强调往往缺乏。执法机构需要适当获取和保存的证据来起诉犯罪分子。涉及电子发现的民事案件可能要求正确的磁盘镜像获取和保存。大型组织中管理人力资源争议、政策违规和举报事件的内部团队也能通过遵循公认的证据收集和保存程序获益。

本书的不同之处

本书是一本技术性的操作指南。它解释了如何使用 Linux 作为执行计算机法医的基础平台,特别是在存储介质的法医影像获取和证据保存方面。我包括了通过使用免费或开源计算机法医工具来展示知名法医方法的示例,用于获取各种目标介质。

与涵盖广泛应用和操作系统分析主题的 Linux 法医书籍不同,本书专注于计算机法医学中的一个特定领域:法医获取,也称为 法医影像,即存储介质的获取。这包括来自各种存储介质的数字证据的准备、获取、保存和管理。存储介质的准确获取正是使这一过程成为“法医”的原因。

除了涵盖开源工具,本书还包括了几个专有命令行工具的示例,这些工具是免费的,但并非开源。

我讨论了一些较新的硬件话题,这些话题尚未被其他取证书籍涵盖。例如,NVME 和 SATA Express,4K 原生扇区驱动器,混合 SSD、SAS、UASP/USB3x、Thunderbolt 等。对于其中的一些,在数字取证中管理起来比较简单,而其他一些则更具挑战性。

我还介绍了一种新的取证技术,它使用 SquashFS 压缩文件系统作为简单实用的取证证据容器。在本书中,我提供了 sfsimage shell 脚本,能够将证据保存到 SquashFS 取证容器中。

为什么使用命令行?

为什么一本基于命令行的书今天仍然有用或相关?计算机命令行自 1960 年代的电传打字机时代就已经存在,至今已有超过半个世纪的历史。在计算机领域,虽然年龄有时被视为过时的标志,但它也可以是成熟和可靠的标志,这正是 Linux/Unix 命令行的特点。即使是微软也认识到命令行的价值和力量,通过引入和推广 PowerShell 作为 DOS 提示符的替代方案。

有许多原因解释了命令行为何多年来仍然保持其流行性,并且继续与本书讨论的话题相关。以下是一些例子:

更简便的脚本编写与自动化可能性: 图形用户界面(GUI)是为人类使用设计的,而命令行可以由人类或机器使用。这使得命令行在脚本编写和工作自动化方面特别有用。

更好地理解底层工作原理: 图形工具通常只是命令行工具的前端。学习命令行工具有助于你理解在使用图形界面工具时底层到底发生了什么。

灵活性和高效性: 当你在命令行上执行某些任务时,你拥有更多的灵活性、控制力和力量。例如,管道和重定向使你能够将多个步骤合并为一个命令行。

Unix 哲学: 传统的 Unix 哲学是创建简单的工具,每个工具只做一件事且做得好,而大型 GUI 程序则将丰富复杂的功能集成到一个庞大的单体程序中。

远程访问: 使用 ssh 远程执行命令行操作既安全又容易。在某些情况下,远程 shell 访问是唯一的选择,尤其是当你在处理虚拟或基于云的服务器,或位于其他城市或国家的系统时。

无头服务器: 在发生故障的 Unix 和 Linux 服务器上,命令行可能是唯一的选择,因为可能没有安装图形界面(GUI)。

嵌入式系统: 嵌入式 Unix 和 Linux 系统(如 Raspberry Pi、Beagleboard 或其他物联网设备)的日益流行,可能仅提供命令行界面。

知识投资: 与 GUI 工具相比,命令行工具的变化相对较少。如果你投资时间学习使用命令行工具,那么在命令更新或新功能添加时,你无需重新学习一切。

个人偏好: 一些技术人员仅仅因为喜欢命令行而非 GUI,如果有选择,他们会选择使用命令行。

本书为你提供了一个命令行指南,用于执行数字法医获取,适用于调查和事件响应活动。它不涉及 GUI 等效工具或前端。

目标读者和前提条件

我写这本书时是有特定读者群体的。我在写许多章节时有一些预期,并且做出了一些假设。

谁应该阅读本书?

本书主要惠及两类人群。首先,它帮助有经验的法医调查员提升他们的 Linux 命令行技能,以便执行法医获取工作。其次,它对那些想要学习数字法医获取技术的经验丰富的 Unix 和 Linux 管理员有帮助。

本书面向越来越多的法医从业者,这些从业者来自多个领域,包括事件响应团队;大公司中的计算机法医调查员;来自法律、审计和咨询公司的法医和电子发现技术人员;以及来自执法机构的传统法医从业者。

本书结束时,你应该对可用于进行存储介质法医获取和法医图像管理的命令行工具 landscape 有一个全面且完整的认识。

前提知识

本书假定你具备操作系统的工作知识,特别是 Unix 和 Linux shell 环境。本书中的示例广泛使用 Bash shell。你还应该了解如何运行命令行程序,以及如何在程序之间进行基本的管道传输和重定向。

此外,你应该具备基本的数字取证原理知识,包括写入阻止技术、按扇区获取和使用加密哈希保持证据完整性。当应用本书中的示例时,这些基础知识是默认具备的。

预安装平台和软件

你应该能够访问一个正常运行的 Linux 平台,并且已经安装了相关工具。本书不涉及如何查找、下载、编译或安装各种工具。如果你有一台较新的机器(在本书出版日期的一年内)并且安装了较新的 Linux 发行版,那么示例应该没有问题。一些工具不是标准 Linux 发行版的一部分,但可以很容易地在 github 上找到或通过搜索找到。

本书结构

本书不是按照时间顺序列出的步骤,而更像是一本任务手册。然而,本书确实遵循一个逻辑进程,从平台搭建、规划与准备、采集到采集后活动。一般来说,本书设计为一本参考书,因此你不必从头到尾阅读它。某些章节假设你具备一定的前置知识和理解,相关的交叉引用也已提供。

第零章 是数字取证的概述。我还涵盖了该领域的历史和发展,提到了塑造其方向的重要事件。我特别强调了为产生可以在法庭上使用的数字证据而需要的标准。本书力求具有国际性,并独立于地区法律管辖区。这一点在今天尤为重要,因为越来越多的刑事调查跨越国家边界,并涉及多个管辖区。此外,由于私营部门法医能力的提高,本书对私营法医实验室尤其是全球公司中的实验室具有重要参考价值。

第一章 提供了大容量存储介质、连接器和接口的技术概述,以及用于访问介质的命令和协议。它涵盖了典型法医调查员在专业法医实验室环境中会遇到的技术。我努力帮助你清晰理解不同存储介质接口、协议隧道、桥接,以及存储介质如何与主机系统连接并交互。

第二章 提供了将 Linux 作为法医采集平台的概述。它简要介绍了使用 Linux 和开源软件的优缺点。它描述了 Linux 内核如何识别并处理连接到系统的新设备,以及如何访问这些设备。本章还概述了 Linux 发行版和 Shell 执行。它还解释了管道和重定向的使用,这在本书中是一个重要的概念。

第三章 介绍了在该领域常用的各种原始和法医格式。这些格式是获取存储介质的数字“证据袋”。本章解释了原始镜像,描述了商业法医格式,如 EnCase 和 FTK,并涵盖了研究社区使用的格式,如 AFF。它还介绍了一种基于 SquashFS 的简单法医证据容器以及管理该容器的工具。

第四章 是本书的一个过渡点,离开理论部分,进入更加实践和程序化的内容。它首先介绍了如何维护日志和审计追踪,以及保存命令数据以供正式的法医报告使用。它涵盖了法医调查员经常面临的各种规划和后勤问题。最后,本章讨论了如何建立一个法医安全、写入阻止的工作环境,为实际的获取过程做好准备。

第五章 讲解如何将嫌疑磁盘连接到获取主机并收集磁盘的数据(如 ATA、SMART 等)。在这一阶段,去除了如 HPA 和 DCO 之类的媒体访问限制,使得锁定和自加密的磁盘可以访问。本章还涉及一些特殊主题,如 Apple 目标磁盘模式。此时,磁盘已准备好,可以执行获取命令。

第六章 执行数据获取,演示了使用开源和专有工具的多种法医获取方式。重点是在获取过程中使用哈希值、签名和时间戳服务来保护证据。本章还讨论了处理坏扇区和错误的各种情况,以及如何通过网络进行远程获取。特殊主题包括磁带和 RAID 系统的获取。

第七章 重点讲解了如何管理获取的磁盘镜像。本章假设法医图像已经成功创建,并描述了典型的后期处理任务。这些任务包括压缩、拆分和加密图像;在法医格式之间转换;克隆或复制图像;将图像传输给其他方;以及为长期存储准备图像。本章最后讨论了安全数据销毁的部分内容。

第八章 涵盖了一些特殊任务,您可以在获取数据后为考试做准备。这些任务包括通过循环设备访问图像、访问虚拟机镜像以及访问操作系统加密的镜像(如 BitLocker、FileVault、TrueCrypt/VeraCrypt 等)。本章还涉及访问其他虚拟磁盘容器。这些技术使您能够对图像进行法医分析,并允许您使用常规文件管理器和其他程序安全地浏览文件系统。

第九章 部分进入法医分析领域,演示了从图像中提取数据子集。它包括识别和提取分区(包括已删除的分区)、提取分区间隙、提取松散空间,以及提取磁盘中先前隐藏的区域(DCO 和 HPA)。本章展示了多个数据提取的示例,包括提取单个扇区和块。

每一章可能会描述多个不同的工具,用于执行相同的任务。通常,你会有多个工具可以选择来执行相同的任务,具体使用哪一个工具取决于情况,有时候某个工具可能比另一个更有用。在这种情况下,我会讨论每个工具的优缺点。

每一章中的各个部分大致遵循相同的结构。标题提供了该主题的高层次描述。引言段落描述了该部分的动机,并解释了为什么这一特定任务对调查、数字取证或事件响应有用。在许多情况下,动机由法律或行业公认的标准驱动。了解并理解这些标准非常重要,因为它们支持所做工作的取证有效性。在必要时,我会提供工具源代码、额外信息或其他相关文章的参考。

在介绍或演示新工具之前,我会提供一段描述工具功能或目的的段落,并阐明它与数字取证的相关性。在某些情况下,工具的历史可能对你有兴趣,因此我也会包括这部分内容。

在描述任务和工具之后,你将看到一个或多个命令行示例以及命令输出(以等宽字体块显示)。一个命令可能会重复,以展示不同的变体或扩展使用形式。每个命令示例后会跟随一段描述,解释正在执行的命令及其输出结果。

最后一段可能包括潜在的注意事项、警告、风险以及可能在数字取证调查中遇到的常见问题或错误。

本书的范围

本书聚焦于常见存储介质的取证采集及其保存证据所需的步骤。虽然书中展示了一些初步筛选和分析工作,但一般来说,应用程序和操作系统数据的取证分析被认为超出了本书的范围。

本书的范围之外还有一些领域,包括从传统存储介质以外的领域进行数据采集,例如网络取证采集、从实时系统采集内存、云数据采集等。

在多个地方,我提到了企业级存储介质和传统存储介质,但没有提供实际示例。这些介质在取证实验室环境中较少见。然而,许多展示的方法通常也适用于企业级或传统存储硬件。

专有设备的获取超出了本书的范围。使用本书中展示的工具和技术,可能能够获取最新一代的手机、平板电脑或物联网设备(如果它们在 Linux 内核中作为块设备运行),但我不会明确介绍这些设备。

约定与格式

代码、命令和命令输出的示例以等宽字体或固定宽度字体显示,类似于你在计算机终端屏幕上看到的样式。在某些地方,可能会删除或截断不相关的命令输出,并用省略号(...)代替,当某些行过长超出书籍的边距时,它们会被换行并缩进。

无需根权限即可运行的命令使用$提示符。通常需要以 root 身份运行的特权命令以#为前缀。为了简洁起见,sudo 或其他权限提升操作通常不显示。某些章节提供了以非 root 用户身份运行命令过程的更多信息。

在计算机书籍行业中,通常会将代码块和命令输出中的时间戳更改为发布后的未来某个时刻,以使内容看起来更新。我认为,写一本关于保持证据完整性的书,然后再通过将时间戳提前日期来篡改书中的证据并不合适。本书中所有的命令输出都反映了实际测试和研究中的输出,包括原始日期和时间戳。除了删除不太相关的部分(使用...)和去除多余的空行外,我保留了命令输出的原始内容。

本书末尾没有提供参考书目。所有参考文献都作为脚注列出,位于引用来源的页面底部。

调查员或检查员的工作站被称为采集主机检查主机。正在进行采集的磁盘和镜像被称为目标磁盘嫌疑磁盘证据磁盘

本书中使用了多个互换的术语。磁盘驱动器介质存储在泛指时通常可以互换使用。法医调查员检查员分析员在本书中被用于指代使用检查主机进行各种法医任务的人员(即你)。镜像采集获取是可以互换使用的,但故意排除了复制一词,以避免与法医背景外的普通复制产生混淆。

第一章:数字取证概述

image

一些关于数字取证领域的历史背景,帮助解释该领域如何发展,并为取证行业中专业人士所面临的一些问题和挑战提供额外的背景信息。

数字取证历史

在这里,我将讨论现代数字取证作为一门科学学科的发展。

Y2K 之前

与其他科学学科相比,数字取证的历史较短。最早的与计算机相关的取证工作始于 1980 年代,当时的从业者几乎全来自执法机构或军事组织。1980 年代,家用计算机和拨号 BBS 服务的兴起,激发了执法界对计算机取证的早期兴趣。1984 年,FBI 开发了一个开创性的程序,用于分析计算机证据。此外,滥用和基于互联网的攻击的增加促成了计算机应急响应小组(CERT)的成立,该小组于 1988 年由国防高级研究计划局(DARPA)创建,并位于匹兹堡的卡内基梅隆大学。

1990 年代,互联网接入的大规模增长使得家用个人计算机变得普及。在此期间,计算机取证成为执法机构中的一个重要话题。1993 年,FBI 主办了第一次关于计算机证据的国际会议,并且 1995 年,国际计算机证据组织(IOCE)成立并开始提出标准建议。“计算机犯罪”的概念已经成为现实,不仅在美国,而且在全球范围内。1999 年,英国警察总监协会(ACPO)为处理计算机证据的英国执法人员创建了一个良好实践指南。同时,在 1990 年代末期,第一个开源取证软件——《验尸官工具包》由 Dan Farmer 和 Wietse Venema 开发。

2000–2010

千年之交后,多个因素增加了对数字法医的需求。2001 年 9 月 11 日的悲剧对全球安全和事件响应的看法产生了巨大的影响。安然和安达信会计丑闻导致了美国《萨班斯-奥克斯利法案》的制定,该法案旨在通过提高公司披露的准确性和可靠性来保护投资者。该法案要求组织必须有正式的事件响应和调查流程,通常包括某种形式的数字法医或证据收集能力。知识产权(IP)问题的增长也对民间组织产生了影响。网络欺诈、网络钓鱼及其他与知识产权和品牌相关的事件进一步增加了对调查和证据收集的需求。点对点文件共享(始于 Napster)以及《数字千年版权法案》(DMCA)的出台,导致了对数字版权侵权调查的需求增加。

自 2000 年以来,数字法医界在将其转变为一门科学学科方面取得了巨大进展。2001 年的 DFRWS 会议为法医界提供了重要的定义和挑战,并对数字法医进行了如下定义:

利用科学推导和验证的方法,保存、收集、验证、识别、分析、解释、记录和呈现来自数字源的数字证据,以便促进或进一步重建已发现的犯罪事件,或帮助预测已证明对计划操作具有破坏性未经授权的行为。^(1)

当法医界确定其范围和目标,力求成为一个公认的科学研究领域时,实践层面的标准、指南和最佳实践程序也在不断规范化。数字证据科学工作组(SWGDE)明确了定义和标准,包括要求执法部门制定标准操作程序(SOP)。2000 年在法国举行的国际刑事侦查组织(IOCE)大会推动了通过指南和检查清单来规范执法人员的程序。第 13 届国际刑警组织法医科学研讨会同样在法国召开,概述了参与数字法医的各方要求,并为政府和执法部门制定了一套全面的标准和原则。美国司法部发布了详细的执法人员应急响应指南(美国司法部《电子犯罪现场调查:应急响应人员指南》),国家标准与技术研究院(NIST)则开展了计算机法医工具测试项目(CFTT),编写了首个《磁盘镜像工具规范》。

在过去的十年里,几本同行评审的学术期刊相继推出,发布日益增加的知识内容。《国际数字证据期刊(IJDE)》于 2002 年创办(并于 2007 年停刊),《数字调查:国际数字取证与事件响应期刊》则于 2004 年创办。

2010 年至今

自 2010 年以来,一系列事件将焦点转向了对网络攻击和数据泄露的调查与证据收集。

WikiLeaks (www.wikileaks.org/) 开始发布美国军方泄露的材料,包括视频和外交电报。匿名者因分布式拒绝服务(DDoS)攻击和其他黑客活动而声名狼藉。LulzSec 破坏并泄露了 HBGary Federal 及其他公司的数据。

高级持续性威胁(APT)恶意软件的调查成为行业中的一个重要话题。政府使用恶意软件对其他政府和私人企业进行间谍活动的程度被公开。特别是,针对 SCADA 系统的 Stuxnet 蠕虫被发现,尤其是针对伊朗核计划中的控制系统。Mandiant 发布了对 APT1(中国军队的网络战单位)的调查报告。爱德华·斯诺登泄露了大量文件,揭示了美国国家安全局(NSA)黑客活动的广泛程度。来自意大利公司 HackingTeam 的数据泄露揭示了为政府、执法机构和私营企业出售的专业漏洞市场。

大型数据泄露事件引起了私营部门公司的关注,因为信用卡和其他数据被从索尼、塔吉特、摩根大通、安盛等公司窃取。全球银行业面临银行恶意软件(如 Zeus、Sinowal/Torpig、SpyEye、Gozi、Dyre、Dridex 等)大幅增长的局面,这些恶意软件成功地攻击银行客户,实施金融诈骗。最近,勒索攻击变得流行起来(如勒索软件、比特币 DDoS 攻击等)。

这种多样化的黑客攻击和滥用行为扩大了数字取证的研究范围,涵盖了网络流量捕获与分析以及感染系统的实时系统内存采集。

取证采集趋势与挑战

数字取证领域由于技术和犯罪行为的变化与进步而不断转型。在本节中,我将讨论近期影响传统取证存储介质获取的挑战、趋势和变化。

证据的规模、位置与复杂性的变化

影响取证镜像采集的最明显变化是磁盘容量。截至目前,消费者硬盘可存储 10TB 的数据。易于使用的 RAID 设备的普及使逻辑磁盘容量达到了更大的规模。这些大容量的磁盘给传统的取证实验室采集过程带来了挑战。

另一个挑战是犯罪现场或事件中出现的各种存储设备。曾经属于家庭使用的单一计算机,现在已经变成了五花八门的计算机、笔记本、平板电脑、手机、外部硬盘、USB 闪存盘、存储卡、CD 和 DVD 以及其他存储大量数据的设备。挑战实际上是找到并扣押所有相关的存储介质,并以一种方式获取图像,使得法医分析工具能够同时访问所有内容。

证据向云端转移的趋势也带来了一些挑战。在某些情况下,数据可能只保存在终端用户设备上的缓存副本中,数据的主要部分存储在云服务提供商处。如果数据存储在法律管辖区之外,执法机构收集这些数据可能会变得复杂;而对于私营组织而言,当外包云服务提供商的服务合同中没有法医支持条款时,收集这些数据也将是一个困难的问题。

物联网是一个快速增长的趋势,也将对法医界提出挑战。各种小型联网电子设备(健康监测器、时钟、环境显示器、安全摄像头等)通常不会包含大量存储。但它们可能包含有用的遥测数据,例如时间戳、位置和移动数据、环境条件等。识别和访问这些数据最终将成为法医证据收集的标准部分。

可以说,当今法医调查人员面临的最难的挑战之一是专有封闭设备的趋势。个人计算机架构和磁盘设备历来是开放的并且有详细的文档,使得创建标准的法医工具来访问数据成为可能。然而,专有软件和硬件的使用增加使得这一创新变得困难。这在移动设备领域尤为突出,许多设备可能需要越狱(实际上是被黑客入侵)才能进行较低层次的文件系统块访问。

跨司法管辖区的因素

网络犯罪的国际性质是法医调查人员面临的另一个挑战。假设 A 国的一家公司遭到 B 国攻击者的攻击,攻击者通过 C 国的代理服务器来入侵基础设施,而这家公司又通过 D 国的外包合作伙伴进行渗透,并将窃取的数据转移到 E 国的一个数据存储点。在这种情况下,涉及到五个不同的国家,意味着可能需要协调五个不同的执法机构,至少与五个不同的公司合作,跨越五个不同的法律管辖区。今天,这种多国情境并不罕见;事实上,它相当常见。

行业、学术界和执法合作

互联网犯罪活动日益复杂和先进,这促进了更多的合作与协作,以收集情报和证据,并协调调查。

竞争的行业同行之间的这种合作可以视为共同对抗一个共同的敌人(银行业对抗银行恶意软件,ISP 行业对抗 DDoS 和垃圾邮件等等)。这种合作也跨越了私营和公共部门的边界:执法机构与行业合作伙伴共同合作,打击公共私营伙伴关系(PPP)中的犯罪活动。这种多方面的合作为识别、收集和转移数字证据创造了机会。这里的挑战是确保私营合作伙伴理解数字证据的性质,并能够满足公共部门执法机关的标准。这将增加根据私营部门收集的证据成功起诉的可能性。

另一个与行业和执法机构合作的团体是学术研究社区。该社区通常由大学取证实验室和安全研究部门组成,专注于计算机犯罪和取证的理论及高度技术性方面。这些研究人员能够花时间分析问题,深入了解新的犯罪方法和取证技术。在某些情况下,他们能够为执法部门提供支持,当标准的取证工具无法提取或分析所需证据时。学术团体还必须了解管理和保存数字证据的需求和期望。

计算机死后取证原则

作为一门科学学科的数字取证原则受到多个因素的影响,包括正式定义的标准、同行评审的研究、行业监管和最佳实践。

数字取证标准

传统物理证据的收集和保存标准在很大程度上依赖于当地的法律管辖区。相比之下,数字证据的收集在国际环境中得到了发展,多个管辖区共同推动了研究和标准的制定。通常,硬件、软件、文件格式、网络协议和其他技术在全球范围内是相同的。因此,收集数字证据的标准和流程在不同管辖区之间更加一致。一个很好的例子是使用写保护器将磁盘连接到成像机器上,这一做法几乎在全球范围内都得到了接受。

存在多个正式的标准组织,定义了取证采集的标准。美国国家标准与技术研究院(NIST)提供了计算机取证工具测试(CFTT)计划。其目标如下所述:

国家标准与技术研究院(NIST)计算机取证工具测试(CFTT)项目的目标是通过制定通用工具规格、测试程序、测试标准、测试集和测试硬件,建立计算机取证软件工具的测试方法。

尽管 NIST 是一个以美国为中心的组织,但它的许多标准在国际上得到了采纳,或者至少对其他国家的标准机构产生了影响。

国际标准化组织(ISO)也提供了一些与数字证据相关的标准。与取证获取相关的是 ISO 关于数字证据识别、收集、获取和保存的指南:

ISO/IEC 27037:2012 提供了处理数字证据的特定活动指南,包括识别、收集、获取和保存具有证据价值的潜在数字证据。

它为个人提供了有关在整个数字证据处理过程中常见情况的指导,并协助组织在其纪律程序中以及促进司法管辖区之间潜在数字证据的交换。

各个警察部门可能有自己的标准,规定了证据收集过程。例如,在英国,首席警察官协会(ACPO)提供了ACPO 数字证据良好实践指南。该指南指出:

本最佳实践指南由 ACPO 犯罪业务领域制定,并于 2007 年 12 月由 ACPO 内阁首次批准。本文档的目的是为执法人员以及所有协助调查网络安全事件和犯罪的人员提供指导。它将根据立法和政策的变化进行更新,并在必要时重新发布。

本文档参考了 ACPO 等机构提出的多个其他标准和文件。

美国司法部维护电子犯罪现场调查:第一响应者指南。该指南的介绍部分指出:

本指南旨在协助州和地方执法人员及其他第一响应者,他们可能负责保存电子犯罪现场并识别、收集和保护数字证据。

其他一些国际组织通过创建取证工作组、委员会和社区,推动标准的制定。

同行评审的研究

另一个数字取证标准和方法的来源是同行评审的研究和学术会议。这些资源提出了数字取证研究社区中的最新进展和技术。在较新的方法和技术上,基于同行评审的科学研究进行取证工作尤为重要,因为这些方法和技术可能尚未在法庭上进行验证。

存在多个国际学术研究社区,并对知识体系做出贡献。该领域最著名的研究期刊是《数字调查:数字取证与事件响应国际期刊》,该期刊已发布该领域的学术研究超过十年。期刊的目标和范围如下所述:

《数字调查学报》涵盖了全球数字取证和事件响应的前沿发展。这本广泛引用的期刊帮助数字调查员跟上新技术、实用工具、相关研究、调查技术和处理安全漏洞的方法。从事企业、刑事和军事领域的从业者利用该期刊分享他们的知识和经验,包括以下领域的当前挑战和经验教训:

同行评审研究:解决数字调查挑战的新方法,包括对特定技术分析的应用研究,以及计算机科学在数字取证和事件响应中遇到的问题的应用。

从业者报告:调查案例研究和报告,描述从业者如何应对该领域的新兴挑战,包括改进的有效数字调查方法……

领先的数字取证学术研究会议是数字取证研究研讨会(DFRWS)。该会议自 2001 年开始,始终在美国举办,尽管在 2014 年创建了一个独立的欧洲分会。DFRWS 的明确目标如下:^(2)

• 吸引新的视角并促进思想交流,以推动数字取证科学的发展

• 促进与数字取证研究及其应用相关的学术讨论

• 邀请来自执法、军事和民间领域的经验丰富的分析师和检查员,集中研究从业者需求、多种调查环境和现实世界的可用性

• 确定构成有用研究和开发重点的核心技术

• 促进发现、解释和呈现具有决定性和说服力的证据,以应对法院和其他决策者在民事和军事环境中的严格审查

• 建立并扩展一个共同的术语表,以便社区能够使用相同的语言

• 进行定期辩论和合作活动,确保保持关注、兴趣和效能

• 维护一个由学术界和实践界专家组成的动态社区

• 提高数字取证科学的科学严谨性

• 激励下一代发明新颖的解决方案

完全披露:我是《数字调查学报》的编辑,并参与了 DFRWS 欧洲分会的组织委员会。

行业规范与最佳实践

行业特定的法规可能对数字证据的收集提出额外的要求(或限制)。

在私营部门,行业标准和最佳实践由各类组织和行业团体制定。例如,信息保障咨询委员会(IAAC)提供了《数字调查与证据的董事与公司顾问指南》

其他来源包括法律和监管机构规定的标准和流程,例如美国《萨班斯-奥克斯利法案》中对证据收集能力的要求。

某些数字证据要求可能取决于行业。例如,某个地区的医疗行业法规可能会规定数据保护的要求,并在发生数据泄露时包括各种取证响应和证据收集流程。电信服务提供商可能会有涵盖日志保留和执法机关访问基础设施通信的规定。银行监管机构也会对数字证据的要求和标准做出规定。一个很好的例子是新加坡金融管理局(MAS),它为银行业提供了详细的安全性和事件响应领域的标准 (www.mas.gov.sg/regulations-and-financial-stability/regulatory-and-supervisory-framework/risk-management/technology-risk.aspx)。

随着针对不同领域(如金融、健康等)的网络攻击的增加,监管机构在未来可能在影响和定义证据收集标准方面发挥更大作用。

本书中使用的原则

本书聚焦于私营和公共部门共同拥有的取证任务。示例从简化的取证获取开始,后续的示例展示了获取过程的附加功能和能力。这包括通过加密哈希和签名来保护证据、日志记录、性能、错误处理和确保获取的映像安全。我还解释了几种通过网络进行影像处理的技术,以及一些特殊话题,如磁带和 RAID 系统。

要执行取证获取,有几个先决条件:

• 目标驱动器已连接并被 Linux 内核识别。

• 已建立写入阻止。

• 已对目标驱动器进行确认并记录。

• 可以完全访问设备(HPA、DCO 和 ATA 安全功能已禁用)。

• 有足够的时间和存储容量来执行获取。

数字取证过程和工具测试在数字取证社区中有很好的文档记录,且某些要求是预期的。一个有用的资源是由 NIST 设立的 CFTT 计划。NIST 的顶级取证映像要求包括以下内容:

• 工具应制作原始磁盘或分区的位流副本或映像。

• 工具不得修改原始磁盘。

• 工具应记录输入/输出错误。

• 工具的文档应当是正确的。

这些原则在 NIST 发布的一篇论文中进行了描述^(3),为本书的其余部分提供了基础。它们的存在是为了确保证据的完整性得到保持,并且防止或检测篡改行为。

一些研究对 ATA 接口在访问物理磁盘时的限制和局限性提出了挑战,认为在这种条件下无法实现完全获取^(4)。理论上,完全获取包括磁盘上的所有扇区以及 SSD 和闪存驱动器闪存转换层下的内存,现如今还扩展到无法通过传统块设备方法对锁定的移动设备进行成像的情况。要实现设备所有物理存储的“完全”获取变得越来越困难。对于移动设备,法医界已经区分了物理获取和逻辑获取,后者指的是复制文件和数据,而不是成像驱动器扇区。

在本书中的示例中,法医完整性指的是通过使用公开可用的软件工具,并根据已发布的接口规范,可靠且可重复地访问磁盘的区域。那些只能通过非公开的厂商专有工具(内部诊断、开发工具等)或使用硬件拆解(芯片去焊、头组件更换、磁盘盘片移除等)才能访问的磁盘区域,不属于本书的讨论范围。

这只是对数字取证领域的简要介绍。第一章将继续介绍存储介质技术及其与采集主机连接所使用的接口。

第二章:存储介质概述

image

本章提供了 PC 总线系统、常见大容量存储介质、物理连接器和接口的概述,并介绍了用于与附加存储设备通信的低级协议命令。它还为理解本书其余部分中描述的存储介质的取证获取提供了背景。

一般来说,大容量存储技术分为三大类:磁性介质、非易失性存储器(闪存)和光学介质。存储介质可以集成到设备中,也可以是可拆卸的。设备还包含与介质接口所需的驱动电子组件。系统通过内部或外部总线或接口访问存储设备。

本章首先概述这三种存储技术,并简要介绍与数字取证相关的关键点。最后两节描述了这些存储设备如何连接并与 Linux 系统进行通信,我还讨论了对取证审查员特别感兴趣的项目。

本章主要关注现代 PC 架构和组件。曾经流行的老旧技术可能会提到,但不会深入讨论。我还将本概述限制在小型服务器环境和个人(员工、家庭用户等)使用的计算机设备上,而不会涉及大型企业技术。大型企业环境中的存储技术通常不适合传统磁盘介质的取证成像;在某些情况下,由于存储空间的庞大,传统的获取方法不可行,而企业级的关键系统通常无法像小型 PC 系统那样下线。

磁性存储介质

磁性介质是三种基本存储技术中最古老的一种(之前是纸带和打孔卡片),并且目前在容量上处于领先地位。当前使用的两种主要磁性存储介质类型是硬盘和磁带;这两者都为在线存储和离线归档存储提供了高容量和高可靠性。

注意

磁盘和固态硬盘(SSD)之间的容量竞争正在加剧。在本书编写过程中,宣布发布了一款 16TB 的 SSD,并且一旦发布,它可能成为全球容量最大的磁盘。

硬盘

硬盘一贯提供比其他介质(如 SSD 或光盘)更高的容量。截至目前,10TB 硬盘已经在消费者市场上有售,并且预计会有更大容量的硬盘发布。

硬盘由涂有磁性材料的旋转盘片构成,如图 1-1 所示。多个盘片堆叠在主轴上,读写磁头通过一个可移动的臂(执行器)从磁性表面读取/写入编码数据。目前,常见的硬盘外形尺寸包括 3.5 英寸、2.5 英寸和 1.8 英寸。由于硬盘是机械设备,它们对震动、跌落、灰尘、湿气和其他环境因素非常敏感。典型的硬盘故障包括划伤的盘片表面、卡住或损坏的磁头、电机故障和电子电路故障。

硬盘的真实物理几何结构(磁头、盘片、磁道、每个磁道的扇区)对计算机进行了抽象,并通过逻辑块地址(LBA)作为一系列扇区进行访问。扇区是用于读写数据的最小可寻址磁盘单元。历史上,标准的物理硬盘扇区大小为 512 字节;然而,现代硬盘已转向 4K 扇区大小。大多数当前的硬盘仍提供 512 字节的扇区大小仿真,但具有原生 4K 扇区大小(称为 4Kn 硬盘)的驱动器已经上市。使用 4Kn 硬盘具有性能优势,未来它们可能会取代传统的 512 字节仿真硬盘。有关 4Kn 硬盘驱动器的更多细节,请参阅“高级格式 4Kn”,见第 41 页。

image

图 1-1:磁性硬盘

传统的计算机取证起源于需要分析硬盘,而硬盘至今仍然是重要的证据来源。特别是,当操作系统“删除”文件时,它只是取消了对磁盘上数据块的引用(与固态硬盘不同,固态硬盘使用 TRIM 命令清除未分配的块)。这些数据块并不会从磁性盘片中删除,而是保留在磁盘上,取证工具可以恢复它们(直到它们被覆盖)。

磁带

磁带在家庭用户市场中的使用几乎已经消失,但小型企业和企业环境仍然使用磁带进行备份和归档。如图 1-2 所示,磁带是早期数字存储形式之一,并且有着成熟技术的声誉,可靠用于长期离线存储。与磁盘、固态硬盘/闪存或光盘不同,磁带只能按顺序读取或写入数据。在磁带上随机访问不同的块,需要用户将磁带倒带或快进到所需的位置才能进行读取或写入。这种缺乏随机块访问的特性使得磁带无法作为常规文件系统使用。数据以磁带文件的序列存储在磁带上;每个文件通常是一个包含文件系统或文件和目录组的归档文件(使用诸如 TAR、DUMP 等归档格式)。磁带驱动器使用 SCSI 磁带命令来控制读写数据、定位或倒带磁带,并弹出磁带。

注意

更新的线性磁带开放(LTO)驱动器可以通过线性磁带文件系统(LTFS)模拟常规文件系统,但这仍然不是随机访问,文件依然是按顺序读取和写入的。

image

图 1-2:磁带

以下是 Fibre Channel LTO5 磁带驱动器和 USB DAT160 磁带驱动器的示例;它们都连接到 Linux 系统上。磁带驱动器的 dmesg 输出如下所示:

[   11.290176] scsi 1:0:0:0: Sequential-Access TANDBERG LTO-5 HH
    Y629 PQ: 0 ANSI: 6
[   11.293554] scsi 1:0:0:0: Attached scsi generic sg5 type 1
[   11.345030] st: Version 20101219, fixed bufsize 32768, s/g segs 256
[   11.361189] st 1:0:0:0: Attached scsi tape st0
...
[ 3263.575014] usb 1-8: new high-speed USB device number 14 using xhci_hcd
[ 3263.703245] usb 1-8: New USB device found, idVendor=03f0, idProduct=0225
[ 3263.703250] usb 1-8: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 3263.703253] usb 1-8: Product: DAT160 USB Tape
[ 3263.703255] usb 1-8: Manufacturer: Hewlett Packard
[ 3263.703257] usb 1-8: SerialNumber: 48553101234E4648
[ 3263.704156] usb-storage 1-8:1.0: USB Mass Storage device detected
[ 3263.704295] scsi host12: usb-storage 1-8:1.0
[ 3264.713397] scsi 12:0:0:0: Sequential-Access HP       DAT160
    WU8A PQ: 0 ANSI: 3
[ 3264.722279] st 12:0:0:0: Attached scsi tape st1

一旦磁带归档文件被写入,数据结束(EOD)标记也会写入磁带。这通知驱动器磁带数据已经结束,防止驱动器继续读取。 然而,从取证的角度来看,EOD 标记之后的任何数据都值得关注,因为它可能包含先前磁带写入的数据。没有通用的 SCSI 命令可以获取 EOD 标记之后的数据。需要专用的磁带驱动器和设备来完成此任务。

传统磁存储

许多传统的磁性存储类型,尤其是在可移动介质中,仍然存在。软盘经历了多个世代的发展后最终被淘汰。一些专有存储产品,如 Jaz、Zip、Syquest 等,在 80 年代和 90 年代曾在市场上广受欢迎。许多种类的磁带已不再使用,例如 4mm DAT、8mm Exabyte 和 QIC。这些存储类型的取证获取超出了本书的讨论范围。然而,如果有功能正常的硬件和接口,您可以使用本书中描述的相同技术获取这些较旧设备上的数据。如果 Linux 内核能够识别基于扇区的介质并将其作为块设备提供,您就可以进行获取。如果 Linux 内核识别磁带驱动器为 SCSI 磁带设备,您可以使用标准 SCSI 磁带命令进行访问。对于专有存储,可能会有内核驱动或用户空间工具,这些工具可以为您提供访问传统存储产品的能力。

非易失性内存

非易失性内存,通常使用 NAND 闪存技术,正在逐渐普及,并开始在不需要非常大容量的情况下替代磁性硬盘。(NAND指的是作为逻辑 NAND 门工作的晶体管。)这种类型的内存给取证调查员带来了新的挑战,因为它不具备与磁盘相同的低级特性。^(1)

SSD 和闪存媒体通常基于 NAND 存储,并且没有活动部件。数据存储在一组内存单元中,抽象层闪存翻译层(FTL)使得硬盘的行为像硬盘一样,表现为一系列线性的扇区。由于非易失性存储磁盘是通过电路实现的,而不是机械的,因此它们无声、功耗低,并且不像硬盘那样容易受到物理损坏。在性能方面,它们可以更快地随机访问和写入数据,因为没有物理磁头在硬盘上寻找位置。(这也意味着碎片整理文件系统并没有性能上的优势。)SSD/闪存驱动器中的内存寿命不如硬盘中的磁性盘片。采用一些方法,如磨损均衡和过度配置,用于延长 SSD 媒体的使用寿命。磨损均衡指的是将读取和写入操作均匀分布到整个硬盘的机制,确保在硬盘的使用寿命内块得到均匀使用。随着块的老化或无法写入,它们会被 FTL 移除,并由一池保留(过度配置)块替换。这些“退役”块可以通过移除(拆焊)物理芯片并读取内存来进行读取。一些专业的取证实验室会执行这一过程,有时称为芯片取出,用于各种基于闪存的存储设备。制造过程中对块的过度配置可以占用闪存磁盘的 10%到 25%(用户无法访问)。目前,有一个开源的 SSD 固件项目,对于学习和研究 SSD 技术非常有用。你可以在* www.openssd-project.org/wiki/The_OpenSSD_Project *上找到更多信息。

固态硬盘(SSD)

如图 1-3 所示,SSD 被设计为常规 SATA 磁盘的直接替代品。(SATA,或称为串行 ATA 连接,是磁盘的标准接口。)SSD 具有标准的 SATA 接口和自监控、分析与报告技术(SMART)功能,并使用常规的 ATA 命令(带有一些扩展)。即使是常见消费级 SSD 的物理形态,也与磁性硬盘相同。较新的 SSD 给数字取证检查员带来了几个挑战,部分原因在于可能从磁盘上的未分配扇区恢复数据,部分原因则是无法访问过度配置的区域。支持 ATA TRIM 命令的 SSD 设备和操作系统可能会在下次使用前擦除未分配的磁盘块(SSD 块必须在写入或修改之前被擦除)。这减少了从未分配块中恢复数据的可能性,而这些未分配块通常是磁性硬盘上宝贵的证据来源。

图片

图 1-3: 固态硬盘(SSD)

你可以使用hdparm命令来确定 SSD 支持的 TRIM 功能。例如:

# hdparm -I /dev/sda
...
Commands/features:
        Enabled Supported:
...
        * Data Set Management TRIM supported (limit 1 block)
        * Deterministic read data after TRIM
...

现代一代 SSD,基于名为 SATA Express 和 NVM Express 的新标准,直接与 PCI Express 总线接口。

USB 闪存驱动器

小型便携式 USB 闪存驱动器,如图 1-4 所示,有许多名称:U 盘、USB 闪存棒、闪存狗条,或者仅称为 USB 闪存驱动器。闪存驱动器最初成为软盘的替代品,并且由于其低价和大容量,现在正在取代 CD 和 DVD。

image

图 1-4:USB 闪存驱动器

但 USB 闪存驱动器的小尺寸和大容量使其成为信息安全的风险。因此,大多数供应商提供涉及加密的安全解决方案。最常见的加密是基于软件的,并且是可选的。驱动器的所有者必须明确安装供应商提供的加密软件(或者使用替代软件,如 BitLocker 或 TrueCrypt)。一些 USB 闪存驱动器提供强制性的基于硬件的加密系统。然而,软件加密的附加工作和复杂性,以及硬件加密显著更高的成本,阻碍了其广泛使用。未加密的普通 USB 设备仍然是最常用的。

可移动存储卡

移动设备的流行,如手机、平板电脑、相机等,创造了一个可移动存储卡的市场,你可以在它们满了或复制到 PC 或其他设备时交换这些卡。图 1-5 展示了各种存储卡。这些通常是基于闪存的,当它们放入读卡器时,呈现出类似硬盘的线性扇区序列。

image

图 1-5:闪存卡

最常见的存储卡是安全数字(SD)标准,它有多种外形和速度。CompactFlash(CF)卡在高端摄影设备中很受欢迎,本质上是 PATA/IDE 接口,并具有更小的外形。你可以使用 PATA/IDE 接口适配器访问它。通过 USB 连接的卡读卡器可以访问这两种类型的存储卡(见图 1-6)。

image

图 1-6:USB 读卡器

注意

并行 ATA(PATA)集成驱动电子(IDE)是定义驱动器与计算机系统之间并行接口的旧标准。

传统非易失性存储

随着市场对其最大容量或专有接口失去兴趣,许多传统内存卡已变得过时。一些例子包括索尼记忆棒、松下 P2 卡、SmartMedia 卡和其他 PCMCIA/PC 卡介质。通常,这些内存卡会作为块设备连接到 Linux 系统,具有线性顺序的扇区,你可以使用与其他内存卡相同的技术对其进行映像(如果有物理读卡器)。

光学存储介质

当前常用的光盘存储介质包括 CD-ROM、DVD-ROM 和蓝光光盘。不同类型的光学媒介在物理和化学性质上有所不同。它们的可见差异在图 1-7 中展示。

image

图 1-7:从上到下:DVD-ROM、蓝光、CD-ROM

光盘通常有只读、一次写入或可读写类型。专业制作的光盘是通过压模制作,而不是通过刻录。尽管它们正在慢慢变得过时,可写光盘仍然是数字证据的常见来源。许多法医实验室仍然使用它们来传输和存储压缩的法医图像。

一张光盘包含一个单一的螺旋轨道,轨道上有一系列凹坑高地,这些可以被激光读取并解读为数据位。数据通过激光在表面烧录点,影响反射率,从而使烧录的区域被解读为数据位。这些位序列被分为扇区,经过编码和错误校正后,包含 2048 字节的用户可访问数据。

光盘与磁带有一个相似之处:数据是以单一的线性字节串写入的——文件不会被碎片化。与磁带不同,光盘可以轻松跳转到磁盘的随机位置,这使得将光盘挂载为只读文件系统成为可能。然而,写入光盘仍然是繁琐的,并且像磁带一样,必须按字节的顺序顺序进行写入。

紧凑光盘

作为三种光盘中最古老的一种,CD-ROM/CDR 光盘曾是家庭用户备份、个人档案存储和信息交换最流行的光学媒介。但随着方便且大容量的 USB 闪存驱动器的使用日益普及,光盘在存储上的使用逐渐减少。

一系列标准被称为彩虹书,描述了各种 CD 规格,存在许多常见的 CD 标准。(有关更多信息,请参阅飞利浦知识产权页面 www.ip.philips.com/licensing/program/16/

• 音乐 CD,或称紧凑光盘-数字音频(CD-DA),按照红皮书和 IEC 60908 标准进行规范。此格式中的数据被划分为多个音频轨道。

• 数据 CD,或称紧凑光盘-只读存储(CD-ROM),在黄皮书、ISO/IEC 10149 和 ECMA 130 标准中有规定 (www.ecma-international.org/publications/files/ECMA-ST/Ecma-130.pdf).

• 可写光盘,或称紧凑光盘-可记录/可重写(CD-R/CD-RW),属于橙皮书标准,允许数据写入(CD-R)或重写(CD-RW)到光盘。

• 不太常见的标准包括 Photo-CD、视频 CD(VCD)以及其他不太常见的变种、扩展和常见标准的增强版。

每张 CD 都有一条线性的比特流(坑和陆地),这些比特流被抽象为一个线性扇区序列。进一步抽象,这些扇区之上是会话,其中包含会话的引导区和目录表(TOC)。可以存在多会话 CD,每个会话都有自己的 TOC。

数据 CD 可以在一个会话中拥有文件系统,其中包含文件和目录结构。一些 CD-ROM 文件系统的示例包括:

High Sierra 最初的 PC 标准(8.3,全部大写)

ISO9660 更新版 High Sierra,用于跨平台

Joliet ISO9660 扩展;微软为 Win95 及更高版本提供

HFS Macintosh

Rock Ridge 为 POSIX 设计的 ISO9660 扩展

El Torito 可引导光盘标准

从法医学角度来看,整个 CD 上的用户数据都可以被读取。没有类似于磁带上的 EOD 或硬盘上的 DCO/HPA(用户不可访问区域)的等价物。但有些文件系统特定的伪像可能需要特殊分析才能解读。

法医学写保护器是专为防止篡改和污染驱动器上发现的证据而设计的硬件,对于 CD-ROM 而言是不必要的,因为其默认的只读属性。操作系统不会通过将 CD 放入 CD 驱动器并访问它来更新时间戳或修改 CD 上的数据。

CD 确实有一些独特的标识符,在法医学背景下非常有用。源唯一标识符(SID) 被印刻在光盘上,包含有关生产该光盘的光盘生产设施的信息。该代码以IFPI 开头,并被物理印刻在光盘的内圈区域(人眼可轻松读取)。记录器标识码(RID) 被写入光盘的系统扇区,并将烧录的 CD 与创建它的驱动器关联。没有专门硬件,RID 不容易访问。

其他物理属性,如表明盗版和伪造副本的特征,不在本书的范围内,但你可以访问国际唱片制品协会(IFPI)提供的指南,网址是* www.ifpi.org/content/library/manual-of-guidance-chap3-english.pdf*。

数字多功能光盘

DVD 与 CD 在物理属性上有所不同,但在逻辑上类似。DVD 有一个单一的螺旋轨道,将比特分割成 2048 字节的扇区。

DVD 可以是单面或双面,也可以是单层或双层。增加一个面或一层会有效地将数据容量翻倍。它们与 CD 有相似的标准,但有所扩展,详见:www.ecma-international.org/publications/files/ECMA-ST/ECMA-382.pdf*。DVD-Video、DVD-ROM、DVD-R 和 DVD-RW 对应于 CD 的相应格式,但还新增了 DVD-RAM 标准。同时,DVD+R 和 DVD+RW 也有一套替代标准,它们的容量与 DVD-R 和 DVD-RW 相同,但“+”和“-”格式不兼容(尽管大多数现代驱动器可以读取两者)。

DVD 驱动器最常用的文件系统是通用磁盘格式(UDF),它被设计为 ISO9660 的包写替代方案。

蓝光光盘

蓝光光盘(BD)采用新的物理制造工艺,进一步提高了光盘的数据容量。BD 与 CD 和 DVD 相似,依然使用螺旋数据轨道,并将数据分割为 2048 字节的扇区。

它的标准与 CD 和 DVD 有相似之处,包括 BD-ROM(只读)、BD-R(可录制)、BD-RE(可重写)、BD-XL(双倍容量可重写)。

DVD 和 BD 通过加密技术实现内容保护,这在进行取证调查时可能会导致获取受保护光盘时出现困难。虽然存在解密 DRM 保护内容的工具和方法,但这些内容超出了本书的讨论范围。

传统光学存储

存在一些传统的光学驱动器,尤其是基于卡带的只写多次读取(WORM)驱动器。传统光学驱动器在企业环境中使用较为广泛,通常使用 SCSI 接口,且可以作为线性扇区序列访问。如果驱动器和兼容的控制卡仍然可用,并且 Linux 内核识别该介质,你可以像处理其他光盘一样读取和分析该介质。

接口和物理连接器

在本节中,我将从取证检查员的角度概述常见的驱动器接口。一个在设备齐全的取证实验室工作的取证检查员,可以通过多种设备接口获取和分析存储介质。

计算机领域(尤其是存储接口)的一个普遍趋势是,从并行和共享总线转向串行点对点连接。PATA/IDE,曾是一个流行的并行接口,两个硬盘共享一根电缆,现已被 SATA 取代,SATA 将一个硬盘连接在串行电缆上。SCSI 曾是一个并行共享总线,支持多个硬盘,现在已经被 SAS 替代,每个硬盘都有独立的串行连接器。最初的 PCI 总线是并行的,多个接口卡共享同一个总线,但它已被 PCI Express 取代,后者是一个串行总线,每个接口都有专用通道(还用于连接 SATA Express 和 NVM Express 驱动器)。并行打印机接口已被 USB 取代(USB 是一个串行协议,但使用共享总线)。随着传输速度的提高,管理并行电信号的时序变得越来越困难。通过专用串行线路进行数据的序列化/反序列化使得传输速度比管理多个并行数据线路的协调更快。

串行 ATA

当前最流行的内部存储介质接口是 SATA。在 PC 内部,大多数硬盘、SSD 和光驱都连接到主板或附加主机总线适配器上的 SATA 接口。SATA 的串行架构已取代了并行 ATA(PATA 或 IDE),后者曾是主流的消费级硬盘接口。

SATA 标准由串行 ATA 国际组织管理(www.sata-io.org/)。当前是 3 版,SATA 提供最高 6Gbps 的速度(1 版和 2 版的速度分别为 1.5Gbps 和 3.0Gbps)。除了内部接口外,还有一个外部接口(eSATA),允许你直接连接外部 SATA 硬盘。图 1-8 展示了 SATA 接口。

image

图 1-8:SATA 硬盘接口

更小的表单因子,迷你 SATA(mSATA),是为小型便携设备设计的。mSATA,如图 1-9 所示,允许小型 SSD SATA 驱动器直接连接到主板,无需单独的 SATA 电缆。

image

图 1-9:mSATA 硬盘接口

主板通常允许你以高级主机控制器接口(AHCI)模式或 IDE 模式安装 SATA 硬盘。AHCI 在此定义了一个标准的 SATA 适配器接口:www.intel.com/content/dam/www/public/us/en/documents/technical-specifications/serial-ata-ahci-spec-rev1-3-1.pdf。IDE 模式为不支持 AHCI 标准的旧操作系统(例如旧版 Windows XP)提供传统的磁盘接口。你使用的模式不会影响取证图像的加密哈希值。你可以在 IDE 模式下将硬盘从目标 PC 中取出,在 AHCI 模式下连接到检查机,并在不丢失数据或修改数据的情况下进行采集。

另一种接口是 micro SATA(不要与 mSATA 混淆),如图 1-10 所示。它是为 1.8 英寸磁盘驱动器和瘦型 CD/DVD 播放器设计的,但如今使用较少。你可以将常规 SATA 写保护器与各种适配器结合使用,以获取 mSATA 和 micro SATA 驱动器。

image

图 1-10:Micro SATA 磁盘接口

一种越来越流行的更先进的外形因子是 M.2 接口,如图 4-4 所示。M.2 接口随着 SATA 3.2 规格的推出而出现,提供了两种标准于一个接口中。M.2 卡可以使用 AHCI/SATA 或 NVMHCI/NVME 接口,具体取决于兼容性要求。在使用 M.2 卡时,请务必确认卡使用的是哪种接口(截至目前,市场上大多数 M.2 卡使用 ACHI/SATA 模式)。

image

图 1-11:M.2 磁盘接口

SATA Express 磁盘接口,如图 1-12 所示,消除了 SATA 协议栈的多个层次,使存储(主要是 SSD)能够直接连接到 PCI Express 总线。这些驱动器继续使用 AHCI 标准,并且与 NVME 不同。

image

图 1-12:SATA Express 磁盘接口

SATA 3.2 规格支持两个 PCI Express 通道,提供 16Gbps 的 SATA Express 速度。存在用于 PCI 和 M.2 基础的 SATA Express 驱动器的写保护器。

串行附加 SCSI 和光纤通道

并行 SCSI 接口在消费市场和企业市场中已基本消失。SATA 已在消费市场中取而代之,而串行附加 SCSI(SAS)光纤通道(FC)则在企业市场中取代了它。SAS 接口的物理连接器,如图 1-13 所示,允许 SAS 和 SATA 磁盘连接并在 SAS 背板上访问。SAS 磁盘驱动器的物理连接器与 SATA 磁盘的连接器略有不同,并且提供各种扇出连接器以将多个磁盘连接到主机总线适配器。当前 SAS-3 磁盘的速度为 12Gbps,是 SATA-3 的两倍。SAS-4 将提供 22.5Gbps 的速度。

image

图 1-13:SAS 磁盘接口

一个 Mini-SAS HD 4i 插座连接器如图 1-14 所示。

image

图 1-14:SFF-8632/Mini-SAS HD 接口

SAS 标准由国际信息技术标准委员会(INCITS)的 T10 技术委员会维护。目前的标准文档是《串行附加 SCSI-3(SAS-3)INCITS 519-2014》。更多信息,包括即将发布的标准草案,可在t10.org/网站获取。

SAS 驱动器不能连接到 SATA 主机总线适配器,成像 SAS 磁盘需要使用单独的 SAS 写保护器。

光纤通道接口通常用于连接企业存储阵列。图 1-15 展示了铜基和光纤基的光纤通道连接器。

image

图 1-15:光纤通道接口

带有集成光纤通道接口的硬盘正逐渐成为过时的技术,已被 SAS 驱动器大量取代。截至目前,市场上尚未有用于光纤通道磁盘接口的硬件写保护器。

非易失性存储器快车

非易失性存储器快车(NVME) 是从零开始设计的,作为替代基于 AHCI 的 SATA 驱动器接口。它旨在直接连接到 PCI Express 总线,从而消除了对 AHCI/SATA 主机总线适配器的需求,省去了与 SATA 物理接口和协议层相关的复杂性。NVME 架构特别专注于 SSD 存储,并创建了一个更简单、更高效的命令集。NVME 设备可以直接插入主板的 PCIE 插槽,使用 M.2 接口的 PCIE NVMe 模式,或通过 U.2(SFF-8639)接口连接。

物理接口直接连接到 PCIE 总线,如 图 1-16 所示。

image

图 1-16:带有 PCIE 接口的 NVME SSD

也有 M.2 或下一代外形因素(NGFF)版本可供选择。这些通常直接插入主板的 M.2 插槽,或者通过使用 PCIE 插槽适配卡,两者都支持 NVME 模式(而非 AHCI/SATA 模式)。目前,大多数 M.2 SSD 硬盘是 AHCI/SATA 模式,而非 NVME,但由于 NVME 的性能优势,未来这种情况可能会发生变化。图 1-17 展示了一款 NVME M.2 硬盘。

image

图 1-17:带有 M.2 接口的 NVME SSD

NVME U.2 接口(见 图 1-18)允许传统 2.5 英寸物理外形的硬盘通过电缆或背板连接。U.2(SFF-8639)接口和电缆(机械上类似于 SAS,但有额外的针脚用于 PCIE 通道)将硬盘外壳连接到 M.2 适配器上的 mini-SAS HD 插头,而该适配器则连接到主板上。

image

图 1-18:带有 U.2 接口的 2.5 英寸 SSD、U.2 到 mini-SAS HD 电缆和用于主板的 mini-SAS HD 到 M.2 适配器

NVME 磁盘无法通过典型的 SCSI 或 SATA 命令工具查看,因为它们不使用 SCSI 或 SATA 命令。设计用于与 ATA 或 SCSI 磁盘接口交互的 Linux 工具通常无法与 NVME 磁盘兼容,且需要额外的支持以确保兼容性。NVME 磁盘的设备名称不是我们熟悉的 /dev/sd* 文件,而是 /dev/nvmen。NVME 设备通过一个附加的 namespace 编号来创建。该命名空间(以 n 表示)是 NVME 硬盘上操作系统以下的空间分配层级。/dev/nvmen 磁盘设备是块设备,在应用到 Linux 设备文件时应能正常工作。例如,以下是 Sleuth Kit mmls 命令在 NVME 磁盘上执行的示例:

# mmls /dev/nvme0n1
DOS Partition Table
Offset Sector: 0
Units are in 512-byte sectors

     Slot    Start        End          Length       Description
00:  Meta    0000000000   0000000000   0000000001   Primary Table (#0)
01:  -----   0000000000   0000002047   0000002048   Unallocated
02:  00:00   0000002048   0781422767   0781420720   Linux (0x83)
#

截至目前,NVME 的使用相对较新,Tableau 刚刚创建了首个支持 NVME 的 PCI Express 法医硬件写保护器。由于在 PCIE 总线上拦截 NVME 命令的难度,使得写保护器的价格昂贵且实现复杂。有关更多信息,请参阅我的论文《NVM Express 驱动器与数字法医学》,该论文详细讨论了这一挑战。^(2)

通用串行总线

USB 被创建的目的是整合并取代老旧的外部外围接口,如 RS-232、并行打印机接口、PS/2 键盘和鼠标以及其他专有的 PC 接口。它的设计考虑了多用途的功能支持,如磁盘、键盘、鼠标、声音、网络连接、打印机和扫描仪,以及连接的小型设备(如手机等)。越来越多的物联网(IoT)设备可以通过 USB 连接到 PC,并且可能包含作为法医证据的有用数据。由于本书的重点是对大容量存储设备的法医采集,因此我将把讨论限定于 USB 大容量存储设备。

闪存驱动器、光驱、一些磁带驱动器,甚至磁性硬盘(参见 图 1-19)可能会将 USB 接口直接集成到驱动器电子组件中。USB 大容量存储类的最常见应用是消费者使用的 USB 闪存盘或拇指盘,以及外置硬盘盒。

image

图 1-19:集成 USB 接口的 1.8 英寸磁性硬盘

原始的 USB 协议用于大容量存储设备类别,称为 Bulk-Only Transport (BOT)。BOT 是当前最常见的 USB 传输协议;然而,随着磁盘速度的提高以及 USB3 的到来,BOT 协议正成为瓶颈,可能会被 USB 附加 SCSI 协议(UASP)所取代。类似于 SATA 的 AHCI,USB 也为主机控制器接口定义了标准。可扩展主机控制器接口(xHCI)取代了多个较老的 USB 标准(特别是 OHCI、UHCI 和 EHCI)。其规范可以在 www.intel.com/content/dam/www/public/us/en/documents/technical-specifications/extensible-host-controler-interface-usb-xhci.pdf 上找到。

最新的 USB 3.1 接口是 Type C,如 图 1-20 所示。Type C 接口具有多功能性,可用于 USB 3.1 设备和 Thunderbolt 3 设备,并可用作电源供应。物理插头是可逆的,这意味着在插入系统时,它没有上或下之分。

image

图 1-20:USB Type C 接口

外部 USB 磁盘外壳通常包含一个或多个 SATA 驱动器。如果可行,你应当拆卸 SATA 磁盘以直接访问 ATA 接口。这可以让你直接查询驱动器接口,并且在某些情况下可能带来性能优势(例如,包含 SATA 磁盘的 USB 2.0 外壳)。

专门为成像 USB 设备设计的法医写入阻止器已经存在,可以用于具有集成 USB 接口的驱动器(无论是闪存驱动器还是其他驱动器)。

Thunderbolt

Thunderbolt 是由 Apple 和 Intel 联合开发的高速外部接口,用于通过单一接口连接磁盘、视频显示器和 PCI Express 设备(参见 图 1-21)。其代号为 Light Peak,最初计划作为光纤连接。物理接口在 Thunderbolt 1 和 Thunderbolt 2 中使用 Mini DisplayPort,而在 Thunderbolt 3 中则过渡为 USB Type C 电缆和连接器。Apple 在 Thunderbolt 的普及上发挥了重要作用(尤其是在 Apple 用户中),通过 Apple 硬件进行推广。Thunderbolt 3 接口将 PCI Express、DisplayPort 和 USB3 集成到单一接口中。Thunderbolt 1、2 和 3 分别提供 10、20 和 40Gbps 的传输速度。

image

图 1-21:Thunderbolt 接口

对于苹果计算机系统,你可以使用目标磁盘模式(TDM)与 Thunderbolt 一起使用(如同 FireWire 一样),使系统表现为连接的另一个系统的外部磁盘机箱。TDM 指示苹果固件将内部磁盘作为块设备提供,可以像外部 SCSI 驱动器一样访问(在使用取证工具时非常有用)。我将在第 137 页的《苹果目标磁盘模式》中演示如何使用 TDM 进行苹果计算机的取证采集。

Thunderbolt 外部磁盘通常包含一个或多个 SATA 驱动器。在大型 Thunderbolt RAID 机箱中,该接口可能使用 SAS 控制器与多个 SATA 或 SAS 磁盘配合使用。

连接 Thunderbolt 接口的外部磁盘的 Linux dmesg 输出如下所示:

[   53.408619] thunderbolt 0000:05:00.0: 0:1: hotplug: scanning
[   53.408792] thunderbolt 0000:05:00.0: 0:1: is connected, link is up (state: 2)
[   53.408969] thunderbolt 0000:05:00.0: initializing Switch at 0x1 (depth: 1,
    up port: 1)
...
[   53.601118] thunderbolt 0000:05:00.0: 1: hotplug: activating pcie devices
[   53.601646] thunderbolt 0000:05:00.0: 0:6 <-> 1:2 (PCI): activating
...
[   53.602444] thunderbolt 0000:05:00.0: path activation complete
[   53.602679] pciehp 0000:04:03.0:pcie24: Card present on Slot(3-1)
[   53.609205] pciehp 0000:04:03.0:pcie24: slot(3-1): Link Up event
...
[   56.375626] ata7: SATA link up 6.0 Gbps (SStatus 133 SControl 300)
[   56.382070] ata7.00: ATA-8: ST1000LM024 HN-M101MBB, 2BA30003, max UDMA/133
[   56.382074] ata7.00: 1953525168 sectors, multi 0: LBA48 NCQ (depth 31/32), AA
[   56.388597] ata7.00: configured for UDMA/133
[   56.388820] scsi 7:0:0:0: Direct-Access     ATA      ST1000LM024 HN-M 0003 PQ: 0
    ANSI: 5
[   56.389341] sd 7:0:0:0: Attached scsi generic sg2 type 0
[   56.389342] sd 7:0:0:0: [sdc] 1953525168 512-byte logical blocks:
    (1.00 TB/931 GiB)
[   56.389345] sd 7:0:0:0: [sdc] 4096-byte physical blocks
[   56.389408] sd 7:0:0:0: [sdc] Write Protect is off
[   56.389413] sd 7:0:0:0: [sdc] Mode Sense: 00 3a 00 00
[   56.389449] sd 7:0:0:0: [sdc] Write cache: enabled, read cache: enabled, doesn't
    support DPO or FUA
[   56.403702]  sdc: [mac] sdc1 sdc2
[   56.404166] sd 7:0:0:0: [sdc] Attached SCSI disk

在撰写本文时,Linux 内核支持苹果计算机上的 Thunderbolt 接口。PC 主板的附加卡,如 ASUS ThunderboltEX II,不支持设备热插拔。但是,启动 PC 时将 Thunderbolt 磁盘连接上,可以让 PC 的 BIOS/固件在操作系统加载之前初始化 Thunderbolt 适配器,使外部磁盘对内核可见。

截至本文撰写时,市面上没有用于 Thunderbolt 接口的写保护器。此外,目前没有直接集成 Thunderbolt 接口的磁盘(仅有机箱)。

遗留接口

本节不讨论计算机磁盘接口的悠久历史;而是简要介绍了最近已过时的 IDE、并行 SCSI 和 FireWire 技术。这些接口在取证调查中可能仍然具有相关性,因为可能会发现或查获作为证据的旧硬件。

IDE 接口(参见图 1-22)和增强版(EIDE)通常用于 3.5 英寸磁盘,在被 SATA 取代之前是流行的接口。

image

图 1-22:IDE 磁盘接口

迷你 IDE 接口(参见图 1-23)是为 2.5 英寸磁盘开发的,用于笔记本电脑,直到被 SATA 取代。

image

图 1-23:迷你 IDE 磁盘接口

微型 IDE ZIF 接口(参见图 1-24)是为 1.8 英寸硬盘在超便携笔记本和其他小型电子设备中开发的,直到被 mSATA 和 M.2 接口取代。

image

图 1-24:微型 IDE ZIF 接口

FireWire,或称 IEEE1394 接口(参见图 1-25),由苹果公司开发,旨在提供高速外部总线,连接视频设备和磁盘驱动器。该接口目前已主要被 Thunderbolt 和 USB3 取代。

image

图 1-25:Firewire 接口

并行 SCSI 接口(参见图 1-26)在消费市场上基本消失,主要被 SATA(或在企业市场上被 SAS)取代。

image

图 1-26:SCSI 接口

用于 IDE、SCSI 和 FireWire 的取证写入阻止器很常见,并且也适用于 mini IDE、micro IDE ZIF 以及各种 SCSI 接口适配器的适配器。

命令、协议和桥接

存储设备与计算机系统之间的通信在概念上与局域网/广域网分层网络有些相似。^(3) 存储设备与计算机系统之间的通信可以类似地组织成几个抽象层。物理层由电缆、导线和电气信号组成。其上是链路层,数字比特和字节通过帧或链路层数据包有序地传输。在链路层之上,协议和命令在发送方和接收方之间交换,以请求和接收数据。在前面的部分中,我描述了物理连接和磁盘接口。这里,我将描述 ATA、SCSI 和 NVME 的更高层命令集。图 1-27 更好地展示了不同的抽象层。

ATA 命令

当前的高级技术附件(ATA)命令最初是由美国国家标准学会(ANSI)标准演变而来的,该标准定义了磁盘驱动器的 AT 附件接口。^(4) 原始标准描述了物理接口(电缆、引脚等)、电气信号和可以发出的逻辑命令。当前的标准^(5) 描述了驱动器可能具备的功能集以及用于控制每个驱动器的 ATA 命令。ATA 包装接口(ATAPI)将一个数据包命令功能集添加到 ATA 标准中,允许额外的命令,这些命令并不特定于磁盘驱动器功能(例如,弹出媒体、封装 SCSI 命令等)。

image

图 1-27:应用于磁盘接口的抽象层

ATA 命令集(ACS)定义了一组命令和参数,这些命令和参数可以加载到 ATA 寄存器中,并发送到驱动器执行。一些常见的 ATA 命令列在 表 1-1 中。

表 1-1: 常见的 ATA 命令

命令 命令代码
设备重置 08h
读取扇区 20h
写入扇区 30h
寻址 70h
下载微码 92h
媒体弹出 EDh
安全解锁 F2h

一些 ATA 和 ATAPI 命令可以使用 hdparm 和 smartctls 工具发布。T13 (t13.org/) 发布了定义完整命令集的标准。你可以在 sata-io.org/ 上找到更多资源。

理解 ATA/ATAPI 命令的基本操作为你提供了必要的背景知识,帮助你理解 SATA 和 IDE 取证写阻断器的工作原理(防止 ATA/ATAPI 命令修改磁盘)。了解这些命令的操作方式也能提升你对取证检查员如何查询磁盘属性并最终进行成功取证采集的理解。

SCSI 命令

从主机总线适配器到磁盘的 SCSI 命令遵循客户端/服务器模型。主机总线适配器(HBA)是客户端或发起者,而磁盘是服务器或目标。发起者向目标发送命令(可能还附带数据),目标则返回响应(可能还附带数据)。SCSI 最初是为多种设备设计的,包括扫描仪、磁带、打印机等,而不仅仅是硬盘。因此,SCSI 具有丰富的命令集。命令通过命令描述符块(CDB)从发起者(HBA)发送到目标(磁盘)。CDB 是一个包含命令及其参数的数据块。目标接收 CDB,执行请求并返回响应。这个过程有些类似于基于 UDP 的请求/响应机制,在 TCP/IP 客户端/服务器架构中使用。

SCSI 命令用于从磁盘读写数据块、控制硬件(如弹出 CD 或更换磁带)、报告状态和诊断信息等。这些命令通常对终端用户隐藏,但有多种实用工具可以从用户空间发出 SCSI 命令。甚至可以使用sg3_utils软件包中的工具,从 Linux 命令行提交任意命令。例如,以下命令会提交一个低级的 SCSI 命令,读取 SCSI 磁盘的第一个扇区:

# sg_raw -r 512 /dev/sda 08 00 00 00 01 00
SCSI Status: Good

Received 512 bytes of data:
 00     00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00    ................
 10     00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00    ................
...
 1a0    00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00    ................
 1b0    00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00    ................
 1c0    02 00 ee ff ff ff 01 00  00 00 ff ff ff ff 00 00    ................
 1d0    00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00    ................
 1e0    00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00    ................
 1f0    00 00 00 00 00 00 00 00  00 00 00 00 00 00 55 aa    ..............U.

在此示例中,sg_raw接收到一个 CDB 命令,向/dev/sda(一块 SAS 磁盘)发送命令。第一个字节0x08指定了 6 字节长的 SCSI READ命令。随后的零指定了 LUN 和起始扇区。0x01指定了要读取的扇区数,-r 512告诉sg_raw显示多少字节。这个示例也应该适用于 SAS、SATA 和 USB 连接的磁盘。

SCSI 和 SAS 命令的技术标准由 INCITS(国际信息技术标准委员会)下属的技术委员会 T10 维护。你可以在* t10.org/*找到这些标准。关于 SCSI 编程的书籍有助于更好地理解 SCSI 命令协议。

理解 SAS/SCSI 命令的基本操作与本书相关。它为你提供了理解 SAS/SCSI 取证写阻断器如何工作的背景知识(防止 SAS/SCSI 命令修改磁盘)。了解 SAS/SCSI 命令的操作方式提高了你对取证检查员如何查询磁盘属性并最终执行取证采集的理解。

SCSI 命令还用于控制磁带和光学设备。

NVME 命令

NVME 命令集是从零开始创建的,没有为现有的 SCSI 或 ATA 命令集提供向后兼容性。它的设计目的是直接支持连接到 PCI Express 总线的 SSD 介质,并利用多 CPU 并行化以及即时的 SSD 寻址时间(没有磁头移动的延迟开销)。标准的开发者还认识到,通过将驱动器直接连接到 PCIE 总线,ATA 或 SCSI 中的许多协议开销可以被消除。于是,创建了一个新的最小命令集,摆脱了传统命令或向后兼容性的要求。NVME 驱动器的性能和效率相比 SATA 或 SAS 有了显著提升。一个广泛的命令排队系统支持最多 64k 个队列,每个队列可以容纳 64k 个命令(相比之下,SATA 只有 32 个队列,每个队列只有一个命令)。

可以参考SCSINVME命令之间的翻译参考资料,地址为nvmexpress.org/。表 1-2 展示了更常见的示例。

表 1-2: SCSI 和 NVME 命令比较

SCSI NVME
COMPARE AND WRITE 比较和写入
READ 读取
WRITE 写入
WRITE BUFFER 固件镜像下载,固件镜像激活
INQUIRY 识别
READ CAPACITY 识别
REPORT LUNS 识别
MODE SENSE 识别,获取功能
LOG SENSE 获取功能,获取日志页
SYNCHRONIZE CACHE 刷新
FORMAT UNIT 格式化 NVM

磁盘设备可以通过各种总线系统和桥接器连接到 PC 系统。通过将驱动器尽可能靠近 CPU 和内存,可以提高性能。目前,驱动器可以通过使用 NVME 接口的 PCI Express 3.0 总线专用通道与 CPU 和内存连接(RAM 磁盘更快、更高效,但它们由操作系统创建,并非非易失性存储介质设备)。NVME 设备可以直接连接到 CPU,而不需要使用南桥芯片组或任何传统的磁盘协议开销,如 ATA 或 SCSI。

桥接、隧道化和透传

ATA 和 SCSI 是与存储介质交互的两种最常见的协议。这些命令可以通过多种物理层总线或传输层发送,甚至可以通过其他协议隧道化或封装。这些复杂性对用户是透明的,附加设备可以通过 Linux 内核提供的标准块设备进行访问。

为了说明,考虑一个 SATA 硬盘插入一个独立的 USB 对接站,而这个对接站又插入到 PC 中安装的 USB3 PCI Express 卡的外部端口。硬盘接口和对接站之间的通信是较低层次的 SATA 协议,使用 SATA 帧信息结构(FIS)数据包。对接站和 USB3 卡之间的通信是较低层次的 USB 协议,使用 BOT 或 USAP。USB3 卡和 PC 之间的通信是较低层次的 PCI Express 协议,使用 PCIE 事务层数据包(TLP)和数据链路层数据包(DLLP)。最后,硬盘通过这些桥接层使用 SCSI 命令协议进行访问。在这个示例中,使用了多个物理和链路层来连接硬盘。对用户来说,硬盘看起来是直接可访问的,较低层次的协议层被隐藏或抽象化。

注意

FIS 是 SATA 协议的一部分。PCI Express 有自己的一套协议,包括 TLP 和 DLLP。

对于每种不同的物理总线,称为PHY(物理层)的设备促进了连接到总线的设备之间的通信(总线上的 PHY 工作方式有点像两个调制解调器通过 WAN 电缆进行通信)。PHY 将数字的 1 和 0 转换为该总线所期望的符合电气信号要求的信号。在 PHY 处理完物理层之后,链路层协议管理在总线上来回传输的比特/字节流。这个链路层将数据流组织成帧或离散的数据包,供上层处理。

存在 USB、PCIE、Thunderbolt、SAS、SATA、光纤通道等的物理层和链路层描述。通常,存在一些标准,允许通用操作系统驱动程序以与硬件无关的方式使用设备中的物理硬件。例如,USB 适配器由 xHCI 标准定义,SATA 适配器由 AHCI 标准定义,NVME 设备由 NVMHCI 标准定义(现在简称为 NVME 标准)等等。符合这些标准允许硬件在不需要额外专有驱动程序的情况下得到支持。

尽管 ATA/ATAPI 和 SCSI 是不同的命令集,但它们都支持某种程度的隧道传输和相互通过对方的命令。ATA 使用 ATAPI 接口封装 SCSI 命令,与诸如光驱、磁带驱动器以及其他理解 SCSI 命令(如弹出介质及 ATA 协议中没有的其他命令)的设备进行通信。SCSI 支持 ATA 通行,这允许 ATA 命令通过 SCSI 协议发送。SAT(SCSI-ATA 转换)在 SCSI 和 ATA 命令之间创建了双向转换,其中命令与存储介质交互。这种转换作为 Linux 内核 API 在 libata 库中实现。(libata 库,有时拼写为libATA,提供了与 ATA 控制器和设备接口的许多功能。)

桥接设备在法医采集中发挥着重要作用,因为它们是实现硬件写入阻止器的基础。硬件写入阻止器通常是一个能够拦截发送到磁盘的 ATA 或 SCSI 命令的桥接设备,防止这些命令修改磁盘上的扇区。

专题

本节涉及与大容量存储和数字取证相关的多个专题。某些领域,例如 UASP 和 SSHD,简要讨论了它们与数字取证的相关性。其他领域,如 DCO、HPA 和 NVME 驱动器,在这里介绍,并在本书后续部分进行更详细的讨论。

DCO 和 HPA 驱动器区域

随着 ATA/ATAPI 标准的演进,某些特性被创建以便惠及系统供应商。主机保护区(HPA)是在 ATA/ATAPI-4 标准中引入的,它允许系统供应商为操作系统外部使用保留磁盘的部分空间。例如,HPA 可以用于存储持久数据、系统恢复数据、休眠数据等。对这些数据的访问由系统固件控制,而非安装的操作系统。设备配置覆盖(DCO)特性是在 ATA/ATAPI-6 标准中引入的,它提供了控制报告的磁盘特性和容量的能力。这使得系统供应商能够从多个制造商处运输磁盘,同时在各磁盘间保持相同数量的用户可访问扇区和特性。这促进了支持和驱动器更换的简化。HPA 和 DCO 可以共存;然而,DCO 必须首先创建,然后是 HPA。

HPA 和 DCO 已被犯罪分子和恶意行为者滥用,用于隐藏非法文件和恶意代码。我在《启用对隐藏扇区的访问》中描述了如何检测和删除 HPA 和 DCO,揭示隐藏在普通用户视野中的扇区,具体见第 118 页。关于 HPA 和 DCO 在法医领域的更详细描述,请参阅论文《隐藏磁盘区域:HPA 和 DCO》。^(6) 关于国家级利用 HPA 的更多信息,可以参考* www.schneier.com/blog/archives/2014/02/swap_nsa_exploi.html leaksource.files.wordpress.com/2013/12/nsa-ant-swap.jpg *。

驱动器服务与维护区域

硬盘的某些维护区域通常无法使用标准 Linux 工具访问。这些区域包含坏道列表和厂商服务扇区(有时称为负扇区)。要访问这些区域,你需要专门的磁盘诊断软件和硬件。我在“驱动器服务区域访问”中提供了一个访问磁盘服务区域的示例,并在第 122 页提供了一些额外的资源。不要将磁盘的服务区域与 HPA 或 DCO 混淆。你可以使用标准的 ATA 命令和方法轻松访问 HPA 和 DCO 区域,但无法访问磁盘的服务区域。

USB 附加 SCSI 协议

USB 提供了两种访问大容量存储设备的模式:更常见的 BOT 模式和更新的 UASP 模式。随着 USB3 和 USB3.1 速度的提升,开发了一种新的、更高效的 USB 大容量存储协议,称为USB 附加 SCSI 协议(UASP)。这个新协议也被称为UAS,并且有时会使用 USB3 Boost、USB3 Turbo 或 USB3 Extreme 等产品营销别名。你可以在* usb.org/* 和 t10.org/ 找到更多信息,这些组织共同开发了这个标准。UASP 通过提供命令排队和异步处理,并且改善任务和命令控制能力,来提高性能。

附加 UASP 支持的 USB 磁盘的 dmesg 输出使用uas协议进行操作:

[15655.838498] usb 2-6.2: new SuperSpeed USB device number 6 using xhci_hcd
...
[15655.952172] scsi host14: uas
...
[15666.978291] sd 14:0:0:0: [sdk] 3907029168 512-byte logical blocks:
    (2.00 TB/1.81 TiB)
...
[15667.033750] sd 14:0:0:0: [sdk] Attached SCSI disk

相比之下,使用传统 BOT USB 接口连接的相同磁盘会加载usb-storage协议进行操作:

[15767.853288] usb 2-6.2: new SuperSpeed USB device number 7 using xhci_hcd
...
[15767.918079] usb-storage 2-6.2:1.0: USB Mass Storage device detected
[15767.918195] usb-storage 2-6.2:1.0: Quirks match for vid 174c pid 55aa: 400000
[15767.918222] scsi host15: usb-storage 2-6.2:1.0
...
[15777.728944] sd 15:0:0:0: [sdk] 3907029168 512-byte logical blocks:
    (2.00 TB/1.81 TiB)
...
[15777.820171] sd 15:0:0:0: [sdk] Attached SCSI disk

从取证的角度来看,需要注意的是,所使用的传输协议不会影响 USB 磁盘的内容,也不会影响取证镜像的加密哈希值。实际上,使用基于 UAS 的写保护器在性能上是有优势的(例如,Tableau 的 USB3 写保护器使用的是 UAS)。

注意

一句建议:当你使用 USB3 的更高速度时,USB 电缆的质量就变得非常重要。较长且质量较差的 USB3 电缆可能会在数据采集过程中产生读取错误。对于那些在专业取证实验室工作的人来说,值得投资购买短小且高质量的 USB3 电缆。

高级格式 4Kn

随着磁盘容量的增加,业界发现通过将磁盘从 512 字节扇区切换到 4096 字节扇区,可以提高磁盘效率。国际磁盘驱动设备与材料协会(IDEMA)为 4096 字节物理扇区制定了高级格式标准(见 www.idema.org/?page_id=2369)。自 2009 年以来,硬盘制造商承诺使用 IDEMA 的高级格式标准生产 4K 扇区磁盘。即使是使用 4K 物理扇区的磁盘,今天的大多数磁盘仍然模拟 512 字节扇区,这些磁盘被称为高级格式 512e磁盘。那些为主机系统和操作系统提供原生 4K 大小扇区的磁盘被称为高级格式 4Kn磁盘。高级格式 4Kn 磁盘在低端市场仍然稀有,但在企业环境中使用广泛。对于更大容量的企业磁盘,大多数企业磁盘制造商提供两种型号:512e 和 4Kn。图 1-28 展示了 4Kn 磁盘的官方标志。

您可以在 YouTube 上找到关于高级格式和 4K 扇区的良好概述,网址为 www.youtube.com/watch?v=TmH3iRLhZ-A/

image

图 1-28:高级格式 4Kn 标志

当 Linux 内核检测到附加的磁盘时,它会显示扇区数量和逻辑扇区大小(在某些情况下,它还可能明确显示物理大小)。以下部分 dmesg 输出显示了两个相同大小的磁盘,一个是高级格式 512e,另一个是 4Kn。将 512 字节扇区的数量除以 8,或者将 4K 扇区的数量乘以 8,可以显示这两个磁盘容量相同,但扇区数不同。

...
[   13.605000] scsi 1:0:1:0: Direct-Access     TOSHIBA  MG03SCA300       0108 PQ: 0
    ANSI: 5
...
[   16.621880] sd 1:0:1:0: [sdb] 5860533168 512-byte logical blocks: (3.00 TB/2.73
    TiB)
...
[   14.355068] scsi 1:0:2:0: Direct-Access     ATA      TOSHIBA MG04ACA3 FP2A PQ: 0
    ANSI: 6
...
[   16.608179] sd 1:0:2:0: [sdc] 732566646 4096-byte logical blocks: (3.00 TB/2.73
    TiB)

在 Linux 系统上,您可以使用/sys伪文件系统来查找磁盘的逻辑和物理扇区大小。例如,您可以按如下方式确定附加磁盘/dev/sda的物理和逻辑扇区大小:

# dmesg
...
[   16.606585] sd 1:0:0:0: [sda] 7814037168 512-byte logical blocks: (4.00 TB/3.64
    TiB)
...
# cat /sys/block/sda/queue/logical_block_size
512
# cat /sys/block/sda/queue/physical_block_size
4096
# blockdev --getpbsz /dev/sda
4096
# blockdev --getss /dev/sda
512

这两种方法展示了从/sys伪文件系统读取(您也可以作为非根用户执行此操作)并使用blockdev命令。

一些 SSD 允许您使用固件工具选择物理扇区大小。例如,一些最新的英特尔 SSD 可以使用英特尔提供的命令行工具在 512 和 4096 之间切换扇区大小(* downloadcenter.intel.com/download/23931/*)。

4K 磁盘的几个方面对数字取证社区具有重要意义,并将在本节剩余部分进行讨论。一些早期的西部数据高级格式 512e 磁盘有一个跳线设置(跳线 7 和 8),用于内部偏移扇区,使默认的 XP 分区的起始位置与 4K 扇区的起始位置对齐。这个跳线设置重新对齐磁盘极大提高了性能。更改这样的扇区对齐跳线会影响取证获取哈希值,并可能影响磁盘的分析。在进行取证成像或验证磁盘时,必须使用与磁盘首次扣押时相同的跳线设置。

使用 4Kn 磁盘将影响剩余空间的值。RAM 剩余空间或内存剩余空间是文件最后一个扇区中未使用的部分(不要与文件剩余空间混淆,后者是文件系统中文件最后一个块中未使用的部分)。当你使用 4Kn 磁盘且文件系统使用 4K 块时,RAM 剩余空间和文件剩余空间是相同的。操作系统在写入之前会用零填充 4K 扇区的未使用部分,这样就消除了文件系统中 4K 块上的文件剩余空间中可能存在有用数据的可能性。

假设扇区大小为 512 字节的取证软件可能会失败,或者更糟糕的是,产生不正确的结果。当使用 4Kn 磁盘时,重要的是确认取证软件是否识别并使用 4Kn 扇区。Sleuth Kit 默认使用 512 字节扇区,必须明确告知它使用 4K 扇区来处理 4Kn 磁盘。以下示例展示了 mmls 默认情况下产生不正确结果,而在指定正确扇区大小时产生正确结果。

# mmls /dev/sde
DOS Partition Table
Offset Sector: 0
Units are in 512-byte sectors

     Slot    Start        End          Length       Description
00:  Meta    0000000000   0000000000   0000000001   Primary Table (#0)
01:  -----   0000000000   0000000255   0000000256   Unallocated
02:  00:00   0000000256   0732566645   0732566390   Linux (0x83)
03:  -----   0732566646   5860533167   5127966522   Unallocated
...
# mmls -b 4096 /dev/sde
DOS Partition Table
Offset Sector: 0
Units are in 4096-byte sectors

     Slot    Start        End          Length       Description
00:  Meta    0000000000   0000000000   0000000001   Primary Table (#0)
01:  -----   0000000000   0000000255   0000000256   Unallocated
02:  00:00   0000000256   0732566645   0732566390   Linux (0x83)
#

在使用 -b 标志指定 4096 字节扇区大小后,Linux 分区的扇区被表示为 4K 单位,磁盘末尾没有未分配区域。成功获取原生 4K 扇区磁盘的示例如“dcfldd 和 dc3dd 工具”中第 144 页所示。

高级格式 4Kn 磁盘的使用仍然不常见。目前尚不清楚 4Kn 扇区磁盘会如何影响现有的取证获取和分析软件,特别是那些基本假设扇区大小为 512 字节的取证工具。这是数字取证领域需要进一步研究的一个方向。

NVME 命名空间

NVME 规范引入了命名空间的概念,允许在较低层次上对磁盘进行分区,抽象化地与普通操作系统分离。对于具有多个命名空间的磁盘进行取证成像时,必须分别对每个命名空间进行处理。你可以通过几种方式确定命名空间的数量。

通过使用 nvme-cli 工具发送识别控制器 admin 命令,你可以检查支持和使用的命名空间数量。以下示例显示了有关命名空间支持的各种信息:

# nvme id-ctrl /dev/nvme1 -H
NVME Identify Controller:
vid     : 0x144d
ssvid   : 0x144d
sn      : S2GLNCAGA04891H
mn      : Samsung SSD 950 PRO 256GB
fr      : 1B0QBXX7
...
oacs    : 0x7
  [3:3] : 0     NS Management and Attachment Not Supported
...
  [0:0] : 0x1   SMART/Health Log Page per NS Supported
...
nn      : 1
...

在这里,可选的管理员命令支持(OACS)表示该特定硬盘不支持命名空间管理。命名空间数量字段(nn)显示控制器上的命名空间数量——该设备上只有一个。

你也可以使用 nvme-cli 检查命名空间的大小,并将其与制造商的规格进行比较,如下所示:

# nvme id-ns  /dev/nvme0n1
NVME Identify Namespace 1:
nsze    : 0x2e9390b0
ncap    : 0x2e9390b0
nuse    : 0x2e9390b0
...

这里,nsze 指的是命名空间大小,ncap 是命名空间容量,nuse 是命名空间使用情况。如果这些值与厂商文档中的硬盘大小匹配,则确认正在使用单一命名空间。

检查是否存在多个命名空间设备的第三种方法是简单列出操作系统检测到的设备(/dev/nvme0n2**、/dev/nvme0n3** 等)。

截至目前,尚未有支持多命名空间的消费级硬盘可供测试。本节中的信息来源于 NVME 规范和工具文档。

固态混合硬盘

开发了一种固态与传统磁盘的混合型硬盘,以提供更大的磁盘容量,且性能可与 SSD 相媲美,且价格更为实惠。

这些混合硬盘,被称为固态混合硬盘(SSHDs),提供额外的固态缓存,缓存经常使用的扇区。SSHDs 可以完全独立于操作系统运行,或者接受操作系统的“提示”,帮助决定哪些块需要缓存。

从 SATA 3.2 起,新增了一项混合信息功能,允许主机通过 ATA 命令与混合硬盘通信缓存信息。

迄今为止,关于 SSHDs 的取证研究较少,对于数据采集的影响尚不明确。SSHDs 包含一个小型的 SSD 硬盘,必须进行磨损平衡。一个不支持 TRIM 命令的混合硬盘不太可能删除未分配文件系统块中的数据。

这里描述的混合系统内建于单个硬盘的电子元件中。也可以拥有一个由两个独立硬盘组成的混合系统:一个较小的 SSD 和一个较大的磁性硬盘。通过操作系统驱动程序或像英特尔的智能响应技术这样的专有系统,可以实现等效的混合缓存功能。

总结思考

在本章中,我回顾了各种类型的存储介质——磁介质、非易失性介质和光学介质——并考察了不同的硬盘类型。我描述了将存储设备连接到检查主机系统的内部和外部接口。还解释了访问硬盘的协议,并涵盖了一些不太常见的专业主题。我从取证检查员的角度呈现了本章内容。你现在应该已建立起坚实的基础,以理解下一章关于使用 Linux 作为取证采集平台的内容。

第三章:LINUX 作为法医采集平台

image

本章描述了 Linux 作为执行数字法医采集的平台,并讨论了其各种优缺点。我还将探讨 Linux 和开源软件在数字法医界的接受度,最后一节将概述你需要理解的 Linux 基础知识,以便理解本书后续章节的内容。

本书中展示的示例主要使用的是 Ubuntu Linux Server 16.04 LTS 版本(支持至 2021 年 4 月),搭载的是 Bourne Again Shell(Bash)版本 4.3.x。这些示例也应该适用于其他 Linux 发行版以及其他操作系统,如 OS X 或 Windows,只要你使用相同或更新版本的工具,并调整设备名称。本书中,命令行ShellBash 这几个词会互换使用。

Linux 和开源软件在法医领域的应用

像 Linux 这样的开源软件(OSS)的日益普及使其成为执行数字取证的重要平台。许多研究人员已经讨论了使用开源软件来满足 Daubert 标准对证据可靠性的要求。^(1) Sleuth Kit 的作者 Brian Carrier 探讨了使用开源法医工具的法律论点,并建议部分法医软件(但不一定是全部)应该开源。^(2)

在法医学领域使用开源软件(OSS)的主要优势是透明性。与专有的商业软件不同,源代码可以被审查并公开验证。此外,学术研究人员可以研究它,并在社区中他人的工作基础上进行构建。开源法医学软件应用已经成为法医学研究的工具和基础构件。使用开源软件也有其缺点,以及一些情况下它的使用没有意义。特别是,开源社区的开放性在某些情况下可能与正在进行的法医调查的保密性相冲突。以下章节将讨论 Linux 和开源软件的优缺点。

Linux 和开源软件在法医学实验室中的优势

开源软件(OSS)的公开可用性意味着它对每个人都可访问。它不局限于那些购买了许可证或签署了保密协议的人。开源软件可以被任何有兴趣的人自由下载、使用、检查和修改,且不涉及任何许可费用或使用成本。

访问源代码使你能够自定义并促进与其他软件、硬件和法医学实验室流程的集成。这种源代码级的访问增加了自动化和脚本化工作负载的可能性。自动化减少了所需的人类互动,从而降低了人为错误的风险,并释放了这些人力资源,使其可以用于其他地方。

在案件工作量大的实验室中,自动化至关重要,有助于优化和简化流程。因为可以自由修改源代码,开源软件可以根据特定法医实验室的要求进行定制。特别是命令行软件可以让你通过 Shell 脚本将多个任务和工作链接在一起,完成端到端的流程。

开源软件的支持有几个优势。即兴的社区支持可能非常优秀,邮件列表和聊天论坛可以在几分钟内回答求助请求。在某些情况下,补丁、错误修复和功能请求可以迅速实现。

Linux 和开源软件非常适合学术法医实验室环境,因为它们使用开放的、已发布的标准,而不是封闭或专有的标准。开源软件开发社区与竞争性团体是合作而非对抗的。学习他人、复制他人的代码和想法(并给予适当的归属),以及在他人工作的基础上构建是被鼓励的,也是学习和获取知识的基础。

开源软件(OSS)提供的供应商独立性避免了供应商产品锁定,并促进了技术和组织之间的互操作性和兼容性。这使得软件随着时间的推移更易于更换,因为可以用新的或替代的技术替换单个组件,而不会影响整体系统和流程。

Linux 和开源软件在法医实验室中的缺点

Linux 和开源软件的缺点为支持封闭专有软件提供了论据。商业工具的实现通常在这一领域提供了好处和优势。

开源社区支持模型不能保证可靠、准确或可信。社区提供的答案质量差异很大;有些答案非常好,而有些可能是错误的,甚至是危险的。通常不存在正式的支持组织来提供帮助。在需要保证 24/7 支持的情况下,商业提供商具有优势。

开源世界中的支持与软件一样透明,所有人都可以看到。然而,在法医实验室环境中,案件和调查可能是敏感的或保密的。向公众寻求支持可能会暴露或妥协正在进行中的调查的细节。因此,信息安全和隐私在开源支持模型中是一个问题。

与专有技术的互操作性给开源接口和 API 带来困难。未公开的专有技术通常会被反向工程,而不是授权。反向工程工作通常不完整,存在错误实现某一技术的风险,并且可能需要很长时间来完成。

免费开源软件(Free OSS)通常是志愿者开发的项目,软件可能处于持续开发的状态。一些项目可能被放弃或因疏忽而死亡。其他项目可能会经历代码的分叉,即一些开发者决定复制现有代码库并将其朝着与原开发者不同的方向发展。

免费开源软件可能存在一些粗糙之处。它可能存在漏洞,或者难以学习和使用。它的文档可能很差(源代码可能是唯一的文档)。与商业软件不同,通常不会提供培训来辅导使用该软件产品。学习 Unix/Linux 需要时间和精力,特别是命令行不像全图形界面那样直观。许多人在刚进入自由开源的世界时,会遇到一个学习曲线问题,这不仅是软件的学习曲线,还有周围社区的整体态度和思维方式。

在法医社区中,商业软件供应商提供了一定程度的可防御性和保证,确保其软件能够正常运行。一些法医公司甚至提供法庭作证服务,以辩护其软件产品提供的结果。而在自由开源社区中,没有人对生产的软件负责,也没有人会为其承担责任。它是“按原样提供”的,“使用风险自负”。

显然,开源软件并不适用于所有情况,这一点在本书中并未暗示。在许多示例中,开源软件更多是用于教育目的,展示事物的运作方式,而不是作为专业商业法医软件的可行替代方案。

Linux 内核与存储设备

传统的 Unix 系统(Linux 继承了其哲学)是以一种“万物皆文件”的方式设计的。每个文件都有一个特定的类型,包括常规文件、目录、块设备、字符设备、命名管道、硬链接和软/符号链接(类似于 Windows 中的 LNK 文件)。在检查工作站上,法医调查人员关心的文件是附加的受试磁盘的块设备文件,这些磁盘可能包含法医证据。本节将描述 Linux 设备,特别是存储介质的块设备。

内核设备检测

Unix 和 Linux 系统有一个特殊的目录,叫做/dev,用于存储与内核理解的设备相对应的特殊文件。最初的 Unix 和 Linux 系统需要手动在/dev目录下创建设备文件(使用mknod命令),或者使用脚本(MAKEDEV)在启动时或需要时创建设备。随着即插即用硬件的出现,需要一种更动态的方法,于是devfs应运而生,能够自动检测新硬件并创建设备文件。为了更好地与用户空间的脚本和程序交互,udev应运而生,取代了devfs。今天,udev已经并入systemd,并运行一个名为systemd-udevd的守护进程。

当新设备连接到(或从)主机时,硬件中断会通知内核硬件发生了变化。内核通知udev系统,udev会创建具有适当权限的设备,执行设置(或移除)脚本和程序,并向其他守护进程发送消息(例如通过dbus)。

要观察udev的工作情况,可以使用udevadm工具的监视模式:

# udevadm monitor
monitor will print the received events for:
UDEV - the event that udev sends out after rule processing
KERNEL - the kernel uevent

KERNEL[7661.685727] add      /devices/pci0000:00/0000:00:14.0/usb1/1-14 (usb)
KERNEL[7661.686030] add      /devices/pci0000:00/0000:00:14.0/usb1/1-14/1-14:1.0
    (usb)
KERNEL[7661.686236] add      /devices/pci0000:00/0000:00:14.0/usb1/1-14/1-14:1.0/
    host9 (scsi)
KERNEL[7661.686286] add      /devices/pci0000:00/0000:00:14.0/usb1/1-14/1-14:1.0/
    host9/scsi_host/host9 (scsi_host)
...
KERNEL[7671.797640] add      /devices/pci0000:00/0000:00:14.0/usb1/1-14/1-14:1.0/
    host9/target9:0:0/9:0:0:0/block/sdf (block)
KERNEL[7671.797721] add      /devices/pci0000:00/0000:00:14.0/usb1/1-14/1-14:1.0/
    host9/target9:0:0/9:0:0:0/block/sdf/sdf1 (block)
...

这里一块硬盘已经插入到 USB 端口,udev管理了所有相关设备文件和链接的设置。

udevadm命令也可以用来列出已连接设备的相关文件和路径。例如:

# udevadm info /dev/sdf
P: /devices/pci0000:00/0000:00:14.0/usb1/1-14/1-14:1.0/host9/target9:0:0/9:0:0:0/
    block/sdf
N: sdf
S: disk/by-id/ata-ST2000DL003-9VT166_5YD83QVW
S: disk/by-id/wwn-0x5000c50048d79a82
S: disk/by-path/pci-0000:00:14.0-usb-0:14:1.0-scsi-0:0:0:0
E: DEVLINKS=/dev/disk/by-path/pci-0000:00:14.0-usb-0:14:1.0-scsi-0:0:0:0 /dev/disk/
    by-id/wwn-0x5000c50048d79a82 /dev/disk/by-id/ata-ST2000DL003-9VT166_5YD83QVW
E: DEVNAME=/dev/sdf
E: DEVPATH=/devices/pci0000:00/0000:00:14.0/usb1/1-14/1-14:1.0/host9/target9:0:0/
    9:0:0:0/block/sdf
E: DEVTYPE=disk
E: ID_ATA=1
...

理解 Linux 设备树在进行取证采集和分析时非常重要。了解哪些设备是本地调查员的计算机设备,哪些设备是嫌疑人的硬盘,哪个设备是写保护器等等,对于执行取证命令并从设备收集信息至关重要。

/dev 中的存储设备

当硬盘被内核检测到时,它们会作为块设备出现在/dev目录下。原始磁盘设备文件有特定的命名约定:sd用于 SCSI 和 SATA,hd用于 IDE,md用于 RAID 阵列,nvmen*用于 NVME 驱动,其他名称则用于较少见或专有的磁盘设备驱动程序。

内核发现的各个分区通过编号的原始设备表示(例如,hda1hda2sda1sda2,等等)。分区块设备表示整个分区作为一系列连续的磁盘扇区。一个分区通常包含一个文件系统,内核可以挂载它,并将其作为目录树的正常部分提供给用户。大多数取证工具可以(并且应该)在不挂载文件系统的情况下检查原始设备和分区设备。

其他特殊设备

本书中的几个其他设备也很有用。位桶/dev/null会丢弃写入其中的任何数据。访问/dev/zero时,会提供一连串的零值。随机数生成器/dev/random在访问时提供一串随机数据。磁带驱动器通常以/dev/st开头,你可以通过/dev/cdrom/dev/dvd(这些通常是指向/dev/sr的符号链接)访问其他外部存储设备。在某些情况下,设备通过通用的 SCSI 设备驱动程序接口/dev/sg进行访问。

其他特殊的伪设备包括/dev/loop/dev/mapper/设备。这些设备将在本书中详细讨论。

Linux 内核与文件系统

文件系统将存储组织成目录(文件夹)和文件的层次结构。它们在块设备之上提供了一层抽象。

内核文件系统支持

Linux 内核支持大量的文件系统(详细列表见 en.wikipedia.org/wiki/Category:Linux_kernel-supported_file_systems),在进行一些取证任务时非常有用。然而,在执行取证获取时,文件系统的支持并不是必需的,因为成像过程是作用于文件系统和分区方案下的块设备。

为了提供一致的接口以支持不同类型的文件系统,Linux 内核实现了一个虚拟文件系统(VFS)抽象层。这允许挂载常规存储介质文件系统(EXT*、NTFS、FAT 等)、基于网络的文件系统(nfs、sambafs/smbfs 等)、基于 FUSE 的用户空间文件系统、可堆叠文件系统(encryptfs、unionfs 等)以及其他特殊伪文件系统(sysfs、proc 等)。

如图 2-1 所示,Linux 存储栈图有助于你理解 Linux 内核中文件系统、设备、设备驱动程序和硬件设备之间的关系。

image

图 2-1:Linux 存储栈图(www.thomas-krenn.com/en/wiki/Linux_Storage_Stack_Diagram,根据 CC 署名-相同方式共享 3.0 未加版使用)

在 Linux 中挂载文件系统

一个常被误解的概念是附加磁盘设备与挂载磁盘设备之间的区别。设备不需要挂载就可以进行获取,甚至可以使用取证分析工具访问它。直接操作块设备的取证工具将能够在不通过操作系统挂载的情况下访问附加的磁盘。

存储在 Unix 和 Linux 的磁盘设备上的文件系统需要显式挂载,才能作为常规目录结构访问。挂载文件系统意味着它可以通过标准文件访问工具(文件管理器、应用程序等)进行使用,类似于 DOS/Windows 中的驱动器字母。Linux 不使用驱动器字母;挂载的磁盘成为本地文件系统的一部分,并附加到文件系统树的任何选定部分。这被称为文件系统的挂载点。例如,以下命令使用(/mnt)作为挂载点将 USB 闪存驱动器挂载到调查人员系统上:

# mount /dev/sdb1 /mnt

要在 Linux 中物理移除挂载的磁盘,首先卸载文件系统以防止文件系统损坏。你可以使用umount命令(是umount,不是unmount)配合设备名称或挂载点。这两个命令执行相同的操作来卸载磁盘文件系统:

# umount /dev/sdb1
# umount /mnt

文件系统卸载后,原始磁盘仍然对内核可见,并且可以通过块设备工具访问,即使文件系统没有挂载。未挂载的磁盘可以安全地从调查人员的获取系统中物理分离。

不要在没有写保护器的情况下连接或挂载可疑驱动器。这样做存在修改、损坏和销毁数字证据的高风险。现代操作系统会在访问文件和目录时更新最后访问的时间戳。任何用户空间的守护进程(搜索索引器、缩略图生成器等)可能会写入磁盘并覆盖证据,文件系统可能会尝试修复,日志文件系统可能会写出日志数据,其他人为事故也可能发生。在使用写保护器时,你可以挂载文件系统,它将像常规文件系统一样可访问,但处于只读状态,从而确保数字证据得到保护。

使用取证工具访问文件系统

当你使用取证工具,例如 Sleuth Kit、dcfldd、foremost 等时,可以通过使用正确的块设备来访问文件系统(无需挂载),该块设备代表文件系统所在的分区。在大多数情况下,这将是一个带编号的设备,如 /dev/sda1/dev/sda2/dev/sdb1 等,由 Linux 内核检测到。

如果 Linux 内核未能检测到文件系统,你可能需要显式指定它。以下原因可能导致文件系统无法正确检测:

• 主机系统不支持该文件系统(缺少内核模块或不支持的文件系统)。

• 分区表损坏或丢失。

• 分区已被删除。

• 磁盘上的文件系统偏移量未知。

• 需要使文件系统可访问(解锁设备、解密分区等)。

在本书的后续章节中,我将解释使用循环设备访问未被 Linux 内核或各种取证工具自动检测到的分区和文件系统的技巧。

Linux 发行版和 Shell

当你创建一个调查工作站来执行数字取证获取或分析工作时,理解 Linux 系统的基本构造或组成是很有帮助的。

Linux 发行版

Linux 这一术语从技术上讲仅指 内核,即实际的操作系统。^4 图形界面、工具和实用程序,甚至命令行 Shell 都不是 Linux,而是 Linux 发行版 的一部分。发行版是一个功能包,通常包含 Linux 内核、安装程序和软件包管理器(通常是特定于该发行版的),以及各种附加程序和实用工具(包括标准应用程序,如办公套件、网页浏览器或电子邮件/聊天客户端)。只有一个官方的 Linux 内核,但有许多 Linux 发行版——例如,Red Hat、SUSE、Arch 和 Debian 等。还有许多衍生发行版。例如,Ubuntu 是基于 Debian 的衍生版,CentOS 基于 Red Hat,Manjaro 基于 Arch。要查看发行版的完整列表(以及其他非 Linux 的开源操作系统),请访问 distrowatch.com/

组成各种 Linux 发行版图形界面的多个组件是很有用的理解对象。X11 窗口系统是一个显示服务器,它与图形硬件交互并提供 X11 图形原语的接口(Wayland 是 X11 的一个较新的替代方案)。窗口管理器控制系统上窗口的移动、大小调整、位置等管理工作。常见的窗口管理器包括 Compiz、Mutter 和 OpenBox,且可以在没有桌面环境的情况下使用它们。桌面环境提供了发行版的外观和感觉,并且运行在窗口管理器之上。流行的桌面环境有 Gnome、KDE、Xfce 和 Mate。你为法证调查员工作站选择的图形环境可以基于个人偏好,它不会影响你收集或分析的证据。本书中的示例是在没有图形用户界面的系统(Ubuntu Server 版本)上进行的。

Shell

Shell 是一个命令提示符,供人类和/或机器用来提交命令以指令和控制操作系统。Shell 启动或停止程序、安装软件、关闭系统并执行其他任务。可以说,命令行 Shell 提供的功能和可能性比图形环境更为强大。

本书中的示例使用的是命令行环境。可能存在一些命令行工具的图形界面替代品或图形前端,但这些内容本书中没有涉及。

当前最常用的 Shell 是 Bash,它是大多数 Linux 发行版的默认 Shell。本书中的示例使用的是 Bash,但也可能适用于其他 Shell(如 zsh、csh 等)。

命令执行

Shell 只是系统上运行的另一个程序。人类用户通过输入命令与其交互,机器则通过执行 Shell 脚本与其交互。

当用户输入命令时,他们通常将其键入提示符,然后按下 ENTER 或 RETURN。根据程序的运行和 shell 的配置,可能会有输出,也可能没有输出。

管道与重定向

Unix/Linux 命令行的一个有用功能是能够通过管道和重定向将数据流传递给程序和文件。这与图形环境中的拖放和复制/粘贴有些相似,但具有更大的灵活性。

程序可以从其他程序的输出或文件系统上的文件接收数据。程序也可以将数据输出到另一个程序的输入或发送到文件系统中的文件。

以下示例演示了 tool.sh 将输出重定向到 file.txt,从 file.txt 接收输入,并将 tool.sh 的输出通过管道传输到 othertool.sh 的输入:

$ tool.sh > file.txt
$ tool.sh < file.txt
$ tool.sh | othertool.sh

这种管道和重定向机制不仅限于单个命令或文件,可以通过多个程序按顺序链接起来:

$ tool.sh < file.txt | othertool.sh | lasttool.sh > lastfile.txt

本书中广泛使用了管道和重定向。它们使你可以通过一行命令完成多个任务,并促进了脚本编写和自动化,消除了对人工交互的需求。本书中的示例使用管道和重定向来获取存储介质的镜像,在取证程序之间移动数据,并将相关的证据保存到文件中。

结束语

在本章中,我讨论了将 Linux 作为一个可行的平台来执行取证采集任务,并覆盖了其优缺点。我回顾了 Linux 发行版以及 Linux 内核的工作原理。我展示了设备和文件系统的概念,以及从取证审查员的角度来看使用 shell、管道和重定向。现在你已经具备了理解本书其余部分示例所需的 Linux 知识。

第四章:取证镜像格式

image

本章概述了今天常用的各种采集工具、证据容器和取证镜像格式。取证镜像格式和证据容器是存储取证采集镜像及其附加案件数据(如采集时间和持续时间、采集方式、大小、错误、哈希等)的结构。取证格式的附加功能通常包括压缩文件和加密。本章展示了使用几种取证格式的命令行取证任务。

你可以在数字取证研究研讨会(DFRWS)网站上找到一篇描述各种取证格式的介绍性论文,网址是 www.dfrws.org/CDESF/survey-dfrws-cdesf-diskimg-01.pdf

你可以通过使用 Sleuth Kit 命令 img_stat 来识别本章中描述的常用取证格式:

# img_stat -i list
Supported image format types:
        raw (Single or split raw file (dd))
        aff (Advanced Forensic Format)
        afd (AFF Multiple File)
        afm (AFF with external metadata)
        afflib (All AFFLIB image formats (including beta ones))
        ewf (Expert Witness format (encase))

除了这些格式,本章还介绍了一种临时方法,使用 SquashFS 作为与标准取证工具配合使用的实际取证容器。

注意

关于取证镜像的一个重要概念是,它们不是复制文件,而是复制磁盘扇区,从扇区 0 到磁盘上最后一个可访问的扇区。原始镜像的大小始终等于整个磁盘的大小,而与磁盘文件系统上存在的文件数量无关。

原始镜像

原始镜像本身并不是一种格式,而是从证据源获取的一段原始数据。原始镜像除了包含有关镜像文件本身(如名称、大小、时间戳和其他信息)的元数据外,不包含任何额外的元数据。

提取原始镜像在技术上是直接的:它只是将字节序列从源设备传输到目标文件。这通常是没有任何转换或翻译的。

磁盘块复制工具,如 dd 和变种工具,最常用来提取原始镜像。以下各节将讨论这些工具。

传统 dd

创建原始镜像的最简单工具,也是最古老的工具,就是原始的 Unix dd 工具。它并非为证据收集而设计,但其简单的逐字节传输对于成像磁盘设备非常有用,因为它会对磁盘的每个扇区进行完整的低级别复制(保留文件系统结构、文件、目录和元数据)。然而,像日志记录、错误处理和哈希等功能要么不足,要么根本不存在;当没有更好的替代工具时,可以使用 dd。计算机取证工具测试(CFTT)项目测试了几个标准的 dd 版本。你可以在 CFTT 网站上找到测试结果,网址是 www.cftt.nist.gov/disk_imaging.htm

dd 工具最初在 1970 年代的早期 UNIX 系统上创建,主要用于字节顺序转换和块复制。最初是为了将主机世界中的 EBCDIC 编码数据转换为 ASCII 编码,这在 UNIX 环境中更为适用。该程序简单地从源位置获取数据块,任选执行转换或变换,然后将这些数据块放置到指定的目标位置(另一设备或文件中)。现代版本的 dd 做了改进,使其能够用于从设备(如磁盘和磁带)中进行取证数据采集。

取证 dd 变种

由于原始的 dd 工具并非为取证环境设计,因此缺少某些功能。随后,基于 dd 的工具应运而生,加入了取证所需的功能,如:

• 加密哈希

• 改进的错误处理

• 日志记录

• 性能提升

• 验证检查

• 进度监控(取证影像可能需要数小时)

两个最常用的 dd 工具变种分别是 dcfldd,2002 年由尼古拉斯·哈伯在美国国防部计算机取证实验室(DCFL)创建,以及 dc3dd,2007 年由杰西·科恩布鲁姆在美国国防部网络犯罪中心(DC3)创建。

dcfldd 工具基于 GNU dd,新增了许多功能,如哈希、改进的日志记录和输出文件分割等。尽管自 2006 年以来没有更新,但该工具至今仍在使用。亚历山大·杜劳诺伊创建了一个 dcfldd 的补丁版本,包含了一些 Debian 的 bug 修复,你可以在* github.com/adulau/*找到它。

更新版的 dc3dd 工具作为一个补丁实现,并且更容易跟随 GNU dd 的代码变化。该工具目前仍在维护,并且已做过最近的更新。它包含与 dcfldd 类似的取证功能,并实现了改进的日志记录和错误处理。

dcfldd 和 dc3dd 都源自传统的 dd,并具有相似的功能。尽管这两个工具都不内置支持写入取证格式(如 FTK、Encase、AFF)、压缩或图像加密,但你可以使用命令管道和重定向来完成这些任务。书中全程展示了这两个工具的使用示例。CFTT 的测试报告已经存在,涵盖了 dcfldd 和 dc3dd。

数据恢复工具

有几种数据恢复工具值得一提,因为它们具有强大的错误处理能力和积极的恢复方法。尽管这些工具并非专为取证设计,但在其他取证工具未能从严重损坏的介质中恢复数据时,它们可以派上用场。

GNU ddrescue 和 dd_rescue 名称相似,但它们是不同的工具,独立开发。截至本文撰写时,这两款工具仍在积极开发中,各自具有不同的有用功能。尽管它们的名字中都提到了 dd,但它们都没有使用dd命令的语法。

GNU ddrescue 由 Antonio Diaz Diaz 于 2004 年创建,并且以“gddrescue”的包名在 Debian 中打包。它采用激进和持续的方法来尝试恢复磁盘上的坏区。

dd_rescue 工具由 Kurt Garloff 于 1999 年创建,拥有一个复杂的插件系统,支持压缩、加密、哈希以及其他插件。

其他类似的存储介质恢复工具包括 myrescue 和 safecopy。这些工具中的一些将在第六章和第七章中演示。

取证格式

对于原始镜像的几个问题导致了取证文件格式的创建。当将存储介质作为证据进行成像时,会包含关于调查、调查员、驱动器详细信息、日志/时间戳、加密哈希等的元数据。除了元数据外,通常还需要对获取的镜像进行压缩或加密。专用的取证格式有助于实现这些功能,本文描述了最常见的格式。

取证文件格式有时被称为证据容器。一些研究工作还概述了数字证据袋的概念。^(1) 用于将数据采集到取证格式中的工具将在第六章中演示。

EnCase EWF

Guidance Software,作为最古老的取证软件公司之一,生产其旗舰产品 EnCase 取证软件套件,该套件使用专家证人格式(EWF)。EWF 格式支持元数据、压缩、加密、哈希、拆分文件等功能。一个反向工程的开源库和工具——libewf,由 Joachim Metz 于 2006 年创建,并且支持可以编译进 Sleuth Kit 中。

FTK SMART

AccessData 的 FTK SMART 格式是 EnCase EWF 的直接竞争对手。这是一种专有格式,也包括元数据、压缩、加密、哈希、拆分文件等功能。命令行工具 ftkimager(免费但不是开源的)可以从 AccessData 获得,并将在第六章和第七章中进行演示。

AFF

高级取证格式(AFF)由 Simson Garfinkel 创建,作为一种开放的、同行评审的、公开发布的格式。它包括所有取证格式的预期功能,还包括使用标准 X.509 证书的额外加密和签名功能。AFFlib 软件包包含许多用于转换和管理 AFF 格式的工具。

AFF 版本 3 由* github.com/sshock/AFFLIBv3/单独维护。2009 年,关于 AFF 版本 4 的论文发表了。^(2) 当前的 AFF 版本 4 网站可以在 www.aff4.org/*找到。高级取证格式 4 工作组(AFF4 WG)在 2016 年夏季宣布,并于 DFRWS 会议上举行了第一次会议,地点在西雅图。

SquashFS 作为取证证据容器

在本书中,我将演示一种创建混合法医容器的技巧,该容器结合了简单的原始成像,并允许以类似于更高级法医格式的方式存储支持案件信息。该技巧使用 SquashFS 作为法医证据容器,并配合一个小型 shell 脚本 sfsimage 来管理容器的各个方面。此方法将一个压缩镜像与成像日志、磁盘设备信息以及任何其他信息(如照片、证据链表格等)结合成一个包。文件被包含在只读的 SquashFS 文件系统中,你可以在没有特殊法医工具的情况下访问它们。

SquashFS 背景

SquashFS 是一个高压缩率的只读文件系统,专为 Linux 设计。它由 Phillip Lougher 于 2002 年创建,并于 2009 年合并到 Linux 内核树中,从 2.6.29 版本的内核开始支持。

SquashFS 最初是为可启动 CD 和嵌入式系统设计的,但它有许多特性使其成为法医证据容器的有吸引力选择:

• SquashFS 是一个高压缩率的文件系统。

• 它是只读的;可以添加项目,但不能移除或修改。

• 它存储调查员的 uid/gid 和创建时间戳。

• 它支持非常大的文件大小(理论上可达 16EiB)。

• 它已包含在 Linux 内核中,挂载为只读文件系统非常简单。

• 该文件系统是一个开放标准(Windows、OS X 等平台已有工具支持)。

• mksquashfs 工具使用所有可用的 CPU 来创建容器。

将 SquashFS 作为法医证据容器的使用是使用其他法医格式的实际替代方案,因为它便于管理使用 dd 获取的压缩原始镜像。接下来的 sfsimage 工具提供了你需要的功能来管理 SquashFS 法医证据容器。

SquashFS 法医证据容器

现代 Linux 内核默认支持 SquashFS 文件系统。无需额外的内核模块或重新编译即可挂载和访问 SquashFS 文件系统。然而,要创建文件、附加文件或列出 SquashFS 文件的内容,必须安装 squashfs-tools 包。^(3) 另外,依据你偏好的成像工具,可能还需要额外的法医软件包(如 dcfldd、dc3dd、ewfacquire)。

我的 sfsimage shell 脚本可以在digitalforensics.ch/sfsimage/上找到。运行 sfsimage 而不带任何选项会显示一些帮助文本,描述其用法:

$ sfsimage
Sfsimage: a script to manage forensic evidence containers with squashfs
Version: Sfsimage Version 0.8
Usage:
       sfsimage -i diskimage container.sfs
       sfsimage -a file ... container.sfs
       sfsimage -l container.sfs ...
       sfsimage -m container.sfs ...
       sfsimage -m
       sfsimage -u container.sfs ...
Where:
diskimage is a disk device, regular file, or "-" for stdin
container.sfs is a squashfs forensic evidence container
file is a regular file to be added to a container
and the arguments are as follows:
  -i images a disk into a newly created *.sfs container
  -a adds a file to an existing *.sfs container
  -l lists the contents of an existing *.sfs container
  -m mounts an *.sfs container in the current directory
  -m without options shows all mounted sfs containers
  -u umounts an *.sfs container

要配置 sfsimage,你可以编辑脚本或为脚本创建单独的sfsimage.conf文件。config文件包含了注释和示例,允许你定义以下参数:

• 优选的成像/采集命令(dddcfldddc3dd 等)

• 查询设备的优选命令(hdparmtableu-parm 等)

• 默认目录用于挂载证据容器(当前工作目录是默认的)

• 如何管理特权命令(sudosu等)

• 创建文件的权限和 uid/gid

sfsimage 脚本使用**.sfs*作为 SquashFS 取证证据容器的命名约定。脚本附带了 sfsimage(1)手册页,提供了更多详细信息。

要将磁盘镜像到 SquashFS 取证证据容器中,请使用-i标志、磁盘设备和证据容器名称运行 sfsimage 命令。将创建一个包含图像和设备初步元数据的证据容器。在此示例中,sfsimage 已配置为使用 dc3dd 作为成像工具:

$ sfsimage -i /dev/sde kingston.sfs
Started: 2016-05-14T20:44:12
Sfsimage version: Sfsimage Version 0.8
Sfsimage command: /usr/bin/sfsimage -i /dev/sde
Current working directory: /home/holmes
Forensic evidence source: if=/dev/sde
Destination squashfs container: kingston.sfs
Image filename inside container: image.raw
Acquisition command: sudo dc3dd if=/dev/sde log=errorlog.txt hlog=hashlog.txt
    hash=md5 2>/dev/null | pv -s 7918845952
7.38GiB 0:01:19 [95.4MiB/s] [========================================>] 100%
Completed: 2016-05-14T20:45:31

在这里,创建了一个 SquashFS 容器,并在其中生成了一个常规的原始镜像。还可以创建其他日志和信息,或者单独添加。

你可以使用带有-a标志的 sfsimage 命令将额外的证据添加到容器中。例如,如果你需要将物理磁盘的照片添加到先前创建的取证证据容器中,可以使用以下命令完成此任务:

$ sfsimage -a photo.jpg kingston.sfs
Appending to existing 4.0 filesystem on kingston.sfs, block size 131072

要列出 SquashFS 取证证据容器的内容,请使用-l标志运行 sfsimage 脚本,如下所示:

$ sfsimage -l kingston.sfs
Contents of kingston.sfs:
drwxrwxrwx holmes/holmes        135 2016-05-14 20:46 squashfs-root
-r--r--r-- holmes/holmes        548 2016-05-14 20:45 squashfs-root/errorlog.txt
-r--r--r-- holmes/holmes        307 2016-05-14 20:45 squashfs-root/hashlog.txt
-r--r--r-- holmes/holmes 7918845952 2016-05-14 20:44 squashfs-root/image.raw
-rw-r----- holmes/holmes     366592 2016-05-14 20:45 squashfs-root/photo.jpg
-r--r--r-- holmes/holmes        431 2016-05-14 20:45 squashfs-root/sfsimagelog.txt

此命令输出显示了**.sfs容器的内容(未挂载)。还显示了文件创建或添加的正确时间。错误日志、哈希日志和 sfsimage 日志包含有关活动和错误的文档。photo.jpg*是随后添加到容器中的照片。

通过挂载**.sfs*文件,你可以访问在 SquashFS 容器中的获取的镜像和附加的元数据文件。内容变得像文件系统中的常规部分一样可访问。因为 SquashFS 文件系统是只读的,所以内容不会被修改。

在以下示例中,**.sfs*文件使用-m标志挂载,并且使用常规取证工具(此示例中的 sleuthkit mmls)对获取的镜像进行操作:

$ sfsimage -m kingston.sfs
kingston.sfs.d mount created
$ mmls kingston.sfs.d/image.raw
DOS Partition Table
Offset Sector: 0
Units are in 512-byte sectors

      Slot      Start        End          Length       Description
000:  Meta      0000000000   0000000000   0000000001   Primary Table (#0)
001:  -------   0000000000   0000002047   0000002048   Unallocated
002:  000:000   0000002048   0015466495   0015464448   Linux (0x83)

注意,挂载的.sfs*容器(默认情况下)会显示为.sfs.d*目录。挂载后,你可以使用常规操作系统工具或取证工具访问目录中的文件,甚至可以通过网络将文件作为共享驱动器导出。

当**.sfs.d*挂载不再需要时,使用-u标志卸载,如下所示:

$ sfsimage -u kingston.sfs.d
kingston.sfs.d unmounted

在没有挂载点的情况下运行sfsimage -m将列出所有挂载的 SquashFS 容器。你也可以在单个系统上挂载多个容器。

磁盘镜像文件的大小在取证环境中一直是一个难题。较大的磁盘大小会带来空间问题和后勤障碍。像 SquashFS 这样的实用压缩方法有助于解决这个问题。为了说明使用压缩文件系统的实用性,sfsimage 被用来对一个 8TB 的目标磁盘(bonkers)进行镜像,该磁盘位于一个只有 2TB 硬盘空间的调查员系统上。整个获取过程花费了超过 16 小时,最终生成的压缩 SquashFS 文件仅为 1TB。挂载的 SquashFS 文件提供对整个 8TB 的访问,作为一个原始镜像文件。该镜像文件在运行时进行压缩,不需要任何临时文件。.sfs文件和镜像文件的大小如下所示:

$ ls -l bonkers.sfs bonkers.sfs.d/bonkers.raw
-rw-r----- 1 holmes root 1042820382720 Jun 28 13:06 bonkers.sfs
-r--r--r-- 1 root root 8001562156544 Jun 27 20:19 bonkers.sfs.d/bonkers.raw

使用 SquashFS 是一种实用且有效的解决方案,可以以压缩的方式使用原始文件,并提供了另一种取证证据容器的选择。

结束语

本章介绍了各种取证镜像格式。我提供了关于不同工具的简要概述和历史,这些工具可以用来取证性地获取硬盘。你还了解了 SquashFS 文件系统以及用于创建和管理 SquashFS 取证证据容器的 sfsimage 脚本。本章中介绍的工具和格式将在本书其余部分的示例中使用。

第五章:计划与准备

image

本章描述了在对磁盘或存储介质进行成像之前的准备步骤。这些步骤包括设置调查员活动的审计跟踪、保存报告输出以及决定命名规范。此外,我还描述了与法医采集存储介质相关的各种后勤挑战,以及如何建立一个受保护的写阻环境。

法医准备的主题与本章中的某些部分有所重叠。然而,法医准备是一个更广泛的话题,包括一般的规划、预算、实验室基础设施、员工培训、硬件和软件采购等。如果将前述需求视为“宏观”法医准备,可以将本章中的信息视为“微观”法医准备。焦点较窄,涵盖了设置法医检查员工作站环境、分析磁盘或存储介质所需的工具和各项任务。

值得注意的是,私人部门组织(例如企业法医实验室)的法医准备与某些公共部门组织(如执法机关)的法医准备有所不同。私人部门组织,尤其是大型企业 IT 环境,可以决定其 IT 基础设施的构建和运行方式。可以将法医准备嵌入到这种受控的 IT 基础设施中,在调查或事件发生时为法医检查员提供优势。本章重点讨论的是私人和公共部门共有的法医准备任务。

保持审计跟踪

审计跟踪或日志维护了操作、事件和任务的历史记录。它可以有不同的详细程度,并可以是手动的或自动的。本节介绍了几种手动跟踪任务的命令行方法以及自动记录命令行活动的方式。

任务管理

在法医检查过程中,保持一个高层次的待办和已完成活动日志是很有益的。待办任务会转变为已完成任务,而已完成的任务构成了检查的历史记录。在工作过程中,你常常会想到一些未来需要处理的任务,或者已经完成并应记录的任务。随着检查时间的延长(可能需要很多小时、天数甚至更长时间)或涉及多名检查员时,快速记录和更全面的任务清单变得愈加重要。

在考试过程中,维护待办任务和已完成任务的列表对于多种原因都很重要:

• 有助于确保没有遗漏任何事情

• 避免重复已完成的工作

• 提高团队协作和协调性

• 展示符合政策和程序的情况

• 便于账务处理,包括计费

• 帮助生成文档和报告(正式的事件报告或取证报告)

• 允许事后审查,以识别经验教训并支持过程优化

• 帮助维护已完成活动的长期历史记录

• 支持新团队成员的学习和教育

• 作为记住复杂程序的指南

• 提供故障排除信息并获得支持

• 维护外部和第三方检查员的工作记录

许多商业任务管理器和调查管理工具可供使用,但本节重点介绍可以通过命令行完成的简单任务管理。使用命令行可以快速跟踪任务和活动,而无需离开终端去访问其他图形或基于 Web 的应用程序。

有许多开源命令行任务管理器可供使用,可用于管理取证检查员的活动。最重要的标准包括可靠的任务记录和详细的时间戳(不仅仅是日期)。

Taskwarrior

Taskwarrior 是一款流行的任务管理器,具有许多功能,能够快速高效地管理大量任务列表。你可以在 taskwarrior.org/ 查找更多关于 Taskwarrior 的信息。以下示例展示了 Taskwarrior 命令在取证实验室环境中的实际应用。

添加多个待办任务:

$ task add acquire PC disk and transfer to evidence safe due:friday
Created task 1.
$ task add have a meeting with investigation team to plan analysis
Created task 2.

列出当前任务列表(task info 将显示时间和更详细的信息):

$ task list

ID Due        Age Description
 1 2015-06-05 1m  acquire PC disk and transfer to evidence safe
 2            3s  have a meeting with investigation team to plan analysis

2 tasks

完成任务列表中的任务:

$ task 2 done
Completed task 2 'have a meeting with investigation team to plan analysis'.
Completed 1 task.

记录已完成任务,但不将其放入任务列表:

$ task log requested history of PC use at the firm
Logged task.

Taskwarrior 对于管理大量任务非常有用。它提供报告、搜索、排序和各种自定义细节级别。Taskwarrior 为每个任务维护时间戳和唯一标识符(UUID),管理待办任务的优先级,并保持已完成任务的历史记录。创建用户定义属性的能力使其可定制,适用于特定的设置,例如取证实验室或检查过程。

Todo.txt

你还可以通过编辑简单的文本文件来维护已完成的任务和待办事项列表。一个例子是 Gina Trapani 提出的 todo.txt 文件格式(更多信息请见 todotxt.com/)。todo.txt 系统定义了一个任务创建和完成日期、优先级、项目和上下文的文件格式。它还提供了一个 Shell 脚本来管理 todo.txt 文件。虽然 todo.sh 脚本执行了所有必要的操作来管理 todo.txt 任务列表,但文件格式可以通过常规文本编辑器进行管理。符号表示优先级((A)(B) 等)、上下文关键字以 @ 表示、项目关键字以 + 表示。已完成的任务前缀为 x。以下是一个 todo.txt 文件示例:

(A) Sign chain of custody forms @reception
(B) Start forensic acquisition +Disk_A @imagingstation
Discuss analysis approach with investigation team @meetingroom
x 2015-05-30 08:45 upgrade ram in imaging PC @imagingstation

todo.txt 应用程序不使用时间戳,仅使用日期。如果你使用这个系统,必须手动为已完成的任务添加时间。

Shell Alias

您还可以在不使用任务管理软件的情况下维护一个检查员活动日志,记录已完成的任务。例如,以下是一个简单的 shell 别名,它将简短描述重定向到带有时间戳的文件中:

$ alias log="echo $2 \`date +%FT%R\` >> ~/examiner.log"

您可以根据需要自定义日志文件名和日期格式。快速记录活动或查看过去的活动只需要一条简单的命令,您可以在检查过程中随时输入。当发生重要或值得注意的事情时,输入log,后面跟上对所采取行动的简短描述。例如:

$ log removed hdd from PC and attached to examiner machine
...
$ log started forensic acquisition of the disk
...
$ log acquisition completed, disk sealed in evidence bag
...
$ cat ~/examiner.log
2015-05-30T09:14 informed that seized PC was enroute to forensic lab
2015-05-30T10:25 PC arrived, chain of custody forms signed
2015-05-30T10:47 removed hdd from PC and attached to examiner machine
2015-05-30T10:55 started forensic acquisition of the disk
2015-05-30T15:17 acquisition completed, disk sealed in evidence bag
2015-05-30T16:09 disk transferred to evidence safe for storage

用于管理任务的简单系统对大部分时间在命令行上工作的工作人员非常有用。它们对于通过安全外壳(ssh)远程工作时也很有优势。

Shell 历史

本节讨论如何设置自动记录检查员在命令行上输入的 shell 命令。理想情况下,这种命令日志记录不应增加复杂性或干扰正在进行的取证工作。通过使用各种工具,您可以通过自动化后台进程记录检查员的命令行活动。这种方法在取证调查过程中对检查员完全透明。

Unix/Linux shell 最初并没有考虑日志记录或审计追踪。在过去,曾经创建过补丁来增强历史机制,黑客也尝试在 shell 使用时捕获命令,而商业产品则进行了各种企业级日志记录。开发一个强大的审计和合规系统来记录所有命令的时间戳,包括 shell 内建命令以及执行的程序和管道,超出了本书的范围。

可以配置 Bash shell 历史以满足以下基本要求:

• 记录检查员输入的命令

• 为每个输入的命令记录时间戳

• 记录所有命令,包括重复命令、注释和空格前缀的命令

• 避免截断或覆盖历史文件

• 在同一系统上使用多个终端窗口时避免冲突

• 包括 root 和非 root 命令历史

使用基本的 Bash shell 历史作为审计追踪是初级的。重要信息,如命令完成时间、命令执行的工作目录和返回码,并没有被记录。Bash 历史也不是一个防篡改的系统:检查员可以轻松修改或删除历史记录。创建一个安全且防篡改的审计环境并限制访问超出了本书的范围。

一些 shell,如 zsh,具有额外的历史记录功能,允许记录经过的时间。其他改进 shell 日志记录的提议解决方案包括使用 PS1PROMPT_COMMANDtrapDEBUG,以及 key 绑定来在执行命令之前修改它。使用 sudo 日志记录;auditd 日志记录;或特殊脚本,如 preexec.sh,也可以增加命令行日志记录。一个有用的教程 www.pointsoftware.ch/en/howto-bash-audit-command-logger/ 详细讨论了这个问题并提出了解决方案。命令行审计跟踪应根据特定的实验室政策或期望进行定制。

对于基本的 shell 命令日志记录,可以配置内置的 shell 历史记录功能来记录命令行活动。Bash 提供了一些有用的功能,包括启用命令输入时间戳的功能。你可以将以下命令添加到 Linux 启动脚本(如 .bashrc 等)中,以启用之前列表中概述的基本要求:

set -o history
shopt -s histappend
export HISTCONTROL=
export HISTIGNORE=
export HISTFILE=~/.bash_history
export HISTFILESIZE=-1
export HISTSIZE=-1
export HISTTIMEFORMAT="%F-%R "

这些命令确保历史记录已启用并处于附加模式(而不是在每次新登录时覆盖)。两个变量 HISTCONTROLHISTIGNORE 控制哪些命令会保存到历史文件中。一个常见的默认设置是忽略重复的命令和以空格开头的命令。为了确保完整记录所有命令,HISTCONTROLHISTIGNORE 变量明确设置为 null。HISTFILE 变量明确设置,确保 shell 退出时内存中的命令历史被保存。HISTFILESIZEHISTSIZE 设置为 -1,以确保历史记录不会被截断或覆盖。HISTTIMEFORMAT 变量启用将时间戳写入历史文件,并允许你设置时间格式。该格式可以包括地区设置,并应包括时间戳,而不仅仅是日期。

在考试结束时,历史记录可以保存到文本文件中,并包含在考试的支持数据文件中。然后可以通过以下命令重置历史记录并为下次考试做好准备:

$ history > examiner_bash_history.txt
$ history -c; history -w

在多个 shell 实例之间同步历史记录可能比较棘手,因为每个 shell 都将历史记录保存在内存中,并仅在退出时将其写入历史文件。设置变量 PROMPT_COMMAND='history -a; history -r' 将在每次显示命令提示符时,向 Bash 历史文件写入(附加)并读取新命令。

一个正在积极开发的命令日志记录器是 Snoopy:它提供了许多功能,包括将命令记录到 syslog。Snoopy 是一个预加载的库,作为 execv()execve() 系统调用的包装器。它对用户是透明的,你可以通过将 Snoopy 库添加到 /etc/ld.so.preload 并编辑 /etc/snoopy.ini 文件来启用和配置它。例如,假设在 Bash 命令提示符中输入以下一系列命令:

# fls -p -r /dev/sda1 | grep -i "\.doc$" |wc -l
10

这些命令会单独记录到 syslog 中,并附带各种细节:

Jun  5 10:47:05 lab-pc snoopy[1521]: [uid:0 sid:1256 tty:(none) cwd:/ filename:
    /bin/grep]: grep -i \.doc$
Jun  5 10:47:05 lab-pc snoopy[1522]: [uid:0 sid:1256 tty:(none) cwd:/ filename:
    /usr/bin/wc]: wc -l
Jun  5 10:47:05 lab-pc snoopy[1520]: [uid:0 sid:1256 tty:/dev/pts/0 cwd:/ filename:
    /usr/bin/fls]: fls -p -r /dev/sda1

你可以在 github.com/a2o/snoopy/ 找到更多信息和 Snoopy 的最新版本。

终端记录器

在某些情况下,展示终端中的工作过程可能很有用,包括命令输出(stdout)、错误信息(stderr)以及终端会话中可见的其他消息或活动。有多个工具可以捕获会话活动,甚至提供会话回放功能。

最著名的工具是script。在这个示例中,script启动后将输出追加到文件中,并附上用于回放的时间数据。在运行script之后,你可以执行任何正常的 shell 命令,它们将被保存以供后续查看。

$ script -a -tscript.timing script.output
Script started, file is script.output

当录制的会话结束时,输入exit或按 CTRL-D。你可以使用scriptreplay命令查看录制的内容,如下所示:

$ scriptreplay -m1 -tscript.timing script.output
...[session plays back here]...

使这种方法具有挑战性的一些常见问题是处理控制字符和诸如终端调整大小等事件。其他 TTY 记录器和嗅探器,如 ttyrec 和 termrec,也提供类似的功能和特性。

终端复用器,如 tmux 和 GNU screen,也提供一些级别的日志记录,这在某些情况下可能非常有用。使用 screen 时,你可以为分离会话设置日志记录(CTRL-A,然后按 H)。tmux 终端复用器现在通过使用pipe-pane选项支持日志记录,如下所示:

$ tmux pipe-pane -o -t session_index:window_index.pane_index 'cat >> ~/output
    .window_index-pane_index.txt'

Linux 审计

专业实验室可能希望实施更为强大的日志记录或审计追踪,以满足更严格的组织政策或监管要求。一种实现方法是通过auditd,这是一个 Linux 审计包。通常,这涉及运行auditd守护进程,并将pam_tty_audit.so配置为 pam 模块。你可以使用aureport命令查看审计追踪活动。

使用auditd提供了几个安全优势,尤其是在与精细化访问控制(如sudo)一起使用时。审计追踪,特别是那些记录到中央日志主机的追踪,可以变得相对不易篡改,从而确保在记录检查工作时增加完整性。

综合审计追踪可以记录所有 TTY 活动(包括按键),还可以监控文件访问以及系统上的许多其他事件。设置审计和审计报告可能是一个复杂的过程,超出了本书的范围。

你会在各种地方找到有关其他解决方案和黑客技巧的讨论,包括 www.pointsoftware.ch/en/howto-bash-audit-command-logger/whmcr.com/2011/10/14/auditd-logging-all-commands/

从 Bash 4.1 版本开始,新增了将命令历史记录日志写入 syslog 的功能(可能需要重新编译才能启用)。

整理收集到的证据和命令输出

在命令行进行法医检查时,通常会将各种工具和实用程序的命令输出保存到文件中,以供以后参考和报告。你可以通过将命令的输出重定向到文本文件来实现这一点。这些文件可以与收集到的其余检查数据一起保存。在收集和保存大量证据数据的过程中,保持文件和目录结构的组织性和可理解性非常重要。本节讨论了实现这一目标的各种策略。

文件和目录的命名规范

为了减少在检查过程中收集到的所有文件、目录、挂载点、图像和其他保存数据之间的混淆,最好遵循命名规范。命名应具有足够的描述性,以便直观理解,但避免冗余的措辞和文件扩展名。最重要的是,命名规范应该在整个调查或事件中保持一致,并且在多个事件之间保持一致。

某些独特的标识符与系统、存储介质设备和可移动媒体相关联。这些标识符在决定命名规范时可能非常有用:

• 个人计算机的公司资产标签或库存编号

• 磁盘驱动器的制造商序列号

• 磁盘驱动器的 64 位全球唯一名称(WWN)

• 文件系统和 RAID 的块设备 UUID

• 磁盘驱动器图像的法医哈希值

• 网络接口卡(NIC)的 48 位 MAC 地址

• 法医实验室证据编号(可能是磁盘上的贴纸或标签)

• 法医实验室证据袋编号(包含磁盘的证据袋)

在合理的情况下,所有编号应从 1 开始,而非 0。程序员和工程师通常习惯从 0 开始,但阅读和审查检查报告的人可能没有技术背景(如律师、法官、经理等),他们通常期望编号从 1 开始。

原始图像文件在本书中使用.raw扩展名。常用的.dd扩展名意味着使用了 dd 工具,但实际情况可能并非如此。.raw扩展名准确描述了文件的性质,而不与特定工具关联。

理想情况下,原始图像的文件名应将法医图像与物理对象的唯一属性联系起来。如果使用法医格式,这些唯一的信息可以作为元数据嵌入到法医图像文件中。这使你能够将单一的物理磁盘与图像关联,并将单一的图像与物理磁盘关联。这样,磁盘和图像就可以在没有对周围上下文(如目录名称、证据架等)的依赖下保持关联。这建立了物理世界和数字世界之间的证据链。

如果有大量磁盘正在分析,可能在镜像文件名中包括序列号。你可以在文件名中包含不同级别的细节。尽管文件名 server12-slot3-seagate-3.5in-disk-500gb -SN12345ACBDEE.raw 非常具有描述性,但它可能过于详细且不便于处理。对于许多基本事件,一个实用的命名规范可以仅仅使用存储介质类型加上一个数字,例如 disk1tape1ssd1stick1card1cdrom1dvd1bluray1floppy1 等。在某些情况下,使用磁盘的简短描述和序列号可能是最合适的方式,例如 crucial-ssd-15030E69A241.raw。通常,创建易于在对话中讨论的镜像名称很有帮助,例如,“我们在 disk1 上找到了文件。”对话中使用的术语、原始检查输出和最终报告应具有一致的命名法。

当你从磁盘镜像、归档文件或其他复合镜像中提取文件时,在文件名中添加一个下划线,表示文件已被提取。这样可以防止你或其他人在不小心打开恶意软件、带有跟踪漏洞的 HTML 页面、Office 文档中的宏,或其他可能在打开时执行的可执行文件和脚本时遭遇问题。以下是一些示例:

$ icat image.raw 68 > photo.jpg_
$ icat image.raw 34 > customerlist.xls_
$ icat image.raw 267 > super-updater57.exe_

如果提取的文件已经以下划线结尾,请再添加一个下划线。附加的下划线可以清楚地表明该文件已作为证据从嫌疑驱动器中提取。

当你分析提取的文件、保存工具输出或做手动笔记时,创建一个文本文件,使用原始文件名并在其后附加 _.txt。例如:

$ exif photo.jpg_ > photo.jpg_.txt
$ vi customerlist.xls_.txt
$ objdump -x super-updater57.exe_ > super-updater57.exe_.txt

_.txt 扩展名表示文本文件包含关于提取文件的笔记、工具输出和取证分析结果。文件名与原始从镜像中提取的文件相关联。文本文件可能包含书签和检查员注释,可以进行搜索。除非清楚地知道提取文件的来源(例如,哪个磁盘、分区等),否则最好有这样的相应文本文件;它们还可以指示为何选择该文件进行提取。

文件扩展名应始终指示内容的格式。例如:

• *.txt 可以使用文本编辑器打开并阅读。

• *.raw 是一个原始数据转储(磁盘、内存等)。

• *.pcap 是捕获的网络流量。

• *.db 是一个数据库(可能是 Sleuth Kit 文件列表)。

• *.sfs 是一个 SquashFS 证据容器。

• *.e01 和 *.aff 是取证格式。

每个案件、事件或调查都会有一个相关的物理存储介质。存储介质将有相应的法医镜像和来自各种程序的关联输出(如 hdparm、smartctl 等)。每个法医镜像将有来自各种程序的关联输出(如 mmls、fls 等),每个提取的文件可能会有来自各种程序的关联输出(如 exif、objdump 等)。命名约定有助于保持一切井井有条,并随着调查数据的增长,使组织系统能够扩展。

应该在文件名和目录名中嵌入多少信息?什么时候更合理地使用一个包含额外信息的描述文本文件?如何将相应的文件与图像关联?请考虑以下两个表示相同事件的示例。

一个将信息嵌入文件名中的示例如下所示:

case42.txt
image6.case42.raw
image6.case42.raw.txt
mmls.image6.case42.txt
fls.part1.image6.case42.txt

将相同信息嵌入到目录结构中的示例如下所示:

./case42/case.txt
./case42/image6/image.raw
./case42/image6/image.raw.txt
./case42/image6/mmls.txt
./case42/image6/part1/fls.txt

对于手动书写的笔记、进一步的描述、警告、问题以及其他在特定上下文中的随意评论,将这些信息存储在工作目录中的简单notes.txtreadme.txt文件中可能是有用的。它们可以为你或其他检查员提供提醒、提示或警告,以供日后阅读。

当你记录可能存在风险的网页网址时,替换httphxxp,以防止其他人意外点击它们。这些链接可能会将用户带到恶意软件、嫌疑人监控的个人网站、带有跟踪代码的网站,或其他在不了解后果的情况下不应访问的内容。

可扩展的检查目录结构

每个事件、案件或调查应该有一个唯一的目录(例如,case42)。所有收集到的证据、图像和分析工作应该包含在该根目录下的一个层次结构中。随着调查的规模扩大,一个良好规划的目录结构可以随之扩展。当多个法医检查员在同一事件上工作并共享目录结构时,拥有一个单一的目录也很实用。如果事件变得更加复杂,准备好重新组织目录结构。如果需要为单独分析提取大量文件,考虑创建一个export目录(类似于 EnCase)。

考试常常会扩大规模,一次从单个可疑磁盘开始的法医检查可能会扩展为涉及多个 PC 和许多磁盘的大规模检查。例如,假设有人报告某台 PC 或员工的行为异常或可疑。一个磁盘被扣押进行检查。初步检查结果发现还涉及一个 USB 闪存驱动器。该设备被发现并检查,随后发现第二台 PC 与事件相关联。该 PC 有两块内部硬盘和 DVD 刻录机。进一步搜索发现,一盒充满数据的 DVD 被藏在一个衣橱里。随后发现,另一个建筑里的外部 USB 硬盘和备用笔记本电脑也与此事件相关。收集的证据从一个硬盘增加到 16 个存储介质。这种假设的事件在大型组织中并不罕见。在准备检查时,应预期扩大检查范围。命名约定应设计得足够灵活,以适应调查规模的扩展。

一些 PC 由多人使用,有些人使用多台 PC。笔记本电脑不一定绑定于某个固定位置。可移动存储介质可以共享并连接到多台 PC 和笔记本电脑。随着时间的推移,PC 硬件会发生变化,办公室可能会变动,部门会有员工流动,组织重组也可能发生。务必设计文件和目录名称,以适应这些变化。

随着检查的进行,输出文件的数量将增加,因为更多的收集数据被分析并生成输出。一个好的做法是创建一个目录结构来区分文件并组织检查的输出。与文件名一样,目录名应指示内容,同时避免泄露机密信息。为每个分析的磁盘或镜像创建单独的目录可以隔离文件,并使调查过程得以扩展。

最小的检查通常由一个磁盘组成。稍大的检查可能由一个包含多个磁盘的 PC 组成;考虑以下示例目录结构:

image

另一个例子,考虑检查一个完整的工作场所,该工作场所包含一台桌面 PC(可能有多个磁盘)、一台笔记本、几个 USB 驱动器、多个 CD-ROM 和 DVD,以及一个外部磁盘包。一个便捷的目录结构将每个存储介质组织起来,其中存储了命令输出文件,从而使检查可以轻松扩展。再考虑一个更大的调查,涉及多个工作场所,分布在多个办公楼,跨越多个国家。在大型全球组织中,这种调查是可能发生的;因此,拥有一个经过深思熟虑的命名约定将有助于保持检查过程的有序进行。

依赖目录结构将不同磁盘、PC、用户和位置的命令输出分开是很有利的。这样,您就不必将这些信息嵌入输出文件名中。例如:

image

在这个例子中,两个办公室位置分别是美国的 US123 和英国的 UK567。美国办公室按用户工作区进行划分,每个正在检查的存储介质都有一个目录。而英国办公室的 PC 并未与任何特定用户关联(可能位于会议室),这在目录结构中有所体现。

在目录结构中,不必使用员工标识符来标识存储介质,而可以使用组织的 IT 库存编号。这个唯一标识符通常会有额外的信息与之关联(如购买日期、部门、办公室位置、用户详细信息、安装的软件、使用历史等)。出于保密原因,可能需要从文件名和目录结构中省略某些信息。例如,疑似或目标人物的名字不应嵌入文件名中。相反,您应使用标识符、首字母缩写或员工编号。调查的代号也可以使用。这样可以提供最低限度的保护,以防信息丢失、被盗或在之后被访问。

保存命令输出并进行重定向

在创建用于存储各种检查项分析结果的目录结构后,典型的 Shell 命令输出将像这样从 stdout 重定向到文件:

# fls /dev/sda1 > fls-part1.txt
# fls /dev/sda2 > fls-part2.txt

若要包含常规输出和错误消息,您需要将 stdout 和 stderr 文件描述符重定向到文件。Bash 的较新版本通过在重定向中添加一个和符号提供了一种易于记忆的方法(这在管道到另一个程序时也适用):

# fls /dev/sda &> fls-part1.txt

其他 Shell 和较早的 Bash 版本可能需要使用2>&1符号来合并 stderr 和 stdin。例如:

# fls /dev/sda > fls-part1.txt 2>&1

当一个文本文件已经存在,并且您需要向其中添加额外的信息时,您可以使用>>符号指定附加操作。例如:

# grep clientnames.xls fls-part1.txt >> notes.txt

在这里,所有已知文件名的实例都会被添加到notes.txt文件的末尾。^(1) 如果notes.txt文件不存在,将会被创建。

许多在命令行上执行的法医任务是耗时的,可能需要几个小时才能完成(例如磁盘映像、对非常大的文件执行操作等)。显示命令执行持续时间的时间戳会很有用。time命令提供了这一功能。time命令有两种常见实现:一种是 shell 内建的,功能简单;另一种是 GNU 工具,功能更强大。shell 内建的 time 版本的主要优点是它会计时整个命令管道,而 GNU time 只会计时管道中的第一个命令。

这是使用time命令运行磁盘映像程序的一个示例:

# time dcfldd if=/dev/sdc of=./ssd-image.raw
3907328 blocks (122104Mb) written.
3907338+1 records in
3907338+1 records out

real    28m5.176s
user    0m11.652s
sys     2m23.652s

zsh shell 可以将命令执行的经过时间记录为历史文件的一部分。当前在 Bash 中并没有这个功能。

另一个在某些情况下有用的命令是时间戳输出命令ts。任何传递到ts的输出都将在每行输出中附加时间戳。

# (ls -l image.raw; cp -v image.raw /exam/image.raw; md5sum /exam/image.raw) |ts
May 15 07:45:28 -rw-r----- 1 root root 7918845952 May 15 07:40 image.raw
May 15 07:45:40 'image.raw' -> '/exam/image.raw'
May 15 07:45:53 4f12fa07601d02e7ae78c2d687403c7c  /exam/image.raw

在这个示例中,执行了三个命令(用括号分组)并将命令输出发送到ts,从而创建了时间轴。

评估采集基础设施的后勤需求

在执行存储介质的法医采集时,后勤问题非常重要。管理大型的法医映像文件并不是一项简单的任务,因此需要提前进行规划和思考。需要考虑磁盘容量、时间持续性、性能和环境因素等问题。

映像大小和磁盘空间需求

存储介质的法医映像比 PC 通常处理的小文件要大几个数量级。管理这种大小的磁盘映像文件需要额外的思考和计划。你还需要考虑准备检查系统时的一些后勤因素。仔细的准备和规划将为你节省时间和精力,同时帮助你避免可能破坏过程的问题。

在创建磁盘的法医映像时(数百 GB 或 TB 级别),复制的不是文件,而是单个磁盘扇区。如果一块 1TB 的磁盘上只有一个 20K 的 Microsoft Word 文档,那么即使未压缩,法医映像的大小仍将是 1TB。截止到本文撰写时,10TB 的磁盘已经上市,这使得执行法医采集的挑战增加。

在管理磁盘映像时,检查者的时间和检查主机的磁盘容量是需要考虑的主要后勤因素。在开始对目标磁盘或存储介质进行法医采集之前,你需要提出一系列问题:

• 附加存储是否可以原地分析,而不需要创建法医映像?

• 目标磁盘的大小是多少?

• 检查者机器上可用的空间是多少?

• 图像压缩的潜力如何?

• 法医工具在处理和临时文件时需要多大的空间?

• 估计需要提取多少文件以供进一步分析?

• 检查员主机上有多少内存和交换空间可用?

• 是否有可能向同一案件或事件中添加更多目标磁盘?

• 是否有期望单独提取所有空闲或未分配的磁盘空间?

• 是否有计划提取单独的分区(可能包括交换分区)?

• 是否有可能将一种取证格式转换为另一种格式?

• 是否需要为将磁盘镜像准备转移到另一个位置?

• 目标磁盘是否包含虚拟机镜像,需要单独提取和分析?

• 目标磁盘是否包含大量的压缩文件和归档文件?

• 目标磁盘是否使用全盘加密?

• 是否需要将镜像刻录到另一个磁盘或 DVD 以用于存储或运输?

• 是否需要从损坏或部分覆盖的文件系统中恢复文件?

• 检查主机的备份是如何执行的?

在某些情况下,可能不需要对磁盘进行镜像。当进行某些初步筛查或快速搜索时,将磁盘连接到检查主机并操作实时的目标磁盘可能就足够了。根据筛查或搜索的结果,你可以决定是否进行取证镜像。在企业环境中,这种方法可能意味着员工的停机时间,因为他们必须等待被扣押的磁盘被审查或分析。企业环境通常有标准的终端用户 PC 配置,设计时不包含本地用户数据(所有数据都保存在服务器或云端)。简单地用新磁盘替换原磁盘可能是更经济的选择,尤其是在考虑到员工停机时间和现场镜像磁盘所需的时间成本时。

文件压缩

使用压缩解决了取证检查员面临的许多容量挑战。你可以使用压缩的取证格式来存储获得的镜像,但其有效性取决于多个因素。

你选择的压缩算法将对压缩目标磁盘所需的大小和时间产生一定影响。较好的压缩比会需要更多的时间来压缩(以及随后的解压缩)。

一个相对较新的 PC 磁盘,如果包含大量未触及的磁盘扇区(原厂清零内容),会比一个包含大量残留数据(未分配扇区中的数据)的旧磁盘压缩效果更好。

包含大量压缩文件(.mp3.avi等)的磁盘将不会进一步压缩,因此,取证镜像工具将从额外的压缩中受益较少。

加密的目标磁盘或包含大量加密文件的磁盘由于数据的熵值较高,其压缩效果不如未加密内容。

稀疏文件

稀疏文件值得一提,因为它们有一些优势;然而,在计算磁盘容量时,它们也可能会带来问题。一些文件系统使用元数据来表示文件中一串零,而不是将所有零写入磁盘。稀疏文件包含“空洞”,其中已知存在一串零。举例来说,一个新磁盘包含大多数为零的扇区,通过 GNU dd 获取,^(2) 首先作为常规原始文件,然后作为稀疏文件。

# dd if=/dev/sde of=image.raw
15466496+0 records in
15466496+0 records out
7918845952 bytes (7.9 GB, 7.4 GiB) copied, 112.315 s, 70.5 MB/s

# dd if=/dev/sde of=sparse-image.raw conv=sparse
15466496+0 records in
15466496+0 records out
7918845952 bytes (7.9 GB, 7.4 GiB) copied, 106.622 s, 74.3 MB/s

GNU dd 命令提供了一个 conv=sparse 标志,用于创建稀疏目标文件。在这些 dd 示例中,你可以看到传输的块数对于正常文件和稀疏文件是相同的。在以下输出中,文件大小和 MD5 哈希也完全相同。然而,注意到文件系统中使用的块大小有很大不同(7733252 块与 2600 块):

# ls -ls image.raw sparse-image.raw
7733252 -rw-r----- 1 root root 7918845952 May 15 08:28 image.raw
   2600 -rw-r----- 1 root root 7918845952 May 15 08:30 sparse-image.raw

# md5sum image.raw sparse-image.raw
325383b1b51754def26c2c29bcd049ae  image.raw
325383b1b51754def26c2c29bcd049ae  sparse-image.raw

尽管稀疏文件需要的空间少得多,但仍然报告完整的字节大小作为文件大小。这可能会在计算实际可用磁盘容量时造成混淆。稀疏文件通常用于虚拟机镜像,在提取进行分析时可能成为一个问题。

你也可以使用稀疏文件作为压缩镜像文件的方法,但建议和推荐使用压缩的法医格式或 SquashFS 容器。并非所有程序和工具都能正确处理稀疏文件,而且这些文件在不同文件系统和平台之间移动时可能会变得有问题。一些程序甚至在读取稀疏文件时可能会扩展它们。

报告的文件和镜像大小

报告数据大小是一个重要的概念。当你使用法医工具时,大小可以指字节、磁盘扇区、文件系统块或其他计量单位。字节的表示法可以带上倍数前缀(例如千字节、兆字节、吉字节、太字节等),而倍数可以是 1000 或 1024 的倍数。磁盘扇区可能表示 512 字节或 4096 字节的扇区大小。文件系统块大小取决于文件系统类型和创建时使用的参数。当你在法医环境中记录大小时,务必始终附上描述性单位。

许多 Linux 工具支持 -h 标志以人类可读的形式报告文件大小。例如,你可以使用 ls -lhdf -hdu -h 更轻松地查看文件和分区的大小。下面是一个带有多个文件大小的 ls 输出示例:

# ls -l
total 4
-rw-r----- 1 root root 2621440000 Jan 29 14:44 big.file
-rw-r----- 1 root root  104857600 Jan 29 14:41 medium.file
-rw-r----- 1 root root      51200 Jan 29 14:42 small.file
-rw-r----- 1 root root         56 Jan 29 14:44 tiny.file
# ls -lh
total 4.0K
-rw-r----- 1 root root 2.5G Jan 29 14:44 big.file
-rw-r----- 1 root root 100M Jan 29 14:41 medium.file
-rw-r----- 1 root root  50K Jan 29 14:42 small.file
-rw-r----- 1 root root   56 Jan 29 14:44 tiny.file

第二条命令输出中的大小要更易读和理解。

移动和复制法医镜像

将法医磁盘镜像从一个地方移动或复制到另一个地方需要规划和预见性。不要将镜像文件与典型的终端用户文件看作相同的(尽管从技术上讲它们是相同的)。

采集、复制和移动大型磁盘镜像可能需要许多小时甚至几天,具体取决于源磁盘的大小、速度以及其他性能因素。考虑以下典型文件和磁盘镜像的大小,以及将文件从一个磁盘复制到另一个磁盘所需的平均时间:^(3)

• 5KB 简单 ASCII 文本电子邮件:不到 1 秒

• 5MB 典型 MP3 音乐文件:不到 1 秒

• 650MB CD ISO 镜像:大约 5 秒

• 5–6GB 典型 DVD 或 iTunes 电影下载:大约 1 分钟

• 64GB 典型手机镜像:大约 10 分钟

• 250GB 典型笔记本磁盘镜像:30-40 分钟

• 1TB 典型桌面 PC 镜像:超过 2 小时

• 2TB 典型外部 USB 磁盘镜像:超过 4 小时

• 8TB 内部磁盘镜像:超过 16 小时

一旦复制或移动过程开始,打断它可能会导致数据处于不完整状态,或需要额外的时间恢复到原始状态。复制或移动操作可能会创建临时文件,或导致镜像暂时存在两个副本。

通常,提前仔细考虑复制和移动大数据集,并且一旦开始,避免中断过程。

估算任务完成时间

取证采集过程需要时间完成。在此过程中,人员和其他进程可能会等待。因此,计算并估算各种过程的完成时间非常重要。同时,确定是否需要将估算的完成时间报告给其他方,如管理层、法律团队、执法部门或其他调查人员。管理完成所需时间的期望非常重要。

需要考虑的一些重要问题包括:

• 是否可以在无人值守的情况下让采集过程安全地运行一整晚?

• 采集过程中检查员机器是否无法使用(因性能原因或其他原因)?

• 在获取取证镜像时,是否可以进行其他检查工作?

• 什么时候可以并行完成多个任务?

• 是否有某些任务或过程只能按顺序执行?

• 是否有任务会阻塞其他任务,直到它们完成?

• 工作负载是否可以在多个检查员之间共享、委派或分配?

你可以根据以往的工作和过程来估算采集的完成时间。你应该知道大致的初始设置时间,包括完成文书工作、创建必要的目录结构、记录硬件、将嫌疑驱动器连接到检查主机、决定采集方法等因素。这将为你提供预采集阶段的时间估算。

你可以根据通过系统中最慢组件(瓶颈)传输的数据量(已知)来估算存储介质采集时间。

性能与瓶颈

为了提高取证采集的效率,你可以优化检查主机并评估瓶颈。

性能瓶颈总是存在的;这就是系统中最慢的组件,其他所有组件都必须等待它。在取证环境中,瓶颈应该理想地是目标磁盘。它是证据源,也是唯一一个你不能(或不应该)修改的性能变量。

你可以通过阅读厂商规格、使用各种工具查询系统,或运行各种基准测试和测量测试来评估系统各个组件的性能。

检查各种组件速度的有用工具包括 dmidecode、lshw、hdparm 和 lsusb。这里展示了几个命令行示例。

要检查 CPU 家族和型号、当前和最大速度、核心数和线程数,以及其他标志和特性,请使用以下命令:

# dmidecode -t processor

这是一个查看 CPU 缓存(L1、L2 和 L3)的命令:

# dmidecode -t cache

要查看内存,包括使用的插槽、大小、数据宽度、速度和其他细节,请使用以下命令:

# dmidecode -t memory

这是一个查看 PCI 插槽数量、使用情况、标识和类型的命令:

# dmidecode -t slot

查看存储接口、类型(SATA、NVME、SCSI 等)和速度的命令:

# lshw -class storage

要查看附加磁盘的速度、接口、缓存、转速和其他信息(以设备 /dev/sda 为例),请使用以下命令:

# hdparm -I /dev/sda

要查看外部 USB 接口的速度(以及可能附加的写保护器),请使用以下命令:

# lsusb -v

注意

获取这些信息有许多不同的方法和命令。这里展示的命令仅提供了一种获取所需性能信息的示例。提供一个包含所有可能工具和技术的详尽清单超出了本书的范围。

阅读厂商文档并查询系统将帮助你识别各种组件的速度。为了获得准确的测量,最好使用硬件基准测试和软件性能分析工具。一些基准测试工具包括 mbw(用于内存)和 bonnie++(用于磁盘 I/O)。

操作系统的健康和调整也是一个性能因素。监控检查硬件的日志(syslog、dmesg)可以揭示错误信息、配置错误和其他低效指标。监控检查机器实时状态的性能和负载的工具包括 htop、iostat、vmstat、free 或 nmon。

你还可以通过确保后台运行的进程最小化(包括通过 cron 安排的进程)、调整内核(sysctl -a)、调整检查主机的文件系统(tunefs)以及管理磁盘交换和缓存来优化操作系统。此外,确保检查器操作系统运行在原生硬件上,而不是作为虚拟机。

当你在寻找瓶颈或优化时,帮助你想象数据从目标磁盘流向检查主机的磁盘是有用的。在采集过程中,数据会通过以下硬件接口和组件流动:

• 被检查磁盘的盘片/介质(转速?延迟?)

• 被检查磁盘接口(SATA-X?)

• 写保护器逻辑(增加的延迟?)

• 写保护器检查主机接口(USB3 与 UASP?)

• 被检查主机接口(USB3 与其他设备共享总线?桥接?)

• PCI 总线(PCI Express?速度?)

• CPU/内存和操作系统内核(速度?DMA?数据宽度?)

这些组件将被遍历两次,一次是在被检查磁盘和被检查主机之间,另一次是在主机和被检查磁盘之间,后者用于保存采集的图像。

确保被检查磁盘和 CPU/内存之间的数据流与 CPU/内存和目标磁盘之间的数据流不使用相同的路径。例如,如果一个现场成像系统有一个写保护器和一个外部磁盘用于保存采集的图像,并且它们都连接到本地 USB 端口,它们可能共享一个总线。因此,可用带宽将被两个磁盘共享,从而导致性能不佳。

对于网络性能调优,底层网络的速度成为一个主要因素,性能增强包括使用巨型以太网帧和通过高性能网络接口卡进行 TCP 校验和卸载。评估各种程序何时访问网络以及访问的原因(自动更新、网络备份等)也是有益的。

总结来说,要为你打算执行的采集操作制定一个整体计划或策略。确保已经建立了经过充分测试的流程和基础设施。确保已经进行了正确的容量规划和优化。能够在操作进行时监控活动。

与法医检查主机相关的最常见总线速度(以字节/秒计)列在表 4-1 中以供比较。你可以在en.wikipedia.org/wiki/List_of_device_bit_rates上找到各种接口和总线的比特率的良好参考。

表 4-1: 常见总线/接口速度

总线/接口 速度
内部总线
PCI Express 3.0 x16 15750 MB/s
PCI Express 3.0 x8 7880 MB/s
PCI Express 3.0 x4 3934 MB/s
PCI 64 位/133MHz 1067 MB/s
存储驱动器
SAS4 2400 MB/s
SAS3 1200 MB/s
SATA3 600 MB/s
SATA2 300 MB/s
SATA1 150 MB/s
外部接口
Thunderbolt3 5000 MB/s
Thunderbolt2 2500 MB/s
USB3.1 1250 MB/s
USB3.0 625 MB/s
GB 以太网 125 MB/s
FW800 98 MB/s
USB2 60 MB/s

热量和环境因素

在进行取证磁盘获取时,每个可访问的扇区都被读取,且读取过程持续且不中断,通常会持续几个小时。因此,磁盘的工作温度可能会上升并引发问题。当磁盘过热时,故障风险增加,尤其是对于较旧的磁盘。Google 的研究人员发布了一篇关于硬盘故障的有益论文,地址为 research.google.com/archive/disk_failures.pdf

为了减少读取错误、坏块或硬盘故障的风险,在获取磁盘时监控磁盘温度是值得的。大多数磁盘供应商都会发布其驱动器的正常工作温度,包括最大可接受的工作温度。

你还可以使用多个工具手动查询硬盘的温度。一个简单的工具是hddtemp,它通过查询 SMART 接口来获取硬盘的温度,如下所示:

# hddtemp /dev/sdb
/dev/sdb: SAMSUNG HD160JJ: 46C

hddtemp工具可以作为守护进程运行,并定期记录到 syslog 中,你可以监控它以便检测某些阈值。

要获得有关磁盘温度的更详细输出,并在某些情况下获取温度历史记录,可以使用smartctl工具。以下是一个示例:

# smartctl -x /dev/sdb
...
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAGS    VALUE WORST THRESH FAIL RAW_VALUE
...
190 Airflow_Temperature_Cel -O---K   100   055   000    -    46
194 Temperature_Celsius     -O---K   100   055   000    -    46
...
Current Temperature:                 46 Celsius
Power Cycle Max Temperature:         46 Celsius
Lifetime    Max Temperature:         55 Celsius

SCT Temperature History Version:     2
Temperature Sampling Period:         1 minute
Temperature Logging Interval:        1 minute
Min/Max recommended Temperature:     10/55 Celsius
Min/Max Temperature Limit:            5/60 Celsius
Temperature History Size (Index):    128 (55)

Index    Estimated Time   Temperature Celsius
  56    2015-06-07 19:56    50  *******************************
...
  62    2015-06-07 20:02    55  ************************************
  63    2015-06-07 20:03    55  ************************************
  64    2015-06-07 20:04    51  ********************************
...
  55    2015-06-07 22:03    46  ***************************

如果磁盘在磁盘获取过程中开始过热,请采取措施降低温度。作为一个立即的步骤,可以暂时挂起获取过程,待磁盘降温后再继续。根据你使用的获取方法,这可能只是通过按 CTRL-Z 或输入kill -SIGTSTP后跟进程 ID 来向 Linux 进程发送一个信号。当温度降至可接受水平时,可以从挂起的地方恢复获取过程。

以这种方式挂起和恢复进程不会影响获取过程的取证有效性。进程被挂起时,其操作状态保持完整(当前扇区、目标文件、环境变量等)。通过按 CTRL-Z 在 Shell 中挂起并恢复成像过程的示例如下:

# dcfldd if=/dev/sdb of=./image.raw
39424 blocks (1232Mb) written.^Z
[1]+  Stopped                 dcfldd if=/dev/sdb of=./image.raw
# fg
dcfldd if=/dev/sdb of=./image.raw
53760 blocks (1680Mb) written.
...

这里,执行的dcfldd命令通过按下键盘上的 CTRL-Z 被挂起。通过使用fg命令(前台)可以恢复该进程。也可以使用kill -SIGCONT命令来恢复该进程。有关作业控制和信号的更多信息,请参阅 Bash 文档和 SIGNAL(7)手册页。

使用像 Nagios、Icinga 或其他基础设施监控系统这样的工具,你可以自动化温度监控和报警。这些系统监控各种环境变量,并在接近或超过临界阈值时提供警报。

许多取证实验室在成像时使用散热器或硬盘冷却器,以减少被处理磁盘过热的问题。特别是在进行长时间的获取会话时,建议这样做,尤其是当你使用较旧的硬盘时。

如果你尝试使用某些电源管理技术来降低温度,它们将无太大作用。这些方法通过在一段时间空闲后关闭硬盘来工作;然而,在持续的成像操作过程中,几乎没有空闲时间。

建立法医写保护

数字证据收集的基本组成部分是对存储介质进行法医上可靠的获取。你可以通过确保在将磁盘连接到法医获取主机之前,已经有写保护机制到位,来实现这一部分目标^(4)。

当你将磁盘连接到运行现代操作系统的计算机时,自动化进程显著增加了数据修改的风险(因此也增加了证据销毁的风险)。自动挂载分区、生成缩略图以便在图形文件管理器中显示、为本地搜索数据库建立索引、使用杀毒软件扫描等尝试都会使连接的磁盘面临修改的风险。时间戳可能会被更新,破坏潜在证据。未分配区域中的删除文件可能被覆盖,也会破坏证据。发现的恶意软件或病毒(这正是调查员可能正在寻找的证据)可能会被清除。日志文件系统可能会将队列中的变更写入磁盘。也可能会尝试修复损坏的文件系统或组装/同步 RAID 组件。

除了自动化潜在的证据销毁,人的错误也是另一个显著的风险。人们可能会不小心复制或删除文件;浏览文件系统(并更新最后访问时间戳);或错误选择了设备,从而导致破坏性操作。

写保护器的设计目的是防止存储介质上的数据被修改。要求在法医实验室的标准流程和程序中使用写保护器,展示了应有的谨慎态度。这符合行业最佳实践,用于在数字取证环境中处理存储介质作为证据。写保护器确保了将存储介质以只读方式连接到检查员的工作站。

NIST 计算机取证工具测试(CFTT)提供了写保护器的正式要求。《硬件写保护(HWB)设备规范,第 2.0 版》可以在 www.cftt.nist.gov/hardware_write_block.htm 上找到。该规范标识了以下顶级工具要求:

• HWB 设备不得向受保护的存储设备发送任何修改存储设备数据的命令。

• HWB 设备应返回读取操作请求的数据。

• HWB 设备应无修改地返回请求磁盘访问的重要信息。

• 存储设备向 HWB 设备报告的任何错误条件应报告给主机。

市面上同时有硬件和软件写入阻止器,作为独立硬件、可安装的软件包或可引导的取证 CD。在某些情况下,媒体可能具有内建的只读功能。

硬件写入阻止器

首选的写入阻止方法是使用位于受检磁盘和检查员工作站之间的硬件设备。硬件写入阻止器会拦截发送到磁盘的可能修改数据的驱动命令。下图展示了一个保护 SATA 驱动器的便携式写入阻止设备(由 Guidance Software 提供的 Tableau),见图 4-1。

image

图 4-1:便携式 SATA 写入阻止器

硬件写入阻止器通常具有一个开关或 LED 指示灯,表明写入阻止功能是否在工作。一个多功能写入阻止设备的照片,设计用于直接安装到检查员工作站(由 Guidance Software 提供的 Tableau),见图 4-2。它可以保护 SATA、SAS、IDE、FireWire 和 USB 驱动器。

image

图 4-2:多功能驱动器舱位写入阻止器

写入阻止器可以向采集主机系统提供状态信息。例如,tableau-parm 工具(github.com/ecbftw/tableau-parm/)可以查询 Tableau 硬件写入阻止器的信息。您可以使用这个开源工具来验证通过 Tableau 写入阻止器连接的磁盘的写入阻止状态。例如:

$ sudo tableau-parm /dev/sdg
WARN: Requested 255 bytes but got 152 bytes)
## Bridge Information ##
chan_index: 0x00
chan_type: SATA
writes_permitted: FALSE
declare_write_blocked: TRUE
declare_write_errors: TRUE
bridge_serial: 000ECC550035F055
bridge_vendor: Tableau
bridge_model: T35u-R2
firmware_date: May 23 2014
firmware_time: 09:43:37

## Drive Information ##
drive_vendor: %00%00%00%00%00%00%00%00
drive_model: INTEL SSDSA2CW300G3
drive_serial: CVPR124600ET300EGN
drive_revision: 4PC10302

## Drive HPA/DCO/Security Information ##
security_in_use: FALSE
security_support: TRUE
hpa_in_use: FALSE
hpa_support: TRUE
dco_in_use: FALSE
dco_support: TRUE
drive_capacity: 586072368
hpa_capacity: 586072368
dco_capacity: 586072368

根据 Tableau 的文档,drive_vendor字段对于某些驱动器可能没有任何信息。^(5)

在本书编辑的最后阶段,第一批 PCI Express 写入阻止器出现在市场上。以下示例来自 Tableau。使用 PCI Express 写入阻止器连接 NVME 驱动器时,产生以下 dmesg 输出:

[194238.882053] usb 2-6: new SuperSpeed USB device number 5 using xhci_hcd
[194238.898642] usb 2-6: New USB device found, idVendor=13d7, idProduct=001e
[194238.898650] usb 2-6: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[194238.898654] usb 2-6: Product: T356789u
[194238.898658] usb 2-6: Manufacturer: Tableau
[194238.898662] usb 2-6: SerialNumber: 0xecc3500671076
[194238.899830] usb-storage 2-6:1.0: USB Mass Storage device detected
[194238.901608] scsi host7: usb-storage 2-6:1.0
[194239.902816] scsi 7:0:0:0: Direct-Access     NVMe     INTEL SSDPEDMW40 0174
    PQ: 0 ANSI: 6
[194239.903611] sd 7:0:0:0: Attached scsi generic sg2 type 0
[194240.013810] sd 7:0:0:0: [sdc] 781422768 512-byte logical blocks: (400 GB/
    373 GiB)
[194240.123456] sd 7:0:0:0: [sdc] Write Protect is on
[194240.123466] sd 7:0:0:0: [sdc] Mode Sense: 17 00 80 00
[194240.233497] sd 7:0:0:0: [sdc] Write cache: disabled, read cache: enabled,
    doesn't support DPO or FUA
[194240.454298]  sdc: sdc1
[194240.673411] sd 7:0:0:0: [sdc] Attached SCSI disk

写入阻止器作为一个 USB3 桥接器工作,使得 NVME 驱动器可以作为 SCSI 设备使用。这个特定的写入阻止器支持使用 AHCI 和 NVME 标准的 PCI Express 驱动器。支持的硬件接口包括常规的 PCI Express 插槽(图 4-3)和 M.2(图 4-4)。可以使用标准的从 mini-SAS 到 PCI Express 或 M.2 的适配器来连接 U.2(SFF-8639)NVME 驱动器。支持 NVME 的 PCI 写入阻止器也可以通过 Wiebetech 获得。

基于硬件的写入阻止器的主要优势是其操作系统独立性。它们在采集主机之外独立透明地运行,消除了维护驱动程序或操作系统兼容性的需求。这使得它们在 Linux 采集环境中使用时非常理想。

image

图 4-3:PCI Express 插槽驱动器的写入阻止器底座

image

图 4-4:多功能写入阻止器和 PCI Express M.2 驱动器的底座

特别感谢瑞士的 Arina AG 提供了本书中用于测试目的的写保护设备。

软件写保护器

软件写保护器有着相对有争议的历史。随着现代操作系统的发展,它们变得越来越难以开发和维护。操作系统厂商的系统更新、审查员的配置调整以及额外安装的软件都可能导致禁用、覆盖、绕过或使得软件实现的写保护功能失效。

软件写保护器的实现比较困难。仅仅将磁盘挂载为只读(mount -o ro不能保证磁盘不会被修改。此处的只读属性指的是文件系统,而不是磁盘设备。在各种情况下,内核仍然可能会写入磁盘。软件写保护必须在内核中实现,位于虚拟文件系统层以下,甚至在实现特定驱动接口的其他设备驱动程序(例如 AHCI)以下。Linux 下已经使用了几种低级别的软件写保护方法,但成功的案例有限。

工具如 hdparm 和 blockdev 可以通过设置内核标志将磁盘设置为只读。例如:

# hdparm -r1 /dev/sdk

/dev/sdk:
 setting readonly to 1 (on)
 readonly      =  1 (on)

可以像这样使用 blockdev 设置相同的标志:

# blockdev --setro /dev/sdk

设置内核标志的方法依赖于正确配置 udev,以便在其他进程有机会修改新附加的驱动器之前将其设置为只读。

也有一个内核补丁专门实现了取证写保护功能。你可以在github.com/msuhanov/Linux-write-blocker/上找到更多信息。几种取证启动 CD 使用了 Maxim Suhanov 的写保护内核补丁。以下辅助脚本管理 DEFT Linux 取证启动 CD 上的软件写保护:

% cat /usr/sbin/wrtblk
#!/bin/sh

# Mark a specified block device as read-only
[ $# -eq 1 ] || exit
[ ! -z "$1" ] || exit
bdev="$1"
[ -b "/dev/$bdev" ] || exit
[ ! -z $bdev##loop*$ ] || exit
blockdev --setro "/dev/$bdev" || logger "wrtblk: blockdev --setro /dev/$bdev
    failed!"

# Mark a parent block device as read-only
syspath=$(echo /sys/block/*/"$bdev")
[ "$syspath" = "/sys/block/*/$bdev" ] && exit
dir=$syspath%/*$
parent=$dir##*/$
[ -b "/dev/$parent" ] || exit
blockdev --setro "/dev/$parent" || logger "wrtblk: blockdev --setro /dev/$parent
    failed!"

补丁在内核中实现,并通过辅助脚本来开启(和关闭)。辅助脚本简单地使用blockdev命令将设备标记为只读。

NIST CFTT 已经进行过软件写保护工具测试,相关信息可以在www.cftt.nist.gov/software_write_block.htm上找到。

硬件写保护器仍然是保护存储介质在取证过程中最安全和推荐的方法。

Linux 取证启动 CD

现场进行事件响应和分类的需求促使了可启动的 Linux 光盘的发展,这些光盘包含执行此类任务所需的软件。这些光盘可以启动目标 PC 并使用各种取证工具访问本地连接的存储设备。取证启动光盘旨在写保护已发现的存储设备,以防其需要进行取证影像制作。你可以通过使用命令(如前面示例中展示的 wrtblk)使附加磁盘可写,这在你连接外部目标磁盘时获取影像非常有用。取证启动光盘还具有网络功能,支持远程分析和获取数据。

取证启动光盘在以下情况下非常有用:

• 在不拆开 PC 的情况下进行检查,以免移除磁盘。

• 没有写保护器可用。

• 在分类过程中需要快速检查 PC 以获取某个证据,然后决定是否进行影像制作。

• 需要基于 Linux 的工具(如 Sleuth Kit、Foremost 等),但这些工具未提供其他方式获取。

• 取证技术人员需要通过 ssh 远程执行工作。

目前维护的几种流行的取证启动光盘包括:

• Kali Linux(前身为 BackTrack),基于 Debian 系统: www.kali.org/

• Digital Evidence & Forensics Toolkit (DEFT),基于 Ubuntu Linux: www.deftlinux.net/

• Pentoo,基于 Gentoo Linux 的取证 CD: pentoo.ch/

• C.A.I.N.E,基于 Ubuntu Linux 的计算机取证 Linux Live 发行版: www.caine-live.net/

取证启动光盘需要大量的维护和测试。过去曾有许多其他取证启动光盘可用。由于取证启动光盘的不断变化,务必研究并使用最新的功能完备且得到维护的版本。

具有物理只读模式的介质

一些存储介质具有写保护机制,在取证环境中非常有用。例如,大多数磁带都有一个滑动开关或标签,指示磁带驱动器将其视为只读,如 图 4-5 左侧所示。在 LTO-5 磁带(左下角)上,闭合标签表示它是写保护的;在 DAT160 磁带(左上角)上,打开标签表示它是写保护的。

SD 存储卡有一个 锁定 开关,可以写保护存储卡,如 图 4-5 右侧所示。

image

图 4-5:磁带和 SD 卡上的写保护标签

较旧的 USB 闪存驱动器可能具有写保护开关。一些非常古老的 IDE 硬盘有一个跳线,可以设置使驱动器电子设备将驱动器视为只读。

CD-ROM、DVD 和 Blu-ray 光盘不需要写入阻断器,因为它们默认是只读的。访问可重写光盘的简单操作不会修改光盘上的时间戳或其他数据;对这些光盘的更改必须明确地刻录到光盘上。

结束语

在本章中,你学习了如何设置基本的审计、活动日志记录和任务管理。我涵盖了命名约定和可扩展目录结构等主题,还讨论了图像大小、驱动器容量规划以及性能和环境问题等各种挑战。最后,本章讨论了法医写入阻断的关键组件。你现在已经准备好将目标驱动器连接到采集主机,准备执行法医采集过程。

第六章:将目标存储介质连接到采集主机

image

本章讨论将目标存储介质物理连接到检查主机,识别系统中的目标设备,以及查询设备固件以获取信息。你还将学习移除 HPA 和 DCO、解锁 ATA 密码以及解密自加密驱动器的方法。本章最后会介绍一些特殊的存储话题。让我们从检查目标 PC 硬件开始。

检查目标 PC 硬件

当 PC 或笔记本电脑在现场被没收或交付到取证实验室进行检查时,除了内部磁盘外,还可以检查其他硬件。检查内容应包括完整的 PC 硬件配置审查、BIOS 设置、硬件时钟等。

注意

本书的范围涵盖了“死”磁盘获取,即已经关闭电源的驱动器和 PC。根据组织的不同,现场到达犯罪或事件现场时可能会有一个分诊过程,处理正在运行的机器。这个分诊过程可能包括拍摄屏幕照片、使用鼠标振动器防止密码保护的屏幕保护程序启动,或者运行内存转储工具。对于现场运行的 PC 的首次响应分诊,超出了本书的范围。

物理 PC 检查和磁盘移除

在拔掉任何驱动器电缆或卸下任何驱动器之前,拍摄目标 PC 的照片,记录硬件配置、其中包含的磁盘数量,以及磁盘如何连接到主板。

小心移除驱动器,尤其是如果它们位于多年未打开的旧 PC 中。每个驱动器的顶部可以拍照,记录标签上的序列号和其他信息。对于每个磁盘,记下电缆在主板上的位置。如果主板有多个 SATA 端口,记录每个磁盘使用的端口。

打开光驱托盘,确认里面没有光盘。大多数光驱都有一个针孔,可以在不开机的情况下手动释放驱动器门。

检查 PCI 插槽,查看是否有 PCI SATA Express 驱动器或 PCI NVME 驱动器。如果主板上有 M.2 或 mSATA 插槽,请检查是否有 SSD 电路板。

目标 PC 硬件审查

从目标 PC 外壳中移除所有驱动器后,打开目标主板电源,记录 BIOS 配置、时钟、启动顺序、可能的 BIOS 日志、版本等信息。

如果需要进一步了解目标 PC,请使用包含各种硬件分析工具(如 lshw、dmidecode、biosdecode、lspic 等)的取证启动 CD 进行检查。

你可能能够通过使用特定厂商的工具来获取一些厂商特定的信息,例如,使用 vpddecode 获取 IBM 和 Lenovo 硬件信息,或获取 Compaq 硬件的所有权标签。

还应检查并记录任何额外的硬件组件,如内存模块或 PCI 卡。

将目标磁盘连接到采集主机

在将目标驱动器物理连接到检验工作站后(使用写保护机制),你需要识别与目标驱动器相关联的正确块设备。为了可靠地识别采集主机上的目标驱动器,列出存储介质设备,确认与物理驱动器关联的唯一标识符,并确定相应的设备文件(位于 /dev 中)。本节将更详细地探讨这些步骤。

查看采集主机硬件

了解检验主机的硬件配置对于性能调优、容量规划、维持平台稳定性、故障排除、隔离故障以及减少人为错误的风险非常有用。在本节中,你将看到一些工具的示例,帮助你列出和查看计算机硬件。

使用 lshw 工具,你可以生成一个关于检验工作站硬件的快速概览:

# lshw -businfo

总线信息描述了设备的具体地址,如 pci@domain🚌slot.function、scsi@host.channel.target.lun 和 usb@bus:device。

你也可以使用 lshw 特别查找连接的设备类型。例如:

# lshw -businfo -class storage
Bus info          Device     Class          Description
=======================================================
...
usb@2:5.2         scsi22     storage        Forensic SATA/IDE Bridge
...
# lshw -businfo -class disk
Bus info          Device     Class          Description
=======================================================
...
scsi@22:0.0.0     /dev/sdp   disk           120GB SSD 850
...

请注意,scsi22 链接到 scsi@22:.0.0.0,该链接指向 /dev/sdp。附加物理驱动器的 Linux 设备文件的识别将在后续章节中进一步讨论。

如果目标驱动器已外部连接,它很可能是通过 USB、Thunderbolt、FireWire 或 eSATA 连接的(在少数情况下,可能是通过光纤通道)。

如果驱动器已内部连接,它很可能是通过 SATA 电缆、PCI Express 插槽、M.2 接口或 SAS 电缆连接的(也可能是通过遗留接口,如并行 SCSI 或 IDE)。

你可以使用 lspci 工具列出连接到 PCI 总线的设备(包括并行 PCI 和 PCI Express):

# lspci

PCI 总线通过类别对设备进行分类(有关 PCI ID 和设备类别的更多信息,请参见 pci-ids.ucw.cz/)。匹配 大容量存储控制器 类别(类别 ID 01)的设备很重要,因为它们管理连接的存储介质。

更新版的 lspci(从 pciutils 版本 3.30 起)可以按设备类别列出 PCI 总线,这对于隔离特定硬件很有帮助。以下命令列出所有 SATA 大容量存储控制器(类别 ID 01,子类 ID 06)设备:

# lspci -d ::0106

此命令列出系统上的所有 SCSI、IDE、RAID、ATA、SATA、SAS 和 NVME 大容量存储控制器设备:

# for i in 00 01 04 05 06 07 08; do lspci -d ::01$i; done

另一个可以管理连接存储介质的 PCI 类别是 串行总线控制器 类别(类别 ID 0C)。以下命令列出所有 USB 串行总线控制器类(类别 ID 0C,子类 ID 03)的设备:

# lspci -d ::0C03

此命令列出检验主机上的所有 FireWire、USB 和光纤通道串行总线控制器:

# for i in 00 03 04; do lspci -d ::0C$i; done

如果主题驱动器是通过 USB 连接的,它不会出现在 PCI 总线上。你可以使用 lsusb 单独列出 USB 设备。如果没有选项,该命令会生成一个所有连接的 USB 设备的列表:

# lsusb
...
Bus 001 Device 005: ID 0951:1665 Kingston Technology
Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

这里,一个 USB 闪存驱动器连接到 USB 总线 1,并被分配了一个 USB 设备 ID 为 5。运行 lsusb -v 会提供关于 USB 设备的更详细输出。^(1)

上述工具和示例提供了一个关于存储介质控制器和连接到考官工作站的硬件的概述。lshw(1)、lspci(8) 和 lsusb(8) 的手册页面解释了更多参数和特性,你可以使用它们来查看硬件的更详细信息。

识别主题驱动器

了解考官工作站的硬件,尤其是可用的总线系统和控制器,将帮助你确定主题磁盘的连接位置。下一步是通过一些独特的信息,如序列号、唯一型号或其他独特属性,确认主题驱动器的身份。

你可以使用多种方法来识别主题设备。如果主题磁盘是通过 USB 总线连接的,并且在 lsusb 工具中列出,你可以通过指定主题磁盘的 vendor:productID 来获取更多信息,如下所示:

# lsusb -vd 0781:5583

Bus 004 Device 002: ID 0781:5583 SanDisk Corp.
...
  idVendor           0x0781 SanDisk Corp.
  idProduct          0x5583
  bcdDevice            1.00
  iManufacturer           1 SanDisk
  iProduct                2 Ultra Fit
  iSerial                 3 4C530001200627113025
...
    wSpeedsSupported   0x000e
      Device can operate at Full Speed (12Mbps)
      Device can operate at High Speed (480Mbps)
      Device can operate at SuperSpeed (5Gbps)
...

从这个输出中,你可以使用设备的唯一信息(如序列号等)来确认连接设备是否为主题驱动器。如果序列号或其他唯一属性与物理连接的驱动器匹配,那么你就确认了正确的设备。

几乎所有驱动器都可以通过 SCSI 命令访问(直接连接的 NVME 驱动器是一个显著的例外)。要查询连接的存储设备,你可以使用 lsscsi 工具。它支持多种传输层协议,包括 SATA、USB、SAS、FireWire、ATA、SCSI、Fibre Channel 等等。lsscsi 还可以用来将内核设备路径与 /dev 中的设备文件关联起来:

# lsscsi -v
...
[6:0:0:0]    disk    ATA      INTEL SSDSA2CW30 0302  /dev/sda
  dir: /sys/bus/scsi/devices/6:0:0:0  [/sys/devices/pci0000:00/0000:00:1f.2/ata7/
    host6/target6:0:0/6:0:0:0]
...

当设备从主机系统连接或断开时,内核会输出一条信息性消息。这是内核的环形缓冲区,可以通过 dmesg 工具查看。使用 dmesg 并加上 -T 参数可以打印出人类可读的时间戳,这在你确定某设备在已知时间被添加时非常有用:

# dmesg -T
...
[Sun May 15 13:44:45 2016] usb 2-1: new SuperSpeed USB device number 9 using
    xhci_hcd
[Sun May 15 13:44:45 2016] usb 2-1: New USB device found, idVendor=0781,
    idProduct=5583
[Sun May 15 13:44:45 2016] usb 2-1: New USB device strings: Mfr=1, Product=2,
    SerialNumber=3
[Sun May 15 13:44:45 2016] usb 2-1: Product: Ultra Fit
[Sun May 15 13:44:45 2016] usb 2-1: Manufacturer: SanDisk
[Sun May 15 13:44:45 2016] usb 2-1: SerialNumber: 4C530001141203113173
[Sun May 15 13:44:45 2016] usb-storage 2-1:1.0: USB Mass Storage device detected
[Sun May 15 13:44:45 2016] scsi host24: usb-storage 2-1:1.0
[Sun May 15 13:44:46 2016] scsi 24:0:0:0: Direct-Access     SanDisk  Ultra Fit
    1.00 PQ: 0 ANSI: 6
[Sun May 15 13:44:46 2016] sd 24:0:0:0: Attached scsi generic sg5 type 0
[Sun May 15 13:44:46 2016] sd 24:0:0:0: [sdf] 30375936 512-byte logical blocks:
    (15.6 GB/14.5 GiB)
[Sun May 15 13:44:46 2016] sd 24:0:0:0: [sdf] Write Protect is off
[Sun May 15 13:44:46 2016] sd 24:0:0:0: [sdf] Mode Sense: 43 00 00 00
[Sun May 15 13:44:46 2016] sd 24:0:0:0: [sdf] Write cache: disabled, read cache:
    enabled, doesn't support DPO or FUA
[Sun May 15 13:44:46 2016]  sdf: sdf1
[Sun May 15 13:44:46 2016] sd 24:0:0:0: [sdf] Attached SCSI removable disk

你可以使用这些输出信息来识别附加的物理设备,将 USB 设备与 SCSI 主机 ID 和块设备名称关联。在这个示例中,usb 2-1:指的是总线 2 和物理端口 1(插口)。该 USB 驱动器被分配了设备号 9,并使用xhci_hcd 驱动程序(支持 USB3)。显示了供应商和产品 ID 字符串,idVendor=0781idProduct=5583,后面跟着制造商、产品和序列号的信息字符串(这些可能与idVendoridProduct不同)。Bulk-Only Transport usb-storage驱动程序检测到该设备(对于 UASP 设备不需要),并且scsi host24:表示设备已分配了 SCSI 主机编号,并对应 SCSI 地址24:0:0:0:。创建了两个设备,sg5(通用 SCSI)和sdf(块设备),它们分别对应/dev/sg5/dev/sdf。查询了有关(现已建立的)SCSI 设备的一些信息,并检测到分区表(sdf1)。

一个更简单的命令来列出所有附加的存储设备,包括描述信息和设备路径,是lsblk命令。较新版本的 lsblk 提供了有关供应商、型号、版本、序列号以及WWN世界唯一名称en.wikipedia.org/wiki/World_Wide_Name)编号的输出选项。此外,lsblk 还提供了有用的技术细节,例如设备名称、大小、物理和逻辑扇区大小、传输方式(USB、SATA、SAS 等)、SCSI 地址等:

# lsblk -pd -o TRAN,NAME,SERIAL,VENDOR,MODEL,REV,WWN,SIZE,HCTL,SUBSYSTEMS,HCTL

此处展示的大多数工具只是从 Linux 的/proc目录中读取不同的文件和目录。你可以在/proc树中找到关于附加硬盘和其他内核结构的更多信息。有关 proc 文件系统的更多信息,请查阅 proc(5)手册页。

查询目标磁盘信息

在将目标硬盘连接到检查工作站并准确识别要操作的正确 Linux 设备后,你可以收集有关该设备的更多元信息。你可以直接查询该设备,获取有关硬盘、固件、SMART 数据和其他配置信息。

有多种工具可用于查询存储在硬盘中的信息。通常,你使用较低级别的 ATA 或 SCSI 接口命令来访问这些固件信息,这些命令直接与硬盘电子设备交互。

文档设备识别详细信息

此时,你应该已获得关于连接到检查主机的硬盘的一些详细信息和技术标识符,包括以下内容:

• 供应商、品牌和型号

• 序列号或 WWN

• Linux 设备名称

• PCI domain🚌slot.function

• PCI vendorID:deviceID

• USB bus:device

• USB vendorID:productID

• SCSI host:channel:target:lun

你可以通过将各种工具命令输出重定向到文本文件来保存这些信息以备报告使用。

记录使用写保护器的证据。如果你使用的是硬件写保护器,如 Tableau,查询并保存结果:

# tableau-parm /dev/sdc > write-blocked.txt

此处/dev/sdc应替换为目标驱动器的相关设备。

如果你使用的是软件写保护器,如 wrtblk,可以查询blockdev以获取设备当前状态的报告(包括只读标志):

# blockdev --report /dev/sda > wrtblk.txt

此处/dev/sda应替换为目标驱动器的相关设备。

如果目标驱动器通过 USB 连接,可以通过bus:device(使用-s)或vendor:product(使用-d)来指定。以下两个命令将生成并保存相同的详细输出:

# lsusb -v -s 2:2 > lsusb.txt
# lsusb -v -d 13fe:5200 > lsusb.txt

此处2:213fe:5200应替换为你的获取主机上目标驱动器的相关值。

lsblk命令可以指定 Linux 设备,-O标志将输出所有可用的列:

# lsblk -O /dev/sda > lsblk.txt

此处/dev/sda应替换为你的获取主机上目标驱动器的相关设备。

lsscsi命令也可以保存连接驱动器的某种视角,并指定要使用的 SCSI 地址:

# lsscsi -vtg -L 16:0:0:0 > lsscsi.txt

此处16:0:0:0应替换为你的获取主机上目标驱动器的相关 SCSI 地址。

如果需要,也可以将相关的 dmesg 输出复制到文本文件中。

本节展示的示例说明了如何保存特定目标驱动器的命令输出。为了简洁,后续章节有时不会包括保存数据到文件的示例,而是专注于命令的构造。

使用 hdparm 查询磁盘功能和特性

之前讨论的许多工具(如 lsusb、lspci、lsblk 等)已经查询了 Linux 系统和内核结构中的信息。然而,也可以直接查询驱动器以获取额外的信息。hdparm 工具对于向大多数连接到 Linux 系统的驱动器发送命令非常有用。

hdparm 工具通过向操作系统磁盘驱动程序发送请求(使用 ioctl)来检索有关磁盘的信息。从取证的角度来看,可能有一些项目值得关注或记录:

• 驱动器几何信息(物理和逻辑)

• 磁盘支持的标准、特性和功能

• 与驱动器配置相关的状态和标志

• DCO 和 HPA 信息

• 安全信息

• 厂商信息,如品牌、型号和序列号

• WWN 设备标识符(如果存在)

• 安全擦除所需的时间(对于大多数磁盘来说,大约是获取时间)

有关 hdparm 功能的详细信息,请参阅 hdparm(8)手册页面。

以下示例展示了如何使用 hdparm 工具,通过-I标志和原始磁盘设备一起获取磁盘概述。列表中注释了与取证调查人员相关的内容。

输出开始时会记录关于硬盘的信息,包括制造商、型号、序列号以及它符合的标准。输出中还包括各种硬盘参数,如物理和逻辑扇区大小、扇区数量、外形尺寸以及其他物理特性。

# hdparm -I /dev/sda

/dev/sda:

ATA device, with non-removable media
        Model Number:       WDC WD20EZRX-00D8PB0
        Serial Number:      WD-WCC4NDA2N98P
        Firmware Revision:  80.00A80
        Transport:          Serial, SATA 1.0a, SATA II Extensions, SATA Rev 2.5,
    SATA Rev 2.6, SATA Rev 3.0
Standards:
        Supported: 9 8 7 6 5
        Likely used: 9
Configuration:
        Logical         max     current
        cylinders       16383   16383
        heads           16      16
        sectors/track   63      63
        --
        CHS current addressable sectors:   16514064
        LBA    user addressable sectors:  268435455
        LBA48  user addressable sectors: 3907029168
        Logical Sector size:                    512 bytes
        Physical Sector size:                  4096 bytes
        device size with M = 1024*1024:     1907729 MBytes
        device size with M = 1000*1000:     2000398 MBytes (2000 GB)
        cache/buffer size  = unknown
        Nominal Media Rotation Rate: 5400
Capabilities:
        LBA, IORDY(can be disabled)
        Queue depth: 32
        Standby timer values: spec'd by Standard, with device specific minimum
        R/W multiple sector transfer: Max = 16  Current = 16
        DMA: mdma0 mdma1 mdma2 udma0 udma1 udma2 udma3 udma4 udma5 *udma6
             Cycle time: min=120ns recommended=120ns
        PIO: pio0 pio1 pio2 pio3 pio4
             Cycle time: no flow control=120ns  IORDY flow control=120ns
...

输出的下一部分描述了硬盘上可用的功能,星号([*])表示某个功能是否当前启用。(为了理解厂商特定的功能,你可能需要额外的专有文档。)当你准备进行法证采集时,这非常有用,因为它表明了安全功能集以及其他功能(如 DCO(设备配置覆盖功能集))的状态。

...
Commands/features:
        Enabled Supported:
           *    SMART feature set
                Security Mode feature set
           *    Power Management feature set
           *    Write cache
           *    Look-ahead
           *    Host Protected Area feature set
           *    WRITE_BUFFER command
           *    READ_BUFFER command
           *    NOP cmd
           *    DOWNLOAD_MICROCODE
                Power-Up In Standby feature set
           *    SET_FEATURES required to spinup after power up
                SET_MAX security extension
           *    48-bit Address feature set
           *    Device Configuration Overlay feature set
           *    Mandatory FLUSH_CACHE
           *    FLUSH_CACHE_EXT
           *    SMART error logging
           *    SMART self-test
           *    General Purpose Logging feature set
           *    64-bit World wide name
           *    WRITE_UNCORRECTABLE_EXT command
           *    {READ,WRITE}_DMA_EXT_GPL commands
           *    Segmented DOWNLOAD_MICROCODE
           *    Gen1 signaling speed (1.5Gb/s)
           *    Gen2 signaling speed (3.0Gb/s)
           *    Gen3 signaling speed (6.0Gb/s)
           *    Native Command Queueing (NCQ)
           *    Host-initiated interface power management
           *    Phy event counters
           *    NCQ priority information
           *    READ_LOG_DMA_EXT equivalent to READ_LOG_EXT
           *    DMA Setup Auto-Activate optimization
                Device-initiated interface power management
           *    Software settings preservation
           *    SMART Command Transport (SCT) feature set
           *    SCT Write Same (AC2)
           *    SCT Features Control (AC4)
           *    SCT Data Tables (AC5)
                unknown 206[12] (vendor specific)
                unknown 206[13] (vendor specific)
                unknown 206[14] (vendor specific)
...

hdparm 输出的下一部分提供了有关当前活动的安全功能的更多细节,当你确定硬盘是否被锁定或加密时,这些信息非常重要。安全擦除所需的时间也是对获取过程可能需要的时间的粗略估算(如果目标硬盘是性能瓶颈的话)。

...
Security:
        Master password revision code = 65534
                supported
        not     enabled
        not     locked
        not     frozen
        not     expired: security count
                supported: enhanced erase
        324min for SECURITY ERASE UNIT. 324min for ENHANCED SECURITY ERASE UNIT.
...

hdparm 输出的最后一部分再次显示了 WWN,但这次它被分解成 NAA(描述 WWN 其余部分的部分)、IEEE OUI 分配的厂商 ID 和 WWN 其余部分(它是唯一的,针对特定硬盘)。

...
Logical Unit WWN Device Identifier: 50014ee25fcfe40c
        NAA             : 5
        IEEE OUI        : 0014ee
        Unique ID       : 25fcfe40c
Checksum: correct

hdparm 输出包含了许多法证调查员感兴趣的项目,既可以作为文档记录,也可以作为进一步分析的信息。如果需要将 hdparm -I 的完整输出包含在法证报告中,可以将其重定向到文本文件中。

查询 SCSI 硬盘的类似工具是 sdparm,你可以使用它来访问 SCSI 模式页面。运行 sdparm 并加上标志 -a -l 会获取磁盘参数的详细列表。使用 sdparm -i 的更简洁查询可以提取重要产品数据(VPD),提供有关 SCSI 和 SAS 硬盘的唯一识别信息,如制造商、型号和序列号。

使用 smartctl 提取 SMART 数据

SMART 是在 1990 年代初期开发的,用于帮助监控硬盘并预测故障。它在 1995 年被加入到 SCSI-3 标准中(SCSI-3 标准:X3T10/94-190 Rev 4),并在 1997 年加入到 ATA-3 标准中(ATA-3 标准:X3.298-1997)。由于磁盘硬件的某些细节可能在法证调查中具有价值,在本节中,你将学习几种提取磁盘硬件 SMART 信息的技术。

smartctl 命令是 smartmontools 包的一部分,提供对几乎所有现代硬盘内置的 SMART 接口的访问。smartctl 命令查询连接的 ATA、SATA、SAS 和 SCSI 硬件。

SMART 提供了关于磁盘的一些变量和统计信息,其中一些可能对法证调查员很有帮助。例如:

• 磁盘错误和磁盘整体健康状态的统计信息

• 磁盘开机的次数

• 磁盘运行的小时数

• 读取和写入的字节数(通常以千兆字节为单位表示)

• 各种 SMART 日志(温度历史等)^(2)

以下示例显示了从驱动器请求的 SMART 数据。列表中附有与取证调查员相关的注释。

-x标志指示 smartctl 打印所有可用的信息。输出的第一个块是信息部分,提供有关驱动器的唯一标识信息。您也可以使用其他工具,如 hdparm,检索大部分这些信息,如之前的示例所示。

# smartctl -x /dev/sda
smartctl 6.4 2014-10-07 r4002 [x86_64-linux-4.2.0-22-generic] (local build)
Copyright (C) 2002-14, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Model Family:     Western Digital Green
Device Model:     WDC WD20EZRX-00D8PB0
Serial Number:    WD-WCC4NDA2N98P
LU WWN Device Id: 5 0014ee 25fcfe40c
Firmware Version: 80.00A80
User Capacity:    2,000,398,934,016 bytes [2.00 TB]
Sector Sizes:     512 bytes logical, 4096 bytes physical
Rotation Rate:    5400 rpm
Device is:        In smartctl database [for details use: -P show]
ATA Version is:   ACS-2 (minor revision not indicated)
SATA Version is:  SATA 3.0, 6.0 Gb/s (current: 6.0 Gb/s)
Local Time is:    Thu Jan 7 12:33:43 2016 CET
SMART support is: Available - device has SMART capability.
SMART support is: Enabled
AAM feature is:   Unavailable
APM feature is:   Unavailable
Rd look-ahead is: Enabled
Write cache is:   Enabled
ATA Security is:  Disabled, NOT FROZEN [SEC1]
Wt Cache Reorder: Enabled
...

以下 SMART 数据部分显示了驱动器的健康状况和自检结果。不健康的驱动器是潜在采集问题的早期警告。接下来列出了其他 SMART 功能。

...
=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED

General SMART Values:
Offline data collection status:  (0x82) Offline data collection activity
                                        was completed without error.
                                        Auto Offline Data Collection: Enabled.
Self-test execution status:      (   0) The previous self-test routine completed
                                        without error or no self-test has ever
                                        been run.
Total time to complete Offline
data collection:                (30480) seconds.
Offline data collection
capabilities:                    (0x7b) SMART execute Offline immediate.
                                        Auto Offline data collection on/off support.
                                        Suspend Offline collection upon new
                                        command.
                                        Offline surface scan supported.
                                        Self-test supported.
                                        Conveyance Self-test supported.
                                        Selective Self-test supported.
SMART capabilities:            (0x0003) Saves SMART data before entering
                                        power-saving mode.
                                        Supports SMART auto save timer.
Error logging capability:        (0x01) Error logging supported.
                                        General Purpose Logging supported.
Short self-test routine
recommended polling time:        (   2) minutes.
Extended self-test routine
recommended polling time:        ( 307) minutes.
Conveyance self-test routine
recommended polling time:        (   5) minutes.
SCT capabilities:              (0x7035) SCT Status supported.
                                        SCT Feature Control supported.
                                        SCT Data Table supported.
...

下一部分提供了关于驱动器的更多统计信息。这里可能与取证相关的统计数据包括驱动器使用历史;例如,驱动器通电的累计小时数(Power_On_Hours)和驱动器启动的次数(Power_Cycle_Count)。这两个属性可能与取自的 PC 相关联。读取和写入的总逻辑块地址(LBAs)指示了驱动器过去的使用量。

...
SMART Attributes Data Structure revision number: 16
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAGS    VALUE WORST THRESH FAIL RAW_VALUE
  1 Raw_Read_Error_Rate     POSR-K   200   200   051    -    0
  3 Spin_Up_Time            POS--K   181   180   021    -    5908
  4 Start_Stop_Count        -O--CK   100   100   000    -    61
  5 Reallocated_Sector_Ct   PO--CK   200   200   140    -    0
  7 Seek_Error_Rate         -OSR-K   200   200   000    -    0
  9 Power_On_Hours          -O--CK   099   099   000    -    989
 10 Spin_Retry_Count        -O--CK   100   253   000    -    0
 11 Calibration_Retry_Count -O--CK   100   253   000    -    0
 12 Power_Cycle_Count       -O--CK   100   100   000    -    59
192 Power-Off_Retract_Count -O--CK   200   200   000    -    33
193 Load_Cycle_Count        -O--CK   199   199   000    -    3721
194 Temperature_Celsius     -O---K   119   110   000    -    31
196 Reallocated_Event_Count -O--CK   200   200   000    -    0
197 Current_Pending_Sector  -O--CK   200   200   000    -    4
198 Offline_Uncorrectable   ----CK   200   200   000    -    4
199 UDMA_CRC_Error_Count    -O--CK   200   200   000    -    0
200 Multi_Zone_Error_Rate   ---R--   200   200   000    -    4
                            ||||||_ K auto-keep
                            |||||__ C event count
                            ||||___ R error rate
                            |||____ S speed/performance
                            ||_____ O updated online
                            |______ P prefailure warning
...

下一部分是日志目录,描述了驱动器上的 SMART 日志。这些日志包含在smartctl -x输出中,重复的条目会被移除(“跳过”)。这些日志中的一些可能在取证调查中具有重要性。

...
General Purpose Log Directory Version 1
SMART           Log Directory Version 1 [multi-sector log support]
Address    Access  R/W   Size  Description
0x00       GPL,SL  R/O      1  Log Directory
0x01           SL  R/O      1  Summary SMART error log
0x02           SL  R/O      5  Comprehensive SMART error log
0x03       GPL     R/O      6  Ext. Comprehensive SMART error log
0x06           SL  R/O      1  SMART self-test log
0x07       GPL     R/O      1  Extended self-test log
0x09           SL  R/W      1  Selective self-test log
0x10       GPL     R/O      1  SATA NCQ Queued Error log
0x11       GPL     R/O      1  SATA Phy Event Counters log
0x80-0x9f  GPL,SL  R/W     16  Host vendor specific log
0xa0-0xa7  GPL,SL  VS      16  Device vendor specific log
0xa8-0xb7  GPL,SL  VS       1  Device vendor specific log
0xbd       GPL,SL  VS       1  Device vendor specific log
0xc0       GPL,SL  VS       1  Device vendor specific log
0xc1       GPL     VS      93  Device vendor specific log
0xe0       GPL,SL  R/W      1  SCT Command/Status
0xe1       GPL,SL  R/W      1  SCT Data Transfer
...

下一部分的日志信息显示了自检结果。自检失败是采集可能存在问题的早期警告。

...
SMART Extended Comprehensive Error Log Version: 1 (6 sectors)
No Errors Logged

SMART Extended Self-test Log Version: 1 (1 sectors)
Num  Test_Description  Status                 Remaining LifeTime(hours)  LBA_of...
# 1  Short offline     Completed without error      00%        0         -

SMART Selective self-test log data structure revision number 1
 SPAN  MIN_LBA  MAX_LBA  CURRENT_TEST_STATUS
    1        0        0  Not_testing
    2        0        0  Not_testing
    3        0        0  Not_testing
    4        0        0  Not_testing
    5        0        0  Not_testing
Selective self-test flags (0x0):
  After scanning selected spans, do NOT read-scan remainder of disk.
If Selective self-test is pending on power-up, resume after 0 minute delay.

SCT Status Version:                  3
SCT Version (vendor specific):       258 (0x0102)
SCT Support Level:                   1
Device State:                        Active (0)
...

下一输出块描述了驱动器的温度统计信息。在采集过程中,监控这些信息可能会很有用。为了调查目的,可能对驱动器在其生命周期内达到的最小和最大温度感兴趣,特别是如果它们与与嫌疑人 PC 相关的环境因素相关联的话。供应商特定的 SMART 数据不属于通用 SMART 标准的一部分,您可能需要额外的专有文档来理解它。

...
Current Temperature:                    31 Celsius
Power Cycle Min/Max Temperature:     22/31 Celsius
Lifetime    Min/Max Temperature:     20/41 Celsius
Under/Over Temperature Limit Count:   0/0
Vendor specific:
01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
...

一些支持 SMART 的驱动器会保持温度历史日志。您可以通过将间隔乘以历史大小来计算历史数据。在这个例子中,478 分钟大约是 8 小时的温度数据。有些磁盘的温度记录间隔设置得更长(一个小时或更长)。温度记录间隔对于调查可能非常有用:如果在犯罪发生后立即扣押磁盘,已知的温度变化可能与磁盘的温度记录相关联。

...
SCT Temperature History Version:     2
Temperature Sampling Period:         1 minute
Temperature Logging Interval:        1 minute
Min/Max recommended Temperature:      0/60 Celsius
Min/Max Temperature Limit:           -41/85 Celsius
Temperature History Size (Index):    478 (175)

Index    Estimated Time   Temperature Celsius
 176    2016-01-07 05:00     ?  -
 ...    ..(300 skipped).    ..  -
 477    2016-01-07 10:01     ?  -
   0    2016-01-07 10:02    29  **********
   1    2016-01-07 10:03    30  ***********
 ...    ..( 68 skipped).    ..  ***********
  70    2016-01-07 11:12    30  ***********
  71    2016-01-07 11:13    31  ************
 ...    ..(103 skipped).    ..  ************
 175    2016-01-07 12:57    31  ************
...

本示例的输出的最后一部分显示了物理错误的统计数据。将这些统计数据与采集过程中的或采集结束时的值进行比较,可能有助于确保在过程中没有出现物理错误。

...
SCT Error Recovery Control command not supported

Device Statistics (GP/SMART Log 0x04) not supported

SATA Phy Event Counters (GP Log 0x11)
ID      Size     Value  Description
0x0001  2            0  Command failed due to ICRC error
0x0002  2            0  R_ERR response for data FIS
0x0003  2            0  R_ERR response for device-to-host data FIS
0x0004  2            0  R_ERR response for host-to-device data FIS
0x0005  2            0  R_ERR response for non-data FIS
0x0006  2            0  R_ERR response for device-to-host non-data FIS
0x0007  2            0  R_ERR response for host-to-device non-data FIS
0x0008  2            0  Device-to-host non-data FIS retries
0x0009  2            6  Transition from drive PhyRdy to drive PhyNRdy
0x000a  2            6  Device-to-host register FISes sent due to a COMRESET
0x000b  2            0  CRC errors within host-to-device FIS
0x000f  2            0  R_ERR response for host-to-device data FIS, CRC
0x0012  2            0  R_ERR response for host-to-device non-data FIS, CRC
0x8000  4        14532  Vendor specific

根据驱动器厂商的不同,可能还会有其他 SMART 日志。有关更多关于附加标志和查询的信息,请查阅 smartctl(8)手册页面,以了解可以发送到附加目标驱动器的命令。

启用对隐藏扇区的访问

取证文献通常将处理 HPA 和 DCO 作为成像过程的一部分。事实上,一些成像软件在获取时就具备检测和移除这些隐藏区域的能力。本书将 HPA/DCO 的检测和移除定位为准备过程的一部分,而非实际的成像过程。一旦这些隐藏区域变得可访问,就没有特别的技术来成像它们。它们只是被驱动器配置参数保护的磁盘扇区。将它们提供给后续成像过程是一个简单的准备步骤。移除 HPA 或 DCO 会修改驱动器的配置,但不会修改其内容。^(3)

本节还涉及磁盘上的驱动器维护扇区和服务区域,但这个话题仅简要提及,因为这些区域无法通过常见的开源工具轻松访问。

移除 DCO

DCO 的开发旨在使 PC 系统制造商能够使不同的驱动器型号看起来具有相同的功能。使用 DCO,可以禁用某些功能,并将驱动器的容量(可用扇区的数量)减少,以符合厂商的要求。在分析可疑驱动器时,识别并移除 DCO 是标准的取证实践。

DCO 是一个通用的配置覆盖层,可以覆盖多个功能。它不仅仅指驱动器上的扇区数量。

两个 hdparm 命令可以确定是否存在 DCO,并提供可用的实际扇区数量。第一个命令用于确定驱动器是否启用了 DCO 功能集。在这个例子中,报告的磁盘当前大小为 474GB 或 926773168 个扇区(512 字节扇区大小),并且Device Configuration Overlay feature set旁边的星号([*])表示该功能已启用:

# hdparm -I /dev/sdl

/dev/sdl:
ATA device, with non-removable media
       Model Number:        WDC WD5003AZEX-00MK2A0
...
       LBA48  user addressable sectors:  926773168
       Logical  Sector size:                   512 bytes
       Physical Sector size:                  4096 bytes
       device size with M = 1024*1024:      452525 MBytes
       device size with M = 1000*1000:      474507 MBytes (474 GB)
...
          * Device Configuration Overlay feature set
...

第二个命令专门查询由 DCO 修改的功能:

# hdparm --dco-identify /dev/sdl

/dev/sdl:
DCO Revision: 0x0002
The following features can be selectively disabled via DCO:
        Transfer modes:
                 udma0 udma1 udma2 udma3 udma4 udma5 udma6
        Real max sectors: 976773168
        ATA command/feature sets:
                 security HPA
        SATA command/feature sets:
                 NCQ interface_power_management SSP

在这个例子中,“Real max sectors”是 976773168,比报告的大小少了 25GB,这表明存在 DCO。报告的 474GB 大小与物理驱动器上的 500GB 标签不匹配。你可以通过检查驱动器型号与厂商的产品文档来确认预期的扇区数量。

确认使用 hdparm 存在 DCO 后,可以使用相同的命令将其移除。首先,运行hdparm以确保驱动器配置未被锁定或冻结:

# hdparm -I /dev/sdl

/dev/sdl:

ATA device, with non-removable media
        Model Number:       WDC WD5003AZEX-00MK2A0
...
Security:
...
        not   locked
        not   frozen
...

一些 BIOS 或操作系统会在启动时发出 ATA 命令冻结 DCO 配置,以防止恶意更改。在这种情况下,启动后热插拔驱动器电源线应使驱动器以未冻结的状态启动。^(4) 许多 USB 桥接器会自动使附加的磁盘在未冻结的状态下启动。如果驱动器被锁定,请参阅“识别和解锁 ATA 密码保护磁盘”第 126 页中的内容。

一旦驱动器准备好,你可以发送适当的 ATA 命令来重置 DCO,使额外的隐藏扇区可用。

仅仅运行带有--dco-restore选项的hdparm命令不会做任何事情,只会生成一个警告信息:

# hdparm --dco-restore /dev/sdl

/dev/sdl:
Use of --dco-restore is VERY DANGEROUS.
You are trying to deliberately reset your drive configuration back to the factory
    defaults.
This may change the apparent capacity and feature set of the drive, making all data
    on it inaccessible.
You could lose *everything*.
Please supply the --yes-i-know-what-i-am-doing flag if you really want this.
Program aborted.

按照说明并包含--yes-i-know-what-i-am-doing标志,你可以按照以下步骤移除 DCO:

# hdparm --yes-i-know-what-i-am-doing --dco-restore /dev/sdl

/dev/sdl:
issuing DCO restore command

现在,当你再次运行hdparm -I命令时,所有扇区将被显示。

# hdparm -I /dev/sdl

/dev/sdl:

ATA device, with non-removable media
        Model Number:       WDC WD5003AZEX-00MK2A0
...
        LBA48  user addressable sectors:  976773168
        Logical  Sector size:                   512 bytes
        Physical Sector size:                  4096 bytes
        device size with M = 1024*1024:      476940 MBytes
        device size with M = 1000*1000:      500107 MBytes (500 GB)
...

现在你可以获取驱动器或使用取证工具对其进行分析。需要注意的是 DCO 隐藏区域的确切扇区偏移量,这在你只想提取 DCO 扇区进行单独分析时会非常有用。

使用hdparm移除 DCO 可能会有些棘手。如果特定驱动器在执行移除命令时出现问题,请查阅 hdparm(8)手册页面。

tableau-parm 工具有一个-r标志,应该能从驱动器中移除 DCO(并可能移除 HPA)。

移除 HPA

HPA 是为了让 PC 系统制造商能够以通常客户无法访问的方式存储数据而开发的。HPA 的使用示例包括诊断工具、恢复分区等。这些特殊区域通常在启动时通过 BIOS 热键激活。

你可以使用一个简单的hdparm命令来检测 HPA 的存在:

# hdparm -N /dev/sdl

/dev/sdl:
 max sectors   = 879095852/976773168, HPA is enabled

这里HPA 已启用表示存在 HPA。最大扇区数提供了可见的扇区数,后跟实际扇区数。在此示例中,减去这两个扇区数可以揭示出 50GB 的差异,这就是主机保护区。

你可以使用相同的命令临时移除 HPA(与 DCO 移除类似,出现警告信息,你需要使用--yes-i-know-what-i_am_doing标志):

# hdparm --yes-i-know-what-i-am-doing -N 976773168 /dev/sdl

/dev/sdl:
 setting max visible sectors to 976773168 (temporary)
 max sectors   = 976773168/976773168, HPA is disabled

该命令的结果只是暂时的;下次你重新启动驱动器时,原来的 HPA 将会恢复。要使该更改永久生效,可以按如下方式将p添加到扇区计数数字中:

# hdparm --yes-i-know-what-i-am-doing -N p976773168 /dev/sdl

/dev/sdl:
 setting max visible sectors to 976773168 (permanent)
 max sectors   = 976773168/976773168, HPA is disabled

HPA 现在已被移除,你可以获取驱动器或使用取证工具对其进行分析。需要注意的是 HPA 隐藏区域的确切扇区偏移量,这在你只想提取 HPA 扇区进行单独分析时会非常有用。

使用 hdparm 移除 HPA 可能会有些棘手。如果特定驱动器在执行移除命令时出现问题,请查阅 hdparm(8)手册页面。

之前,Sleuth Kit 取证套件有两个实用工具用于检测并临时移除 HPA:disk_stat 和 disk_sreset。这些工具在 2009 年被移除,因为其他工具,如 hdparm,已包含相同的功能。

驱动器服务区域访问

硬盘驱动器需要存储如 SMART 日志、ATA 密码、不良扇区列表、固件和其他持久信息等数据。这些信息通常存储在磁盘盘片的保留区域,用户无法访问,这些区域被称为系统区域(也叫服务区域负扇区维护扇区)。访问这些区域是通过厂商专有命令完成的,这些命令通常不对外公开。

目前并没有统一的系统方法来访问磁盘的系统区域。每个磁盘制造商实现系统区域的方式不同,且没有行业标准,公开的工具也很少。存在一些专业的商业工具,如 Ace Laboratory 的 PC-3000 (www.acelaboratory.com/catalog/ ) 或 Atola Insight Forensic (www.atola.com/products/insight/supported-drives.html ),这些工具可以访问许多磁盘的服务区域。^(5, 6)

在某些情况下,可以绕过标准的 SATA、USB 或 SAS 接口,通过驱动器电子组件内置的调试或诊断端口访问存储介质。这些接口可能使用串行 RS-232/TTL、JTAG 进行芯片访问,^(7)或通过常规驱动器接口使用未公开的厂商专有命令。以这种方式访问介质在不同厂商之间,甚至在同一厂商的不同驱动器之间并不统一。

为了说明,以下示例展示了如何通过串行接口读取 Seagate Barracuda ST500DM002 驱动器的信息。该驱动器在 SATA 数据插头旁边有一个串口,可以通过 USB 3V TTL 电缆进行访问。在此示例中,使用标准的串行终端仿真软件,如 Linux 的cu(连接 UNIX)命令。

图 5-1 展示了连接到驱动器背面针脚块的 USB 电缆照片。

image

图 5-1:通过串口访问磁盘固件

注意

警告: 在没有专业培训或工具的情况下,不应使用此方法。存在对磁盘造成无法修复的物理损坏的风险。

连接终端并打开驱动器电源后,会显示启动信息。按下 CTRL-Z 进入诊断模式,驱动器固件会显示命令提示符(类似于 UNIX 终端或模拟调制解调器)。

$ cu -s 38400 -l /dev/ttyUSB0
Connected.

Boot 0x10M
 Spin Up[0x00000000][0x0000B67C][0x0000BA10]
 Trans.

Rst 0x10M
 MC Internal LPC Process
 Spin Up
(P) SATA Reset

ASCII Diag mode

F3 T>

从这个诊断界面可以获取有关磁盘的详细底层信息。在以下示例中,Level 2 x 命令揭示了用户和系统区域的内部物理驱动器几何结构和分区:

F3 2>x

User Partition

 LBAs 000000000000-0000075D672E
 PBAs 000000000000-0000076F8EDD
 HdSkew 006E, CylSkew 002D
 ZonesPerHd 11

 Head 0, PhyCyls 000000-040001, LogCyls 000000-03F19C

     Physical      Logical       Sec   Sym   Sym      Data
  Zn Cylinders     Cylinders     Track Wedge Track    Rate
  00 000000-0003FB 000000-0003FB 010F  0D77  000F4D40 1263.750
  01 0003FC-005A41 0003FC-005A41 0130  0F1A  00112A40 1417.500
...

 Head 1, PhyCyls 000000-039877, LogCyls 000000-038B61

     Physical      Logical       Sec   Sym   Sym      Data
  Zn Cylinders     Cylinders     Track Wedge Track    Rate
  00 000000-00035B 000000-00035B 0130  0F16  001124A0 1415.625
  01 00035C-004E72 00035C-004E72 0145  1025  00125E80 1516.875
...
System Partition

 LBAs 000000000000-0000000972CF
 PBAs 000000000000-00000009811F
 HdSkew 006E, CylSkew 0018
 ZonesPerHd 02

 Head 0, PhyCyls 040002-040155, LogCyls 000000-000152

     Physical      Logical       Sec   Sym   Sym      Data
  Zn Cylinders     Cylinders     Track Wedge Track    Rate
  00 040002-0400AB 000000-0000A9 0394  063D  00072AE0  592.500
  01 0400AC-040155 0000AA-000152 0394  063D  00072AE0  592.500

 Head 1, PhyCyls 039878-0399CB, LogCyls 000000-000152

     Physical      Logical       Sec   Sym   Sym      Data
  Zn Cylinders     Cylinders     Track Wedge Track    Rate
  00 039878-039921 000000-0000A9 0394  063D  00072AE0  592.500
  01 039922-0399CB 0000AA-000152 0394  063D  00072AE0  592.500

诊断接口,例如此接口,可以提供访问系统区域中的磁盘扇区以及其他通常无法访问的信息。

存在一些在线论坛讨论低级磁盘访问和恢复技术,例如 HDDGURU (forum.hddguru.com/index.php) 和 The HDD Oracle (www.hddoracle.com/index.php).

访问 SSD 或闪存存储介质底层区域的方法包括物理拆卸(去焊)内存芯片,有时被称为chip-off。然后可以提取这些芯片的内存内容,并将其重构为可读的数据块。

一些设备(如物联网设备、移动设备等)可能具有 JTAG 接口,可以访问内存内容。JTAG 是一个文档齐全的标准,并且可以在取证环境中应用来提取数据(参见 www.evidencemagazine.com/index.php?option=com_content&task=view&id=922)。

详细讲解这些技术已经超出了本书的范围。我提到 JTAG 接口和串行访问磁盘是为了说明这些技术在取证行业中是存在的。

ATA 密码安全和自加密驱动器

本节内容涵盖了磁盘厂商实施的标准安全功能。这些功能包括驱动器锁定、密码保护、自加密驱动器和其他安全机制。尽管这里讨论的一些功能并未广泛使用,但在专业的取证实验室环境中了解它们仍然很重要。

本书未详细描述密码恢复技术。示例展示了如何将密码保护的媒体连接到采集主机以准备镜像。假设密码已经是已知的。

获取密码的方法超出了本书的范围,但恢复技术可能包括以下几种:

• 暴力破解,反复尝试多个密码直到找到正确的密码。

• 找到隐藏或存储在可访问位置的密码。

• 了解不同账户或设备之间的密码复用。从一个地方恢复密码即可访问所有账户。

• 根据不同司法管辖区的规定,可能会依法强制要求提供密码。

• 密码可能由友好或合作的所有者(可能是受害人)或合作的同伙提供。

• 企业 IT 环境中可能已设置密钥托管或备份。

识别并解锁 ATA 密码保护的磁盘

ATA/ATAPI 命令 (www.t13.org/) 指定了一组安全功能,使用密码限制对磁盘的访问。当启用此功能时,固件将阻止执行某些 ATA 命令,包括访问内容,直到提供所需的密码。这仅仅是一种访问控制功能,并不使用加密来保护磁盘上的数据。

hdparm 工具可以确定磁盘是否启用了安全功能。例如:

# hdparm -I /dev/sda
...
Commands/features:
        Enabled Supported:
...
           *    Security Mode feature set
...
Security:
        Master password revision code = 1
                supported
                enabled
                locked
        not     frozen
        not     expired: security count
                supported: enhanced erase
        Security level high
        60min for SECURITY ERASE UNIT. 60min for ENHANCED SECURITY ERASE UNIT.
...

Commands/features: 信息表明 Security Mode feature set 存在并已启用,而 Security: 信息也确认该功能已被支持并启用。

如果 Security: 显示为 enabled,则表示已设置用户密码,并且磁盘将在启动时被锁定。如果磁盘被锁定,如前所述,磁盘的访问将被阻止,直到输入正确密码。操作系统在尝试访问磁盘时可能会生成设备错误或命令失败错误。T13 标准概述了磁盘被锁定时允许哪些命令。即使磁盘被锁定,仍然可以访问一些命令,包括查询 SMART 信息。

可以设置两个密码:用户密码和管理员密码。如果设置了用户密码,安全功能将启用(如前所述)。仅设置管理员密码不会启用安全功能。

如果从未设置过管理员密码(它可能仍然使用出厂默认密码),则 Master password revision code 将设置为 65534。第一次设置管理员密码时,此值设置为 1,并且每次重新设置管理员密码时都会递增。

两个安全级别控制密码的正确行为。Security level 指的是 T13 标准中的 MASTER PASSWORD CAPABILITY 位,安全级别可以是“高”或“最大”。如果安全级别设置为高,用户或管理员密码都可以解锁磁盘。如果安全级别设置为最大,管理员密码将允许执行安全擦除命令,但只有用户密码可以解锁磁盘。

一些 PC 可能在启动后发出安全冻结命令,以防止进一步发送安全命令,即使提供了正确的密码(防止恶意密码设置攻击)。hdparm 的安全输出将指示磁盘是否被冻结。许多 USB 桥接器会自动以未冻结状态启动连接的磁盘,但如果您仍然遇到困难,可以尝试以下几种方法:

• 检查 BIOS 设置以启用/禁用冻结命令

• 使用防止发出冻结命令的取证启动 CD

• 将磁盘连接到单独的控制卡(非主板集成)

• 热插拔磁盘到系统中(如果支持)

• 使用不发出冻结命令的主板

如果您知道用户密码,并且磁盘安全未被冻结,您可以按以下方式解锁磁盘:

# hdparm --security-unlock "mysecret99" /dev/sdb
security_password="mysecret99"

/dev/sdb:
 Issuing SECURITY_UNLOCK command, password="mysecret99", user=user

默认情况下,用户密码通过 hdparm 提供,主密码需要通过额外的命令行参数明确指定。如果您知道主密码并且安全级别设置为高,则可以使用主密码解锁硬盘,如下所示:

# hdparm --user-master m --security-unlock "companysecret22" /dev/sdb
security_password="companysecret22"

/dev/sdb:
 Issuing SECURITY_UNLOCK command, password="companysecret22", user=master

如果不知道任何密码,则无法使用常规工具访问硬盘。密码信息存储在硬盘的服务/系统区域,通常没有特殊硬件或工具是无法访问的。然而,仍然有若干其他选项可用,下面将进行讨论。

主密码可能被设置为出厂默认密码,并可以用于访问硬盘(如果安全级别设置为高而非最高)。您可以轻松地在互联网上找到出厂默认主密码的列表。

使用暴力破解来识别主密码或用户密码是低效的,因为在五次失败尝试后,硬盘必须重置。然而,如果您有一个小的可能密码集,多次尝试就变得可行,并且可能会有幸运的成功。

专业的数据恢复公司提供服务和硬件工具,可以从硬盘的服务区域恢复或重置 ATA 安全功能集密码。并非所有硬盘都能成功恢复,但数据恢复公司通常会列出他们支持的硬盘型号。在某些情况下,您可能需要将硬盘寄送到公司的实验室,这可能涉及到所有权链的问题。有关更多信息,请参见“驱动器服务区域访问”,见第 122 页。

硬盘厂商可能能够提供帮助以禁用或重置 ATA 密码。这将取决于硬盘厂商的合作、证明硬盘及其内容所有权的能力、请求方的权限以及数据恢复的动机。

可能存在硬件和固件破解方法以及研究人员发布的其他方法,可以为某些硬盘型号提供访问权限。安全研究社区定期发现创新的方式来访问和修改难以接触到的地方的数据。

识别和解锁 Opal 自加密驱动器

自加密硬盘(SEDs) 是一种全盘加密(FDE)的形式。与软件基础的 FDE(如 TrueCrypt、FileVault、LUKS 等)不同,后者由操作系统管理加密,而 SEDs 则将加密功能直接集成到硬盘的电子和固件中。SEDs 与操作系统无关,基于厂商独立的标准。负责定义该标准的国际机构是可信计算集团(TCG;www.trustedcomputinggroup.org/)。该标准是 TCG 存储安全子系统类:Opal,规范版本 2.00。

本节介绍具有 Opal 加密的驱动器,并描述如何使用适当的密钥解锁驱动器。加密密钥的恢复不在本书范围内。这里显示的示例假定密钥是已知的。

对驱动器进行物理检查可以判断它是否为 Opal SED。驱动器标签上打印的物理安全 ID(PSID)字符串如图 5-2 所示。该字符串用于 Opal RevertSP 功能,它会安全地生成一个新密钥,销毁所有数据并将驱动器重置为原始工厂状态。PSID 不能从驱动器中查询,如果存在二维码,必须通过物理读取或扫描。PSID 字符串的存在并不意味着驱动器已被锁定且设置了密码;它仅表示该驱动器支持 Opal 全盘加密。

image

图 5-2:Opal SED PSID

全盘加密存在一个鸡和蛋的问题。如果整个驱动器被加密,包括引导扇区,那么系统如何执行主引导记录(MBR)并要求输入密码或其他安全凭证?解决方案是实现一个影像 MBR并将其存储在磁盘的系统区域(与 SMART 数据、坏道列表等存储的地方相同)。当 Opal 磁盘处于锁定状态时,只有影像 MBR 对主机可见。它是一组未加密的扇区(可以很大——例如 150MB),作为普通 MBR 执行(主机完全不知道它正在使用影像 MBR)。这个替代启动区域可以执行代码来请求密码、访问受信任的平台模块(TPM)芯片或智能卡,或获取其他凭证。一旦磁盘解锁,正确的 MBR 就会变得可见,并且可以开始正常的启动过程。

创建了一个开源命令行工具来管理 Linux 下的 Opal SED 加密。最初称为 msed,它可以在github.com/r0m30/msed/找到,但该工具最近更名为 sedutil-cli 并移至github.com/Drive-Trust-Alliance/sedutil/。该工具仍在开发中,可能无法在所有驱动器上工作。请仔细按照说明操作,并确保内核中启用了libata.allow_tpm

以下命令扫描本地系统中的所有 Opal 兼容 SED 驱动器。在四个连接的驱动器中,检测到一个磁盘为 Opal 版本 2:

# sedutil-cli --scan

Scanning for Opal compliant disks
/dev/sda  2  Crucial_CT250MX200SSD1                 MU01
/dev/sdb No  WDC WD20EZRX-00D8PB0                   80.00A80
/dev/sdc No  INTEL SSDSA2CW300G3                    4PC10302
/dev/sdd No  Kingston SHPM2280P2H/240G              OC34L5TA
No more disks present ending scan

你可以查询驱动器以查找有关 Opal 状态的信息,包括磁盘是否加密、锁定或是否有影像 MBR(这三种情况在本示例中都有显示):

# sedutil-cli --query /dev/sda

/dev/sda ATA Crucial_CT250MX200SSD1                  MU01             15030E69A241
...
Locking function (0x0002)
   Locked = Y, LockingEnabled = Y, LockingSupported = Y, MBRDone = N,
   MBREnabled = Y, MediaEncrypt = Y
...

可以发出两个命令:一个用于禁用锁定,另一个则告知磁盘不需要影像 MBR(MBR 为“完成”)。在本示例中,xxmonkey是密码:

# sedutil-cli --disableLockingRange 0 xxmonkey /dev/sda
- 16:33:34.480 INFO: LockingRange0 disabled
# sedutil-cli --setMBRDone on xxmonkey /dev/sda
- 16:33:54.341 INFO: MBRDone set on

此时,内核消息(dmesg)可能显示可用设备的变化。此示例中的状态现在显示如下:

# sedutil-cli --query /dev/sda

/dev/sda ATA Crucial_CT250MX200SSD1                   MU01             15030E69A241
...
Locking function (0x0002)
    Locked = N, LockingEnabled = Y, LockingSupported = Y, MBRDone = Y,
    MBREnabled = Y, MediaEncrypt = Y
...

驱动器不再被锁定,影子 MBR 不再可见。正确的 MBR 和解密后的磁盘其他部分可用,并且可以通过常规的取证工具访问。现在,Linux 安装的分区表变得可见,如此示例所示:

# mmls /dev/sda
DOS Partition Table
Offset Sector: 0
Units are in 512-byte sectors

     Slot    Start        End          Length       Description
00:  Meta    0000000000   0000000000   0000000001   Primary Table (#0)
01:  -----   0000000000   0000002047   0000002048   Unallocated
02:  00:00   0000002048   0471887871   0471885824   Linux (0x83)
03:  -----   0471887872   0471889919   0000002048   Unallocated
04:  Meta    0471889918   0488396799   0016506882   DOS Extended (0x05)
05:  Meta    0471889918   0471889918   0000000001   Extended Table (#1)
06:  01:00   0471889920   0488396799   0016506880   Linux Swap / Solaris x86 (0x82)
07:  -----   0488396800   0488397167   0000000368   Unallocated

一个没有启用影子 MBR 的锁定驱动器会在内核的 dmesg 输出中产生多个错误消息。

本节中描述的简单示例仅用于说明目的。一些 Opal 磁盘在使用该工具时可能会有不同的表现。在实际场景中,密钥可能不是简单的密码,而是与 TPM 或其他企业安全机制绑定。如果在这种情况下输入错误的命令,磁盘上的数据可能会被不可逆转地销毁(如果密钥被销毁,瞬间就会丧失)。

从取证的角度来看,镜像影子 MBR 以供分析可能是有用的。它可能包含在磁盘加密设置时产生的有趣文物。也可以设想,数据可能隐藏在 Opal 兼容驱动器的影子 MBR 区域中。

加密闪存驱动器

被销售为“安全”设备的 USB 闪存驱动器通常附带供应商提供的专有软件加密解决方案。一些驱动器提供操作系统独立的加密,并通过键盘、指纹识别器或智能卡进行身份验证(见图 5-3)。

image

图 5-3:加密 USB 闪存驱动器

专有解决方案可能没有兼容的工具来管理访问权限,这使得使用 Linux 获取解密数据变得困难。带有内部认证机制的设备在认证后应显示为普通的 USB 存储设备。

被锁定的安全闪存驱动器在连接到主机时可能表现不同。有些不会提供任何已插入主机的提示。有些会表现为没有介质的可移动存储设备(如存储卡读取器)。有些会表现为 CD-ROM,并提供软件运行或安装,以管理驱动器。

更大的硬件加密外部驱动器也存在,可能需要一个 PIN 码来解锁。此类驱动器的示例在第七章中有所描述(见图 7-1 于第 216 页)。

附加可移动存储介质

本节讨论了使用可移动存储介质的设备的连接。可移动介质最常见的例子是光盘、存储卡和磁带。以某种方式,将可移动存储介质连接到采集主机的过程分为两步。首先是设备电子组件的连接,然后在另一步中插入可移动介质。让我们从讨论光盘驱动器开始。

光盘驱动器

光盘驱动器通常通过 SATA 连接内部或通过 USB 连接外部。驱动器出现在 Linux 设备树中,但没有介质。在空驱动器上运行取证命令会产生明显的结果,如下所示:

# mmls /dev/cdrom
Error opening image file (raw_open: file "/dev/cdrom" - No medium found)

两个有用的命令提供有关附加驱动器和插入光盘的信息。cd-drive命令提供关于附加光盘驱动器(内部或外部)的详细信息,包括各种功能、支持的媒体等:

# cd-drive
cd-drive version 0.83 x86_64-pc-linux-gnu
...
CD-ROM drive supports MMC 3

                       Drive: /dev/cdrom
Vendor                      : ASUS
Model                       : BW-16D1HT
Revision                    : 1.01
Profile List Feature
        Blu Ray BD-RE
        Blu Ray BD-R random recording
        Blu Ray BD-R sequential recording
        Blu Ray BD-ROM
        DVD+R Double Layer - DVD Recordable Double Layer
        DVD+R - DVD Recordable
        DVD+RW - DVD Rewritable
        DVD-R - Double-layer Jump Recording
        DVD-R - Double-Layer Sequential Recording
        Re-recordable DVD using Sequential Recording
        Re-recordable DVD using Restricted Overwrite
        Re-writable DVD
        Re-recordable DVD using Sequential recording
        Read only DVD
        CD-RW Re-writable Compact Disc capable
        Write once Compact Disc capable
        Read only Compact Disc capable
...
Removable Medium Feature
        Tray type loading mechanism
        can eject the medium or magazine via the normal START/STOP command
        can be locked into the Logical Unit
...

当你将光盘插入驱动器时,可以使用cd-info命令获取关于媒体的信息。结果包括模式、格式以及出版商的信息:

# cd-info
cd-info version 0.83 x86_64-pc-linux-gnu
Disc mode is listed as: CD-DA
CD-ROM Track List (1 - 1)
  #: MSF       LSN    Type   Green? Copy? Channels Premphasis?
  1: 00:02:00  000000 data   false  no
170: 39:42:20  178520 leadout (400 MB raw, 400 MB formatted)
Media Catalog Number (MCN): 0000000000000
TRACK  1 ISRC: 000000000000
Last CD Session LSN: 0
audio status: invalid
__________________________________
CD Analysis Report
CD-ROM with ISO 9660 filesystem
ISO 9660: 154301 blocks, label `SOLARIS_2_5_1_SPARC '
Application: NOT SPECIFIED
Preparer   : SOLARIS_PRODUCT_ENGINEERING
Publisher  : SUNSOFT_INC
System     : SUNSOFT_INC
Volume     : SOLARIS_2_5_1_SPARC
Volume Set : SOLARIS_2_5_1_SERIES

你可以使用eject shell 命令弹出光盘媒体。

在光盘驱动器上使用写保护器是不必要的。仅仅通过访问光盘上的文件并不会更新时间戳。修改光盘需要明确的刻录指令,从而降低了意外修改的风险。

磁带驱动器

你可以使用 lshw 工具和磁带类来确定附加的磁带驱动器列表。输出提供关于驱动器供应商、序列号和设备信息的详细信息。

在这个例子中,发现了两个磁带驱动器(LTO 和 DAT):

# lshw -class tape
  *-tape
       description: SCSI Tape
       product: LTO-5 HH
       vendor: TANDBERG
       physical id: 0.0.0
       bus info: scsi@13:0.0.0
       logical name: /dev/nst0
       version: Y629
       serial: HU1246T99F
       capabilities: removable
       configuration: ansiversion=6
  *-tape
       description: SCSI Tape
       product: DAT160
       vendor: HP
       physical id: 0.0.0
       bus info: scsi@15:0.0.0
       logical name: /dev/nst1
       version: WU8A
       serial: HU10123NFH
       capabilities: removable
       configuration: ansiversion=3

磁带驱动器通常是 SCSI 设备,你可以使用标准 SCSI 命令查询。控制磁带的标准工具是 mt,它提供关于驱动器状态的信息,控制磁带位置,并弹出媒体。mt 工具可以提供有关磁带的基本信息,但 tapeinfo 工具更为全面。在这个例子中,mt 和 tapeinfo 工具查询加载磁带的 LTO 磁带驱动器的状态:

# mt -f /dev/nst0 status
SCSI 2 tape drive:
File number=1, block number=0, partition=0.
Tape block size 0 bytes. Density code 0x58 (no translation).
Soft error count since last status=0
General status bits on (81010000):
 EOF ONLINE IM_REP_EN

# tapeinfo -f /dev/nst0
Product Type: Tape Drive
Vendor ID: 'TANDBERG'
Product ID: 'LTO-5 HH         '
Revision: 'Y629'
Attached Changer API: No
SerialNumber: 'HU1246T99F'
MinBlock: 1
MaxBlock: 16777215
SCSI ID: 0
SCSI LUN: 0
Ready: yes
BufferedMode: yes
Medium Type: Not Loaded
Density Code: 0x58
BlockSize: 0
DataCompEnabled: yes
DataCompCapable: yes
DataDeCompEnabled: yes
CompType: 0x1
DeCompType: 0x1
Block Position: 166723430
Partition 0 Remaining Kbytes: 1459056
Partition 0 Size in Kbytes: 1459056
ActivePartition: 0
EarlyWarningSize: 0
NumPartitions: 0
MaxPartitions: 1

磁带头位于磁带上的第二个文件位置(文件 1 位于文件 0 之后)。块偏移和文件偏移在法医收集磁带上的单个文件时非常有用。

使用 mt 命令,你可以倒带磁带并将其下线(弹出它们):

# mt -f /dev/nst0 status

当磁带设备连接到 Linux 系统时,会创建多个相应的设备。

# ls -1 /dev/*st0*
/dev/nst0
/dev/nst0a
/dev/nst0l
/dev/nst0m
/dev/st0
/dev/st0a
/dev/st0l
/dev/st0m

st*设备在每个命令之后会自动倒带磁带(这并非总是所需的),而nst*设备则是非倒带设备。alm字符代表相同的设备,只是具有不同的特性(如块大小、压缩)。在进行法医收集时,应该使用nst[*]设备(没有附加的alm字符)。

内存卡

内存卡通常通过带有多个插槽的 USB 适配器连接到主机,以支持不同类型的内存卡。连接后,适配器为每个插槽创建一个可移动的 SCSI 设备(即使插槽为空)。这种行为可以通过以下的 dmesg 输出观察到。

[ 2175.331711] usb 1-7: new high-speed USB device number 10 using xhci_hcd
[ 2175.461244] usb 1-7: New USB device found, idVendor=058f, idProduct=6362
[ 2175.461249] usb 1-7: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 2175.461252] usb 1-7: Manufacturer: Generic
[ 2175.461938] usb-storage 1-7:1.0: USB Mass Storage device detected
[ 2175.462143] scsi host15: usb-storage 1-7:1.0
[ 2176.458662] scsi 15:0:0:0: Direct-Access     Generic  USB SD Reader    1.00
    PQ: 0 ANSI: 0
[ 2176.459179] scsi 15:0:0:1: Direct-Access     Generic  USB CF Reader    1.01
    PQ: 0 ANSI: 0
[ 2176.459646] scsi 15:0:0:2: Direct-Access     Generic  USB SM Reader    1.02
    PQ: 0 ANSI: 0
[ 2176.460089] scsi 15:0:0:3: Direct-Access     Generic  USB MS Reader    1.03
    PQ: 0 ANSI: 0
[ 2176.460431] sd 15:0:0:0: Attached scsi generic sg11 type 0
[ 2176.460641] sd 15:0:0:1: Attached scsi generic sg12 type 0
[ 2176.460863] sd 15:0:0:2: Attached scsi generic sg13 type 0
[ 2176.461150] sd 15:0:0:3: Attached scsi generic sg14 type 0
[ 2176.463711] sd 15:0:0:0: [sdj] Attached SCSI removable disk
[ 2176.464510] sd 15:0:0:1: [sdk] Attached SCSI removable disk
[ 2176.464944] sd 15:0:0:2: [sdl] Attached SCSI removable disk
[ 2176.465339] sd 15:0:0:3: [sdm] Attached SCSI removable disk

当你将媒体插入插槽时,媒体会作为 USB 大容量存储设备提供,并具有线性的“扇区”序列,你可以进行法医收集。从前面的例子继续,一个内存卡现在已经插入到读卡器的插槽中,并作为块设备出现:

[ 2310.750147] sd 15:0:0:0: [sdj] 7959552 512-byte logical blocks: (4.07 GB/3.79 GiB)
[ 2310.753162]  sdj: sdj1

硬件查询工具,如 hdparm 和 smartctl,可能会产生不可靠的结果,因为内存卡没有更复杂的驱动器和专用驱动电路的 ATA 功能。

连接其他存储设备

有时,存储介质会连接到取证采集主机,并以独特的方式运行。特别是,了解便携设备、苹果计算机系统和 NVME 驱动器的特殊行为非常有用。

苹果目标磁盘模式

TDM(Target Disk Mode)允许带有 OpenBoot 固件或更新固件的苹果计算机启动到一个状态,此时 Mac 系统会作为外部磁盘外壳显示,内部磁盘作为 SCSI 目标设备可用。早期的 TDM 实现使用 FireWire 总线,但现在已转向 Thunderbolt。你可以通过在开机时按住 T 键来激活此模式。

没有 Thunderbolt 适配器的 Linux 机器可以使用 FireWire 适配器实现相同的效果。图 5-4 展示了一张 Thunderbolt 到 FireWire 适配器的照片。

image

图 5-4:Thunderbolt 到 FireWire 适配器

确保在插入 Thunderbolt 到 FireWire 适配器后(并按住 T 键)启动苹果设备,否则苹果固件不会使用 FireWire 适配器来作为目标设备。

以下示例显示了一个连接到 Linux 机器的苹果笔记本的 dmesg 输出,该机器通过 Thunderbolt 到 FireWire 适配器连接(苹果使用 Thunderbolt;Linux 机器使用 FireWire):

[  542.964313] scsi host10: SBP-2 IEEE-1394
[  542.964404] firewire_core 0000:0e:00.0: created device fw1: GUID
    000a27020064d0ef, S800
[  543.163093] firewire_sbp2 fw1.0: logged in to LUN 0000 (0 retries)
[  543.163779] scsi 10:0:0:0: Direct-Access-RBC AAPL     FireWire Target 0000
    PQ: 0 ANSI: 3
[  543.164226] sd 10:0:0:0: Attached scsi generic sg10 type 14
[  543.165006] sd 10:0:0:0: [sdj] 236978176 512-byte logical blocks:
    (121 GB/113 GiB)
[  543.165267] sd 10:0:0:0: [sdj] Write Protect is off
[  543.165271] sd 10:0:0:0: [sdj] Mode Sense: 10 00 00 00
[  543.165759] sd 10:0:0:0: [sdj] Write cache: enabled, read cache: enabled,
    doesn't support DPO or FUA
[  543.171533] sdj: sdj1 sdj2 sdj3
[  543.173479] sd 10:0:0:0: [sdj] Attached SCSI disk

配有 Thunderbolt 端口的 PC 型 Linux 系统不常见,而且 Linux 内核的支持仍在开发中。作为替代方案,你可以使用取证启动 CD/USB 设备启动最近的苹果计算机,并将其数据获取到本地连接的证据驱动器中。

NVME SSD

NVME 驱动器与 SATA Express 在连接到 PCI Express 总线的方式上竞争。截止目前,NVME 驱动器的硬件写保护器非常新。Tableau(Guidance Software)提供了适用于 NVME 和 SATA Express 驱动器的热插拔 USB 桥接器。为了说明,下面的示例使用了直接连接到 Linux 系统的 NVME 设备。

你可以使用 nvme-cli 软件包中的 nvme 工具列出已连接的 NVME 设备:

# nvme list
Node             Model                Version  Namepace Usage                   ...
---------------- -------------------- -------- -------- --------------------------
/dev/nvme0n1     INTEL SSDPE2MW400G4  1.0      1        400.09  GB / 400.09  GB ...
/dev/nvme1n1     Samsung SSD 950 PRO  1.1      1          3.01  GB / 256.06  GB ...
...

你还应该使用 nvme 工具检查每个 NVME 驱动器的多个命名空间。在这个示例中,只有一个命名空间存在:

# nvme list-ns /dev/nvme1
[   0]:0x1

可能需要单独获取多个命名空间。这与其他驱动器有根本区别,后者将单个驱动器视为一组线性的扇区,可以一次性获取。具有多个命名空间的 NVME 驱动器可能需要特别注意。^(8)

需要注意的是,NVME 标准是从零开始创建的,并且与 SCSI 或 ATA 标准(如 AHCI 等)不具备向后兼容性。它有自己的一套命令集,并独立于其他磁盘系统运行。因此,一些工具可能无法与 NVME 硬件正常配合使用。任何直接操作低级设备驱动程序的取证工具(如 SATA 或 SAS)将无法与 NVME 配合使用。然而,如果取证工具操作的是虚拟块层,它们应该能够正常工作。此外,PCI 取证写保护器可能充当桥接作用,使设备看起来像 SCSI 设备。例如,以下是使用 Sleuth Kit mmls 工具对连接到检查主机的 NVME 驱动器进行操作的示例:

# mmls /dev/nvme1n1
DOS Partition Table
Offset Sector: 0
Units are in 512-byte sectors

     Slot    Start        End          Length       Description
00:  Meta    0000000000   0000000000   0000000001   Primary Table (#0)
01:  -----   0000000000   0000002047   0000002048   Unallocated
02:  00:00   0000002048   0167774207   0167772160   Linux (0x83)
03:  00:01   0167774208   0335546367   0167772160   Linux (0x83)
04:  00:02   0335546368   0500118191   0164571824   Linux (0x83)

请注意,设备是nvme1n1而不仅仅是nvme1。在对 NVME 驱动器使用命令时,必须指定驱动器的命名空间。

与其他驱动器一样,NVME 驱动器也有 SMART 日志,但你无法通过当前版本的 smartctl 访问它(截至目前)。然而,你可以使用 nvme 工具提取 SMART 日志,方法如下:

# nvme smart-log /dev/nvme1
Smart Log for NVME device:/dev/nvme1 namespace-id:ffffffff
critical_warning          : 0
temperature               : 46 C
available_spare           : 100%
available_spare_threshold : 10%
percentage_used           : 0%
data_units_read           : 2,616
data_units_written        : 5,874
host_read_commands        : 19,206
host_write_commands       : 56,145
controller_busy_time      : 0
power_cycles              : 34
power_on_hours            : 52
unsafe_shutdowns          : 17
media_errors              : 0
num_err_log_entries       : 7

nvme 工具有许多用于查询连接的 NVME 驱动器的功能。请参阅 nvme(1)手册页面或访问github.com/linux-nvme/了解更多信息。

截至目前,NVME 驱动器是一项新兴技术。由于它们在性能和效率方面有许多优点,未来它们可能会变得更加流行。

其他具有块或字符访问权限的设备

你可以对任何被 Linux 内核识别为块设备的设备进行成像。一些设备在连接到主机系统时会立即显示为块设备。例如,许多通用的 MP3/音乐播放器、相机和其他移动设备就是如此。

一些设备需要切换到不同的“磁盘”模式,才能作为块设备进行访问。通常,你可以通过设备的用户界面选择该模式。

一些 USB 设备是多功能的,除了存储功能外,它们还可能提供其他 USB 模式。在进行采集之前,你可能需要将这些设备切换到 usb-storage 模式。一个名为 usb_modeswitch 的 Linux 工具能够查询一些多功能 USB 设备并切换模式。

结束思考

在本章中,你学习了如何将一个主题驱动器连接到采集机器并正确识别设备以进行成像。你学习了计算机硬件的不同方面(如 USB、PCI、块设备等),如何查询你的采集系统,以及如何查询驱动器的固件和 SMART 信息。我演示了如何移除 HPA 和 DCO,以及一些驱动器硬件中内置的各种安全功能。现在,你已经掌握了进行取证采集所需的知识,而这将是第六章的重点内容。

第七章:取证图像获取

image

本章解释了存储介质的取证成像,重点是执行取证性图像获取。这意味着最大化从特定存储介质中提取的数据量,最小化对存储设备和介质的干扰,保存收集到的证据,并记录过程(包括错误)。

你将在这里阅读到几种工具和方法,以及每种工具的优缺点。结果,你将能够根据特定情况做出明智的决定,选择最合适的工具。你将学习如何使用多种免费的或开源的取证成像工具,例如 dd、dcfldd、dc3dd、ewfacquire 和 ftkimager-cli。此外,我还描述了 sfsimage 工具,这是一个使用现有获取工具创建 SquashFS 取证证据容器的脚本。

在进行磁盘成像时,如何选择使用哪个工具?在某种程度上,这取决于个人偏好。你可能比其他工具更熟悉某个工具,或者基于过去的经验信任某个特定的工具(或者由于过去的经验不信任某个工具)。每个工具都有其优势和独特的功能。广泛使用 EnCase 或 FTK 的取证实验室可能会选择 ewfacquire 或 ftkimager-cli,出于兼容性和政策原因。dcfldd 和 dc3dd 基于成熟且经过充分测试的软件,旨在进行取证性原始图像获取,并且具备广泛的哈希计算和日志记录功能。对于具有许多坏道的磁盘,GNU ddrescue 可能是一个不错的选择。对于在获取过程中进行集成哈希、加密和压缩,近期版本的 dd_rescue 可能是一个有趣的替代方案。最终,所使用的工具将取决于取证实验室的组织政策、检查类型、个人偏好以及其他情况。本书中没有推荐特定的工具。

本章中的所有示例都基于以下假设:

• 受检存储设备物理上连接到取证检查员的获取工作站。

• 受检存储设备已被确认。

• 已采取适当的写入阻断措施,以防止修改受检驱动器。

• 已经进行了磁盘容量规划,以确保磁盘空间不成为问题。

使用 dd 工具获取图像

使用基于 dd 的工具生成的图像文件,并不像其他取证格式(例如 EnCase EWF 或 FTK SMART)那样是“格式”。由 dd 工具创建的图像没有头部、尾部、内部标记,或者有关案件或事件的描述性元数据。它们只是数据的一种原始镜像,在本例中,是受检磁盘或其他大容量存储的镜像。

注意

警告: 如果你犯任何错误,dd 工具将毫不宽容地不可逆地覆盖任何未受保护的磁盘。

为了减少损坏证据或检查工作站的风险,始终仔细检查以下事项:

• 写保护器正在保护证据/目标驱动器。

• 输入设备的序列号(if=)与物理目标磁盘标签上的序列号匹配。

• 确认输出文件(of=)是一个普通文件,位于检查员系统中,或者是一个能够处理预期输入的程序,接收标准输入(stdin)。

标准 Unix dd 和 GNU dd

dd 命令的语法简单地指定了输入文件和输出文件,并且可以包括其他选项来修改命令的行为。以下示例展示了使用 dd 将磁盘块设备复制到文件的操作:

# dd if=/dev/sde of=image.raw
15466496+0 records in
15466496+0 records out
7918845952 bytes (7.9 GB) copied, 130.952 s, 60.5 MB/s

这里的 if= 指定了输入文件,在此情况下是连接到采集系统的原始磁盘设备。of= 参数是输出文件,它是一个包含从磁盘设备复制的原始数据的普通文件。完成后,dd 会报告传输了多少字节。你可以将传输的字节数除以扇区大小,结果应该与连接设备时识别的扇区数完全匹配。

在使用 dd 进行法证磁盘成像时可能会遇到挑战。如果在采集过程中发生读取错误,dd 会以“输入/输出错误”中止。通过添加 conv=noerror 可以解决这个问题,它会强制 dd 跳过无法读取的块并继续执行。跳过无法读取的块的问题在于,目标文件中的扇区偏移会发生变化,这会导致磁盘其余部分的文件系统块出现错误。例如,考虑一本书的页面。假设 第 99 页被撕掉。如果目录指向以 第 200 页 开头的章节,仍然可以找到它。即使缺少一页,书的页码仍然是完整的。但是,当磁盘镜像中的第 99 扇区由于读取错误被撕掉时,情况就不同了。其余的扇区会重新编号,文件系统的“目录”会在第 99 扇区之后指向错误的块。

sync 参数通过用零填充无法读取的输出块来修正这一问题,实质上创建了一个“虚拟”扇区或块(全是零),以代表丢失的块。磁盘镜像的其余部分将会有文件系统期望的正确扇区号(偏移量)。

使用前面的示例,但这次启用了防止读取错误块(跳过并用零填充它们),结果如下:

# dd if=/dev/sde of=image.raw conv=noerror,sync
15466496+0 records in
15466496+0 records out
7918845952 bytes (7.9 GB) copied, 136.702 s, 57.9 MB/s

填充输出会影响取证获取,因为镜像已经被修改并添加了新数据(零)。磁盘的加密校验和将与磁盘上的原始数据不匹配(特别是当磁盘上有新的或变化的不可读区域时)。这个问题可以通过记录哈希窗口来管理。有关这一点,请参见 “哈希窗口” 第 152 页。

dd 的另一个问题是,传输块的大小可能大于物理介质的扇区大小。当发生读取错误时,这是一个问题,因为较大的块中剩余的扇区会被填充零,而不仅仅是不可读的一个扇区。这意味着一些正常可读的扇区可能会被排除在取证镜像之外。大于扇区大小的块大小还可能导致在取证镜像的末尾添加额外的填充扇区(如果镜像大小不能被块大小整除)。增加块大小可能带来的性能提升,必须与丢失来自大填充块的证据的风险进行权衡。

传统的 dd 工具没有哈希、日志记录或其他你期望从取证获取工具中得到的功能。由于原始镜像不包含关于原始磁盘的元数据,你必须单独记录任何描述磁盘的信息(或将部分信息嵌入到文件名中)。

dcfldd 和 dc3dd 工具

两个流行的 dd 派生工具,dcfldd 和 dc3dd,都是专门为取证环境独立开发的。

因为 dcfldd 和 dc3dd 都源自 GNU dd,所以它们使用相似的命令语法。两个工具都没有内置支持写入取证格式(FTK、EnCase、AFF)、压缩或镜像加密。但你可以通过使用命令管道来实现这些功能,我将在后续部分进行演示。

以下例子使用 dcfldd 来对磁盘进行镜像,确保包含不可读扇区的块会被填充,并且不会导致中止:

# dcfldd if=/dev/sde of=image.raw conv=noerror,sync errlog=error.log
241664 blocks (7552Mb) written.
241664+0 records in
241664+0 records out

错误会被写入单独的错误日志文件。dcfldd 工具默认不使用 conv=noerror,sync,你必须手动添加它。

下一个例子展示了 dc3dd 的类似镜像命令。默认情况下,dc3dd 在获取过程中能够很好地管理错误。无需 conv=noerror,sync 标志,因为它是内置的。输出会很好地记录,既写入 stdout,也写入日志文件。这里是一个简单的获取示例:

# dc3dd if=/dev/sde of=image.raw log=error.log

dc3dd 7.2.641 started at 2016-05-07 14:37:10 +0200
compiled options:
command line: dc3dd if=/dev/sde of=image.raw log=error.log
device size: 15466496 sectors (probed),    7,918,845,952 bytes
sector size: 512 bytes (probed)
  7918845952 bytes ( 7.4 G ) copied ( 100% ),   80 s, 95 M/s

input results for device `/dev/sde':
   15466496 sectors in
   0 bad sectors replaced by zeros
output results for file `image.raw':
   15466496 sectors out

dc3dd completed at 2016-05-07 14:38:30 +0200

你也可以配置 sfsimage 脚本,使用 dcfldd 或 dc3dd 将数据镜像到 SquashFS 取证容器中。在以下例子中,使用 sfsimage 镜像一个 4K 原生(4096 字节原生扇区大小)驱动器:

# sfsimage -i /dev/sdd 4Knative.sfs
Started: 2016-05-07T17:16:54
Sfsimage version: Sfsimage Version 0.8
Sfsimage command: /usr/bin/sfsimage -i /dev/sdd
Current working directory: /exam
Forensic evidence source: if=/dev/sdd
Destination squashfs container: 4Knative.sfs
Image filename inside container: image.raw
Aquisition command: sudo dc3dd if=/dev/sdd log=errorlog.txt hlog=hashlog.txt
    hash=md5 2>/dev/null | pv -s 3000592982016
2.73TiB 5:29:31 [ 144MiB/s] [==========================================>] 100%
Completed: 2016-05-07T22:47:42
# cat /sys/block/sdd/queue/logical_block_size
4096
# cat /sys/block/sdd/queue/physical_block_size
4096

这个例子也说明了,当使用 dd 风格的镜像工具时,驱动器的物理和逻辑扇区大小不会影响获取过程。

dcfldd 和 dc3dd 具有额外的功能,包括加密哈希、镜像拆分和与外部程序的管道传输。我将在本书的接下来的部分中展示这些功能在各种情况下的应用。

使用取证格式采集镜像

有几个成像格式是专门为取证设计的。例如,FTK 和 EnCase 是商业专有格式,已经被逆向工程化,以便开发兼容开源工具。接下来的两节将介绍使用这些专有格式进行采集的工具。

ewfacquire 工具

ewfacquire 是一个专门用于 Guidance EnCase Expert Witness 格式的采集工具,来自 libewf (github.com/libyal/libewf/)。该工具可以在命令行上接受信息性参数,或者交互式地询问用户。你可以从多个商业格式中进行选择,包括各种 EnCase 格式以及 FTK。ewfacquire 工具创建的采集文件支持与 EnCase、FTK 和 Sleuth Kit 的互操作性。该工具还可以将原始镜像转换为其他格式。

本示例展示了 ewfacquire 采集一个附加的磁盘设备(一个通过 Thunderbolt 到 FireWire 适配器连接到检查工作站的 MacBook Air,处于目标磁盘模式):

# ewfacquire -c best -t /exam/macbookair /dev/sdf
ewfacquire 20160424

Device information:
Bus type:                             FireWire (IEEE1394)
Vendor:
Model:
Serial:

Storage media information:
Type:                                 Device
Media type:                           Fixed
Media size:                           121 GB (121332826112 bytes)
Bytes per sector:                     512

Acquiry parameters required, please provide the necessary input
Case number: 42
Description: The case of the missing vase
Evidence number: 1
Examiner name: holmes
Notes: The vase was blue.
Media type (fixed, removable, optical, memory) [fixed]:
Media characteristics (logical, physical) [physical]:
Use EWF file format (ewf, smart, ftk, encase1, encase2, encase3, encase4, encase5,
    encase6, encase7, encase7-v2, linen5, linen6, linen7, ewfx) [encase6]:
Start to acquire at offset (0 <= value <= 121332826112) [0]:
The number of bytes to acquire (0 <= value <= 121332826112) [121332826112]:
Evidence segment file size in bytes (1.0 MiB <= value <= 7.9 EiB) [1.4 GiB]:
The number of bytes per sector (1 <= value <= 4294967295) [512]:
The number of sectors to read at once (16, 32, 64, 128, 256, 512, 1024, 2048, 4096,
    8192, 16384, 32768) [64]:
The number of sectors to be used as error granularity (1 <= value <= 64) [64]:
The number of retries when a read error occurs (0 <= value <= 255) [2]:
Wipe sectors on read error (mimic EnCase like behavior) (yes, no) [no]:

The following acquiry parameters were provided:
Image path and filename:                /exam/macbookair.E01
Case number:                            42
Description:                            The case of the missing vase
Evidence number:                        1
Examiner name:                          holmes
Notes:                                  The vase was blue.
Media type:                             fixed disk
Is physical:                            yes
EWF file format:                        EnCase 6 (.E01)
Compression method:                     deflate
Compression level:                      best
Acquiry start offset:                   0
Number of bytes to acquire:             113 GiB (121332826112 bytes)
Evidence segment file size:             1.4 GiB (1572864000 bytes)
Bytes per sector:                       512
Block size:                             64 sectors
Error granularity:                      64 sectors
Retries on read error:                  2
Zero sectors on read error:             no

Continue acquiry with these values (yes, no) [yes]:

Acquiry started at: May 07, 2016 14:54:52
This could take a while.

Status: at 0.0%
        acquired 60 MiB (62914560 bytes) of total 113 GiB (121332826112 bytes)
        completion in 2 hour(s), 8 minute(s) and 38 second(s) with 14 MiB/s
    (15712616 bytes/second)
...
Status: at 99.9%
        acquired 112 GiB (121329188864 bytes) of total 113 GiB (121332826112 bytes)
        completion in 0 second(s) with 51 MiB/s (54069886 bytes/second)

Acquiry completed at: May 07, 2016 15:32:16

Written: 113 GiB (121332826300 bytes) in 37 minute(s) and 24 second(s) with
    51 MiB/s (54069886 bytes/second)
MD5 hash calculated over data:          083e2131d0a59a9e3b59d48dbc451591
ewfacquire: SUCCESS

ewfacquire 采集在 37 分钟内成功完成,120GB 文件被拆分为 54 个压缩的**.E0*文件,总计 79GB。

AccessData ftkimager

AccessData 提供了免费的、预编译的命令行版本 FTK Imager。该工具名为 ftkimager,二进制文件(没有源代码)适用于 Debian Linux、Fedora Linux、OS X 和 Windows,你可以从 AccessData 网站下载,网址是accessdata.com/product-download/digital-forensics/

ftkimager 工具可以从原始设备、文件或 stdin 接收输入。它可以输出到 FTK SMART 格式、EnCase EWF 格式或 stdout。stdin 和 stdout 流特别适用于与其他程序之间的管道传输。还支持许多其他功能,包括将案件元数据添加到保存的格式中、压缩、输出文件拆分(“镜像碎片”)、哈希处理和加密镜像。

以下基本示例演示了使用 ftkimager 获取附加磁盘:

# ftkimager /dev/sdf --s01 --description "SN4C53000120 Ultra Fit" sandisk
AccessData FTK Imager v3.1.1 CLI (Aug 24 2012)
Copyright 2006-2012 AccessData Corp., 384 South 400 West, Lindon, UT 84042
All rights reserved.

Creating image...
Image creation complete.

在此示例中,源设备是通过/dev/sdf访问的 SanDisk U 盘,目标文件名是sandisk。由于默认格式是原始格式,添加--s01标志将其保存为 FTK 的 SMART 格式。通过--description标志添加了一个序列号和型号字符串到元数据中。

ftkimager 创建了一个日志文件,记录了基本元数据以及使用命令行标志添加的任何附加信息,如下所示:

# cat sandisk.s01.txt
Case Information:
Acquired using: ADI3
Case Number:
Evidence Number:
Unique description: SN4C53000120 Ultra Fit
Examiner:
Notes:

--------------------------------------------------------------

Information for sandisk:

Physical Evidentiary Item (Source) Information:
[Device Info]
 Source Type: Physical
[Drive Geometry]
 Cylinders: 14832
 Heads: 64
 Sectors per Track: 32
 Bytes per Sector: 512
 Sector Count: 30375936
 Source data size: 14832 MB
 Sector count:    30375936
[Computed Hashes]
 MD5 checksum:    a2a9a891eed92edbf47ffba9f4fad402
 SHA1 checksum:   2e73cc2a2c21c9d4198e93db04303f9b38e0aefe

Image Information:
 Acquisition started:   Sat May  7 15:49:07 2016
 Acquisition finished:  Sat May  7 15:53:07 2016
 Segment list:
  sandisk.s01
  sandisk.s02

你可以通过使用--print-info标志并结合文件名来提取相同的信息。

SquashFS 取证证据容器

sfsimage 工具仅仅是一个 shell 包装脚本,你可以配置它以使用任何支持将镜像干净地写入 stdout 的镜像工具。该脚本将这些成像字节流放入一个 SquashFS 压缩文件系统中。

在这个示例中,通过编辑 shell 脚本开头的DD变量,sfsimage 被配置为使用 dc3dd 作为成像工具:

DD="dc3dd if=$DDIN log=errorlog.txt hlog=hashlog.txt hash=md5"

然后,使用-i标志对块设备进行镜像:

$ sfsimage -i /dev/sde philips-usb-drive.sfs
Started: 2016-05-07T15:40:03
Sfsimage version: Sfsimage Version 0.8
Sfsimage command: /usr/bin/sfsimage -i /dev/sde
Current working directory: /exam
Forensic evidence source: if=/dev/sde
Destination squashfs container: philips-usb-drive.sfs
Image filename inside container: image.raw
Aquisition command: sudo dc3dd if=/dev/sde log=errorlog.txt hlog=hashlog.txt
    hash=md5 2>/dev/null | pv -s 7918845952
7.38GiB 0:01:18 [95.7MiB/s] [=====================================>] 100%
Completed: 2016-05-07T15:41:22

以下输出显示了压缩后的.sfs文件的大小:

$ ls -lh *.sfs
-rw-r----- 1 holmes holmes 4.5G May  7 15:41 philips-usb-drive.sfs

你可以使用sfsimage -l列出 SquashFS 容器文件的内容,或者使用sfsimage -m挂载它(只读)。在获取过程中,sfsimage 会保存错误日志、哈希日志以及它自己的日志,并将其与原始镜像文件一起保存。你可以使用sfsimage -a将额外的文件添加到 sfsimage 容器中。

获取图像到多个目标位置

Unix 管道机制的灵活性使得在单一步骤中可以完成多个复杂任务。dc3dd 和 dcfldd 都可以指定多个目标文件名,从而使得可以同时进行镜像复制。以下示例展示了如何对磁盘进行镜像,并同时将数据写入多个目标驱动器:一个是本地主机上的本地副本,另一个是已挂载的外部第三方驱动器上的副本。这两个输出文件通过多个of=标志来指定,如下所示:

# dc3dd if=/dev/sde of=/exam/local-lab.raw of=/ext/third-party.raw

dc3dd 7.2.641 started at 2016-05-07 15:56:10 +0200
compiled options:
command line: dc3dd if=/dev/sde of=/exam/local-lab.raw of=/ext/third-party.raw
device size: 15466496 sectors (probed),    7,918,845,952 bytes
sector size: 512 bytes (probed)
  7918845952 bytes ( 7.4 G ) copied ( 100% ),   79 s, 95 M/s

input results for device `/dev/sde':
   15466496 sectors in
   0 bad sectors replaced by zeros

output results for file `/exam/local-lab.raw':
   15466496 sectors out

output results for file `/ext/third-party.raw':
   15466496 sectors out

dc3dd completed at 2016-05-07 15:57:30 +0200

这种技术在你创建一个用于分析的镜像和一个用于备份的镜像时非常有用,也适用于你为第三方创建额外镜像的情况,或者任何需要多个镜像副本的情况。这两个镜像应该是完全相同的,你可以通过比较加密校验和来验证它们。

使用加密技术保存数字证据

保证证据的完整性是数字取证过程中的基础。通过使用加密哈希并通过执行获取的技术人员进一步增强加密签名,可以保持完整性。哈希或签名镜像的目的是验证镜像自获取以来没有发生变化。由于法庭程序和证据展示可能需要几个月甚至几年的时间,因此确认证据在此期间没有被修改非常有用。这可以被视为一种数字化的证据链。

接下来的几个部分展示了使用哈希窗口、PGP 和 S/MIME 签名以及 RFC-3161 时间戳来保存数字证据。我们先从一些基本的加密哈希示例开始。

基本的加密哈希

数字取证镜像的加密哈希通常是成像过程的一部分。整个媒体镜像(每个扇区按顺序)会通过单向哈希函数。到目前为止,本书讨论的四个主要的取证成像工具支持表 6-1 中所示的加密哈希算法。

表 6-1: 支持的加密哈希算法

工具 支持的哈希算法
dcfldd MD5, SHA1, SHA256, SHA384, SHA512
dc3dd MD5, SHA1, SHA256, SHA512
ewfacquire MD5, SHA1, SHA256
ftkimager MD5, SHA1

使用取证格式的工具通常会默认生成哈希值。ftkimager 和 ewfacquire 会在采集过程中自动生成哈希值,这一点你在前面的示例中已经看到了。

要使用 dcfldd 创建哈希(或多个哈希),你需要在命令行中指定所需的哈希算法,如下所示:

# dcfldd if=/dev/sde of=image.raw conv=noerror,sync hash=md5,sha256
241664 blocks (7552Mb) written.Total (md5): ebda11ffb776f183325cf1d8941109f8
Total (sha256): 792996cb7f54cbfd91b5ea9d817546f001f5f8ac05f2d9140fc0778fa60980a2

241664+0 records in
241664+0 records out

使用 dc3dd 时,你可以通过多次使用hash=来指定哈希算法,如下所示:

# dc3dd if=/dev/sde of=image.raw hash=md5 hash=sha1 hash=sha512

dc3dd 7.2.641 started at 2016-05-07 16:02:56 +0200
compiled options:
command line: dc3dd if=/dev/sde of=image.raw hash=md5 hash=sha1 hash=sha512
device size: 15466496 sectors (probed),    7,918,845,952 bytes
sector size: 512 bytes (probed)
  7918845952 bytes ( 7.4 G ) copied ( 100% ),   80 s, 94 M/s
input results for device `/dev/sde':
   15466496 sectors in
   0 bad sectors replaced by zeros
   ebda11ffb776f183325cf1d8941109f8 (md5)
   62e5045fbf6a07fa77c48f82eddb59dfaf7d4d81 (sha1)
   f0d1132bf569b68d900433aa52bfc08da10a4c45f6b89847f244834ef20bb04f8c35dd625a31c2e3
   a29724e18d9abbf924b16d8f608f0ff0944dcb35e7387b8d (sha512)

output results for file `image.raw':
   15466496 sectors out

dc3dd completed at 2016-05-07 16:04:17 +0200

传统的 dd 命令不支持哈希。相反,你必须在采集过程中将镜像管道传输到一个独立的程序,这可以通过使用 Unix 的 tee 命令来实现:

# dd if=/dev/sde | tee image.raw | md5sum
15466496+0 records in
15466496+0 records out
7918845952 bytes (7.9 GB, 7.4 GiB) copied, 108.822 s, 72.8 MB/s
ebda11ffb776f183325cf1d8941109f8 -

dd没有指定of=时,数据会被发送到 stdout,可以将其重定向或管道传输到另一个程序。在这个例子中,它被管道传输到 Unix 的 tee 命令,该命令同时将数据保存到文件并将其发送到 stdout。然后,它被管道传输到独立的哈希工具 md5sum,这时它会生成哈希。除了 md5sum 之外,Linux 的 coreutils 软件包还包括其他哈希程序:sha1sum、sha224sum、sha256sum、sha384sum 和 sha512sum。

我在 “验证取证镜像的完整性” 章节中解释了验证生成的哈希的过程,详见 第 197 页。

哈希窗口

当你对旧的或损坏的磁盘进行镜像时,可能会出现块读取错误。这些错误可能在采集过程中随机发生,且随着时间的推移,发生的频率可能增加。这会在保全证据的完整性时带来挑战,因为每次读取磁盘时(重新采集、复制、验证等),加密哈希可能会不同。

解决这个问题的方法是使用哈希窗口,或分段哈希。哈希窗口是对磁盘上较小一段扇区序列进行的独立加密哈希。例如,在采集过程中使用 10MB 的哈希窗口大小,会为每 10MB 的扇区序列生成一个单独的哈希,并为磁盘生成一个哈希列表。如果某个扇区变得无法读取(或因某种原因被修改),该窗口的哈希将无效。但磁盘上其他的哈希窗口仍然会保持其完整性。因此,即使整个磁盘的哈希无效,如果某个哈希窗口匹配,窗口内数据的完整性也会得到保留。

在商业取证格式中,早期版本的专家证人格式(EWF)仅使用循环冗余校验(CRC)校验和对数据的单独块进行检查。更新版本不是开放格式,且 ftkimager 没有创建或查看哈希窗口的选项。

要使用 dcfldd 创建哈希窗口,您需要添加hashwindow=参数来指定窗口大小。您可以在获取过程中使用hashlog=参数并指定文件名,将哈希窗口列表保存到文件中。以下示例指定了 1MB 的哈希窗口大小,并将每个扇区范围的哈希值记录到 stdout:

# dcfldd if=/dev/sde of=image.raw conv=noerror,sync hashwindow=1M
0 - 1048576: e0796359399e85ecc03b9ca2fae7b9cf
1048576 - 2097152: 5f44a2407d244c24e261b00de65949d7
2097152 - 3145728: d6d8c4ae64b464dc77658730aec34a01
3145728 - 4194304: 0eae942f041ea38d560e26dc3cbfac48
4194304 - 5242880: 382897281f396b70e76b79dd042cfa7f
5242880 - 6291456: 17664a919d533a91df8d26dfb3d84fb9
6291456 - 7340032: ce29d3ca2c459c311eb8c9d08391a446
7340032 - 8388608: cd0ac7cbbd58f768cd949b082de18d55
256 blocks (8Mb) written.8388608 - 9437184: 31ca089fce536aea91d957e070b189d8
9437184 - 10485760: 48586d6dde4c630ebb168b0276bec0e3
10485760 - 11534336: 0969f7533736e7a2ee480d0ca8d9fad1
...

相同的磁盘扇区组将具有相同的哈希值。这通常发生在磁盘的较大部分是零值或重复模式时。

使用 dc3dd 时,哈希窗口被称为分段哈希,哈希可以通过每个拆分文件创建,而不是通过扇区范围。在下面的示例中,每个拆分文件中扇区范围的哈希值都会被记录:

# dc3dd if=/dev/sda hof=image.raw ofs=image.000 ofsz=1G hlog=hash.log hash=md5

dc3dd 7.2.641 started at 2016-05-07 17:10:31 +0200
compiled options:
command line: dc3dd if=/dev/sda hof=image.raw ofs=image.000 ofsz=1G hlog=hash.log
    hash=md5
device size: 15466496 sectors (probed),    7,918,845,952 bytes
sector size: 512 bytes (probed)
  7918845952 bytes ( 7.4 G ) copied ( 100% ),  114 s, 66 M/s
  7918845952 bytes ( 7.4 G ) hashed ( 100% ),   24 s, 314 M/s

input results for device `/dev/sda':
   15466496 sectors in
   0 bad sectors replaced by zeros
   5dfe68597f8ad9f20600a453101f2c57 (md5)
   c250163554581d94958018d8cca61db6, sectors 0 - 2097151
   cd573cfaace07e7949bc0c46028904ff, sectors 2097152 - 4194303
   83d63636749194bcc7152d9d1f4b9df1, sectors 4194304 - 6291455
   da961f072998b8897c4fbed4c0f74e0e, sectors 6291456 - 8388607
   4cd5560038faee09da94a0c829f07f7a, sectors 8388608 - 10485759
   516ba0bdf8d969fd7e86cd005c992600, sectors 10485760 - 12582911
   c19f8c710088b785c3f2ad2fb636cfcd, sectors 12582912 - 14680063
   fb2eb5b178839878c1778453805b8bf6, sectors 14680064 - 15466495

output results for file `image.raw':
   15466496 sectors out
   [ok] 5dfe68597f8ad9f20600a453101f2c57 (md5)

output results for files `image.000':
   15466496 sectors out

dc3dd completed at 2016-05-07 17:12:25 +0200

如果只有一个镜像文件(即没有拆分),则没有单独的哈希窗口,只有一个针对整个镜像的哈希值。在前面的示例中,创建了八个镜像文件,每个文件的 MD5 哈希值与获取时报告的值一致。可以使用 md5sum 轻松确认,如下所示:

# md5sum image.*
c250163554581d94958018d8cca61db6  image.000
cd573cfaace07e7949bc0c46028904ff  image.001
83d63636749194bcc7152d9d1f4b9df1  image.002
da961f072998b8897c4fbed4c0f74e0e  image.003
4cd5560038faee09da94a0c829f07f7a  image.004
516ba0bdf8d969fd7e86cd005c992600  image.005
c19f8c710088b785c3f2ad2fb636cfcd  image.006
fb2eb5b178839878c1778453805b8bf6  image.007

使用 PGP 或 S/MIME 签名镜像文件

哈希值对于在时间上保持镜像的完整性非常有用,但任何人都可以随时对镜像进行加密哈希。考虑一个磁盘被未经授权的人修改,并为该磁盘镜像创建一个新的哈希值。除非原始哈希在获取时被妥善保管,否则很难证明哪个哈希值(旧的还是新的)是正确的。对取证镜像进行加密签名将某个人(或该人的密钥)与镜像的完整性绑定。取证检查员、上级或外部中立方可以在获取时签署该镜像。

这并不意味着您需要传递多个 TB 大小的镜像文件让别人签名。只需签名磁盘的哈希值或哈希窗口列表即可。最佳选择是签名包含时间戳、获取字节数和所有生成的加密哈希值的完整输出日志。

就像授权的个人用钢笔签署纸质表格一样,他们也可以使用数字签名签署数字表格。与钢笔和纸质签名不同,数字签名很难伪造(除非私钥被盗)。两种常见的数字签名标准是Pretty Good Privacy (PGP)Secure/Multipurpose Internet Mail Extensions (S/MIME)

最常见的 Linux OpenPGP 标准实现是 GnuPG (GPG)。^(1) 三种不同的签名方法包括常规二进制签名、明文签名和分离签名。使用明文签名是最有利的,因为它可以将文本与签名一起显示,并且可以轻松嵌入到其他文档和报告中。

在以下示例中,S. Holmes 进行了磁盘的取证获取,并签署了包含 MD5 哈希值和其他详细信息的日志输出:

$ gpg --clearsign hash.log

You need a passphrase to unlock the secret key for
user: "Sherlock Holmes <holmes@digitalforensics.ch>"
2048-bit RSA key, ID CF87856B, created 2016-01-11

Enter passphrase:

上述命令创建了 hash.log.asc 文件,其中包含文件的内容以及签名:

$ cat hash.log.asc
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

dc3dd 7.2.641 started at 2016-05-07 17:23:49 +0200
compiled options:
command line: dc3dd if=/dev/sda hof=image.raw ofs=image.000 ofsz=1G hlog=hash.log
    hash=md5

input results for device `/dev/sda':
   5dfe68597f8ad9f20600a453101f2c57 (md5)
      c250163554581d94958018d8cca61db6, sectors 0 - 2097151
      cd573cfaace07e7949bc0c46028904ff, sectors 2097152 - 4194303
      83d63636749194bcc7152d9d1f4b9df1, sectors 4194304 - 6291455
      da961f072998b8897c4fbed4c0f74e0e, sectors 6291456 - 8388607
      4cd5560038faee09da94a0c829f07f7a, sectors 8388608 - 10485759
      516ba0bdf8d969fd7e86cd005c992600, sectors 10485760 - 12582911
      c19f8c710088b785c3f2ad2fb636cfcd, sectors 12582912 - 14680063
      fb2eb5b178839878c1778453805b8bf6, sectors 14680064 - 15466495

output results for file `image.raw':
   [ok] 5dfe68597f8ad9f20600a453101f2c57 (md5)

output results for files `image.000':

dc3dd completed at 2016-05-07 17:25:40 +0200

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1

iQEcBAEBAgAGBQJXLgnoAAoJEEg0vvzPh4VrdeAH/0EhCLFSWwTZDNUrIn++1rI3
XI6KuwES19EKR18PrK/Nhf5MsF3xyy3c/j7tjopkfnDGLYRA615ycWEvIJlevNh7
k7QHJoPTDnyJcF29uuTINPWk2MsBlkNdTTiyA6ab3U4Qm+DMC4wVKpOp/io52qq3
KP7Kh558aw8m+0Froc0/4sF7rer9xvBThA2cw+ZiyF5a8wTCBmavDchCfWm+NREr
RIncJV45nuHrQW8MObPOK6G34mruT9nSQFH1LR1FL830m/W69WHS2JX+shfk5g5X
I6I7jNEn6FgiRyhm+BizoSl5F6mv3ff6mRlVysGDJ+FXE3CiE6ZzK+jNB7Pw+Zg=
=6GrG
-----END PGP SIGNATURE-----

该签名文本可以通过任何第三方使用 Holmes 的 GPG 公钥副本在以后进行验证。

另一种可以用来签署文件的加密标准是 S/MIME。S/MIME 的使用依赖于来自公钥基础设施(PKI)的 X.509 证书,这些证书可以是组织内私有的,也可以来自公共证书颁发机构(CA)。如果授权人员拥有个人证书(通常是他们用来签署和加密 S/MIME 电子邮件的证书),他们可以使用它来签署包含获取细节的文件。

gpgsm 工具是 GnuPG2 的一部分,支持使用 S/MIME 标准管理 X.509 密钥、加密和签名。一旦生成了必要的密钥并安装了证书,您就可以像使用 GPG 一样使用 gpgsm 对文件进行签名。以下命令对指定的文件生成签名:

$ gpgsm -a -r holmes@digitalforensics.ch -o hash.log.pem --sign hash.log

-a 标志指定应使用 ASCII 装甲,这是一种将二进制数据以明文格式编码的方法,而不是使用二进制(因为它更容易复制到报告或电子邮件中)。-r 标志指定用于签名的接收者密钥。在这个命令示例中,使用的是电子邮件地址,但也可以通过密钥 ID、指纹或匹配的 X.509 字符串组件来指定密钥。-o 指定签名的输出文件,--sign 指示 gpgsm 对指定的 hash.log 文件进行签名。

在签名时,gpgsm 将创建一个 PEM^(2) 签名文件,内容类似于以下内容:

-----BEGIN SIGNED MESSAGE-----
MIAGCSqGSIb3DQEHAqCAMIACAQExDzANBglghkgBZQMEAgEFADCABgkqhkiG9w0B
BwGggCSABIICIApkYzNkZCA3LjIuNjQxIHN0YXJ0ZWQgYXQgMjAxNi0wMS0xMSAy
...
GR2YC4Mx5xQ63Kbxg/5BxT7rlC7DBjHOVMCMJzVPy4OVUOXPnL2IdP2dhvkOtojk
UKIjSw40xIIAAAAAAAA=
-----END SIGNED MESSAGE-----

一旦由授权方创建了签名,原始法医获取的哈希值和细节就无法更改。只有创建签名的人才能进行更改并重新签名。^(3) 使用这些签名,可以验证获取细节的完整性,而无需涉及签名的人。我在第七章中描述了签名验证过程。

您可以购买类似于网站 SSL 证书的个人 S/MIME 证书。您可以在 www.sslshopper.com/email-certificates-smime-certificates.html 查看提供个人 S/MIME 证书的 CA 概述。使用个人 S/MIME 证书,您也可以通过发送包含输出日志内容的签名电子邮件消息来简单地签署获取细节。

本节中显示的示例很简单,使用了 GNU 隐私保护工具。还有其他命令行工具可以用于执行加密签名。OpenSSL 命令行工具提供了丰富的加密工具包,包括使用 X.509 证书和 S/MIME 签署文件的能力。下一节将使用 OpenSSL 演示加密时间戳。

RFC-3161 时间戳

使用 PGP 或 S/MIME 签名可以将授权个人(或多个个人)强烈绑定到包含取证获取结果的文件的完整性上。在某些情况下,将取证获取结果强烈绑定到特定时间点也是非常有用的。你可以通过使用独立的时间戳服务来做到这一点。

时间戳是一个正式的标准,定义在 RFC-3161 中,描述了时间戳请求和响应的格式。OpenSSL 可以创建和发送时间戳请求并验证响应。在以下示例中,创建了一个符合 RFC-3161 标准的时间戳请求,用于获取日志,生成一个带有 *.tsq 扩展名的请求文件:

$ openssl ts -query -data hash.log -out hash.log.tsq -cert

这个时间戳请求包含 hash.log 文件的哈希值,而不是实际的文件。文件不会发送到时间戳服务器。这从信息安全的角度来看非常重要。时间戳服务提供商只会信任时间戳信息,而不是被时间戳的文件内容。

然后,可以使用 OpenSSL 中包含的 tsget 命令将生成的请求发送到时间戳服务。^(4) 以下示例使用 FreeTSA 服务:

$ tsget -h https://freetsa.org/tsr hash.log.tsq

在某些 Linux 发行版中,可能缺少或损坏这个脚本。你可以通过手动提交时间戳请求,使用 curl 命令来绕过它,命令如下:

$ curl -s -H "Content-Type: application/timestamp-query" --data-binary
    "@hash.log.tsq" https://freetsa.org/tsr > hash.log.tsr

如果时间戳服务器接受请求,它会返回一个符合 RFC-3161 标准的时间戳。在这个例子中,时间戳会以 *.tsr 文件扩展名保存到 hash.log.tsr 中。你可以使用 OpenSSL ts 命令查看时间戳的内容:

$ openssl ts -reply -in hash.log.tsr -text
Status info:
Status: Granted.
Status description: unspecified
Failure info: unspecified

TST info:
Version: 1
Policy OID: 1.2.3.4.1
Hash Algorithm: sha1
Message data:
    0000 - 63 5a 86 52 01 24 72 43-8e 10 24 bc 24 97 d0 50   cZ.R.$rC..$.$..P
    0010 - 4a 69 ad a9                                       Ji..
Serial number: 0x0AF4
Time stamp: May  7 22:03:49 2016 GMT
Accuracy: 0x01 seconds, 0x01F4 millis, 0x64 micros
Ordering: yes
Nonce: 0xBC6F68553A3E5EF5
TSA: DirName:/O=Free TSA/OU=TSA/description=This certificate digitally signs
    documents and time stamp requests made using the freetsa.org online
    services/CN=www.freetsa.org/emailAddress=busilezas@gmail.com/L=Wuerzburg/
    C=DE/ST=Bayern
Extensions:

hash.log.tsr 文件的副本提供了一个证明,表明获取结果在特定时间点存在。独立的第三方也可以验证时间戳的有效性。我将在第七章中演示时间戳的验证。

互联网上有许多免费和商业的时间戳服务。这里列出了一些示例:

• Comodo RFC-3161 时间戳服务: timestamp.comodoca.com/?td=sha256

• FreeTSA: freetsa.org/index_en.php

• 波兰 CERTUM PCC - 一般认证机构: time.certum.pl/

• Safe Creative 时间戳认证机构(TSA)服务器: tsa.safecreative.org/

• StartCom 免费 RFC-3161 时间戳服务: tsa.startssl.com/rfc3161

• DFN-PKI 的 Zeitstempeldienst: www.pki.dfn.de/zeitstempeldienst/

最后两部分中的示例强烈地将个人和时间与镜像的完整性绑定在一起。可以使用诸如智能卡或硬件安全模块(HSM)等加密令牌来保护私钥,并保证物理拥有令牌来签署镜像。硬令牌上的加密密钥不能被复制或窃取。一些可以用来制作加密签名的硬令牌包括 Nitrokey、Yubikey 和 GnuPG OpenPGP 智能卡。

管理驱动器故障和错误

有时,取证实验室会收到一个有问题的硬盘进行分析。磁盘可能很旧、损坏或正在故障中。它可能有接口错误、盘片读取错误、磁头错误、电机重置等问题。在某些情况下,您仍然可以获取该驱动器的部分取证镜像。根据磁盘大小、块大小和无法读取的扇区数量,映像制作可能需要几天时间。

重要的是要理解,这里描述的错误是指驱动器硬件的错误。它们并不指代如文件系统损坏、分区表破坏等软件错误。

本部分展示了不同工具的示例,以及它们如何处理错误情况。dmsetup 工具用于模拟磁盘错误,并测试取证工具在各种故障条件下的表现,并在以下多个示例中使用(磁盘设备为/dev/mapper/errdisk)。下面的部分概述了 dc3dd、dcfldd、ewfacquire 和 ftkimager 如何管理和报告错误。

取证工具错误处理

以下示例展示了 dcfldd 工具遇到带有两个错误的磁盘。错误在磁盘上的位置(块偏移量)会报告到标准输出,并记录到指定的文件中,如下所示:

# dcfldd if=/dev/mapper/errdisk of=errdisk.raw conv=noerror,sync errlog=error.log
...
# cat error.log
dcfldd:/dev/mapper/errdisk: Input/output error
(null)+15 records in
(null)+16 records out
dcfldd:/dev/mapper/errdisk: Input/output error
(null)+29 records in
(null)+32 records out
(null)+62496 records in
(null)+62501 records out

在 Debian Linux 下测试 dcfldd 时遇到了几个 bug。即使指定了 512 字节的块大小,填充使用的块大小仍然保持为 4K(dd 也表现出相同的行为)。在某些错误情况下,dcfldd 进入了死循环,必须手动终止。

dc3dd 工具提供了非常详细的错误概述。错误被发送到标准输出,并保存在指定的日志文件中,如下所示:

# dc3dd if=/dev/mapper/errdisk of=errdisk.raw log=error.log
...
# cat error.log

dc3dd 7.2.641 started at 2016-01-12 19:42:26 +0100
compiled options:
command line: dc3dd if=/dev/mapper/errdisk of=errdisk.raw log=error.log
device size: 4000000 sectors (probed),    2,048,000,000 bytes
sector size: 512 bytes (probed)
[!!] reading `/dev/mapper/errdisk' at sector 1000 : Input/output error
[!!] 4 occurences while reading `/dev/mapper/errdisk' from sector 2001 to sector 2004
    : Input/output error
  2048000000 bytes ( 1.9 G ) copied ( 100% ), 5.74919 s, 340 M/s

input results for device `/dev/mapper/errdisk':
   4000000 sectors in
   5 bad sectors replaced by zeros
output results for file `errdisk.raw':
   4000000 sectors out

dc3dd completed at 2016-01-12 19:42:31 +0100

ewfacquire 工具提供了默认的错误粒度为 64 个扇区,且可以更改为 1,以减少填充为零的扇区数。在这个例子中,ewfacquire 只检测到两个读取错误(类似于 dcfldd;它跳过并填充了一个 4k 块,而没有检查其他扇区):

# ewfacquire -t errdisk /dev/mapper/errdisk
ewfacquire 20150126
...
The number of bytes per sector (1 <= value <= 4294967295) [512]:
The number of sectors to read at once (16, 32, 64, 128, 256, 512, 1024, 2048, 4096,
    8192, 16384, 32768) [64]:
The number of sectors to be used as error granularity (1 <= value <= 64) [64]: 1
The number of retries when a read error occurs (0 <= value <= 255) [2]: 1
Wipe sectors on read error (mimic EnCase like behavior) (yes, no) [no]: yes
...
Acquiry completed at: Jan 12, 2016 19:57:58

Written: 1.9 GiB (2048000804 bytes) in 14 second(s) with 139 MiB/s (146285771
    bytes/second).
Errors reading device:
        total number: 2
        at sector(s): 1000 - 1008 number: 8 (offset: 0x0007d000 of size: 4096)
        at sector(s): 2000 - 2008 number: 8 (offset: 0x000fa000 of size: 4096)

MD5 hash calculated over data:          4d319b12088b3990bded7834211308eb
ewfacquire: SUCCESS

ftkimager 报告并记录错误。以下示例使用了一个实际的物理损坏磁盘(一台原始的第一代 iPod),因为 ftkimager 在与 dmsetup 创建的模拟错误下无法正常工作:

# ftkimager /dev/sdg ipod
AccessData FTK Imager v3.1.1 CLI (Aug 24 2012)
Copyright 2006-2012 AccessData Corp., 384 South 400 West, Lindon, UT 84042
All rights reserved.

Creating image...
234.25 / 4775.76 MB (11.71 MB/sec) - 0:06:27 left
Image creation complete.
# cat ipod.001.txt
Case Information:
Acquired using: FTK
...
ATTENTION:
The following sector(s) on the source drive could not be read:
        491584 through 491591
        491928 through 491935
The contents of these sectors were replaced with zeros in the image.
...

每个取证采集工具都具有一些错误检测、处理和日志记录功能。然而,对于那些有大量错误或硬件损坏的磁盘,使用更专业的工具可能更为合适。下一节将介绍为此目的使用数据恢复工具的方法。

数据恢复工具

有几个磁盘块恢复工具值得一提,因为它们具有强大的错误处理和积极的恢复方法。尽管这些工具不是专为取证设计的,但它们在其他取证工具失败的情况下非常有用。

ddrescue 工具(由 Antonio Diaz Diaz 开发)旨在从损坏的磁盘中恢复数据块。与 dd 家族的工具不同,它有一个多阶段恢复算法,你可以多次运行它以填补镜像中的空白。该算法包括反向读取磁盘中有问题的部分,以增加恢复的扇区数量,并在多个传输过程中执行各种重试操作。

完成的 ddrescue 操作会生成统计数据,描述恢复的成功率:

# ddrescue /dev/sda image.raw image.log
rescued:    40968 MB,  errsize:   2895 kB,  current rate:        0 B/s
   ipos:    39026 MB,   errors:      38,    average rate:     563 kB/s
   opos:    39026 MB, run time:   20.18 h,  successful read:    8.04 h ago
Finished

ddrescue 生成的日志文件显示了开始和结束时间,并详细概述了磁盘的问题区域:

# Rescue Logfile. Created by GNU ddrescue version 1.19
# Command line: ddrescue /dev/sda image.raw image.log
# Start time:   2015-06-13 22:57:39
# Current time: 2015-06-14 19:09:03
# Finished
# current_pos  current_status
0x9162CAC00     +
#      pos        size  status
0x00000000  0x4F29D000  +
0x4F29D000  0x00002000  -
0x4F29F000  0x00253000  +
...

dd_rescue 工具(注意下划线)由 Kurt Garloff 于 1990 年代末开发,尽管其名称中包含 dd,但命令语法完全不同,并且它不执行数据转换(与 ddrescue 相同)。但是,它确实像 dd 一样传输数据块。该工具具有若干功能,使其成为数字取证实验室中的一个可能选择。当磁盘发生错误时,块大小会动态调整,自动减小到物理块大小。在一段时间内没有错误发生后,块大小会再次调整,以提高性能。你还可以将磁盘反向成像,从磁盘的末端到开始。这项技术对于驱动器在读取磁盘某些点时遇到困难的情况非常有用。

myrescue 工具旨在初始时避免无法读取的区域(不重试),并专注于恢复尽可能多的可读区域。读取扇区复制后,它会处理失败的范围。该工具的文档建议在重试之间让有问题的驱动器休息几个小时。

另一个名为 recoverdm 的工具也可以执行数据恢复。它具有独特的特点,即能够在扇区级别或单个文件级别从损坏的磁盘中恢复数据。该工具还具有额外的功能,用于软盘和光盘介质。

SMART 和内核错误

磁盘上的 SMART 信息可以提供关于驱动器健康状况和成功恢复可能性的额外指标。例如:

# smartctl -x /dev/sda
smartctl 6.4 2014-10-07 r4002 [x86_64-linux-3.19.0-18-generic] (local build)
Copyright (C) 2002-14, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Model Family:     Maxtor DiamondMax D540X-4K
Device Model:     MAXTOR 4K040H2
Serial Number:    672136472275
Firmware Version: A08.1500
User Capacity:    40,971,571,200 bytes [40.9 GB]
Sector Size:      512 bytes logical/physical
...
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAGS    VALUE WORST THRESH FAIL RAW_VALUE
  1 Raw_Read_Error_Rate     P--R-K   100   253   020    -    0
  3 Spin_Up_Time            POS--K   087   086   020    -    1678
  4 Start_Stop_Count        -O--CK   078   078   008    -    14628
  5 Reallocated_Sector_Ct   PO--CK   003   001   020    NOW  486
  7 Seek_Error_Rate         PO-R--   100   100   023    -    0
  9 Power_On_Hours          -O--C-   073   073   001    -    17814
 10 Spin_Retry_Count        -OS--K   100   100   000    -    0
 11 Calibration_Retry_Count PO--C-   100   080   020    -    0
 12 Power_Cycle_Count       -O--CK   100   100   008    -    294
 13 Read_Soft_Error_Rate    PO-R--   100   100   023    -    0
194 Temperature_Celsius     -O---K   094   083   042    -    17
195 Hardware_ECC_Recovered  -O-RC-   100   031   000    -    7137262
196 Reallocated_Event_Count ----C-   100   253   020    -    0
197 Current_Pending_Sector  -O--CK   003   001   020    NOW  486
198 Offline_Uncorrectable   ----C-   100   253   000    -    0
199 UDMA_CRC_Error_Count    -O-RC-   199   199   000    -    1
                            ||||||_ K auto-keep
                            |||||__ C event count
                            ||||___ R error rate
                            |||____ S speed/performance
                            ||_____ O updated online
                            |______ P prefailure warning

Read SMART Log Directory failed: scsi error badly formed scsi parameters

ATA_READ_LOG_EXT (addr=0x00:0x00, page=0, n=1) failed: scsi error aborted command
Read GP Log Directory failed
...
ATA Error Count: 9883 (device log contains only the most recent five errors)
...
Error 9883 occurred at disk power-on lifetime: 17810 hours (742 days + 2 hours)
...
Error 9882 occurred at disk power-on lifetime: 17810 hours (742 days + 2 hours)
...
Error 9881 occurred at disk power-on lifetime: 17810 hours (742 days + 2 hours)
...

在进行取证采集时,应注意记录在 dmesg 或工具输出中出现的任何错误和失败信息。如果无法读取某些扇区并且已添加零填充,这需要记录下来(具体取决于所使用的取证采集工具,通常会进行日志记录)。

失败驱动器的其他选项

在本节中,我提供了一些附加的提示和建议,帮助你获取有问题的磁盘。

在某些情况下,磁盘可能只有在冷却时才会正常工作几分钟,然后就变得无法访问或不稳定。如果磁盘在失败前能正常工作几分钟,你仍然可以通过反复重启恢复过程来逐渐制作镜像。在第 162 页的“数据恢复工具”中提到的一些工具会保存上次尝试恢复时的状态文件。恢复操作可以被中断,然后从上次的地方继续进行。

在尝试对驱动器进行镜像一段时间后,让驱动器冷却下来然后再试。有时驱动器过热时,访问问题可能会变得更严重。同样,磁盘恢复工具的重启功能在这种情况下非常有用。

如果你怀疑驱动器的电子元件有故障,并且有一台相同型号(即相同的品牌、型号和固件版本)且功能正常的备用驱动器,^(5)你可能能够暂时交换驱动器电子元件来恢复数据。你不需要打开磁盘进行此操作,因此损坏的风险(如灰尘等)最小。

专业的数据恢复公司拥有无尘室,训练有素的工作人员可以在无尘环境中打开驱动器、解开驱动器头、替换驱动器执行器,并进行其他精细操作。没有适当的环境、设备和培训,请勿尝试这些操作。仅在无尘室外打开驱动器会暴露在灰尘中,可能会对磁盘造成损坏。

损坏的光盘

前面提到的大多数工具也应该能在光盘介质上使用。某些工具为光盘介质增加了特殊的功能或行为。

ddrescue 工具建议为光盘介质指定 2048 字节的扇区大小。以下是 ddrescue 恢复损坏的 CD-ROM 磁盘过程中的示例:

# ddrescue -b 2048 /dev/cdrom cdrom.raw
GNU ddrescue 1.19
Press Ctrl-C to interrupt
rescued:    15671 kB,  errsize:   3878 kB,  current rate:         0 B/s
   ipos:   408485 kB,   errors:    126,     average rate:     12557 B/s
   opos:   408485 kB, run time:   20.80 m,  successful read:       31 s ago
Copying non-tried blocks... Pass 2 (backwards)

请注意,ddrescue 会倒着读取 CD-ROM,以尝试恢复扇区。

对于部分可恢复但文件系统损坏的光盘,可以使用文件雕刻工具提取文件。专为光盘设计的数据雕刻工具是 dares 雕刻工具(ftp://ftp.heise.de/pub/ct/ctsi/dares.tgz),它支持多种光盘文件系统格式。

本节已经涵盖了磁盘故障和错误的管理。磁盘故障和错误是会发生的,并且可能导致部分或完全的数据丢失。如果你遇到磁盘问题,请确保记录错误的性质,并尽可能记录受影响的扇区。

通过网络获取映像

通过网络对磁盘进行成像在多种情况下是有用的:

• 磁盘可能位于远程位置,并且可能无法将磁盘物理扣押并运送到中央法医实验室(可能是由于业务中断、资源不足或其他物流问题)。

• 时间紧迫的事件可能需要尽快获取远程磁盘映像,而不因运输而产生延迟(根据网络带宽、磁盘大小和运输时间,运输磁盘可能仍然更快)。^(6)

• 本地法医实验室中的机器可能有一个无法物理拆卸的磁盘。这可能是由于 PC 的设计、缺少所需的工具,或是拆卸可能导致损坏或破坏证据的风险。

通常来说,扣押磁盘在大规模组织中不容易扩展,拥有一个广泛部署的企业级远程磁盘筛查和采集解决方案是很常见的。EnCase Enterprise 是一个经典的例子,许多新兴公司也在市场上推出了类似的产品。

与磁盘成像类似,存在许多通过网络进行法医采集的方式。大多数解决方案包括在远程机器上启动法医 CD,建立网络连接,并将 dd 输出通过网络传输到本地文件。你可以通过简单地使用 dd 和 netcat 的组合来实现。也可以使用 ssh 或安全 netcat 替代品(如 socat 和 cryptcat)建立安全连接。

本节提供了几个使用 ssh 进行安全网络连接的示例。但首先,让我们来看一下 rdd,它是专门为法医采集而设计的。

使用 rdd 进行远程法医成像

rdd 工具是专门为通过网络获取磁盘映像而设计的,由荷兰法医研究所(NFI)开发。rdd 工具具有许多有用的功能,包括哈希、日志记录、压缩、错误处理、文件分割、进度指示器和统计信息。支持 EWF 输出可以在编译时包含。rdd 工具采用客户端-服务器模型,受试 PC(从法医启动 CD 启动)是客户端,检查员 PC 是服务器。通过在服务器(检查员 PC)上启动监听进程,并在客户端运行采集命令来执行采集操作。

rdd 工具没有内建的安全功能;必须使用 VPN、安全外壳或类似工具来添加安全性。当你在不可信或敌对网络上使用 rdd 时,网络流量需要加密,并且监听的 TCP 端口不应暴露。你可以通过建立安全网络通道并利用该通道进行数据获取的两步过程来实现这一点。

如果没有安全性,rdd 工具仍然可以在受信任的网络段中使用,比如在受保护的实验室环境中,或者在使用交叉以太网线缆或连接两台 PC 的 FireWire 线缆时(FireWire 接口可以用作网络接口)。

在考官的工作站上,通过指定-S运行rdd-copy的服务器模式,如下例所示。在客户端启动之前,必须先启动服务器模式。确保没有防火墙或 iptables 包过滤阻止 TCP 端口 4832(默认端口)。

# rdd-copy -S --md5 -l server.log
# cat server.log
2016-01-13 01:34:21 +0100:
2016-01-13 01:34:21 +0100: 2016-01-13 01:34:21 CET
2016-01-13 01:34:21 +0100: rdd version 3.0.4
...
2016-01-13 01:34:21 +0100: rdd-copy -S --md5 -l server.log
2016-01-13 01:34:21 +0100: ========== Parameter settings ==========
2016-01-13 01:34:21 +0100: mode: server
2016-01-13 01:34:21 +0100: verbose: no
2016-01-13 01:34:21 +0100: quiet: no
2016-01-13 01:34:21 +0100: server port: 4832
2016-01-13 01:34:21 +0100: input file: <none>
2016-01-13 01:34:21 +0100: log file: server.log
...
2016-01-13 01:37:05 +0100: === done ***
2016-01-13 01:37:05 +0100: seconds: 147.787
2016-01-13 01:37:05 +0100: bytes written: 7918845952
2016-01-13 01:37:05 +0100: bytes lost: 0
2016-01-13 01:37:05 +0100: read errors: 0
2016-01-13 01:37:05 +0100: zero-block substitutions: 0
2016-01-13 01:37:05 +0100: MD5: a3fa962816227e35f954bb0b5be893ea
...

在远程目标 PC 上,使用-C运行rdd-copy的客户端模式。通过-I指定输入设备。输入设备可以是任何本地连接的存储设备(在这个示例中是远程 USB 闪存驱动器)。输出文件-O有一个额外的选项来指示网络目标。客户端通过使用传统的 Unix 约定hostname:/path/to/filename告知服务器获取镜像所使用的文件:

# rdd-copy -C --md5 -l client.log -I /dev/sde -O -N lab-pc:/evi/image.raw
# cat client.log
2016-01-13 01:34:37 +0100:
2016-01-13 01:34:37 +0100: 2016-01-13 01:34:37 CET
2016-01-13 01:34:37 +0100: rdd version 3.0.4
...
2016-01-13 01:34:37 +0100: rdd-copy -C --md5 -l client.log -I /dev/sde -O -N
    lab-pc:/evi/image.raw
2016-01-13 01:34:37 +0100: ========== Parameter settings ==========
2016-01-13 01:34:37 +0100: mode: client
2016-01-13 01:34:37 +0100: verbose: no
2016-01-13 01:34:37 +0100: quiet: no
2016-01-13 01:34:37 +0100: server port: 4832
2016-01-13 01:34:37 +0100: input file: /dev/sde
2016-01-13 01:34:37 +0100: log file: client.log
2016-01-13 01:34:37 +0100: output #0
2016-01-13 01:34:37 +0100:      output file: /evi/image.raw
2016-01-13 01:34:37 +0100:      segment size: 0
2016-01-13 01:34:37 +0100:      output as ewf compression: no ewf
2016-01-13 01:34:37 +0100:      output host: lab-pc
2016-01-13 01:34:37 +0100:      output port: 4832
...
2016-01-13 01:37:05 +0100: === done ***
2016-01-13 01:37:05 +0100: seconds: 147.787
2016-01-13 01:37:05 +0100: bytes written: 7918845952
2016-01-13 01:37:05 +0100: bytes lost: 0
2016-01-13 01:37:05 +0100: read errors: 0
2016-01-13 01:37:05 +0100: zero-block substitutions: 0
2016-01-13 01:37:05 +0100: MD5: a3fa962816227e35f954bb0b5be893ea
...

客户端和服务器都通过-l指定日志文件,并使用一种可以在传输结束时验证的哈希算法。你可以通过在任何一方(或两方)添加-P 1来监控客户端和服务器的进度。

使用 ssh 进行安全远程镜像

在 rdd 不可用的情况下,你可以仅使用一个ssh命令进行基本的获取,无论是在包含目标磁盘的远程 PC 上还是在考官 PC 上。以下示例展示了通过从远程 PC 发起的安全外壳会话在网络上获取磁盘镜像(本示例中的 USB 闪存驱动器是插入远程 PC 的)。

# dd if=/dev/sdb | ssh lab-pc "cat > sandisk-02028302BCA1D848.raw"
7856127+0 records in
7856127+0 records out
4022337024 bytes (4.0 GB) copied, 347.411 s, 11.6 MB/s

在本地运行dd命令,并将输出通过管道传输到ssh命令。安全外壳将该数据流通过管道传输到考官 PC 上的cat程序。cat程序的输出被重定向到考官 PC 上的一个文件中。完成后,原始镜像文件可以用其他取证工具进行检查。

你也可以通过安全外壳从考官工作站获取镜像,连接到带有目标磁盘的远程 PC。以下示例演示了从考官 PC 获取相同 USB 镜像的过程:

# ssh remote-pc "dd if=/dev/sdb" > sandisk-02028302BCA1D848.raw
7856127+0 records in
7856127+0 records out
4022337024 bytes (4.0 GB) copied, 343.991 s, 11.7 MB/s

在这里,指示安全外壳在远程(目标)机器上运行dd命令。远程dd命令的输出成为本地ssh命令的输出,并重定向到本地文件。完成后,考官的 PC 上将生成可用于分析的原始镜像文件。

你可以用 dcfldd、dc3dd 或任何其他将数据成像到标准输出的工具,替换本节中显示的基本 dd 命令。你可以使用此方法收集有关远程(目标)机器的其他信息。为了说明这一点,下面是一些收集关于已启动 DEFT Linux 启动 CD 的远程 PC 数据的示例。在这个示例中,hdparm、smartctl 和 lshw 数据被收集并保存在检查员工作站上:

# ssh remote-pc "hdparm --dco-identify /dev/sda" > dco.lenovo-W38237SJ.txt
# ssh remote-pc "hdparm -I /dev/sda" > hdparm.lenovo-W38237SJ.txt
# ssh remote-pc "smartctl -x /dev/sda" > smartctl.lenovo-W38237SJ.txt
# ssh remote-pc "lshw" > lshw.lenovo-W38237SJ.txt

如同前一个示例,ssh 在远程机器上执行各种命令,并将输出重定向到本地(检查员)工作站上的文件中。磁盘的序列号包含在文件名中,以确保物理磁盘与收集的数据文件之间有明确的关联。

远程采集到 SquashFS 证据容器

如前所示,SquashFS 可以作为法医证据容器使用,sfsimage 用于对本地磁盘进行成像。sfsimage 脚本还可以直接将远程机器上的磁盘成像到 SquashFS 证据容器中。这里展示了两个示例。

远程 dd 输出可以通过 ssh 管道传输到本地 sfsimage 命令,从而创建一个包含原始镜像的 SquashFS 法医证据容器:

$ ssh root@remote-pc "dd if=/dev/mmcblk0" | sfsimage -i - remote-pc.sfs
Started: 2016-05-08T10:30:34
Sfsimage version: Sfsimage Version 0.8
Sfsimage command: /usr/bin/sfsimage -i -
Current working directory: /home/holmes
Forensic evidence source:
Destination squashfs container: remote-pc.sfs
Image filename inside container: image.raw
Aquisition command: sudo dc3dd   log=errorlog.txt hlog=hashlog.txt hash=md5
    2>/dev/null | pv -s 0
31116288+0 records inMiB/s] [     <=>      ]
31116288+0 records out
15931539456 bytes (16 GB, 15 GiB) copied, 597.913 s, 26.6 MB/s
14.8GiB 0:09:58 [25.4MiB/s] [ <=>     ]
Completed: 2016-05-08T10:40:32

在这个例子中,通过 root 用户 (root@remote-pc) 访问远程 PC,使用 dd 命令将远程媒体卡 (/dev/mmcblk0) 成像到标准输出(stdout)。标准输出流通过 ssh 连接传输到本地 sfsimage 命令,其中 -(stdin)是输入文件。

第二种方法使用相同的原理,但为 sfsimage shell 脚本设置了变量。在 sfsimage 的 config() 块或单独的 sfsimage.conf 文件中,你可以指定控制 sfsimage 行为的变量和配置设置。将 DD 变量设置为 ssh 命令,将导致 mksquashfs 从远程机器通过 ssh 获取输入。这里展示了一个当前工作目录中的配置文件:

$ cat sfsimage.conf
DD="ssh root@remote-pc \"dd if=/dev/mmcblk0\""
SQSUDO=""

DD 变量中的双引号需要进行转义。SQSUDO 变量被设置为空字符串,因为不需要本地根权限。当你在本地工作目录中运行带有此配置文件的 sfsimage 时,你的配置设置将覆盖默认的 sfsimage 设置。

需要注意的是,输入文件仍应指定为短横线(-),因为输入会通过 ssh 命令在 DD 变量中被内部传输到标准输入(stdin)。使用这种方式通过 sfsimage 进行远程采集如下所示:

$ sfsimage -i - remote-pc.sfs
Started: 2016-05-08T10:56:30
Sfsimage version: Sfsimage Version 0.8
Sfsimage command: /usr/bin/sfsimage -i -
Current working directory: /home/holmes
Forensic evidence source:
Destination squashfs container: remote-pc.sfs
Image filename inside container: image.raw
Aquisition command:  ssh root@remote-pc "dd if=/dev/mmcblk0" 2>/dev/null | pv -s 0
14.8GiB 0:09:03 [  28MiB/s] [          <=>           ]
Completed: 2016-05-08T11:05:33

我展示这个 DD 配置示例,主要是为了说明将远程网络成像命令嵌入到 sfsimage 中的可能性。通常,将复杂的采集命令嵌入配置文件可以改变 sfsimage 脚本的操作方式。

获取远程磁盘以便转换为 EnCase 或 FTK 格式

你还可以将远程ssh命令管道传递给其他程序,以执行任务或转换成其他格式。一个有用的示例是远程获取原始图像并在写入磁盘时将其转换为 Encase/EWF 格式。此示例展示了远程 PC 被远程镜像到检查工作站并保存为.ewf文件:

# ssh remote-pc "dd if=/dev/sda" | ewfacquirestream -D 16048539022588504422 -t
    eepc-16048539022588504422
ewfacquirestream 20140608

Using the following acquiry parameters:
Image path and filename:                eepc-16048539022588504422.E01
Case number:                            case_number
Description:                            16048539022588504422
Evidence number:                        evidence_number
Examiner name:                          examiner_name
Notes:                                  notes
Media type:                             fixed disk
Is physical:                            yes
EWF file format:                        EnCase 6 (.E01)
Compression method:                     deflate
Compression level:                      none
Acquiry start offset:                   0
Number of bytes to acquire:             0 (until end of input)
Evidence segment file size:             1.4 GiB (1572864000 bytes)
Bytes per sector:                       512
Block size:                             64 sectors
Error granularity:                      64 sectors
Retries on read error:                  2
Zero sectors on read error:             no

Acquiry started at: Jun 22, 2015 21:22:47
This could take a while.
...
Status: acquired 3.7 GiB (3999301632 bytes)
        in 7 minute(s) and 38 second(s) with 8.3 MiB/s (8732099 bytes/second).

7815024+0 records in
7815024+0 records out
4001292288 bytes (4.0 GB) copied, 451.948 s, 8.9 MB/s
Acquiry completed at: Jun 22, 2015 21:30:25
Written: 3.7 GiB (4001526432 bytes) in 7 minute(s) and 38 second(s) with 8.3 MiB/s
    (8736957 bytes/second).
MD5 hash calculated over data:          e86d952a68546fbdab55d0b205cd1c6e
ewfacquirestream: SUCCESS

在这个例子中,PC(eepc)的描述和序列号(16048539022588504422)被嵌入到镜像文件名中。dd命令的最终输出将在完成后显示,紧接着是 ewfacquirestream 完成消息。

你可以使用 EnCase、Sleuth Kit 或任何其他支持 EWF 的工具对获取到的镜像进行法医分析。

# ls -l eepc-16048539022588504422.*
-rw-r----- 1 root root 1572852270 Jun 22 21:30 eepc-16048539022588504422.E01
-rw-r----- 1 root root 1572851461 Jun 22 21:30 eepc-16048539022588504422.E02
-rw-r----- 1 root root 857059301 Jun 22 21:30 eepc-16048539022588504422.E03

使用 ewfacquirestream 附加标志可以提供更多的案件元数据细节、增加压缩比并提供其他功能。有关更多信息,请参见 ewfacquirestream(1)手册页。

使用写时复制快照进行实时镜像

一般来说,当你需要获取的磁盘包含正在运行的操作系统时,创建实时系统的法医镜像没有意义。在实时系统上,块是不断变化的。在获取每个扇区的镜像所需的时间内,文件系统将发生显著变化,导致镜像的文件系统副本损坏且不一致。

有时可能无法通过法医启动 CD 启动系统来远程获取镜像。在无法关闭的实时服务器上,可能会在某些情况下使用用于冻结文件系统的备份方法。如果系统具有写时复制(CoW)文件系统,并且文件系统快照具有关联的块设备(例如逻辑卷管理器[LVM]),那么你可能能够进行一定量的法医镜像。这将提供文件系统块在某个时间点的一致快照。如果 CoW 文件系统没有与快照关联的块设备,那么文件至少会被冻结,从而进行文件级的获取。

如果目标系统是基于云的虚拟机,通过网络对实时系统进行镜像可能是唯一的选择,除非云服务提供商能够提供快照图像。

获取可移动媒体

可移动媒体的独特之处在于,驱动设备可以连接到系统并在没有任何媒体的情况下操作。只有在插入媒体后,才能获取那些只能通过法医方式获取的块设备。USB 闪存驱动器可以被描述为可移动设备,但不是可移动媒体。除非它是存储卡适配器或读卡器,否则介质不会从 USB 闪存驱动器中取出。

本节涵盖了基本的可移动媒体类型,包括存储卡、光盘和磁带。

存储卡

大多数存储卡的行为与常规磁盘相似。它们的存储表现为一系列线性块,给人一种常规磁盘的印象,你可以使用任何操作块设备的工具访问这些扇区。

在 图 6-1 中,Micro SD 卡插入 SD 卡适配器,再插入 SD 卡读卡器,最后插入 PC。这里,几项可移动存储介质被堆叠并且仍然显示为一个可以正常成像的块设备。

image

图 6-1:可移动存储卡适配器

在这个示例中,所有三项设备都插入并连接到采集主机。内核检测到了它们并创建了一个 /dev/sdg 块设备:

# dmesg
...
[65396.394080] usb-storage 3-2:1.0: USB Mass Storage device detected
[65396.394211] scsi host21: usb-storage 3-2:1.0
[65397.392652] scsi 21:0:0:0: Direct-Access     SanDisk SDDR-113         1.00 PQ:
     0 ANSI: 0
[65397.393098] sd 21:0:0:0: Attached scsi generic sg5 type 0
[65398.073649] sd 21:0:0:0: [sdf] 3911680 512-byte logical blocks: (2.00 GB/1.87
    GiB)
[65398.074060] sd 21:0:0:0: [sdf] Write Protect is on
...

SD 适配器已启用写保护标签,可以在 dmesg 输出中看到。

在这个示例中,Micro SD 卡被使用 sfsimage 脚本成像到一个 SquashFS 证据容器中:

$ sfsimage -i /dev/sdf MicroSD.sfs
Started: 2016-05-08T11:19:35
Sfsimage version: Sfsimage Version 0.8
Sfsimage command: /usr/bin/sfsimage -i /dev/sdf
Current working directory: /home/holmes
Forensic evidence source: if=/dev/sdf
Destination squashfs container: MicroSD.sfs
Image filename inside container: image.raw
Aquisition command: sudo dc3dd if=/dev/sdf log=errorlog.txt hlog=hashlog.txt hash=md5
    2>/dev/null | pv -s 2002780160
1.87GiB 0:02:34 [12.3MiB/s] [================================================>] 100%
Completed: 2016-05-08T11:22:10

成像后,可以安全地将存储卡从读卡器中取出(假设它没有被挂载)。

光盘

不同类型的光学介质在其物理和化学属性上有所不同;然而,一旦将它们插入附加的光驱,它们的相似之处多于差异。三种最常见的光盘(DVD、CD-ROM 和蓝光)都有 2048 字节的扇区大小,并且表现为一个线性扇区序列(类似于磁带,但呈螺旋形)。主要的区别在于数据比特的密度(这一点由设备硬件抽象化)和光盘的容量。

映像数据光盘非常简单,类似于硬盘或闪存的镜像。以下是使用 dc3dd 对光盘进行成像的示例:

# dc3dd if=/dev/cdrom of=datacd.raw

dc3dd 7.2.641 started at 2016-01-13 23:04:31 +0100
compiled options:
command line: dc3dd if=/dev/cdrom of=datacd.raw
device size: 331414 sectors (probed),      678,735,872 bytes
sector size: 2048 bytes (probed)
   678735872 bytes ( 647 M ) copied ( 100% ),  142 s, 4.5 M/s

input results for device `/dev/cdrom':
   331414 sectors in
   0 bad sectors replaced by zeros

output results for file `datacd.raw':
   331414 sectors out

dc3dd completed at 2016-01-13 23:06:53 +0100

使用常见的取证工具,你可以分析 datacd.raw 镜像文件。

恢复紧凑型光盘数字音频(CDDA),或音乐光盘,与数据光盘的恢复方式不同。它们包含一组音乐轨道,这些轨道是线性的脉冲编码调制(PCM)编码的比特流。与数据光盘不同,它们对错误有一定的容忍度。正因如此,工具已经被创建出来,以尝试恢复 CDDA 并管理驱动器问题,如未对齐和帧抖动。^(7) 大多数 CDDA 工具是简单的音乐光盘 提取工具,它们将光盘轨道转换为音频文件(重新编码为其他音频格式)。在这个示例中,cdparanoia 执行了 PCM 数据的原始提取:

# cdparanoia --output-raw --log-summary 1- cdda.raw
cdparanoia III release 10.2 (September 11, 2008)

Ripping from sector      0 (track 1 [0:00.00])
          to sector 251487 (track 15 [4:58.72])

outputting to cdda.raw

(== PROGRESS == [                             | 251487 00 ] == :^D * ==)

Done.

这个命令将整个音乐光盘提取为一个包含所有音频轨道的原始 PCM 音频镜像文件。然后,你可以将此文件导入音频分析软件中。由于音频数据未被修改或重新编码,因此没有音频质量的损失或退化。

具有数字版权管理(DRM)和区域保护的 DVD 和蓝光光盘恢复起来具有挑战性。虽然存在用于恢复加密内容的 Linux 工具和指令,但这些内容故意不包括在本书的范围内。

磁带

磁带几乎在家庭环境中消失了。但它们仍然在小型、中型和企业环境中用于备份和归档。偶尔,您可能会收到要求从磁带中恢复数据的请求。例如,在公司法医实验室中,有时会在公司部门重组或搬迁时找到旧磁带。

历史上,常用的磁带有 4mm DAT、8mm Exabyte 和 DLT 磁带。如今,最常用的类型是 LTO 和 8mm DAT。这些磁带的最大原生/压缩容量分别为 DAT-320 的 160GB/320GB 和 LTO-7 的 6TB/15TB。现代 LTO 驱动器还支持加密磁带。

现代磁带驱动器通过 SAS 或光纤通道接口连接到主机系统。历史上,几乎所有磁带驱动器都遵循 SCSI 流命令(SSC)标准(SSC-5 是最新的)。

磁带技术使用自己的“文件”概念,这些文件按顺序放置在磁带上。通常,磁带文件由备份或归档软件创建的备份档案组成。磁带文件不像硬盘驱动器和光盘那样可以随机访问。相反,您需要通过前进或 间隔 跳到文件编号的开始位置,然后读取逻辑块直到文件末尾。

磁带上有不同的标记,用于告诉磁带驱动器磁头在磁带上的位置(见 图 6-2)。需要了解的有趣标记如下:

BOT 或 BOM(磁带或介质开始) 告诉驱动器可以开始读取或写入数据的位置。

EOF(文件结束) 告诉驱动器已经到达磁带文件的末尾。

EOD(数据结束) 告诉驱动器已到达写入数据的末尾(位于最后一个磁带文件之后)。这是磁带的逻辑末尾。

PEOT、EOT 或 EOM([物理] 磁带或介质结束) 告诉驱动器已到达物理磁带长度的末尾。

image

图 6-2:磁带上的文件和标记

在进行法医收集时,至关重要的是将磁带上的每个文件复制到 EOD 标记(磁带上最后一个可读文件)之前。使用标准的 SCSI 命令无法读取 EOD 之后的内容。一些法医公司提供专门的硬件和服务,能够恢复超出 EOD 的数据。

你可以使用 dd 的变体从磁带中提取文件。在以下示例中,三个位于磁带上的文件被恢复。选择非回绕设备进行磁带访问,通常为 Linux 上的 /dev/nst0,以防在复制所有文件之前,驱动器回绕磁带。命令会反复执行,始终使用相同的输入设备(它会取出磁带上的下一个文件),直到出现“0+0 records in”表示所有文件已提取完毕:

# dcfldd if=/dev/nst0 of=file0.tape hashlog=hash0.log
0+46 records in
14+1 records out
# dcfldd if=/dev/nst0 of=file1.tape hashlog=hash1.log
22016 blocks (688Mb) written.
0+70736 records in
22105+0 records out
# dcfldd if=/dev/nst0 of=file2.tape hashlog=hash2.log
256 blocks (8Mb) written.
0+1442 records in
450+1 records out
# dcfldd if=/dev/nst0 of=file3.tape hashlog=hash3.log
0+0 records in
0+0 records out

在带磁带文件恢复后,您可以分析文件类型。通常,您可以使用一个基本的文件类型程序来确定使用了哪种存档或备份格式。在此示例中,提取了两个 .tar 文件和一个 .dump 文件:

# ls -l
total 722260
-rw-r----- 1 root root    471040 Jan 14 01:46 file0.tape
-rw-r----- 1 root root 724336640 Jan 14 01:46 file1.tape
-rw-r----- 1 root root  14766080 Jan 14 01:47 file2.tape
-rw-r----- 1 root root         0 Jan 14 01:47 file3.tape
-rw-r----- 1 root root        46 Jan 14 01:46 hash0.log
-rw-r----- 1 root root        46 Jan 14 01:46 hash1.log
-rw-r----- 1 root root        46 Jan 14 01:47 hash2.log
-rw-r----- 1 root root        46 Jan 14 01:47 hash3.log
# file *.tape
file0.tape: POSIX tar archive (GNU)
file1.tape: POSIX tar archive (GNU)
file2.tape: new-fs dump file (little endian),  Previous dump Thu Jan 14 01:39:29
    2016, This dump Thu Jan  1 01:00:00 1970, Volume 1, Level zero, type: tape
    header, Label none, Filesystem / (dir etc), Device /dev/sdf1, Host lab-pc,
    Flags 3
file3.tape: empty

每个 hash.log* 文件包含一个单独的 MD5 哈希值,用于每个提取的磁带文件。在此示例中,file3.tape 是空的,可以忽略。

RAID 和多磁盘系统

对冗余独立磁盘阵列(RAID)系统的法医采集面临许多挑战,可能需要额外的步骤来完成。容量规划很重要,因为这可能涉及到对大量磁盘的成像。

本节假设 RAID 中的各个磁盘已分别成像并存在于采集工作站上。目标是将这些成像磁盘组装起来,使元设备层作为文件或块设备可访问,从而使用法医分析工具。

通常,RAID 系统在磁盘的开始位置(有时也在磁盘的结束位置)创建自己的头信息。该头信息用于唯一标识符(UUID)、阵列名称、时间戳、RAID 配置信息以及其他管理信息。

专有 RAID 采集

在使用硬件 RAID 控制器且没有软件工具来离线组装 RAID 的情况下,您可能需要克隆 RAID 磁盘,并启动一个带有控制器物理安装的检查系统。

本节中的示例聚焦于 Linux 软件 RAID,但也有许多开源工具可以支持获取和分析专有 RAID 系统。

例如,以下软件包包含这些工具,并可以从 Debian 软件库中获取:

dpt-i2o-raidutils Adaptec I2O 硬件 RAID 管理工具

array-info 一个用于报告多种 RAID 类型的 RAID 状态的命令行工具

cciss-vol-status HP SmartArray RAID 卷状态检查工具

cpqarrayd HP(Compaq)SmartArray 控制器的监控工具

dpt-i2o-raidutils Adaptec I2O 硬件 RAID 管理工具

mpt-status 一个从 mpt(及其他)硬件 RAID 控制器获取 RAID 状态的工具

varmon VA RAID 监控工具

除了这些软件包之外,dmraid 工具还能够识别多种专有格式的 RAID 元数据。您可以使用 -l 标志查看支持的格式列表,具体如下:

# dmraid -l
asr     : Adaptec HostRAID ASR (0,1,10)
ddf1    : SNIA DDF1 (0,1,4,5,linear)
hpt37x  : Highpoint HPT37X (S,0,1,10,01)
hpt45x  : Highpoint HPT45X (S,0,1,10)
isw     : Intel Software RAID (0,1,5,01)
jmicron : JMicron ATARAID (S,0,1)
lsi     : LSI Logic MegaRAID (0,1,10)
nvidia  : NVidia RAID (S,0,1,10,5)
pdc     : Promise FastTrack (S,0,1,10)
sil     : Silicon Image(tm) Medley(tm) (0,1,10)
via     : VIA Software RAID (S,0,1,10)
dos     : DOS partitions on SW RAIDs

dmraid 工具使用与 “管理驱动器故障和错误” 中所示相同的设备映射功能,见 第 159 页(其中使用了 dmsetup 工具模拟错误)。dmraid(8) 手册页提供了多个示例,用于重新组装各种专有 RAID 配置。^(8)

JBOD 和 RAID-0 条带化磁盘

"Just a Bunch Of Disks"(JBOD)是用来表示将多个磁盘连接成一个逻辑驱动器的术语(没有任何 RAID 配置来提高性能或冗余)。要将一组磁盘组装成一个单一的 JBOD 设备,您可以使用dmsetup命令。

当您从多个磁盘构建设备时,拥有一个单独的表文件来定义设备、偏移量和映射非常有用。在这个简单的文本文件中,您还可以包含有关磁盘的信息评论。

以下示例包含一个具有三个不同大小磁盘的 JBOD(JBOD 系统的特点是可以使用任何组合的驱动器大小)。该 JBOD 设备映射表文件(此示例中的jbod-table.txt)定义了它们如何连接。使用dmsetup命令并将表文件作为输入,以在/dev/mapper中创建设备:

# cat jbod-table.txt
0        15589376 linear /dev/sdm 0
15589376 15466496 linear /dev/sdn 0
31055872 15728640 linear /dev/sdo 0
# dmsetup create jbod < jbod-table.txt

此表定义了构建设备文件的三个映射,这些文件将出现在/dev/mapper中。每行定义了映射器设备中的偏移量、要映射的扇区数量、目标类型(线性)以及带有偏移量的目标设备(此处为零扇区,因为我们希望使用整个设备)。正确获取偏移量可能很棘手,可能需要一些计算。如果遇到问题,请先仔细检查偏移量。

表被管道传输到dmsetup create命令中,指定映射器设备的名称。设备创建后,您可以使用常规取证工具对其进行操作。以下示例展示了 Sleuth Kit 的fsstat命令在新创建的设备上使用:

# fsstat /dev/mapper/jbod
FILE SYSTEM INFORMATION
--------------------------------------------
File System Type: Ext4
Volume Name:
Volume ID: cfd74d32abd105b18043840bfd2743b3
...

当您不再需要映射器设备时,可以使用dmsetup命令将其删除,如下所示:

# dmsetup remove /dev/mapper/jbod

有关dmsetup工具使用的不同设备映射器类型的更多信息,请参阅 dmsetup(8)手册页。您可以使用设备映射进行加密、快照、RAID 系统,甚至模拟错误和故障设备(这对于测试取证工具的行为非常有用)。

RAID-0 条带磁盘是为了性能而创建的,而不是冗余。RAID-0 配置中的磁盘组具有所有驱动器的总容量,并且磁盘访问分布在阵列中(随着磁盘数量的增加,性能提高)。

如果您知道条带化 RAID-0 阵列的偏移量和块大小,则dmsetup工具可以创建一个映射器设备来表示已组装的阵列。

在以下示例中,一个由两个条带磁盘组成的 RAID-0 被附加到采集主机。已知该 RAID 系统有 2048 个初始扇区,其中包含元数据,块大小为 128 个扇区。然后,您可以按如下方式组装 RAID:

# dmsetup create striped --table '0 117243904 striped 2 128 /dev/sda 2048 /dev/sdb
    2048'

您可以使用常规文件系统取证工具分析此/dev/mapper设备。以下是使用 Sleuth Kit 的fls命令分析新创建的设备的示例:

# fls /dev/mapper/striped
r/r 4-128-4:    $AttrDef
r/r 8-128-2:    $BadClus
r/r 8-128-1:    $BadClus:$Bad

完成任务后,请勿忘记删除设备。

Microsoft 动态磁盘

微软创建了逻辑磁盘管理器(LDM)来管理逻辑卷,你可以使用基于 Linux 的工具 ldmtool 来分析微软的动态磁盘。这里的目标是使卷对取证工具具有块级访问权限。

在这个示例中,两个由微软 LDM 创建的卷的目标磁盘连接到采集主机。LDM 磁盘组由其全球唯一标识符(GUID)标识。你可以扫描磁盘以查找磁盘组的 GUID,使用 ldmtool 的show命令将获取更多关于该磁盘组的信息:

# ldmtool scan /dev/sda /dev/sdb
[
  "04729fd9-bac0-11e5-ae3c-c03fd5eafb47"
]
# ldmtool show diskgroup 04729fd9-bac0-11e5-ae3c-c03fd5eafb47
{
  "name" : "LENNY-Dg0",
  "guid" : "04729fd9-bac0-11e5-ae3c-c03fd5eafb47",
  "volumes" : [
    "Volume1"
  ],
  "disks" : [
    "Disk1",
    "Disk2"
  ]
}

show命令提供了磁盘组的名称和 GUID、卷名称以及磁盘的名称。这些信息足以创建映射设备。

知道 GUID 和卷名称后,你可以创建一个卷设备:

# ldmtool create volume 04729fd9-bac0-11e5-ae3c-c03fd5eafb47 Volume1
[
  "ldm_vol_LENNY-Dg0_Volume1"
]

这会在/dev/mapper中创建一个设备,它对应于动态磁盘上的文件系统(这相当于一个分区设备,如/dev/sda1)。然后,你可以使用常规的取证分析工具对该设备进行操作。以下是使用 Sleuth Kit 的fsstat命令的示例:

# fsstat /dev/mapper/ldm_vol_LENNY-Dg0_Volume1
FILE SYSTEM INFORMATION
--------------------------------------------
File System Type: NTFS
Volume Serial Number: 0CD28FC0D28FAD10
OEM Name: NTFS
Version: Windows XP

METADATA INFORMATION
--------------------------------------------
First Cluster of MFT: 786432
First Cluster of MFT Mirror: 2
Size of MFT Entries: 1024 bytes
Size of Index Records: 4096 bytes
...

当你不再需要该设备时,可以使用dmsetup命令将其移除,如在第 179 页的“JBOD 与 RAID-0 条带磁盘”中所示。

RAID-1 镜像磁盘

镜像磁盘很简单,由两个相同的磁盘组成(如果它们已同步的话)。将两个磁盘分别制作成镜像文件。根据镜像软件或硬件的不同,磁盘的起始扇区可能包含一个头信息,进行分析时需要跳过这些扇区。

以下示例展示了包含 EXT4 分区的镜像磁盘。镜像软件(Linux 软件 RAID)使用了前 32,768 个扇区,镜像文件系统从物理磁盘的该偏移开始,并且多个设备没有偏移,^(9) md0:

# fsstat /dev/md0
FILE SYSTEM INFORMATION
--------------------------------------------
File System Type: Ext4
Volume Name:
Volume ID: f45d47511e6a2db2db4a5e9778c60685
...
# fsstat -o 32768 /dev/sde
FILE SYSTEM INFORMATION
--------------------------------------------
File System Type: Ext4
Volume Name:
Volume ID: f45d47511e6a2db2db4a5e9778c60685
...
# fsstat -o 32768 /dev/sdg
FILE SYSTEM INFORMATION
--------------------------------------------
File System Type: Ext4
Volume Name:
Volume ID: f45d47511e6a2db2db4a5e9778c60685

在这个示例中,md0 上的相同文件系统也存在于两个物理设备(sde 和 sdg)的 32k 偏移处。镜像磁盘的加密校验和可能不会相互匹配,因为 RAID 头信息可能不同(如独特的磁盘 UUID 等),并且磁盘可能没有完全同步。

Linux RAID-5

如果多个磁盘是 Linux RAID 阵列的一部分,你可以分别获取它们,然后使用几种方法将它们组合在一起。dmsetup 工具通过表格提供了一个与 mdadm 交互的接口。mdadm 工具可以在已映射或已挂载的设备上运行。在以下示例中,使用了来自 Linux MD RAID-5 设置的三个获取的驱动器镜像。

对单个分区表进行 mmls 分析,揭示了每个磁盘映像(sda.rawsdb.raw,和sdc.raw)的第 2048 个扇区有一个 Linux RAID 分区。此扇区偏移被转换(使用 Bash 数学扩展)为losetup命令的字节偏移:

# mmls sda.raw
DOS Partition Table
Offset Sector: 0
Units are in 512-byte sectors

     Slot    Start        End          Length       Description
00:  Meta    0000000000   0000000000   0000000001   Primary Table (#0)
01:  -----   0000000000   0000002047   0000002048   Unallocated
02:  00:00   0000002048   0312580095   0312578048   Linux RAID (0xfd)
03:  -----   0312580096   0312581807   0000001712   Unallocated
# echo $((2048*512))
1048576

对阵列中每个磁盘创建一个只读循环设备,使用计算出的字节偏移(2048 个扇区,即 1048576 字节):

# losetup --read-only --find --show -o 1048576 sda.raw
/dev/loop0
# losetup --read-only --find --show -o 1048576 sdb.raw
/dev/loop1
# losetup --read-only --find --show -o 1048576 sdc.raw
/dev/loop2

前面的命令创建了与三个获取的映像文件对应的循环设备。你可以使用 mdadm 组装一个阵列,方法如下:

# mdadm -A --readonly /dev/md0 /dev/loop0 /dev/loop1 /dev/loop2
mdadm: /dev/md0 has been started with 3 drives.

现在,你可以使用常规取证工具访问和分析 RAID 元磁盘设备,路径为/dev/md0。这里展示了一个使用 Sleuth Kit 的fsstat命令的示例:

# fsstat /dev/md0
FILE SYSTEM INFORMATION
--------------------------------------------
File System Type: Ext4
Volume Name:
Volume ID: 37b9d96d8ba240b446894383764412
...

你也可以挂载新创建的设备,并使用常规文件工具访问它。可以使用正常的 Linux mount命令,方法如下:

# mkdir mnt
# mount /dev/md0 mnt
mount: /dev/md0 is write-protected, mounting read-only

完成分析后,按照清理过程的步骤反向操作,包括使用stop命令与 mdadm 系统:

# umount mnt
# rmdir mnt
# mdadm --stop /dev/md0
# losetup -d /dev/loop2
# losetup -d /dev/loop1
# losetup -d /dev/loop0

根据系统配置,Linux 内核可能会自动尝试重新组装已检测到的附加 RAID 设备,可能会启动一个重建操作,从而销毁证据。使用实时设备时,务必使用写入阻止,并确保创建只读循环设备和阵列。

本章中描述的许多技术适用于映射到映像文件的循环设备。创建和使用循环设备的更多示例,请参见第八章。

结束语

本章我介绍了本书的主要主题——取证采集。你学习了如何使用不同的基于 dd 的工具,创建具有取证格式的映像,并使用 SquashFS 作为取证证据容器。本书还展示了使用加密技术进行证据保存的各个方面,包括哈希、哈希窗口、签名和时间戳。你现在对在成像问题媒体时的错误管理和恢复有了更深入的了解。你能够在网络上成像,成像可移动媒体和多磁盘(RAID)系统。这是取证采集过程的核心。

第八章:取证图像管理

image

本章涉及获取后管理取证图像文件的各个方面。与磁盘上的典型文件相比,磁盘镜像非常庞大,移动、复制和转换这些大文件可能会变得笨重且耗时。你将学习多种管理大图像文件的技术,以帮助克服各种挑战。这些技术包括压缩和拆分图像以便更容易处理、使用加密保障图像安全以及在格式之间转换图像。此外,我还将描述如何以只读方式挂载图像进行安全的本地浏览,并演示取证克隆(或磁盘复制)。我还会讨论大图像文件的安全、可靠存储和网络传输。章节的最后我将介绍如何安全地擦除和处置图像及文件。我将从管理图像压缩开始。

管理图像压缩

原始磁盘镜像的大小始终与其包含的扇区总数相同。磁盘上的文件数量或数据量无关紧要,并不会影响未压缩原始镜像的大小。随着当前多太字节磁盘的广泛使用,在时间和磁盘容量的限制下操作镜像可能会面临挑战。即使是简单地复制一个镜像,也可能需要花费几个小时才能完成。通过保持图像压缩,你可以在一定程度上减少这个问题。

在取证背景下压缩图像涉及对整个磁盘的逐扇区压缩(与压缩磁盘上每个文件不同)。未曾写入过数据的磁盘,尤其是那些存有大量千兆字节或太字节空间的磁盘,会更容易压缩,因为磁盘的很多部分仍然是未触及的扇区,里面填充着零。使用过的磁盘压缩效果较差,因为大多数扇区已经被分配并且仍然包含残留数据。包含大量音频和视频文件的磁盘镜像压缩效果也不好,因为这些文件已经通过它们自己的算法进行了压缩。

选择最合适和高效的压缩工具和技术非常重要。有些工具可能对原始源文件或压缩后的目标文件有大小限制。其他工具可能效率较低,或者在压缩过程中使用临时文件,导致内存耗尽或产生磁盘空间问题。为了在进行压缩操作时解决这些问题,你可以使用管道和重定向。

使用压缩后的取证镜像最有用的功能之一是能够在不解压整个镜像的情况下直接使用取证工具进行分析。但这对于某些压缩工具来说是个问题,因为它们无法在压缩文件中进行定位。定位 允许程序随机访问文件中的任何位置。取证格式被设计为允许分析程序在压缩镜像上进行实时的随机访问。流行的取证格式都支持镜像压缩,通常在采集过程中进行,尽管并非所有工具默认进行压缩。

标准 Linux 压缩工具

当前开源世界中常用的压缩工具有 zip、gzip 和 bzip(版本 1 或 2)。本节中的示例使用了 gzip,但您也可以使用其他压缩工具。如果希望以时间和 CPU 周期为代价,尝试更好的压缩,您可以调整压缩级别。

如果有足够的磁盘空间,您可以直接压缩磁盘镜像文件,方法如下:

$ gzip image.raw

此命令创建文件 image.raw.gz,并在完成后删除原始文件。在压缩过程中,压缩文件和解压文件需要足够的空间共存。使用 gunzip 解压文件时同样适用。

您还可以在采集过程中通过管道和重定向实现即时压缩。例如:

# dcfldd if=/dev/sde | gzip > image.raw.gz

这里的输入文件是一个原始磁盘设备。没有指定输出文件时,dcfldd 会将镜像数据流发送到标准输出(stdout),然后通过管道传递给 gzip,最后重定向到一个压缩文件中。

压缩文件可以解压为原始镜像文件,您可以使用取证工具直接对其进行操作。或者,您可以将解压后的数据流通过 stdout 和 stdin 管道传递给某些程序。例如:

$ zcat image.raw.gz | sha256sum
1b52ab6c1ff8f292ca88404acfc9f576ff9db3c1bbeb73e50697a4f3bbf42dd0 -

这里,zcat 解压图像并将其传递给程序,以生成 sha256 加密哈希。值得注意的是,gzip 文件格式包含额外的元数据,如创建时间戳、原始文件名和其他信息。即使压缩文件内的哈希值相同,gzip 容器(image.raw.gz)的哈希值每次创建时也会不同。

EnCase EWF 压缩格式

ewfacquire 工具提供了控制采集过程中文件压缩的标志。例如:

# ewfacquire -c bzip2:best -f encase7-v2 /dev/sdj
ewfacquire 20150126
...
EWF file format:                        EnCase 7 (.Ex01)
Compression method:                     bzip2
Compression level:                      best
...
MD5 hash calculated over data:          9749f1561dacd9ae85ac0e08f4e4272e
ewfacquire: SUCCESS

在这个示例中,-c 标志可以指定一个压缩算法以及压缩级别。这里,算法是 bzip2,配置为最佳的压缩级别。由于只有 EWFv2 格式支持 bzip2,因此指定了格式版本 encase7-v2 作为参数。请注意,ewftools 需要编译时支持 bzip2。^(1)

FTK SMART 压缩格式

命令行工具 ftkimager 支持在采集过程中使用压缩镜像,如以下示例所示:

# ftkimager --compress 9 --s01 /dev/sdj image
AccessData FTK Imager v3.1.1 CLI (Aug 24 2012)
Copyright 2006-2012 AccessData Corp., 384 South 400 West, Lindon, UT 84042
All rights reserved.

Creating image...
Image creation complete.

在这里,--s01标志指定创建一个 SMART ew 压缩映像,而--compress标志设置为最高压缩级别。你可以使用--help标志来获取有关 ftkimager 压缩选项的更多信息。

AFFlib 内置压缩

尽管 AFFv3 已被弃用(forensicswiki.org/wiki/AFF),并且不鼓励使用 aimage(forensicswiki.org/wiki/Aimage),但这里提到 aimage 使用 AFFv3 压缩仅用于示范目的。

以下示例演示了使用 aimage 进行磁盘映像并指定 LZMA 压缩算法(而不是默认的 zlib):

# aimage --lzma_compress --compression=9 /dev/sdj image.aff
im->outfile=image.aff
image.aff****************************** IMAGING REPORT ******************************
Input: /dev/sdj
  Model: Nano S/N: 07A40C03C895171A
  Output file: image.aff
  Bytes read: 2,003,828,736
  Bytes written: 628,991,770

raw image md5:  9749 F156 1DAC D9AE 85AC 0E08 F4E4 272E
raw image sha1: 9871 0FB5 531E F390 2ED0 47A7 5BE4 747E 6BC1 BDB0
raw image sha256: 85B7 6D38 D60A 91F6 A0B6 9F65 B2C5 3BD9 F7E7 D944 639C 6F40 B3C4
    0B06 83D8 A7E5
Free space remaining on capture drive:  527,524 MB

Sleuth Kit 法医学软件提供了对 AFFlib 压缩映像的集成支持。AFFv4 引入了 aff4imager 工具,新增了额外的功能。这个工具可以在github.com/google/aff4/找到。

SquashFS 压缩证据容器

回想一下,在第六章中描述了如何使用 SquashFS 作为法医证据容器。当你创建 SquashFS 文件时,可以调整多个压缩参数。提供了三种压缩算法(gzip、lzo、xz),可以压缩 SquashFS 的各种元数据(如 inode 表、扩展属性),还可以进行其他调整。更多信息请参见 squashfs(1)手册页。

在这个示例中,一个原始映像文件被转换为一个压缩的 SquashFS 文件:

# mksquashfs image.raw image.sfs -comp lzo -noI
Parallel mksquashfs: Using 8 processors
Creating 4.0 filesystem on image.sfs, block size 131072.
...
Exportable Squashfs 4.0 filesystem, lzo compressed, data block size 131072
        compressed data, uncompressed metadata, compressed fragments, compressed
    xattrs
        duplicates are removed
Filesystem size 615435.77 Kbytes (601.01 Mbytes)
        31.45% of uncompressed filesystem size (1956923.96 Kbytes)
Inode table size 61232 bytes (59.80 Kbytes)
        100.00% of uncompressed inode table size (61232 bytes)
Directory table size 31 bytes (0.03 Kbytes)
        100.00% of uncompressed directory table size (31 bytes)
...

在这里,-comp标志将压缩算法设置为 lzo(gzip 是默认的),而-noI标志则阻止压缩 inode(指的是 SquashFS 容器中的 inode,而不是证据映像中的 inode)。

sfsimage shell 脚本管理 SquashFS 法医证据容器的创建,并增加了一些额外的法医功能。

在处理大型法医映像时,压缩的使用是至关重要的。然而,即使是压缩的映像,管理起来仍然可能非常庞大。还有一种方法可以简化这一过程:你可以将法医映像拆分成多个较小的部分。

管理拆分映像

由于文件大小庞大,管理获取的磁盘映像可能会出现问题。将映像分割成较小、易于处理的部分可以帮助解决这个问题。请考虑以下几个例子,在这些情况下,拆分映像可能是有益的:

• 在不稳定的网络连接下,可以通过多个较小的下载来进行网络传输,使用拆分映像。

• 一个大的映像文件可能会超过软件工具的最大文件大小。拆分映像提供了一种解决方法。

• 存储介质,如磁带、CD 或 DVD,具有固定的最大容量。拆分映像使你可以使用一组这些介质。

• 某些文件系统(尤其是 FAT)具有相对较小的最大文件大小。

拆分映像在数字取证中的最常见用途是用于证据的传输和存储。历史上,这通常是通过将映像刻录到一组 CD 或 DVD 中来完成的。

GNU split 命令

标准的 Unix 和 Linux 系统提供了 split 工具,用于将大文件分割成多个较小的文件。以下示例使用split命令将现有图像分割成 DVD 大小的块:

$ split -d -b 4G image.raw image.raw.
$ ls
image.raw.00  image.raw.01  image.raw.02  image.raw.03  image.raw.04
...

-d标志指定应该将数字扩展名添加到image.raw.(注意末尾的点);-b标志指定从image.raw文件中分割出的块的大小。

通过将多个工具结合使用,可以在采集过程中同时进行压缩和分割,从而节省时间和空间。以下是一个示例:使用 dd 命令采集图像,使用 gzip 压缩,并将其分割成 CD 大小的块:

# dd if=/dev/sdb | gzip | split -d -b 640m - image.raw.gz.

split命令的输入文件是-,指定了标准输入,并将压缩字节流分割成多个部分。需要注意的是,这些部分不会被单独压缩,不能单独解压。必须将分割后的部分重新组装才能进行解压。

采集过程中分割图像

你可以在采集过程中将成像的硬盘分割成多个部分,而不是在后续的单独步骤中进行分割。在采集大磁盘之前,考虑一下是否可能需要分割图像,以及什么样的碎片大小最合适。从一开始就使用合适的分割图像可以在调查过程中节省时间和磁盘空间。

分割图像在数字取证中非常常见,因此取证采集和分析工具对其提供了良好的支持。通常,标志可以设置碎片大小并自定义分割图像的扩展名。

dcfldd 工具提供了内建的分割功能。例如,如果你以后将图像通过一组 16GB 的 USB 闪存盘传输给第三方,可以在输出文件之前使用split=16G标志来使用 dcfldd 采集图像:

# dcfldd if=/dev/sdc split=16G of=image.raw
# ls
image.raw.000  image.raw.001  image.raw.002  image.raw.003  image.raw.004
...

默认扩展名是附加到输出文件名后的三位数字。

使用 dc3dd 工具时,可以通过指定ofsz=来分割采集过程中的图像,设置输出大小。文件扩展名是数字,如下所示:

# dc3dd if=/dev/sdh ofsz=640M ofs=image.raw.000
# ls -l
total 7733284
-rw-r----- 1 root root 671088640 Jan 14 10:59 image.raw.000
-rw-r----- 1 root root 671088640 Jan 14 10:59 image.raw.001
-rw-r----- 1 root root 671088640 Jan 14 10:59 image.raw.002
...
-rw-r----- 1 root root 671088640 Jan 14 11:00 image.raw.009
-rw-r----- 1 root root 671088640 Jan 14 11:00 image.raw.010
-rw-r----- 1 root root 536870912 Jan 14 11:00 image.raw.011

确保文件扩展名中有足够的零,否则 dc3dd 将无法完成并生成错误消息,例如[!!] file extensions exhausted for image.raw.0。该文件集中的最后一个文件通常会比其他文件小(除非图像大小正好可以被分割文件大小整除)。

EnCase 工具通常默认为在采集过程中分割图像。你可以使用 ewfacquire 通过指定最大分段文件大小(-S标志)来将磁盘采集成一个分割的 EnCase 图像:

# ewfacquire -S 2G /dev/sdc
...
# ls
image.E01  image.E02  image.E03  image.E04  image.E05  image.E06
...

商业版 EnCase 取证套件可以直接使用这些图像。

ftkimager 工具提供了--frag标志,用于在采集过程中将图像保存为多个部分,如下示例所示:

# ftkimager /dev/sdk image --frag 20GB --s01
AccessData FTK Imager v3.1.1 CLI (Aug 24 2012)
Copyright 2006-2012 AccessData Corp., 384 South 400 West, Lindon, UT 84042
All rights reserved.
...
# ls -l
total 53771524
-rw-r----- 1 holmes root 2147442006 Jul  2 08:01 image.s01
-rw-r----- 1 holmes root       1038 Jul  2 08:43 image.s01.txt
-rw-r----- 1 holmes root 2147412323 Jul  2 08:01 image.s02
-rw-r----- 1 holmes root 2147423595 Jul  2 08:02 image.s03
-rw-r----- 1 holmes root 2147420805 Jul  2 08:02 image.s04
...

这里的磁盘是通过设置最大碎片大小为 20GB 的方式进行获取,格式是 SMART 压缩镜像。请注意,添加了包含元数据的.txt文件。与某些法医格式不同,这些元数据并未嵌入由 ftkimager 创建的 FTK 拆分文件中。

访问拆分镜像文件集

法医工具,如 Sleuth Kit,支持直接对拆分镜像集进行操作,而无需先重新组装它们。要列出 Sleuth Kit 中支持的镜像,可以在任何 Sleuth Kit 图像处理工具中使用-i list标志:

$ mmls -i list
Supported image format types:
        raw (Single raw file (dd))
        aff (Advanced Forensic Format)
        afd (AFF Multiple File)
        afm (AFF with external metadata)
        afflib (All AFFLIB image formats (including beta ones))
        ewf (Expert Witness format (encase))
        split (Split raw files)

在这个示例中,支持拆分原始镜像(包括 Unix 拆分文件)、拆分 AFF 镜像和拆分 EnCase 文件(尽管没有明确说明,但拆分 EnCase 文件是受支持的)。这些图像格式类型中的一些可能需要在编译 Sleuth Kit 软件时显式包含。

在以下示例中,一个 EWF 镜像被拆分为 54 个部分。运行img_stat命令对第一个文件进行操作,可以提供完整文件集的信息:

$ img_stat image.E01
IMAGE FILE INFORMATION
--------------------------------------------
Image Type:            ewf

Size of data in bytes: 121332826112
MD5 hash of data:      ce85c1dffc2807a205f49355f4f5a029

使用各种工具,你可以直接操作拆分的镜像。当你指定拆分镜像类型的第一个文件时,大多数 Sleuth Kit 命令将适用于拆分的原始文件集。

最近版本的 Sleuth Kit 会自动检查拆分文件集:

$ mmls image.raw.000

早期版本的 Sleuth Kit 可能要求你指定拆分镜像类型:

$ fls -o 63 -i split image.000 image.001 image.002

要检查一组拆分文件是否被识别,img_stat命令将显示已识别的总字节数,对于原始类型,它还会显示每个部分的字节偏移范围:

$ img_stat image.raw.000
IMAGE FILE INFORMATION
--------------------------------------------
Image Type: raw

Size in bytes: 2003828736

--------------------------------------------
Split Information:
image.raw.000  (0 to 16777215)
image.raw.001  (16777216 to 33554431)
image.raw.002  (33554432 to 50331647)
image.raw.003  (50331648 to 67108863)
image.raw.004  (67108864 to 83886079)
...

另一种确定是否支持拆分文件的方法是运行命令或工具,并使用strace -e open来查看是否打开了每个拆分文件部分。

拆分文件并操作拆分文件集非常有用,但有时你需要将它们重新组装成一个完整的镜像。这将在下一节中展示。

重新组装拆分镜像

一般情况下,不需要重新组装拆分的法医格式文件,因为与特定法医格式(如 EWF、SMART 或 AFF)兼容的工具应该能够支持拆分文件。

因为原始镜像中不包含任何头部或元数据信息,重新组装只是将一组镜像片段连接成一个完整的镜像。仔细操作时,这应该是一个两步过程,如下所示:

$ ls -1 image.raw.*
image.raw.000
image.raw.001
image.raw.002
image.raw.003
...
$ cat image.raw.* > image.raw

ls -1标志将列出由 shell 通配符模式识别的文件。使用此列表将文件连接成一个完整镜像之前,请务必确认这是一份完整且有序的列表。如果拆分片段丢失或文件顺序错误,组装后的部分将无法创建正确的法医镜像。

如果你收到一堆 DVD,每张 DVD 包含一个压缩原始镜像的片段,你可以按以下方式重新组装它们:

$ cat /dvd/image.raw.gz.00 > image.raw.gz
$ cat /dvd/image.raw.gz.01 >> image.raw.gz
$ cat /dvd/image.raw.gz.02 >> image.raw.gz
$ cat /dvd/image.raw.gz.03 >> image.raw.gz
...

在这里,DVD 被反复插入并挂载到/dvd,直到映像文件被恢复,期间不断添加分割部分。请注意,初始的 cat 命令中的>创建了映像文件,而随后的命令中的>>则是追加数据(而非覆盖)。所有部分添加到目标文件后,解压后的映像的加密哈希应与获取时记录的哈希一致。

你还可以通过将所有分割文件传输到 zcat,并将输出重定向到一个文件,来解压并组装来自压缩映像的一组分割文件:

# cat image.raw.gz.* | zcat > image.raw

AFFlib 提供的一个有用方法允许使用 FUSE 文件系统对一组碎片进行虚拟重组。affuse 工具可以将一组分割文件呈现为一个完整的原始映像文件,如下所示:

# ls
image.raw.000  image.raw.011  image.raw.022  image.raw.033  image.raw.044
image.raw.001  image.raw.012  image.raw.023  image.raw.034  image.raw.045
...
#
# affuse image.raw.000 /mnt
# ls -l /mnt
total 0
-r--r--r-- 1 root root 8011120640 1970-01-01 01:00 image.raw.000.raw

在这里,一个包含原始文件的目录被表示为一个单一的磁盘映像文件,并且可以在/mnt虚拟文件系统中找到。你可以直接使用取证工具对这个原始文件进行操作。

验证取证映像的完整性

验证映像的加密哈希是数字取证中至关重要的一步,它是保留数字证据的基础。本节提供了验证映像的加密哈希和签名的示例。

验证证据的保留涉及确认映像的当前加密哈希与之前某个时间点的哈希是否一致。你可以使用哈希值来验证磁盘或映像上的成功操作(获取、转换、传输、备份等)。你还可以用它来验证磁盘或映像文件在较长时间内(几个月甚至几年)是否未被篡改。

哈希的要求(过程和算法)取决于使用的法律管辖区以及对取证实验室的组织政策。因此,本节不提供具体的哈希推荐。

验证获取时的哈希值

获取磁盘后,如果你需要验证获取的哈希值,任务非常简单(但可能耗时),只需将磁盘内容传输到加密哈希程序中。使用不同的程序来验证磁盘的哈希值,能够在工具层面提供独立的验证。例如:

# img_stat image.E01
IMAGE FILE INFORMATION
--------------------------------------------
Image Type:             ewf

Size of data in bytes:  2003828736
MD5 hash of data:       9749f1561dacd9ae85ac0e08f4e4272e
# dd if=/dev/sdj | md5sum
3913728+0 records in
3913728+0 records out
9749f1561dacd9ae85ac0e08f4e4272e  -
2003828736 bytes (2.0 GB) copied, 126.639 s, 15.8 MB/s

在这里,img_stat 输出指示了 EnCase 成像工具记录的 MD5 获取哈希。接着,使用第二个工具——常规的 dd 命令,重新计算来自原始磁盘设备的哈希。在这个例子中,两个 MD5 哈希匹配,确认证据的完整性得到了保留。

重新计算取证映像的哈希值

每种取证格式和基于 dd 的取证工具都可以记录或日志记录磁盘映像的哈希值。为了验证记录的哈希值,你可以重新计算磁盘映像的哈希值。在以下示例中,哈希值是在使用 dc3dd 进行获取时记录的,并存储在hashlog.txt中。哈希值可以通过以下方式验证:

# grep "(md5)" hashlog.txt
   5dfe68597f8ad9f20600a453101f2c57 (md5)
# md5sum image.raw
5dfe68597f8ad9f20600a453101f2c57  image.raw

哈希匹配,确认证据文件和哈希日志一致,从而表明证据的完整性得到了保留。

以下示例验证存储在 EnCase 格式元数据中的镜像。在此示例中,使用专用工具 ewfverify 来验证哈希:

# ewfverify image.Ex01
ewfverify 20160424

Verify started at: May 14, 2016 14:47:32
This could take a while.
...
MD5 hash stored in file:                 5dfe68597f8ad9f20600a453101f2c57
MD5 hash calculated over data:           5dfe68597f8ad9f20600a453101f2c57

ewfverify: SUCCESS

在这里,重新计算的哈希值匹配,确认了 EWF 镜像文件的一致性。该工具会自动验证一组拆分文件的哈希值,这些文件属于 EnCase 取证格式。

affinfo 工具对 AFF 文件执行类似的有效性检查。在此示例中,SHA1 哈希值被验证:

$ affinfo -S image.aff
image.aff is a AFF file
...
Validating SHA1 hash codes.
computed sha1: 9871 0FB5 531E F390 2ED0 47A7 5BE4 747E 6BC1 BDB0
  stored sha1: 9871 0FB5 531E F390 2ED0 47A7 5BE4 747E 6BC1 BDB0   MATCH

该输出确认 AFF 文件中包含的镜像的哈希值与 AFF 元数据中记录的哈希值相同。

拆分原始镜像的加密哈希值

计算一组原始拆分文件的加密哈希值是直接的,你可以通过将连接起来的部分传递到哈希程序中来完成此操作。以下示例计算一组拆分原始文件的 sha256 哈希值:

$ cat image.raw.* | sha256sum
12ef4b26e01eb306d732a314753fd86de099b02105ba534d1b365a232c2fd36a -

本示例假设文件部分的文件名可以按正确的顺序排序(在此示例中,可以通过ls -1 image.raw.*进行验证)。这里需要使用cat命令,因为它在将所有部分拼接在一起后,才能将其传递给 sha256sum。

你可以通过形成多个程序的命令管道来验证已压缩并拆分成多个部分的镜像的加密哈希值。在以下示例中,cat 将镜像拼接在一起,并将其传递给 zcat 进行解压。zcat 的输出被发送到哈希程序中,程序完成后会生成一个哈希值:

$ cat image.raw.gz.* | zcat | md5sum
9749f1561dacd9ae85ac0e08f4e4272e  -

这里,cat命令是必要的,因为它在传递给 zcat 之前将所有拆分的部分连接在一起。使用zcat image.raw.gz.*会失败,因为它会尝试解压每个文件片段,而不是解压整个拼接后的镜像。

在 Unix 社区中,无用的 cat 命令使用(UUOC)指的是使用cat命令将文件传送到命令,而可以使用<来代替。传统的 Unix 社区会授予 UUOC 奖项,鼓励更高效地使用 Shell 命令重定向。然而,本节中的示例确实需要cat命令,因为它们执行了连接功能。

识别不匹配的哈希窗口

随着磁盘老化,或在运输和处理过程中,可能会出现损坏的风险,进而可能引入坏道。如果原始证据磁盘自首次镜像以来就出现不可读的扇区错误,那么该磁盘的加密校验和将无法匹配。在这种情况下,哈希窗口变得非常有价值,因为你可以利用它们更精确地识别磁盘上哪个部分未能匹配。更重要的是,哈希窗口可以显示磁盘哪些区域仍然被保留,即使整个磁盘的哈希匹配失败。

哈希窗口的指定大小决定了在获取磁盘或验证磁盘哈希窗口时,每次写入新哈希的频率。当比较两个哈希列表以进行验证时,两个列表必须使用相同大小的哈希窗口。要找到不匹配的区域,可以使用 Unix diff 工具比较这两个哈希日志。

在以下示例中,使用 dcfldd 对磁盘进行了成像,并保存了一个具有 10M 哈希窗口大小的哈希日志。后续的验证未能匹配整个磁盘的 MD5 哈希,并提供了一个新的哈希日志,仍然使用 10M 哈希窗口大小:

$ diff hash1.log hash2.log
3c3
< 20971520 - 31457280: b587779d76eac5711e92334922f5649e
---
> 20971520 - 31457280: cf6453e4453210a3fd8383ff8ad1511d
193c193
< Total (md5): 9749f1561dacd9ae85ac0e08f4e4272e
---
> Total (md5): fde1aa944dd8027c7b874a400a56dde1

该输出揭示了完整图像以及介于 20971520 到 31457280 字节之间的字节范围的哈希值不匹配。通过除以 512 字节的扇区大小,可以确定哈希值不匹配发生的扇区范围为 40960 到 61440。磁盘其余部分的哈希值仍然是有效的;只有哈希值不匹配的扇区没有进行法医保留。位于哈希值不匹配的扇区范围内的内容(块、文件、文件部分等)可以在后续阶段从提交的证据中排除。如果两个完整图像的加密哈希值匹配,那么可以假设所有哈希窗口也匹配。

法医图像的加密哈希值保持了收集证据的完整性。然而,哈希值本身并未受到防止恶意或意外修改的保护。通过加密签名和时间戳,可以确认计算的哈希值的完整性得到保留。验证签名和时间戳的有效性将在下一节中展示。

验证签名和时间戳

前一章节演示了如何使用 GnuPG 对磁盘的哈希值进行签名。你可以在没有签名私钥的情况下验证签名。无需原始签署证据的人;只需要他们的公钥即可。此示例验证了对获取的磁盘镜像进行签名的人员的 gpg 签名:

$ gpg < hash.log.asc

dc3dd 7.2.641 started at 2016-05-07 17:23:49 +0200
compiled options:
command line: dc3dd if=/dev/sda hof=image.raw ofs=image.000 ofsz=1G hlog=hash.log
   hash=md5
input results for device `/dev/sda':
   5dfe68597f8ad9f20600a453101f2c57 (md5)
...
dc3dd completed at 2016-05-07 17:25:40 +0200

gpg: Signature made Sat 07 May 2016 17:29:44 CEST using RSA key ID CF87856B
gpg: Good signature from "Sherlock Holmes <holmes@digitalforensics.ch>"

在这里,显示了签名消息的内容(获取输出和哈希),以及一个 gpg 消息,表明签名是有效的。

对于 S/MIME 签名消息,类似的命令将验证(或使之失效)来自 PEM 文件的签名,命令如下所示:

$ gpgsm --verify image.log.pem
gpgsm: Signature made 2016-01-25 19:49:42 using certificate ID 0xFFFFFFFFABCD1234
...
gpgsm: Good signature from "/CN=holmes@digitalforensics.ch/EMail=holmes@
    digitalforensics.ch"
gpgsm:                 aka "holmes@digitalforensics.ch"

第六章讨论了使用时间戳服务从时间戳机构生成 RFC-3161 时间戳。验证时间戳类似于使用 S/MIME 验证签名,并且需要安装正确的证书颁发机构(CA)证书链,以便验证成功。此示例验证了之前使用 FreeTSA 创建的时间戳(http://freetsa.org/)。

如果时间戳服务的 CA 证书未安装在你的系统中,可以手动获取。TSA 证书应在请求时作为时间戳的一部分返回(由于-cert标志)。在此示例中,CA 证书是从 FreeTSA 获取的,方法如下:

$ curl http://freetsa.org/files/cacert.pem > cacert.pem

假设 CA 和 TSA 证书已经提供给 OpenSSL 并且有效,你可以通过以下方式验证时间戳:

$ openssl ts -verify -in hash.log.tsr -queryfile hash.log.tsq -CAfile cacert.pem
Verification: OK

openssl ts命令用于验证时间戳。提供时间戳查询(tsq)和时间戳响应(tsr),在此示例中,指定包含时间戳服务器 CA 证书的文件。第三方时间戳有效(Verification: OK),这表明自指定时间以来,文件(以及它包含的取证获取哈希值)未被修改。如果期望永久使用某个特定的时间戳认证机构,可以将 CA 证书添加到操作系统的受信任 CA 存储中。

AFFlib 还规定了使用 X.509 证书签名和验证获取的图像签名的功能。

本节未讨论信任链或公钥基础设施(PKI),这些是用于信任签署图像和验证时间戳的密钥所必需的。示例假设此信任已建立。

在图像格式之间转换

在不同取证图像格式之间转换可能有多种好处。如果实验室有新的软件或基础设施,并且当前格式不受支持或效率较低,转换为其他格式可能是一个选择。如果你需要将图像传输给第三方,他们可能有首选的图像格式。如果你接收来自第三方的图像,可能希望将其转换为你偏好的格式。本节提供了在命令行中进行格式转换的示例。展示了几种源格式的转换,包括 EnCase、FTK、AFF 和原始图像。此外,示例展示了将各种格式转换为 SquashFS 证据容器。

当你在不同图像格式之间转换时,最好使用管道和重定向。避免使用临时文件的工具。在转换过程中,可能会同时存在两份图像(其中一份或两份可能被压缩)。在准备转换过程时,进行一些容量规划。

转换后,检查原始图像和目标图像的哈希值,以确保匹配。

从原始图像转换

将原始图像转换为其他格式通常很简单,因为可以使用常规的磁盘映像功能。与其使用原始设备名称,通常使用原始图像的文件名。

以下示例展示了如何将一个原始图像文件转换为 EnCase 和 FTK 格式。第一个示例使用ewfacquireimage.raw转换为 EnCase 专家证人格式:

$ ewfacquire image.raw -t image -f encase7
ewfacquire 20160424

Storage media information:
Type:                                   RAW image
Media size:                             7.9 GB (7918845952 bytes)
Bytes per sector:                       512

Acquiry parameters required, please provide the necessary input
Case number: 42
Description: The case of the missing red stapler
Evidence number: 1
Examiner name: S. Holmes
Notes: This red USB stick was found at the scene
...
Acquiry completed at: May 14, 2016 15:03:40

Written: 7.3 GiB (7918846140 bytes) in 54 second(s) with 139 MiB/s
    (146645298 bytes/second)
MD5 hash calculated over data:          5dfe68597f8ad9f20600a453101f2c57
ewfacquire: SUCCESS

在这里,指定的源文件是原始镜像;-t 是 EnCase 目标 .e01 文件的基本名称。指定了 EnCase 版本 7,当命令执行时,会询问一系列问题。由于原始文件没有案件元数据,你需要手动输入这些信息。

从原始镜像转换为 FTK SMART 类似:你将原始镜像指定为源,并手动添加案件元数据。使用 ftkimage,你在命令行上指定案件元数据,如以下示例所示:

$ ftkimager image.raw image --s01 --case-number 1 --evidence-number 1 --description
    "The case of the missing red stapler" --examiner "S. Holmes" --notes "This USB
    stick was found at the scene"
AccessData FTK Imager v3.1.1 CLI (Aug 24 2012)
Copyright 2006-2012 AccessData Corp., 384 South 400 West, Lindon, UT 84042
All rights reserved.

Creating image...
Image creation complete.

--s01 标志指定将创建一个 SMART 压缩图像。基本文件名仅指定为 image,并且适当的文件扩展名会自动添加。

如果你使用 sfsimage 脚本,将图像转换为 SquashFS 取证证据容器也只是一个简单的命令,如下所示:

$ sfsimage -i image.raw image.sfs
Started: 2016-05-14T15:14:13
Sfsimage version: Sfsimage Version 0.8
Sfsimage command: /usr/bin/sfsimage -i image.raw
Current working directory: /exam
Forensic evidence source: if=/exam/image.raw
Destination squashfs container: image.sfs
Image filename inside container: image.raw
Aquisition command: sudo dc3dd if=/exam/image.raw log=errorlog.txt hlog=hashlog.txt
    hash=md5 2>/dev/null | pv -s 7918845952
7.38GiB 0:00:22 [ 339MiB/s] [=================================>] 100%
Completed: 2016-05-14T15:14:37

在这里,原始镜像文件与目标 SquashFS 容器文件名一起指定。sfsimage 脚本构建所需的 SquashFS 虚拟设备,并将日志和哈希信息添加为常规文本文件。你可以手动向证据容器中附加额外的案件元数据(使用 sfsimage -a)。

你无法直接使用典型的取证工具访问 gzip 压缩的原始镜像,因为无法在 gzip 文件中进行寻址(随机访问文件中的任意块)。最好将此类文件转换为可以寻址的压缩格式。然后你可以直接使用取证分析工具进行操作。在此示例中,一个 gzip 压缩的原始镜像文件被转换为一个使用 sfsimage 创建的 SquashFS 压缩文件:

$ zcat image.raw.gz | sfsimage -i - image.sfs
Started: 2016-05-14T15:20:39
Sfsimage version: Sfsimage Version 0.8
Sfsimage command: /usr/bin/sfsimage -i -
Current working directory: /exam
Forensic evidence source:
Destination squashfs container: image.sfs
Image filename inside container: image.raw
Aquisition command: sudo dc3dd   log=errorlog.txt hlog=hashlog.txt hash=md5
    2>/dev/null | pv -s 0
7.38GiB 0:00:38 [ 195MiB/s] [     <=> ]
Completed: 2016-05-14T15:21:18

原始文件仍然以原始形式存在,但现在它位于一个压缩文件系统中。你可以挂载生成的.sfs文件来访问原始镜像,如此处所示:

$ sfsimage -m image.sfs
image.sfs.d mount created
$ ls image.sfs.d/
errorlog.txt  hashlog.txt  image.raw  sfsimagelog.txt

你可以使用一个简单的 affconvert 命令将原始镜像文件转换为 AFF 文件:

$ affconvert image.raw
convert image.raw --> image.aff
Converting page 119 of 119
md5: 9749f1561dacd9ae85ac0e08f4e4272e
sha1: 98710fb5531ef3902ed047a75be4747e6bc1bdb0
bytes converted: 2003828736
Total pages: 120  (117 compressed)
Conversion finished.

然后你可以使用一个单独的工具(如 affsegment)添加案件元数据。affconvert 工具提供了合理的压缩默认设置,生成的文件具有.aff扩展名,并以原始文件的基本名称命名。

以下是最后一个示例,展示了如何使用 affconvert 命令将 SquashFS 取证证据容器中的原始镜像转换为 AFF 文件:

# affconvert -Oaff image.sfs.d/image.raw
convert image.sfs.d/image.raw --> aff/image.aff
Converting page 953 of 953
md5: d469842a3233cc4e7d4e77fd81e21035
sha1: 9ad205b1c7889d0e4ccc9185efce2c4b9a1a8ec6
bytes converted: 16001269760
Total pages: 954  (954 compressed)
Conversion finished.

由于 SquashFS 是只读的,你需要告诉affconvert将输出文件写入一个可写的不同目录。

从 EnCase/E01 格式转换

libewf 包含了 ewfexport 工具,用于将 EnCase EWF (.E0) 文件转换为其他格式。这包括读取一个或多个文件并将它们通过管道传输到其他程序的功能。

注意

某些旧版本的 ewfexport 存在一个 bug,会在导出到 stdout 后,将 ewfexport: SUCCESS 这一行附加到镜像的末尾。这个添加的字符串会导致图像的 MD5 校验和不匹配。该字符串的长度为 19 字节,因此你可以通过管道命令 tail -c 19 来抑制它。

手动创建 SquashFS 容器

在本书中,你已经看到了 sfsimage shell 脚本的示例。但看到没有脚本的情况下如何创建 SquashFS 文件也是很有用的。下一个示例将帮助你更好地理解 sfsimage 如何在内部工作。

以下的 EnCase 获取包含 54 个 *.E0 文件,这些文件将被组合成一个原始镜像并放入 SquashFS 证据容器中:

# ls
image.E01  image.E10  image.E19  image.E28  image.E37  image.E46
image.E02  image.E11  image.E20  image.E29  image.E38  image.E47
image.E03  image.E12  image.E21  image.E30  image.E39  image.E48
image.E04  image.E13  image.E22  image.E31  image.E40  image.E49
image.E05  image.E14  image.E23  image.E32  image.E41  image.E50
image.E06  image.E15  image.E24  image.E33  image.E42  image.E51
image.E07  image.E16  image.E25  image.E34  image.E43  image.E52
image.E08  image.E17  image.E26  image.E35  image.E44  image.E53
image.E09  image.E18  image.E27  image.E36  image.E45  image.E54

首先,你需要一个 mksquashfs 伪定义文件来定义将创建 SquashFS 容器中文件的命令。伪定义文件包含目标文件名、文件类型、权限、所有者和要执行的命令。该命令的输出将成为定义的文件名在 SquashFS 文件系统中的内容。

在以下示例中,已创建一个名为 pseudo_files.txt 的文件,文件中包含两个定义。第一个定义使用 ewfinfo 提取 EnCase 元数据并将其放入 image.txt(否则这些元数据将丢失)。第二个定义将 *.E0 文件中的原始镜像导出为 image.raw

# cat pseudo_files.txt
image.txt f 444 root root ewfinfo image.E01
image.raw f 444 root root ewfexport -u -t - image.E01

ewfexport 标志 -u 允许转换过程以无人值守的方式执行(否则它会提示用户提问)。-t 标志指定目标,在此示例中是 stdout 或者破折号 -

使用这个定义文件,你可以创建包含生成文件的压缩文件系统,如下所示:

# mksquashfs pseudo_files.txt image.sfs -pf pseudo_files.txt
Parallel mksquashfs: Using 12 processors
Creating 4.0 filesystem on image.sfs, block size 131072.
ewfexport 20160424

Export started at: May 12, 2016 19:09:42
This could take a while.
...
Export completed at: May 12, 2016 19:28:56

Written: 113 GiB (121332826112 bytes) in 19 minute(s) and 14 second(s) with
    100 MiB/s (105141097 bytes/second)
MD5 hash calculated over data:          083e2131d0a59a9e3b59d48dbc451591
ewfexport: SUCCESS
...
Filesystem size 62068754.40 Kbytes (60614.02 Mbytes)
        52.38% of uncompressed filesystem size (118492706.13 Kbytes)
...

生成的 SquashFS 文件系统 image.sfs 将包含三个文件:原始镜像文件 image.raw,包含元数据的 image.txt,以及包含已执行命令定义的 pseudo_files.txt 文件。mksquashfs(1) 手册页面提供了有关创建 SquashFS 文件系统的标志和选项的更多信息。

你可以通过以下命令使用 unsquashfs 查看 SquashFS 文件的内容:

# unsquashfs -lls image.sfs
...
-r--r--r-- root/root      121332826112 2016-05-12 19:09 squashfs-root/image.raw
-r--r--r-- root/root               770 2016-05-12 19:09 squashfs-root/image.txt
-rw-r----- root/root                98 2016-05-12 16:58 squashfs-root/
    pseudo_files.txt

最后的步骤是通过比较 MD5 哈希值来验证证据的完整性。ewfinfo 命令提供了原始 EnCase 获取过程中计算的 MD5 哈希值。你可以使用 md5sum 在 SquashFS 容器中的新转换的原始镜像上计算第二个 MD5 校验和。为此,你需要首先挂载 SquashFS 文件系统。以下示例展示了这些步骤:

# ewfinfo image.E01
ewfinfo 20160424
...
Digest hash information
        MD5:                    083e2131d0a59a9e3b59d48dbc451591

# mkdir image.sfs.d; mount image.sfs image.sfs.d
# md5sum image.sfs.d/image.raw
083e2131d0a59a9e3b59d48dbc451591  image.sfs.d/image.raw

结果显示两个 MD5 哈希值匹配,表明从 EnCase 到 SquashFS 容器中的原始镜像的证据转换已成功保存。在转换过程中计算的第三个匹配的 MD5 哈希可以在 ewfexport 输出中看到。ewfexport 工具还可以转换或导出为其他 EnCase 格式。

当挂载的 SquashFS 文件系统 image.sfs.d 不再需要时,可以通过 umount image.sfs.d 将其卸载。sfsimage 脚本会为你管理这些步骤。

从 EnCase 转换文件到 FTK

ftkimager 工具可以从 EnCase 转换到 FTK。在此示例中,一组 EnCase *.e01 文件被转换为 SMART ew 压缩文件,这些文件与原文件具有相同的名称,但扩展名为 **.s01*:

# ftkimager image.E01 image --s01
AccessData FTK Imager v3.1.1 CLI (Aug 24 2012)
Copyright 2006-2012 AccessData Corp., 384 South 400 West, Lindon, UT 84042
All rights reserved.
Creating image...
Image creation complete.

哈希值会被检查并添加到新的 FTK 文件中。原始的案例元数据不会添加到新转换的文件中,而是从原始格式中提取并保存为一个单独的文件,文件名相同,但扩展名为**.txt(例如在这个例子中是image.s01.txt*)。

从 FTK 格式转换

命令行工具 ftkimager 可以在 EnCase 和 FTK 格式之间进行转换,并允许您使用 stdin 和 stdout 与原始镜像文件进行转换。

在以下示例中,一组压缩的 FTK SMART *.s01 文件被转换为 EnCase EWF *E01 格式:

# ftkimager image.s01 image --e01
AccessData FTK Imager v3.1.1 CLI (Aug 24 2012)
Copyright 2006-2012 AccessData Corp., 384 South 400 West, Lindon, UT 84042
All rights reserved.

Creating image...
Image creation complete.

案例元数据不会转移到新格式中,而是自动保存到单独的文件中(image.E01.txt)。

ftkimager 可以将 SMART *.s01 文件转换为 stdout,您可以将其重定向到原始镜像文件,或者将其通过管道输入到其他程序中。在以下示例中,一组 FTK SMART 文件被转换为 SquashFS 法医证据容器,使用 ftkimager 输出通过管道传递给 sfsimage:

# ftkimager sandisk.s01 - | sfsimage -i - sandisk.sfs
Started: 2016-05-12T19:59:13
Sfsimage version: Sfsimage Version 0.8
Sfsimage command: /usr/bin/sfsimage -i -
Current working directory: /exam
Forensic evidence source:
Destination squashfs container: sandisk.sfs
Image filename inside container: image.raw
Aquisition command: sudo dc3dd   log=errorlog.txt hlog=hashlog.txt hash=md5
    2>/dev/null | pv -s 0
AccessData FTK Imager v3.1.1 CLI (Aug 24 2012)
Copyright 2006-2012 AccessData Corp., 384 South 400 West, Lindon, UT 84042
All rights reserved.

14.5GiB 0:01:37 [ 151MiB/s] [    <=>    ]
Completed: 2016-05-12T20:00:51
# sfsimage -a sandisk.s01.txt sandisk.sfs
Appending to existing 4.0 filesystem on sandisk.sfs, block size 131072

当您将 FTK 格式转换为原始磁盘镜像时,案例元数据不会被转移。您需要手动保存案例元数据,通常它保存在单独的文本文件中。您可以像之前的示例那样,使用sfsimage -a命令将其添加到 SquashFS 容器中。

在进行任何格式转换后,您应当在目标格式上单独验证哈希值,以确保证据的完整性已被保留。

从 AFF 格式转换

affconvert 工具可以将 AFF 镜像转换为原始镜像(也可以将原始镜像转换为 AFF 格式)。affconvert 工具不使用 stdin 或 stdout,而是读取或创建独立的文件。以下简单示例展示了将 AFF 文件转换为原始镜像:

$ affconvert -r image.aff
convert image.aff --> image.raw
Converting page 96 of 96
bytes converted: 1625702400
Conversion finished.

要将原始镜像转换为 AFF 格式,只需使用affconvert image.raw,系统会生成相应的image.aff文件。

要在 AFF 文件中使用管道和重定向,您可以使用 affcat 工具。之前的示例也可以通过affcat完成,并将输出重定向到文件(不包含任何状态或完成信息,这对于脚本很有用),如下面所示:

$ affcat image.aff > image.raw

要将 AFF 镜像转换为 EnCase 或 FTK 格式,可以使用 affcat 工具通过 stdout 或 stdin 将镜像传输到相应工具,从而创建所需格式的新镜像。例如,您可以像这样将 AFF 格式转换为压缩的 FTK SMART 镜像:

$ affcat image.aff | ftkimager - image --s01
AccessData FTK Imager v3.1.1 CLI (Aug 24 2012)
Copyright 2006-2012 AccessData Corp., 384 South 400 West, Lindon, UT 84042
All rights reserved.

Creating image...
Image creation complete.

这里,-代表接收原始镜像数据的 stdin 文件描述符,image是基础文件名,最后的标志--s01指定了压缩格式。

同样,您可以使用 efwacquirestream 转换为各种 EnCase 格式。例如:

$ affcat image.aff | ewfacquirestream -C 42 -E 1 -e "S. Holmes" -D "Data theft
    case" image
ewfacquirestream 20160424

Using the following acquiry parameters:
Image path and filename:                image.E01
Case number:                            42
Description:                            Data theft case
Evidence number:                        1
Examiner name:                          S. Holmes
...
Acquiry completed at: May 14, 2016 15:41:42

Written: 1.8 GiB (2003934492 bytes) in 10 second(s) with 191 MiB/s (200393449
    bytes/second)
MD5 hash calculated over data:          9749f1561dacd9ae85ac0e08f4e4272e
ewfacquirestream: SUCCESS

在之前的 AFF 转换示例中,案例元数据(如案件名称、检查员姓名、采集时间、哈希值等)在从 AFF 转换为其他格式时没有得到保留。但你可以使用 affinfo 导出这些信息,然后手动添加或保存到目标格式中。根据所使用的工具,你也可以将元数据作为命令行参数包含在内,正如前面示例中的-C 42 -E 1 -e "S. Holmes" -D "Data theft case"所示。

最后的这个例子展示了如何使用 sfsimage 将 AFF 文件转换为压缩的 SquashFS 取证证据容器:

$ affcat image.aff | sfsimage -i - image.sfs
Started: 2016-05-14T15:47:19
Sfsimage version: Sfsimage Version 0.8
Sfsimage command: /usr/bin/sfsimage -i -
Current working directory: /exam
Forensic evidence source:
Destination squashfs container: image.sfs
Image filename inside container: image.raw
Aquisition command: sudo dc3dd   log=errorlog.txt hlog=hashlog.txt hash=md5
    2>/dev/null | pv -s 0
1.87GiB 0:00:06 [ 276MiB/s] [          <=>         ]
Completed: 2016-05-14T15:47:26

你可以使用 affinfo 提取 AFF 文件的元数据,然后将其添加到 SquashFS 取证证据容器中,方法如下:

$ affinfo image.aff > affinfo.txt
$ sfsimage -a affinfo.txt image.sfs
Appending to existing 4.0 filesystem on image.sfs, block size 131072

一旦镜像转换完成,比较原始镜像和目标镜像的哈希值,以确保一致性。

使用加密保护镜像

数字取证中一个重要但常被忽视的组成部分是信息安全。在调查过程中,你应当将获得和提取的信息视为敏感信息,并适当保护其安全性。

数据机密性的丧失可能带来不良后果。例如,这可能违反组织的政策要求,危及法律和合规性,带来受害者隐私问题,甚至损害调查组织的声誉。如果没有充分保护获取的证据,可能会对任何相关方造成损害,包括调查人员及其雇主、受害者、被告及其他参与方。泄露的信息还可能干扰或危及正在进行的调查。

本节重点介绍确保信息保护的方法,特别是在数据传输和存储(包括长期和短期存储)过程中维持安全性。为镜像添加安全性会增加加密和后续解密的复杂性和所需时间,但你将在这里看到的示例尽力将这一过程保持尽可能简单高效。这里使用的是基本的对称加密,而非更复杂的公钥基础设施(PKI)或信任网系统。

除了本节中展示的方法外,ZIP 归档格式也可以用于加密。具有 ZIP64 扩展的较新版本支持超过 4GB 的文件大小。ZIP 格式具有与其他平台(如 Windows)高度兼容的优势。

GPG 加密

使用对称加密,你可以轻松地加密磁盘镜像,以便在网络传输或存储过程中保护数据。GNU 隐私保护工具(GPG)提供了一个免费的实现,符合 RFC-4880 定义的 OpenPGP 标准。它是传统 PGP 加密的替代方案,后者由 Phil Zimmerman 于 1990 年代初期创建。

在使用 GPG 时,启动代理是非常有用的。(使用 gpg2 时,代理会自动启动。)通常在登录时,通过以下命令启动代理:

$ eval $(gpg-agent --daemon)

在接下来的所有示例中,-v 标志用于增加详细输出。这使得输出对于文档编写(无论是本书还是用于创建正式的取证报告)更加有用。

使用 GPG 对现有图像进行加密非常简单,如下所示:

$ gpg -cv image.raw
gpg: using cipher AES
gpg: writing to `image.raw.gpg'
Enter passphrase:

会请求输入密码短语,并使用默认的对称加密算法对图像进行加密,创建一个扩展名为 .gpg 的新文件。由于 GPG 在加密的同时进行压缩,图像的大小会变小。这可以在这里看到:

$ ls -lh
total 1.2G
-r--r----- 1 holmes holmes 1.9G May 14 15:56 image.raw
-rw-r----- 1 holmes holmes 603M May 14 15:57 image.raw.gpg

上面的示例展示了在原地加密文件。但你也可以在采集过程中实时加密:

$ sudo dcfldd if=/dev/sde | gpg -cv > image.raw.gpg
Enter passphrase:
gpg: using cipher AES
gpg: writing to stdout
241664 blocks (7552Mb) written.
241664+0 records in
241664+0 records out

在这里,dcfldd 通过 /dev/sde 获取附加的磁盘,并将其直接传输到 GPG 程序。GPG 的加密输出然后被重定向到一个文件。sudo 命令将权限提升为 root,以便读取原始设备。

解密一个 GPG 加密的图像和加密过程一样简单。唯一的区别是使用解密标志以及需要指定输出文件(默认情况下,它会输出到 stdout)。在以下示例中,GPG 加密的图像文件被解密为一个常规(未加密)文件:

$ gpg -dv -o image.raw image.raw.gpg
gpg: AES encrypted data
Enter passphrase:
gpg: encrypted with 1 passphrase
gpg: original file name='image.raw'

这个示例展示了不带签名的对称加密。你还可以使用 GPG 公钥和私钥来加密、解密和签名图像。通过将 GPG 加密的图像的哈希与原始图像文件的哈希进行比较,可以验证其完整性,如下所示:

$ gpg -dv image.raw.gpg | md5sum
gpg: AES encrypted data
Enter passphrase:
gpg: encrypted with 1 passphrase
gpg: original file name='image.raw'
5dfe68597f8ad9f20600a453101f2c57  -
md5sum image.raw
5dfe68597f8ad9f20600a453101f2c57  image.raw

在解密图像时,需要进行一些容量规划。解密后,将会存在两个图像副本(其中一个或两个可能会被压缩)。

GPG 加密的文件是不可寻址的,因此不能直接使用取证分析工具对其内容进行操作。

OpenSSL 加密

其他加密系统也可以为磁盘镜像提供安全性。OpenSSL 工具包(www.openssl.org/提供了许多可以用来加密文件的算法。例如,要使用 256 位 AES 和密码块链接模式对图像进行密码加密,可以使用以下命令:

# openssl enc -aes-256-cbc -in image.raw -out image.raw.aes
enter aes-256-cbc encryption password:
Verifying - enter aes-256-cbc encryption password:

OpenSSL 对于加密算法和模式非常灵活,提供了数十种选择。还支持管道和重定向,你可以在采集过程中轻松进行加密,例如:

# dcfldd if=/dev/sdg | openssl enc -aes-256-cbc > image.raw.aes
enter aes-256-cbc encryption password:
Verifying - enter aes-256-cbc encryption password:
241664 blocks (7552Mb) written.
241664+0 records in
241664+0 records out

解密一个 OpenSSL 加密的文件也相对简单,只要知道加密算法,如下所示:

# openssl enc -d -aes-256-cbc -in image.raw.aes -out image.raw
enter aes-256-cbc decryption password:

添加 -d 标志表示这是一个解密操作(enc 指定使用对称加密)。由于 OpenSSL 没有提供自动检测使用了哪种对称加密算法的方法,因此记录文件的加密方式非常重要。

除非专门使用 zlib 编译,否则 OpenSSL 不会压缩文件。为了在采集过程中实时添加压缩,可以将 gzip 添加到管道中,像这样:

# dcfldd if=/dev/sdg | gzip | openssl enc -aes-256-cbc > image.raw.gz.aes
enter aes-256-cbc encryption password:
Verifying - enter aes-256-cbc encryption password:
241664 blocks (7552Mb) written.
241664+0 records in
241664+0 records out

要验证图像的加密哈希,可以运行类似的命令管道,如下所示:

$ openssl enc -d -aes-256-cbc < image.raw.gz.aes | gunzip | md5sum
enter aes-256-cbc decryption password:
4f9f576113d981ad420bbc9c251bea0c  -

在这里,解密命令将压缩并加密的文件作为输入,并将解密后的输出通过管道传送给 gunzip,后者将原始镜像输出到哈希程序。

一些 ZIP 实现也支持内建加密,可以用来保护镜像文件和其他证据文件。

法医格式内建加密

GPG 和 OpenSSL 是众所周知的加密工具,提供与其他工具的兼容性和互操作性。然而,它们并非专为数字取证设计,加密后的镜像文件不能直接被标准的法医工具使用(必须先解密)。本书中讨论的某些流行法医格式支持随机访问加密镜像。

ftkimager 程序可以使用密码或证书来保护镜像文件。以下是一个在采集过程中使用密码(monkey99)进行加密的示例:

# ftkimager --outpass monkey99 --e01 /dev/sdg image
AccessData FTK Imager v3.1.1 CLI (Aug 24 2012)
Copyright 2006-2012 AccessData Corp., 384 South 400 West, Lindon, UT 84042
All rights reserved.

Creating image...
Image creation complete.

注意

在命令参数中包含密码通常是不好的做法。密码会显示在 shell 历史记录中,任何人都可以在进程表中查看密码。

尝试在没有密码或密码错误的情况下访问加密镜像将会生成以下错误信息:

** Source is encrypted; please provide credentials for decryption.
** AD Decryption setup failed.

对加密镜像进行操作需要在命令行中包含密码,示例如下:

# ftkimager --inpass monkey99 image.E01 - > image.raw
AccessData FTK Imager v3.1.1 CLI (Aug 24 2012)
Copyright 2006-2012 AccessData Corp., 384 South 400 West, Lindon, UT 84042
All rights reserved.

一些版本的 EWF 格式支持加密,截至本文撰写时,libewf 的支持处于不同的开发阶段。有关当前加密格式支持的信息,请参见最新的源代码。

AFFlibsuite 允许你通过高级法医格式(AFF)库直接访问加密镜像。从一开始,AFFlib 就是考虑到信息安全而开发的。它提供了多种加密方式来保护法医镜像,包括基于密码的(对称)加密和基于证书的(X.509)加密。你可以使用 affcrypto 工具为已获取的镜像添加保护。以下是一个示例:

# affcrypto -e -N monkey99 image.aff
image.aff:   967 segments;     0 signed;   967 encrypted;     0 pages;
    0 encrypted pages

最近版本的 dd_rescue 实现了插件接口,并且(截至本文撰写时)有 LZO 压缩、加密哈希和对称加密(AES)插件。以下示例展示了如何对磁盘(/dev/sdc)进行镜像,并使用 AES 插件以加密形式保存输出:

# dd_rescue -L crypt=enc:passfd=0:pbkdf2 /dev/sdc samsung.raw.aes
dd_rescue: (info): Using softbs=128.0kiB, hardbs=4.0kiB
dd_rescue: (input): crypt(0): Enter passphrase:
dd_rescue: (warning): some plugins don't handle sparse, enabled -A/--nosparse!
dd_rescue: (info): expect to copy 156290904.0kiB from /dev/sdc
dd_rescue: (info): crypt(0): Derived salt from samsung.raw.aes=00000025433d6000
dd_rescue: (info): crypt(0): Generate KEY and IV from same passwd/salt
dd_rescue: (info): ipos: 156286976.0k, opos: 156286976.0k, xferd: 156286976.0k
                   errs:      0, errxfer:         0.0k, succxfer: 156286976.0k
             +curr.rate:    38650kB/s, avg.rate:    56830kB/s, avg.load: 14.9%
             >----------------------------------------.<  99%  ETA:  0:00:00
dd_rescue: (info): read /dev/sdc (156290904.0kiB): EOF
dd_rescue: (info): Summary for /dev/sdc -> samsung.raw.aes
dd_rescue: (info): ipos: 156290904.0k, opos: 156290904.0k, xferd: 156290904.0k
                   errs:      0, errxfer:         0.0k, succxfer: 156290904.0k
             +curr.rate:    29345kB/s, avg.rate:    56775kB/s, avg.load: 14.9%
             >-----------------------------------------< 100%  TOT:  0:45:53

如果法医实验室的检查员预计会处理大量加密、签名和时间戳的镜像与证据文件,那么投资使用公钥基础设施(PKI)是值得的。可以选择使用内部的 PKI 系统,或者外部的商业 PKI 提供商。

通用磁盘加密

前面的示例集中在保护单个文件或文件容器上。另一种选择是保护存放镜像文件的整个驱动器。你可以通过文件系统加密、硬件加密、用户空间加密或内核加密来实现。你将在本节中看到几个示例。

市场上有一些高容量的安全外部硬盘,可用于安全传输镜像文件,例如联想的 ThinkPad 安全硬盘,其中一款如图 7-1 所示。这些硬盘与操作系统无关,并通过设备上的物理键盘输入 PIN 码来加密硬盘内容。

image

图 7-1:ThinkPad 安全硬盘

TrueCrypt 曾是最流行的免费跨平台文件系统软件。但在 2014 年 5 月,开发者发布了一则意外且未作解释的公告,建议用户寻找 TrueCrypt 的替代品,因为该项目已停止开发。由此衍生出了一些分支和兼容项目,其中一些项目在这里列出:

• VeraCrypt: veracrypt.codeplex.com/

• tc-play: github.com/bwalex/tc-play/

• CipherShed: ciphershed.org/

• zuluCrypt: mhogomchungu.github.io/zuluCrypt/(不是 TrueCrypt 的实现,而是值得一提的 TrueCrypt 管理工具)

本节中的其余示例使用 VeraCrypt。撰写本文时,VeraCrypt 仍在积极开发中,并作为 TrueCrypt 的替代品,正在获得越来越多的关注。

以下示例演示了如何对整个外部硬盘进行加密。你可以将加密后的容器用于安全传输或存储证据数据。veracrypt 工具会询问一些有关加密容器设置的问题。请注意,在此示例中,/dev/sda是检查员的硬盘,而非被调查者的硬盘。

# veracrypt -c /dev/sda
Volume type:
 1) Normal
 2) Hidden
Select [1]:

Encryption Algorithm:
 1) AES
 2) Serpent
 3) Twofish
 4) AES(Twofish)
 5) AES(Twofish(Serpent))
 6) Serpent(AES)
 7) Serpent(Twofish(AES))
 8) Twofish(Serpent)
Select [1]:

Hash algorithm:
 1) SHA-512
 2) Whirlpool
 3) SHA-256
Select [1]:

Filesystem:
 1) None
 2) FAT
 3) Linux Ext2
 4) Linux Ext3
 5) Linux Ext4
 6) NTFS

Select [2]: 5

Enter password:
Re-enter password:

Enter PIM:

Enter keyfile path [none]:

Please type at least 320 randomly chosen characters and then press Enter:

The VeraCrypt volume has been successfully created.

现在,硬盘已经初始化为 VeraCrypt 容器(根据 PC 的速度和硬盘的大小,这可能需要较长时间)。要挂载 VeraCrypt 卷,你需要使用一个简单的命令,其中包括源设备和挂载点:

# veracrypt /dev/sda /mnt
Enter password for /dev/sda:
Enter PIM for /dev/sda:
Enter keyfile [none]:
Protect hidden volume (if any)? (y=Yes/n=No) [No]:
# veracrypt -l
1: /dev/sda /dev/mapper/veracrypt1 /mnt

安全移除设备需要“卸载”VeraCrypt 卷,这也可以通过一个简单的命令来完成,命令中指定了挂载点:

# veracrypt --dismount /mnt

此时,你可以将硬盘从系统中物理分离。此示例中的加密硬盘是整个原始设备,但也可以使用 VeraCrypt 容器文件。此示例中的挂载点是/mnt,但它可以是文件系统中的任何位置。

还有其他完整磁盘加密系统可以用来保护法证镜像文件和其他数据。你可以使用自加密硬盘(SED),详细内容请参阅“识别和解锁 Opal 自加密硬盘”第 128 页,使用sedutil-cli命令创建加密硬盘进行存储和传输。像 Linux LUKS 和 dm-crypt 这样的文件系统加密也提供类似的保护级别。尽管这些加密系统能在硬盘上保护证据数据,但它们可能与其他操作系统(例如 Windows 或 OS X)不兼容。

磁盘克隆与复制

在某些情况下,磁盘的克隆或复制副本比镜像文件更受欢迎。每个副本都是原始磁盘的逐扇区精确复制。新克隆的磁盘将拥有与原始磁盘匹配的加密校验和。克隆磁盘有几个用途:

• 使用需要写入磁盘的分析工具和方法

• 用克隆磁盘启动 PC

• 使用专有控制器重建 RAID 阵列

磁盘克隆是一个直接的过程;它基本上是反向的采集过程。在克隆过程中一定要小心,因为如果错误地使用了错误的设备作为目标磁盘,可能会破坏数据。

准备克隆磁盘

目标磁盘或克隆磁盘的大小(扇区数量)必须大于或等于原始磁盘。因为克隆涉及逐扇区复制,所以目标磁盘必须有足够的容量来容纳原始磁盘的所有扇区。在某些情况下,拥有更大的目标磁盘并不成问题,因为 PC 和操作系统会受限于分区表中定义的内容,并忽略磁盘的其余部分。在其他情况下,复制磁盘的精确扇区数量非常重要,因为软件和工具可能对扇区数量有特定的预期。一些例子包括 GPT 分区分析(备份存储在磁盘的末尾)和 RAID 系统,以及分析部分存储在磁盘最后几个扇区的恶意软件。

在克隆之前,安全地擦除目标磁盘(用零填充扇区)对于去除以前数据的痕迹并减少污染克隆的风险至关重要。

使用 HPA 复制扇区大小

HPA 可以用来模拟克隆磁盘上与原始磁盘相同数量的扇区。^(2) 如果有期望克隆磁盘和原始磁盘有完全相同数量的扇区,设置 HPA 会很有帮助。当你正在使用专有控制器重建 RAID 系统或复制一个数据预期存储在磁盘最后几个扇区的磁盘时,这一点尤其重要。

注意

在使用 hdparm 工具设置 HPA 之前,你应该知道原始磁盘的确切扇区数量(这是在将磁盘连接到检查主机时确定的)。

在这个示例中,500GB 硬盘上的 HPA 被设置为复制一个 120GB 的硬盘。原始磁盘报告了 234441648 个 512 字节的扇区,你可以利用这些信息来设置克隆磁盘上的最大可见扇区。使用以下命令:

# hdparm -N /dev/sdk

/dev/sdk:
 max sectors   = 976773168/976773168, HPA is disabled
# hdparm --yes-i-know-what-i-am-doing -N p234441648 /dev/sdk

/dev/sdk:
 setting max visible sectors to 234441648 (permanent)
 max sectors   = 234441648/976773168, HPA is enabled
# hdparm -I /dev/sdk
...
        LBA    user addressable sectors:  234441648
...
        device size with M = 1000*1000:      120034 MBytes (120 GB)
...

第一个hdparm -N命令显示了初始状态,500GB 的可访问扇区和禁用的 HPA。第二个hdparm命令需要--yes-i-know-what-i-am-doing标志来配置危险设置,例如更改扇区大小。-N p234441648指定扇区数量。它以字母p为前缀,这样更改将在磁盘重启后保持永久有效。最后一个hdparm命令检查磁盘是否报告新的扇区大小,现在与克隆磁盘(120GB)相同。

将镜像文件写入克隆磁盘

要将镜像写入新磁盘,使用与获取磁盘时相同的工具,只是过程是反向的。

你可以直接从原始嫌疑磁盘或先前获取的镜像文件使用标准的 dd 工具创建磁盘克隆。此示例展示了使用 dc3dd 将原始镜像文件写入克隆磁盘的过程:

# dc3dd if=image.raw of=/dev/sdk log=clone.log

dc3dd 7.2.641 started at 2016-01-16 01:41:44 +0100
compiled options:
command line: dc3dd if=image.raw of=/dev/sdk log=clone.log
sector size: 512 bytes (assumed)
120034123776 bytes ( 112 G ) copied ( 100% ), 663 s, 173 M/s

input results for file `image.raw':
   234441648 sectors in
output results for device `/dev/sdk':
   234441648 sectors out

dc3dd completed at 2016-01-16 01:52:48 +0100

现在你可以验证加密哈希值与原始文件的匹配情况。如果原始磁盘和克隆磁盘的扇区数量不匹配,则会产生错误(如果克隆磁盘的扇区不足以完成复制操作),或者哈希值将不匹配。

你可以将一组拆分图像、压缩图像或加密图像写回克隆磁盘,而无需先创建常规的镜像文件。

你还可以使用非原始格式,如 AFF、EnCase EWF 或 FTK SMART,来创建克隆磁盘。如果某个特定的取证工具无法将镜像写回设备,它可能能够将原始镜像传递到 dd 程序中,这样就可以完成操作。

镜像传输与存储

安全和成功地管理取证镜像的传输和长期存储需要一些思考和规划。通常,会发生需要将镜像传输给另一方的情况,例如大型组织内部的其他部门、独立的第三方取证公司或执法机构。

完成传输的过程受到多个因素的影响,主要是数据的大小和数据的安全性。此外,根据不同的组织,你可能还需要考虑法律和监管要求,以及组织的政策要求。例如,由于银行监管规定禁止将客户数据转移到境外,全球银行可能无法将某些磁盘镜像跨国界传输。

长期存储镜像也需要一定的思考和规划。如果某个镜像在几年后重新打开,可能会使用不同的员工、工具和基础设施。重要的是要记录已存储的内容,并保持与过去使用的软件的向后兼容性。

写入可移动媒体

过去,使用一堆 CD 或 DVD 来传输获取的磁盘镜像。通过压缩和分割,使用这些介质是一种便宜且可行的传输方法。如今,4TB 和 6TB 的硬盘已经很常见,10TB 硬盘已经进入消费市场。即使在压缩的情况下,光盘已不再是今天更大镜像文件的实用传输媒介。然而,为了完整性,以下仍然展示了几个示例。

以下简单示例演示了将 SquashFS 文件刻录到 CDROM。mkisofs命令是指向 genisoimage 的符号链接,用于创建文件系统,并通过 wodim 工具将其刻录到光盘。

# mkisofs -r -J maxtor-2gb-L905T60S.sfs | wodim dev=/dev/cdrom -
...
Starting to write CD/DVD at speed 48.0 in real TAO mode for single session.
...
 97.45% done, estimate finish Sat Jan 16 02:36:16 2016
 98.88% done, estimate finish Sat Jan 16 02:36:15 2016
...
348929 extents written (681 MB)
Track 01: Total bytes read/written: 714606592/714606592 (348929 sectors).

下面是一个简单的将镜像刻录到 DVD 的示例。growisofs 工具最初是作为 genisoimage 的前端,后来发展成为一个通用的 DVD 和 Blu-ray 刻录工具。

# growisofs -Z /dev/dvd -R -J ibm-4gb-J30J30K5215.sfs
Executing 'genisoimage -R -J ibm-4gb-J30J30K5215.sfs | builtin_dd of=/dev/dvd
    obs=32k seek=0'
...
 99.58% done, estimate finish Sat Jan 16 02:30:07 2016
 99.98% done, estimate finish Sat Jan 16 02:30:07 2016
1240225 extents written (2422 MB)
...

以下示例演示了使用growisofs命令将镜像刻录到 Blu-ray 光盘:

# growisofs -allow-limited-size  -Z /dev/dvd -R -J atlas-18gb.sfs
Executing 'genisoimage -allow-limited-size -R -J atlas-18gb.sfs | builtin_dd
    of=/dev/dvd obs=32k seek=0'
...
This size can only be represented in the UDF filesystem.
...
/dev/dvd: pre-formatting blank BD-R for 24.8GB...
...
 99.79% done, estimate finish Sat Jan 16 02:20:10 2016
 99.98% done, estimate finish Sat Jan 16 02:20:10 2016
2525420 extents written (4932 MB)
...

在 Linux 下将大型镜像刻录到光盘时可能会遇到一些问题。根据使用的驱动器和介质,可能会出现意外或不一致的行为。在将其用于生产环境之前,务必测试驱动器和介质的兼容性。

便宜的磁盘用于存储和传输

从一组分割和压缩的镜像创建一堆光盘需要一个系统化的过程,这个过程可能既费时又容易出错。目前 Blu-ray 光盘的最大容量为 100GB(BD-R XL)。Blu-ray 光盘每 GB 的成本高于便宜硬盘的每 GB 成本。

考虑到人工努力、错误风险、刻录数据到光盘所需的时间和每 GB 的成本,仅仅购买和使用便宜的硬盘,成为离线存储和转移取证镜像的一个有吸引力的选择。

执行大规模网络传输

有关通过网络获取镜像的一些问题,已经在第六章中讨论过。

获取的大型镜像进行网络传输可能需要较长的时间才能完成,且可能会饱和公司内部网络或互联网连接。在此类长时间网络传输过程中,也可能发生连接丢失和超时。

在网络之间传输大型取证镜像的速度远不如在本地机器上的磁盘之间传输。为了更好地理解网络带宽的速度,将其与常见的磁盘速度进行比较会很有帮助。表 7-1 将两种快速驱动器接口与两种快速网络接口进行了比较。

表 7-1: 常见接口的传输速度

接口 速度
NVME 4000MB/s
SATA III 600MB/s
Gigabit 以太网 125MB/s
快速以太网 12.5MB/s

有关不同带宽的更详细比较,请参阅 Wikipedia 页面上的* en.wikipedia.org/wiki/List_of_device_bit_rates*。

根据网络带宽和映像大小,物理传输一个存储容器,其中包含获取的主题图像,可能比网络传输更快。

但在某些情况下,安全的网络数据传输是必要的。在传输过程中确保安全可能会带来一些副作用,例如增加复杂性或性能下降。对于不受信任或未知的网络,可以使用几种标准的安全协议,包括 SSL/TLS、ssh/sftp 或 IPSEC。

以下简单示例展示了如何使用 OpenSSH 软件包中的 scp(安全复制)传输一个取证图像文件:

$ scp image.raw server1.company.com:/data/image.raw
image.raw                11% 1955MB  37.8MB/s   06:51 ETA
...

在这里,一个图像文件 (image.raw) 被通过不安全的网络复制到远程服务器的特定数据目录中。使用 scp 有多个优点,包括强大的加密算法、内置压缩、实时进度状态、预计完成时间和强身份验证功能。对于取证调查员来说,最重要的是,scp 支持非常大的文件大小(前提是软件二进制文件已编译为支持 64 位大文件大小),并且能够轻松传输大型磁盘映像。

如果一个图像文件已经加密,那么底层的安全性可能不那么重要,你可以使用传统的文件传输协议,如文件传输协议(FTP)或 Windows 服务器消息块(SMB)。然而,当你使用不安全和弱认证的协议传输加密文件时,应该在传输完成后通过验证加密哈希来确认文件的完整性。

安全擦除与数据销毁

每当你丢弃或重复使用磁盘,或者不再需要临时文件时,都应采取细致的措施来正确擦除内容。有多种命令行擦除和安全删除方法可以用于此目的。

销毁单个文件

在某些情况下,你可能需要安全地擦除单个文件,而不是整个磁盘。例如,你可能需要销毁临时获取的图像文件,这些图像文件存储在采集主机上。在这种情况下,使用文件销毁工具是合理的,因为它减少了破坏其他数据的风险,特别是在检查员的工作站上。

标准的 Linux 核心工具包包含 shred 工具,它试图安全地删除文件,如下所示:

$ shred -v confidential-case-notes.txt
shred: confidential-case-notes.txt: pass 1/3 (random)...
shred: confidential-case-notes.txt: pass 2/3 (random)...
shred: confidential-case-notes.txt: pass 3/3 (random)...

一个名为 secure_deletion 工具包的软件包提供了一套工具,旨在擦除交换空间、缓存、内存、i 节点和文件。特别是,srm 将擦除单个文件。另一个命令行工具叫做 wipe,也可以擦除文件。

擦除单个文件是一个复杂的过程,取决于所使用的操作系统和文件系统的许多变量。不能保证所有擦除或销毁的文件碎片都已被完全销毁。

安全擦除存储设备

擦除整个物理驱动器涉及将零或随机字节写入驱动器上的每个用户可访问扇区。这并不能保证所有隐藏或用户无法访问的物理驱动器区域都已被擦除。由 HPA 或 DCO 保护的扇区(这些可以被移除)、重新映射的坏扇区、闪存驱动器的过度配置区域,以及驱动器的不可访问系统区域都不能通过正常的 Linux 工具擦除。尽管如此,擦除所有用户可访问的扇区仍然提供了一个合理的保证,因此这是一种适用于实验室中重用驱动器的数据销毁方法。

根据特定组织的风险偏好和政策,数据销毁可能需要以下一种或多种方法:

• 完全不擦除,仅进行常规格式化

• 使用一次零擦除所有可见扇区

• 使用多次随机数据擦除所有可见扇区

• 物理消磁驱动器

• 物理粉碎驱动器

所需的销毁方法是基于风险的决策,取决于驱动器上数据的敏感性、可能对恢复数据有兴趣的人、恢复的成本和努力以及其他因素。

第一个示例使用 dc3dd 将零写入磁盘的每个可见扇区。dc3dd 工具具有内置的擦除功能,您可以按如下方式使用它:

# dc3dd wipe=/dev/sdi

dc3dd 7.2.641 started at 2016-01-16 00:03:16 +0100
compiled options:
command line: dc3dd wipe=/dev/sdi
device size: 29305206 sectors (probed),   120,034,123,776 bytes
sector size: 4096 bytes (probed)
120034123776 bytes ( 112 G ) copied ( 100% ), 3619 s, 32 M/s

input results for pattern `00':
   29305206 sectors in

output results for device `/dev/sdi':
   29305206 sectors out

dc3dd completed at 2016-01-16 01:03:35 +0100

你也可以使用 dd 配合/dev/zero作为输入文件来完成此任务,但 dc3dd 更快。

要确认磁盘已经被零擦除,你可以使用 dd 将磁盘读入 hexdump 程序:

# dd if=/dev/sda | hd

如果整个磁盘充满零,hexdump(hd)工具将显示一行零后跟一个星号([*]),表示整个磁盘上的重复模式。

0000000 000000 000000 000000 000000 000000 000000 000000 000000
*

如果结果仅显示零,表示驱动器的用户可访问扇区已成功擦除。

以下示例使用 nwipe 工具,这是 Darik 的启动和清除(dban)工具的一个分支。nwipe 工具可以指定不同的擦除标准、随机性和轮次数量,并提供活动日志文件。这里显示的是加拿大 RCMP TSSIT OPS-II 擦除版本:^(3)

# nwipe --autonuke --nogui --method=ops2 /dev/sdj
[2016/01/15 23:14:56] nwipe: notice: Opened entropy source '/dev/urandom'.
[2016/01/15 23:14:56] nwipe: info: Device '/dev/sdj' has sector size 512.
[2016/01/15 23:14:56] nwipe: warning: Changing '/dev/sdj' block size from 4096 to
    512.
[2016/01/15 23:14:56] nwipe: info: Device '/dev/sdj' is size 160041885696.
[2016/01/15 23:14:56] nwipe: notice: Invoking method 'RCMP TSSIT OPS-II' on device
    '/dev/sdj'.
[2016/01/15 23:14:56] nwipe: notice: Starting round 1 of 1 on device '/dev/sdj'.
[2016/01/15 23:14:56] nwipe: notice: Starting pass 1 of 8, round 1 of 1, on device
    '/dev/sdj'.
[2016/01/15 23:57:00] nwipe: notice: 160041885696 bytes written to device
    '/dev/sdj'.
[2016/01/15 23:57:00] nwipe: notice: Finished pass 1 of 8, round 1 of 1, on device
    '/dev/sdj'.
...

在擦除驱动器时,确保已移除 DCO 和 HPA。对于 NVME 驱动器,确保已擦除每个独立的命名空间(大多数消费者级 NVME 驱动器只有一个命名空间)。

发出 ATA 安全擦除单元命令

ATA 标准规定了一个安全擦除命令,可以直接向驱动器发出该命令以擦除磁盘。ATA SECURITY ERASE UNIT命令会将零写入磁盘的所有用户可访问扇区。EXTENDED SECURITY ERASE命令会写入一个预定义的模式(由驱动器制造商定义),而不是零。

运行hdparm命令可以显示驱动器安全功能的能力和状态。还会提供估算的安全擦除驱动器所需的时间,如下所示:

# hdparm -I /dev/sdh
...
        device size with M = 1000*1000:     500107 MBytes (500 GB)
...
Security:
        Master password revision code = 7
                supported
                enabled
        not     locked
        not     frozen
        not     expired: security count
                supported: enhanced erase
        Security level high
        60min for SECURITY ERASE UNIT. 60min for ENHANCED SECURITY ERASE UNIT.

如果您没有明确设置密码,有些驱动器会拒绝擦除命令。在以下示例中,使用的是 Western Digital 驱动器,密码首先设置为 dummy,然后才接受 --security-erase 命令:

# hdparm --security-erase dummy /dev/sdh
security_password="dummy"

/dev/sdh:
 Issuing SECURITY_ERASE command, password="dummy", user=user

该驱动器现已安全擦除,可以重新使用。如果驱动器需要设置密码,请在安全擦除完成后不要忘记禁用密码。

销毁加密磁盘密钥

您可以通过销毁加密密钥的所有已知副本来安全销毁加密的磁盘和文件系统。如果密钥是在如智能卡、TPM 或 Opal 驱动器等安全设备上生成的,那么只有一个密钥副本。如果驱动器或文件系统是在企业环境中配置的,则可能会有用于恢复目的的备份或托管副本。

针对基于操作系统的加密驱动器(如 Microsoft BitLocker、Apple FileVault、Linux LUKS/dm-crypt 或 TrueCrypt 变体)的密钥擦除程序,要求详细了解密钥存储的位置。密钥可能受到密码/短语保护,并存储在文件或驱动器的某个块中。它们也可能存储在其他地方的密钥文件中。如果无法定位并安全销毁所有副本的私钥,则替代方法是使用前述的完全驱动器擦除方法擦除磁盘。

通常,安全外部 USB 闪存驱动器具有用于找回丢失密码的出厂重置功能。这可以用来销毁密钥,从而销毁驱动器的内容。例如,您可以通过同时按住 KEY 和 0/1 按钮三秒钟来重置 Corsair Padlock2 闪存驱动器,然后输入 911 来重置密钥并销毁驱动器内容。在 iStorage datashur 驱动器上,按住 KEY 和 2 按钮三秒钟,然后输入 999 来重置密钥。

销毁 Opal SED 驱动器内容也是即时的,只需通过输入 物理安全 ID(PSID) 来销毁驱动器上的加密密钥即可。PSID 通常在驱动器的物理封面上有一个二维码,您可以扫描它来代替手动输入。您无法通过 ATA 命令查询获取 PSID;它仅在物理驱动器的封面上可见。

sedutil-cli 命令有一个特殊选项,可以使用 PSID 永久重置驱动器密钥:

# time sedutil-cli --yesIreallywanttoERASEALLmydatausingthePSID
     3HTEWZB0TVOLH2MZU8F7LCFD28U7GJPG /dev/sdi
- 22:21:13.738 INFO: revertTper completed successfully

real    0m0.541s
user    0m0.000s
sys     0m0.000s

驱动器中的加密密钥现在已重置,数据已有效销毁。磁盘已恢复出厂设置,解锁,并可以重新使用。销毁此 120GB 驱动器上的数据所需的时间为半秒。

结束语

在本章中,你学习了多种管理取证镜像的技术,包括使用常见的 Linux 工具进行压缩和取证格式中的内建压缩。你看到了更多关于 SquashFS 压缩文件系统的示例,以及用于管理取证证据容器的 sfsimage 脚本。我演示了镜像的分割与重组、驱动器的复制,以及镜像格式之间的转换。你还学习了如何验证哈希值、签名和时间戳,以及如何在网络传输和存储过程中使用加密保护镜像。最后,我展示了如何安全销毁取证镜像文件和驱动器。

第九章:特殊镜像访问主题

image

本章展示了如何获取磁盘镜像文件的信息,并将其作为块设备和挂载目录使其可访问。你将学习如何设置循环设备,并使用设备映射工具创建逻辑设备。你还将探索映射或转换软件加密磁盘镜像的方法,使其能够被取证工具访问。这些方法在图像内容无法直接访问且需要进行主动翻译或解密时非常有用。此类图像的示例包括加密文件系统、虚拟机(VM)镜像以及其他取证工具不直接支持的镜像文件格式。

每个部分还包括将(只读)镜像文件安全挂载为常规文件系统的示例,这些镜像文件将被挂载到取证采集主机上。然后,你可以使用常见程序轻松浏览和访问文件系统,如文件管理器、办公套件、文件查看器、媒体播放器等。

取证采集的镜像文件

本部分中许多方法和示例的基础是 Linux 循环设备(不要与环回设备混淆,环回设备是网络接口)。循环设备是一种伪设备,可以与常规文件关联,使得该文件可以作为块设备在/dev中访问。

Linux 系统通常默认创建八个循环设备,这对于取证采集主机可能不够,但你可以手动或自动在启动时增加这个数量。要在启动时创建 32 个循环设备,可以在/etc/default/grub文件的GRUB_CMDLINE_LINUX_DEFAULT=行中添加max_loop=32;重启后,应有 32 个未使用的循环设备可用。sfsimage 脚本使用循环设备挂载 SquashFS 取证证据容器。

本章将介绍来自常见虚拟机系统(如 QEMU、VirtualBox、VMWare 和 Microsoft Virtual PC)的不同虚拟机镜像。我还将描述如何访问操作系统加密的文件系统,包括微软的 BitLocker、苹果的 FileVault、Linux LUKS 和 VeraCrypt(TrueCrypt 的一个分支)。但让我们从最简单的镜像类型开始:通过 dd 风格的采集工具获取的原始磁盘镜像。

使用循环设备的原始镜像文件

最简单的循环设备演示可以使用原始镜像文件(可能是通过简单的dd命令采集的)。losetup命令用于在 Linux 系统中附加和分离循环设备。此示例为image.raw文件创建一个块设备:

# losetup --read-only --find --show image.raw
/dev/loop0

在这里,标志指定循环设备应为只读(--read-only),并且应使用下一个可用的循环设备(--find),并在完成后显示(--show)。指定的文件名(image.raw)随后将作为附加的块设备可用。

运行没有参数的losetup命令将显示所有已配置循环设备的状态。这里我们可以看到刚刚创建的一个:

# losetup
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE
/dev/loop0         0      0         0  1 /exam/image.raw

现在,/dev/loop0设备指向/exam/image.raw,你可以使用任何操作块设备的工具访问它。例如,这里使用 Sleuth Kit 的mmls命令,通过循环设备查看image.raw文件中的分区表:

# mmls /dev/loop0
DOS Partition Table
Offset Sector: 0
Units are in 512-byte sectors

     Slot    Start        End          Length       Description
00:  Meta    0000000000   0000000000   0000000001   Primary Table (#0)
01:  -----   0000000000   0000002047   0000002048   Unallocated
02:  00:00   0000002048   0058597375   0058595328   Linux (0x83)
03:  00:01   0058597376   0078129151   0019531776   Linux Swap / Solaris x86 (0x82)
04:  00:02   0078129152   0078231551   0000102400   NTFS (0x07)
05:  00:03   0078231552   0234441647   0156210096   Mac OS X HFS (0xaf)

当你不再需要循环设备时,只需按照以下方式分离它:

# losetup --detach /dev/loop0

循环设备是灵活且可配置的。在前面的 mmls 示例中,文件系统从第 2048 扇区开始。每次运行取证工具时,都可以指定偏移量,但为每个分区创建一个单独的设备(类似于/dev/sda1)会更容易。你可以通过指定正确的偏移量标志(--offset)和大小标志(--sizelimit)来仅为该分区创建一个单独的循环设备。然而,通常接受的做法是使用设备映射器。

你也可以手动使用 dmsetup 和映射表,如在《RAID 和多磁盘系统》的第 178 页中所描述的那样。然而,kpartx 工具自动化了为特定镜像文件创建分区设备的过程。以下示例中使用了一个具有四个分区的取证获取的镜像文件,展示了 kpartx 工具如何为每个分区创建映射设备:

# kpartx -r -a -v image.raw
add map loop0p1 (252:0): 0 58595328 linear /dev/loop0 2048
add map loop0p2 (252:1): 0 19531776 linear /dev/loop0 58597376
add map loop0p3 (252:2): 0 102400 linear /dev/loop0 78129152
add map loop0p4 (252:3): 0 156210096 linear /dev/loop0 78231552

在这里,kpartx 工具读取磁盘或镜像文件中的分区表,创建一个用于整个镜像的循环设备,然后为每个分区创建映射设备。-r标志确保驱动器循环和分区映射为只读,-a标志指示 kpartx 映射它找到的所有内容。使用详细标志-v来记录命令输出,并指示刚才映射了什么。

在这个示例中,创建了一个循环设备(/dev/loop0)用于整个镜像文件,并作为原始块设备可以访问。此外,分区设备现在可以在/dev/mapper目录中找到,你可以使用操作分区的取证工具访问它们,而无需指定任何偏移量。以下是一些用于某些分区的 Sleuth Kit 命令示例:

# fsstat /dev/mapper/loop0p1
FILE SYSTEM INFORMATION
--------------------------------------------
File System Type: Ext4
Volume Name:
Volume ID: d4605b95ec13fcb43646de38f7f49680
...
# fls /dev/mapper/loop0p3
r/r 4-128-1:    $AttrDef
r/r 8-128-2:    $BadClus
r/r 8-128-1:    $BadClus:$Bad
r/r 6-128-1:    $Bitmap
r/r 7-128-1:    $Boot
d/d 11-144-2:   $Extend
r/r 2-128-1:    $LogFile
r/r 0-128-1:    $MFT
...
# fsstat /dev/mapper/loop0p4
FILE SYSTEM INFORMATION
--------------------------------------------
File System Type: HFS+
File System Version: HFS+
...

从镜像文件映射到设备的文件系统可以安全地以只读模式挂载。这将允许你通过标准文件管理器、应用程序和其他文件分析工具访问它。你可以像示例中所示那样挂载和卸载循环分区:

# mkdir p3
# mount --read-only /dev/mapper/loop0p3 p3
# mc ./p3
...
# umount p3
# rmdir p3

在这里,创建了一个目录,p3,表示该分区,并且该目录与原始镜像文件位于同一目录下。然后,p3被用作挂载点(选择的挂载点可以是检查主机文件系统中的任何位置)。Midnight Commander(mc)是一个基于文本的文件管理器(Norton Commander 的克隆版),在本示例中用于查看挂载分区中的文件。当不再需要挂载点时,umount命令(此命令只有一个n)卸载文件系统,rmdir 则移除挂载点目录。这是传统的 Unix 方式,用于在主机系统上挂载和卸载文件系统。

当您不再需要驱动环回和分区映射时,可以通过使用 kpartx 删除(-d)标志和镜像文件名来删除它们,如下所示:

# kpartx -d image.raw
loop deleted : /dev/loop0

请注意,这个“删除”操作不会影响磁盘镜像的内容。删除的是环回设备和映射,而不是驱动镜像,驱动镜像并没有被修改。

如果原始镜像具有损坏或被覆盖的分区表,您可以扫描镜像文件查找文件系统,并使用 dmsetup 手动将文件系统映射为设备(使用 dmsetup 表格)。

创建、挂载、卸载或分离环回设备时需要 root 权限。操作/dev/loopX设备时也需要 root 权限,尤其是使用取证工具时。本节中的示例是作为 root 用户运行的,以简化命令行的复杂性,使其更易理解。通过在命令前加sudo,可以作为非 root 用户执行特权命令。

取证格式镜像文件

ewflib 软件包包括一个名为 ewfmount 的工具,用于“挂载”取证镜像的内容,使其可以作为常规原始镜像文件访问。

以下示例展示了一组**.e01*文件。通过mkdir创建了一个挂载点,在本例中为raw,该挂载点将包含原始镜像文件:

# ls
image.E01  image.E02  image.E03  image.E04  image.E05
# mkdir raw

ewfmount 工具创建了一个 FUSE 文件系统,其中包含一个来自一个或多个 EWF 文件的虚拟原始镜像。您可以使用第一个 EnCase EWF 文件和挂载点运行ewfmount命令来访问一个原始镜像文件,如下所示:

# ewfmount image.E01 raw
ewfmount 20160424

# ls -l raw
total 0
-r--r--r-- 1 root root 16001269760 May 17 21:20 ewf1

然后,您可以使用不直接支持 EWF 格式的工具来操作这个虚拟原始镜像文件。在下面的例子中,使用十六进制编辑器(不支持 EWF)在扇区模式下分析原始镜像:

# hexedit -s raw/ewf1
...

kpartx 工具再次用于识别分区并创建相应的环回设备,从而使可以使用操作块设备的工具,并允许挂载文件系统进行常规浏览。以下是使用 ewfmount 挂载的**.e01*文件的 kpartx 输出:

# kpartx -r -a -v raw/ewf1
add map loop0p1 (252:0): 0 29848707 linear /dev/loop0 63
add map loop0p2 (252:1): 0 2 linear /dev/loop0 29848770
add map loop0p5 : 0 1397592 linear /dev/loop0 29848833

让我们继续使用这个例子来为一个分区创建挂载点,并挂载和访问文件系统:

# mkdir p1
# mount --read-only /dev/mapper/loop0p1 p1
# ls p1
cdrom  home/       lib32/       media/  proc/  selinux/  tmp/  vmlinuz
bin/     dev/   initrd.img  lib64        mnt/    root/  srv/      usr/
boot/    etc/   lib/        lost+found/  opt/    sbin/  sys/      var/
...

在此示例中,创建了一个与分区对应的挂载点并将分区设备挂载到该点,然后通过ls访问文件系统。如果可能,避免在挂载证据文件和容器时使用/mnt或其他共享挂载目录。当镜像的挂载点与其他相关案件文件位于同一工作目录时,取证工作会更容易进行。

如之前所述,当工作完成后,您需要清理挂载点和虚拟文件。这一步依旧按照反向顺序进行:

# umount p1
# kpartx -d raw/ewf1
loop deleted : /dev/loop0
# fusermount -u raw
# rmdir p1 raw

本示例中展示了fusermount命令,但标准的 Linux umount命令也可以使用。确保您的当前工作目录不在挂载点内,并且没有程序在挂载点内打开文件。如果满足这两个条件,清理步骤将会失败。

使用 SquashFS 法医证据容器时,您可以通过使用 sfsimage -m 挂载 .sfs 文件,创建分区设备,然后挂载所需的分区来访问原始镜像。然后,您可以在目标镜像的文件系统上执行常规命令。完整的示例如下:

# sfsimage -m image.sfs
image.sfs.d mount created
# kpartx -r -a -v image.sfs.d/image.raw
add map loop1p1 (252:0): 0 29848707 linear /dev/loop1 63
add map loop1p2 (252:1): 0 2 linear /dev/loop1 29848770
add map loop1p5 : 0 1397592 linear /dev/loop1 29848833
# mkdir p1
# mount /dev/mapper/loop1p1 p1
mount: /dev/mapper/loop1p1 is write-protected, mounting read-only
# ls -l
...

完成访问原始镜像及其文件系统后,SquashFS 法医证据容器的清理过程也需要反向操作。sfsimage -u 命令卸载 SquashFS 文件系统,如本示例所示:

# umount p1
# kpartx -d image.sfs.d/image.raw
loop deleted : /dev/loop1
# sfsimage -u image.sfs.d/
image.sfs.d unmounted

本节演示了几种访问法医格式内容的方法,既可以作为块设备,也可以作为常规文件系统。ewfmount 工具也适用于 FTK SMART 文件。Afflib 有一个类似的工具叫做 affuse,用于挂载 .aff 文件。ewfmount 和 affuse 都可以在各自格式的单个文件或分割文件上操作。

请注意,许多法医工具(例如 Sleuth Kit)能够直接操作法医格式,而无需原始块设备或原始文件。

使用 xmount 准备启动镜像

法医调查员通常希望使用非法医工具(如文件管理器、办公套件、应用程序或其他文件查看工具)检查目标驱动器镜像。这可以通过使驱动器内容通过只读挂载安全地提供给本地考官机器访问来实现。

在某些情况下,启动目标驱动器到虚拟机中进行观察和直接与目标环境互动是有用的。这允许您查看目标桌面并使用目标计算机上安装的程序。为此,您可以使用本节中描述的多种工具。

xmount(发音为“crossmount”)工具创建一个虚拟磁盘镜像,您可以使用虚拟机软件(如 VirtualBox 或 kvmqemu)启动。xmount 工具允许您模拟一个读写驱动器,使虚拟机认为磁盘是可写的,但它仍然保持镜像为只读状态。提供多种虚拟机输出格式,包括 raw、DMG、VDI、VHD、VMDK 和 VMDKS。

输入格式包括法医获取的镜像文件,如 .raw、EnCase .ewf 和 AFFlib .aff 文件。

这是一个使用 xmount 设置的原始镜像(image.raw),作为 VirtualBox .vdi 文件的示例:

$ mkdir virtual
$ xmount --cache xmount.cache --in raw image.raw --out vdi virtual
$ ls virtual/
image.info  image.vdi
$ cat virtual/image.info
------> The following values are supplied by the used input library(ies) <------

--> image.raw <--
RAW image assembled of 1 piece(s)
30016659456 bytes in total (27.955 GiB)

------> The following values are supplied by the used morphing library <------

None
$ virtualbox

在此示例中,创建了一个名为 virtual 的目录,用于保存虚拟镜像文件(该文件将通过 FUSE 挂载)。从现有的 image.raw 文件中,xmount 命令在 ./virtual 目录中创建一个写缓存的 VirtualBox VDI 镜像。这仅仅是镜像文件的虚拟表示;它不会被复制或转换(因此不会浪费考官机器的磁盘空间)。--in--out 标志指定使用的镜像格式。输入格式必须是 raw、AFF 或 EWF。可以选择多种输出格式。

在虚拟机中启动操作系统镜像可能会遇到困难,特别是当已安装的操作系统期望的硬件配置与虚拟机提供的配置不同。通常,Linux 安装较少遇到此问题,但 Windows 和 OS X 可能会出现此问题。为了解决这个问题,创建了两个工具,opengates 和 openjobs,用于准备 Windows 和 OS X 镜像,以便在虚拟环境中安全启动目标磁盘。我不会介绍如何使用 opengates 和 openjobs,但你可以在www.pinguin.lu/openjobs/www.pinguin.lu/opengates/上找到更多相关信息。

当你不再需要虚拟机镜像时,可以通过卸载虚拟镜像并删除挂载点目录来进行清理:

$ fusermount -u virtual
$ ls virtual/
$ rmdir virtual

一个包含在使用虚拟机时写入数据的xmount.cache文件可能存在。如果需要继续之前的虚拟机会话,可以保存该文件,或者选择删除它。

虚拟机镜像

随着家庭计算机性能的提升、现代 CPU 支持的硬件虚拟化和廉价或免费的虚拟化软件的可用性,对虚拟机镜像内容的分析需求不断增加。在某些情况下,你可能会在目标 PC 上发现许多虚拟机镜像。本节将重点介绍如何访问常见的虚拟机镜像文件类型,如 QCOW2、VDI、VMDK 和 VHD。

QEMU QCOW2

QCOW2 格式是 Linux 中常见的虚拟机镜像类型,并且被 QEMU 模拟器使用。在本节中,我将展示如何将 QCOW2 镜像作为块设备提供,并安全地挂载以供浏览。

libqcow-utils 软件包(由 Joachim Metz 编写,ewflib 的作者)包含 qcowinfo 和 qcowmount 工具。你可以像使用之前示例中的 ewfinfo 和 ewfmount 工具一样使用这两个工具。但以下示例展示了使用qemu-img命令、nbd 内核模块和 qemu-nbd 工具的替代方法。这种方法具有性能优势,因为它在内核中运行,并且省去了几个步骤,因为你不需要使用 kpartx。

给定一个.qcow2文件,qemu-img命令可以提供该文件的概述:

# qemu-img info image.qcow2
image: image.qcow2
file format: qcow2
virtual size: 5.0G (5368709120 bytes)
disk size: 141M
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false
    refcount bits: 16
    corrupt: false

若要使用 nbd 以原始镜像表示访问 QCOW 镜像,你需要加载 nbd 内核模块:

# modprobe nbd
# dmesg | grep nbd
[16771.003241] nbd: registered device at major 43

losetup命令不同,设备不会自动选择。需要按如下方式指定一个/dev/nbd设备:

# qemu-nbd --read-only --connect /dev/nbd0 image.qcow2
# dmesg | grep nbd0
[16997.777839]  nbd0: p1

在这里,QCOW2 镜像文件已连接到内核模块,并以只读模式挂载,分区设备已自动检测。你可以像示例中所示,使用此原始设备进行取证工具分析:

# mmls /dev/nbd0
DOS Partition Table
Offset Sector: 0
Units are in 512-byte sectors

     Slot    Start        End          Length       Description
00:  Meta    0000000000   0000000000   0000000001   Primary Table (#0)
01:  -----   0000000000   0000002047   0000002048   Unallocated
02:  00:00   0000002048   0010485759   0010483712   Linux (0x83)

分区设备(本示例中的原始设备名称加上p1)也可以直接用于取证工具。为了说明这一点,以下是直接在分区设备的文件系统上操作的fls命令:

# fls /dev/nbd0p1
d/d 11: lost+found
r/r 12: hosts
d/d 327681:     $OrphanFiles
...

在本地挂载设备进行浏览是很简单的。创建一个本地挂载点目录,并按正常方式挂载文件系统,如下所示:

# mkdir p1
# mount /dev/nbd0p1 p1
mount: /dev/nbd0p1 is write-protected, mounting read-only
# ls p1
hosts  lost+found/

这里的清理过程类似于使用 loop 设备的示例,但步骤更少。所有进程应该关闭文件,且在卸载前需要离开挂载目录。qemu-nbd disconnect 命令指定设备名称,将设备从内核中注销,如下所示:

# umount p1
# qemu-nbd --read-only --disconnect /dev/nbd0
/dev/nbd0 disconnected
# rmdir p1

一个可选步骤是使用 rmmod nbd 移除内核模块。但如果您还会进行更多 QCOW 挂载,保留它也没有问题。您还可以通过将其添加到 /etc/modules 文件中,在启动时自动加载 nbd 模块。

VirtualBox VDI

VirtualBox 是由 Oracle(前身为 Sun Microsystems)维护的开源项目。虽然它支持多种虚拟机镜像格式,但以下示例中使用的是 VirtualBox VDI 镜像。与之前一样,使用相同的 qemu-nbd 命令,但这次使用的是 OpenSolaris 镜像。

VirtualBox 软件包包括多个实用工具;这里显示的是 VBoxManage 工具,提供有关 VDI 镜像的信息:

# VBoxManage showhdinfo OpenSolaris.vdi
UUID:           0e2e2466-afd7-49ba-8fe8-35d73d187704
Parent UUID:    base
State:          created
Type:           normal (base)
Location:       /exam/OpenSolaris.vdi
Storage format: VDI
Format variant: dynamic default
Capacity:       16384 MBytes
Size on disk:   2803 MBytes
Encryption:     disabled

您可以使用 qemu-nbd 和 nbd 内核模块来挂载 VirtualBox 镜像(如前节中使用 QCOW2 时所见)。这里展示的 Open-Solaris 示例与 Windows 和 Linux 使用的分区方案略有不同。也展示了多个磁盘切片^(1):

# qemu-nbd -c /dev/nbd0 OpenSolaris.vdi
# dmesg
...
[19646.708351]  nbd0: p1
                p1: <solaris: [s0] p5 [s1] p6 [s2] p7 [s8] p8 >

在本示例中,单一的 Solaris 分区(p1)包含多个切片(p5p6p7p8)。

您可以使用与前面 QEMU 示例相同的方法访问原始设备和分区设备,然后将分区以只读方式挂载到本地挂载点。这里同样不需要使用 kpartx 来查找分区,因为内核会自动完成。访问完分区(或切片)后,执行清理步骤,卸载文件系统并断开 nbd 设备连接。

VMWare VMDK

虚拟机磁盘(VMDK)格式由 VMWare 的虚拟机软件产品使用。以下示例使用 libvmdk-utils 软件包在 Apple Lion VMDK 镜像上,该镜像被分割成多个部分:

# ls
lion-000001-s001.vmdk  lion-000003-s007.vmdk  lion-s009.vmdk
lion-000001-s002.vmdk  lion-000003-s008.vmdk  lion-s010.vmdk
lion-000001-s003.vmdk  lion-000003-s009.vmdk  lion-s011.vmdk
lion-000001-s004.vmdk  lion-000003-s010.vmdk  lion-s012.vmdk
lion-000001-s005.vmdk  lion-000003-s011.vmdk  lion-s013.vmdk
lion-000001-s006.vmdk  lion-000003-s012.vmdk  lion-s014.vmdk
lion-000001-s007.vmdk  lion-000003-s013.vmdk  lion-s015.vmdk
lion-000001-s008.vmdk  lion-000003-s014.vmdk  lion-s016.vmdk
...

您可以使用 vmdkinfo 获取有关已组装镜像及每个“扩展”(Extents)的信息:

# vmdkinfo lion.vmdk
vmdkinfo 20160119

VMware Virtual Disk (VMDK) information:
        Disk type:                      2GB extent sparse
        Media size:                     42949672960 bytes
        Content identifier:             0xadba0513
        Parent content identifier:      0xffffffff
        Number of extents:              21

Extent: 1
        Filename:                       lion-s001.vmdk
        Type:                           Sparse
        Start offset:                   0
        Size:                           2146435072 bytes
...

创建挂载点并挂载镜像文件后,可以将其作为原始镜像文件进行访问:

# mkdir lion
# vmdkmount lion.vmdk lion
vmdkmount 20160119
# ls -ls lion
total 0
0 -r--r--r-- 1 root root 42949672960 May 17 22:24 vmdk1
# mmls lion/vmdk1
GUID Partition Table (EFI)
Offset Sector: 0
Units are in 512-byte sectors

     Slot    Start        End          Length       Description
00:  Meta    0000000000   0000000000   0000000001   Safety Table
01:  -----   0000000000   0000000039   0000000040   Unallocated
02:  Meta    0000000001   0000000001   0000000001   GPT Header
03:  Meta    0000000002   0000000033   0000000032   Partition Table
04:  00      0000000040   0000409639   0000409600   EFI System Partition
05:  01      0000409640   0082616503   0082206864   Untitled
06:  02      0082616504   0083886039   0001269536   Recovery HD
07:  -----   0083886040   0083886079   0000000040   Unallocated

如本章前面所示,使用 kpartx 将创建关联的磁盘和分区块设备。然后,您可以直接使用取证分析工具对其进行分析,或将其挂载到本地机器上以浏览文件系统。

Microsoft VHD

有多种方法可以使 Microsoft VHD 虚拟镜像格式变得可访问。例如,您可以使用 qemu-nbd 方法或使用 libvhdi-utils 配合 vhdiinfo 和 vhdimount。

另一种方法是使用带有 Xen blktap xapi 接口的 blktap-utils。与 nbd 方法类似,blktap 需要你插入内核模块并手动分配一个设备。会启动一个 tapdisk 进程,附加到驱动程序,并指示其打开磁盘映像。blktap-utils 的手册页面不太有用,但你可以在 Xen 网站上找到相关描述,链接为 wiki.xen.org/wiki/Mounting_a_.vhd_disk_image_using_blktap/tapdisklists.xen.org/archives/html/xen-api/2012-05/msg00149.html

为了完成这一部分,我将重复使用 libvhdi 工具设置设备的过程。为了简便起见,之前的示例使用了特权 root 用户。但接下来的示例演示了授权使用sudo的非特权用户。

要作为非特权用户运行 FUSE 的mountunmount命令,你需要在/etc/fuse.conf中设置user_allow_other

你可以使用vhdiinfo来查找关于映像的信息,不需要特别的权限:

$ vhdiinfo windows.vhd
vhdiinfo 20160111
Virtual Hard Disk (VHD) image information:
        Format:                 1.0
        Disk type:              Dynamic
        Media size:             136365211648 bytes
        Identifier:             c9f106a3-cf3f-6b42-a13f-60e349faccb5

你可以在没有 root 权限的情况下使用 FUSE 挂载映像,但你需要明确地指示vhdimount命令通过添加-X allow_root标志来允许 root 用户访问。这个标志也需要允许 root 通过sudo执行进一步的操作(例如使用 kpartx 创建块设备):

$ mkdir raw
$ vhdimount -X allow_root windows.vhd raw
vhdimount 20160111

$ ls -l raw/
total 0
-r--r--r-- 1 holmes holmes 136365211648 Jan 20 08:14 vhdi1

原始映像现在可以在./raw目录中找到,你可以使用标准工具访问它。要创建循环设备和映射器设备,使用sudo命令运行kpartx。一旦设备创建完成,你可以通过sudo命令访问它们。所有块设备的访问都需要sudo命令。以下是使用 kpartx 和 fls 的示例:

$ sudo kpartx -r -a -v ./raw/vhdi1
add map loop0p1 (252:0): 0 266334018 linear /dev/loop0 63
$ sudo fls /dev/mapper/loop0p1
r/r 4-128-4:    $AttrDef
r/r 8-128-2:    $BadClus
r/r 8-128-1:    $BadClus:$Bad
r/r 6-128-1:    $Bitmap
r/r 7-128-1:    $Boot
d/d 11-144-4:   $Extend
r/r 2-128-1:    $LogFile
r/r 0-128-1:    $MFT

挂载文件系统同样需要sudo,并且通过明确指定-o ro可以将其挂载为只读。这里展示了创建挂载点、挂载上一个示例中的文件系统并通过ls命令访问它的示例:

$ mkdir p1
$ sudo mount -o ro /dev/mapper/loop0p1 p1
$ ls p1
AUTOEXEC.BAT                 IO.SYS          $RECYCLE.BIN/
...

清理此会话需要sudo来卸载原始映像并移除循环设备和映射器设备。你可以在没有 root 权限的情况下移除.vhd文件的 FUSE 挂载。以下是步骤:

$ sudo umount p1
$ sudo kpartx -d raw/vhdi1
loop deleted : /dev/loop0
$ fusermount -u raw

你可以通过编辑/etc/sudoers文件来配置sudo命令。本书中的许多示例为了简化命令行操作,使用了 root 用户,减少了复杂命令的数量。作为一种良好的实践,建议作为非特权用户工作,并使用诸如sudo之类的安全机制。

操作系统加密文件系统

现在让我们来看一下如何访问常见的加密文件系统。重点不在于密钥恢复(虽然我提供了一些建议),而是如何使用已知密钥访问文件系统。假设密钥或密码可以通过内存转储、企业组织中的托管/备份、依法强制提供的个人、愿意提供帮助的受害者、商业恢复服务/软件或其他来源获得。

你可以使用各种分区分析工具来确定文件系统加密的类型,这些工具能够识别头部、魔法数字以及其他特定加密文件系统类型的独特标志物。在取证环境中,你可以在 encase-forensic-blog.guidancesoftware.com/2014/04/version-7-tech-tip-spotting-full-disk.html 找到有关识别文件系统加密的概述。

在本节中,你将找到有关特定加密镜像的信息,这些信息用于创建一个未加密的块设备或文件,你可以使用取证工具访问,或者安全地挂载以进行本地浏览。

微软 BitLocker

微软当前的默认文件系统加密是 BitLocker。它在块级别进行加密,保护整个卷。为可移动介质设计的 BitLocker 变体称为 BitLocker-To-Go,它在常规的未加密文件系统上使用加密容器文件。本节中的示例展示了两个开源工具:dislocker 和 libbde。

由 Romain Coltel 编写,你可以在 github.com/Aorimn/dislocker/ 找到 dislocker 包。它提供了处理 BitLocker 卷的各种工具,包括查看元数据、创建解密的镜像文件和 FUSE 挂载卷。

dislocker-find 工具扫描所有附加的分区设备和指定文件,以识别任何 BitLocker 卷的存在。如果在将设备附加到获取主机的过程中已经识别了目标设备,可能就不需要扫描 BitLocker 设备了。

dislocker-metadata 命令提供了 BitLocker 驱动器的概览。下一个示例来自一个 USB 闪存驱动器的镜像。整个驱动器都被加密,并且没有分区表。可以通过以下方式查询该镜像文件:

# dislocker-metadata -V bitlocker-image.raw
...
Wed Jan 20 13:46:06 2016 [INFO] BitLocker metadata found and parsed.
Wed Jan 20 13:46:06 2016 [INFO] =====[ Volume header informations ]=====
Wed Jan 20 13:46:06 2016 [INFO]   Signature: 'MSWIN4.1'
Wed Jan 20 13:46:06 2016 [INFO]   Sector size: 0x0200 (512) bytes
...
Wed Jan 20 13:46:06 2016 [INFO]   Number of sectors (64 bits): 0x0000000200000000
    (8589934592) bytes
Wed Jan 20 13:46:06 2016 [INFO]   MFT start cluster: 0x0000000000060001 (393217)
    bytes
...
Wed Jan 20 13:46:06 2016 [INFO] =====================[ BitLocker information
    structure ]=====================
Wed Jan 20 13:46:06 2016 [INFO]   Signature: '-FVE-FS-'
Wed Jan 20 13:46:06 2016 [INFO]   Total Size: 0x02f0 (752) bytes (including
    signature and data)
Wed Jan 20 13:46:06 2016 [INFO]   Version: 2
Wed Jan 20 13:46:06 2016 [INFO]   Current state: ENCRYPTED (4)
Wed Jan 20 13:46:06 2016 [INFO]   Next state: ENCRYPTED (4)
Wed Jan 20 13:46:06 2016 [INFO]   Encrypted volume size: 7918845952 bytes
    (0x1d8000000), ~7552 MB
...

此命令的输出提供了许多详细的加密信息,这里未展示。你可以将 dislocker-metadata 的输出保存为文本文件,以供文档记录使用。该命令也可以直接在附加的设备上操作。

与之前的密码和加密示例一样,假设您已经拥有密钥。有些商业工具可用于尝试密码暴力破解以恢复密钥。此外,您还可以使用波动性插件从内存镜像中提取 FVEK(github.com/elceef/bitlocker/),并且可以将该工具与 inception memorydumping 工具一起使用。这里不涉及这些工具的使用。

您可以创建一个虚拟文件或块设备,在“原地”操作解密后的磁盘镜像视图。执行此过程与 “VM Images” 中的示例类似,详见 第 237 页。dislocker 软件包提供了一个工具,可以创建一个虚拟表示解密卷的 FUSE 文件系统:

# mkdir clear
# dislocker-fuse -u -V bitlocker-image.raw clear
Enter the user password:
# ls -l clear/
total 0
-rw-rw-rw- 1 root root 7918845952 Jan  1  1970 dislocker-file
...

出现在 clear 目录中的文件是加密文件系统的解密表示,您可以使用常规的取证工具对其进行操作。以下是使用 Sleuth Kit 的 fsstat 工具的示例:

# fsstat clear/dislocker-file
FILE SYSTEM INFORMATION
--------------------------------------------
File System Type: FAT32

OEM Name: MSDOS5.0
Volume ID: 0x5a08a5ba
Volume Label (Boot Sector): NO NAME
Volume Label (Root Directory): MY SECRETS
File System Type Label: FAT32
Next Free Sector (FS Info): 34304
Free Sector Count (FS Info): 15418664
...

您可以安全地挂载解密后的文件系统镜像以进行正常浏览。mount 命令具有 loop 选项,允许直接挂载分区镜像文件,如下所示:

# mkdir files
# mount -o loop,ro clear/dislocker-file files
# ls files
Penguins.jpg  private/  System Volume Information/
...

本示例中的清理工作很简单,只需卸载文件的挂载点,移除 FUSE 挂载,并删除挂载目录:

# umount files
# rmdir files
# fusermount -u clear
# rmdir clear

请注意,前面的示例是使用 root 权限执行的,以减少复杂性并使其更易于理解。您可以作为非特权用户执行相同的命令,如下所示:

$ dislocker-metadata -V bitlocker-image.raw
$ mkdir clear files
$ dislocker-fuse -u -V bitlocker-image.raw -- -o allow_root clear
$ sudo mount -o loop,ro,uid=holmes clear/dislocker-file files
...
$ sudo umount files
$ fusermount -u clear
$ rmdir clear files

在这里,dislocker-fuse-o allow_root 传递给 FUSE 驱动程序,允许使用 sudo 进行挂载和卸载。uid=holmes 确保 Holmes 先生可以在没有 root 权限的情况下访问挂载的文件。假设 Holmes 先生是 FUSE Unix 组的成员,并且 /etc/fuse.conf 文件中包含 user_allow_other 行。

使用 dislocker,您可以提供三种可能的凭证来解锁 BitLocker 容器。-u 标志(在前面的示例中使用)指定请求用户密码。-p 标志提供恢复密码(长达 48 位)。-f 标志指定一个密钥文件(BEK 文件)。

使用恢复密码(-p)而不是用户密码(-u)需要手动输入 48 位恢复密码,如下所示:

# dislocker-fuse -p -V bitlocker-image.raw clear
Enter the recovery password: XXXXXX-XXXXXX-XXXXXX-XXXXXX-XXXXXX-XXXXXX-XXXXXX-XXXXXX
Valid password format, continuing.

此命令的非 root 版本将标志传递给 FUSE,允许使用 sudo 进行挂载:

$ dislocker-fuse -p -V bitlocker-image.raw -- -o allow_root clear

您还可以解密 BitLocker 镜像,并将其单独保存为常规的文件系统镜像(仅保存指定的卷,而不是分区表或其他分区)。根据 BitLocker 镜像的大小,这将需要一些时间,因为整个镜像会被解密并写入到磁盘上的新镜像文件。您需要进行一些容量规划,因为加密和解密后的两个镜像会占用获取主机的存储空间。您可以按如下方式创建解密后的卷版本:

# dislocker-file -u -V bitlocker-image.raw bitlocker-image.clear
Enter the user password:
# ls -hs
total 15G
7.4G bitlocker-image.clear  7.4G bitlocker-image.raw

解密后的镜像文件与原始文件的大小相同,因为每个 BitLocker 块都已被解密,并将明文块写入新镜像中。此命令不需要 root 权限。

现在你可以挂载解密后的 BitLocker 镜像文件,并使用带有loop选项的mount命令将其作为分区访问:

# mkdir files
# mount -o loop,ro bitlocker-image.clear files
# ls files/
Penguins.jpg  private/  System Volume Information/

唯一不同的命令是非 root 用户使用的mount

$ sudo mount -o loop,ro,uid=holmes bitlocker-image.clear files

由于 BitLocker 是主流操作系统平台上的默认文件系统加密,因此提供第二个使用不同软件包的示例是很有价值的。libbde 包(由 ewflib 的作者 Joachim Metz 编写)也提供了访问 BitLocker 镜像的库和工具。

下一个示例比前一个稍微复杂一些,因为它涉及到一个带有常规分区表的笔记本硬盘(与没有分区表的 USB 闪存驱动器不同)。在计算了来自 mmls 输出的偏移量后,展示了 bdeinfo 工具,它提供了一个紧凑的 BitLocker 容器概览。

无论是 dislocker 还是 libbde,都可以给定字节偏移量,表示 BitLocker 加密卷的起始位置。但在处理没有分区的卷/分区或设备的镜像文件时,这一点是多余的。在本示例中,获取的镜像有一个分区表,因此必须计算 BitLocker 加密卷的偏移量(以字节为单位)。

注意

始终确保了解命令使用的单位。一些工具使用扇区偏移量,而另一些使用字节偏移量。区分并转换这两者非常重要。

下一个示例演示了如何确定字节偏移量。Sleuth Kit 的mmls命令显示了分区表和每个分区的扇区偏移量。必须将扇区偏移量转换为字节偏移量,然后可以与解密工具一起使用:

# mmls image0.raw
DOS Partition Table
Offset Sector: 0
Units are in 512-byte sectors

     Slot    Start        End          Length       Description
00:  Meta    0000000000   0000000000   0000000001   Primary Table (#0)
01:  -----   0000000000   0000002047   0000002048   Unallocated
02:  00:00   0000002048   0004098047   0004096000   NTFS (0x07)
03:  00:01   0004098048   0625140399   0621042352   NTFS (0x07)
04:  -----   0625140400   0625142447   0000002048   Unallocated
# echo $((4098048*512))
2098200576

你可以通过将mmls显示的扇区偏移量乘以扇区大小,将其转换为字节偏移量。在命令行中,使用 Bash 数学扩展非常方便。在本示例中,扇区偏移量是 4098048,扇区大小是 512。将这两个数相乘,得到字节偏移量为 2098200576。你可以将此值用于bdeinfo命令,如下所示:

# bdeinfo -o 2098200576 image0.raw
bdeinfo 20160119

BitLocker Drive Encryption information:
        Encryption method:              AES-CBC 128-bit with Diffuser
        Volume identifier:              5f61cbf2-75b5-32e5-caef-537fce3cf412
        Creation time:                  Jan 10, 2014 17:43:50.838892200 UTC
        Description:                    Notebook System 15.01.2014
        Number of key protectors:       2

Key protector 0:
        Identifier:                     3cd1fd6c-2ecb-2dc7-c150-839ce9e710b6
        Type:                           TPM

Key protector 1:
        Identifier:                     837ef544-e1ca-65c1-a910-83acd492bc1a
        Type:                           Recovery password
...

bdemount命令的操作方式类似于dislocker命令,并创建一个虚拟文件,表示解密后的镜像(这里的完整密钥已简化):

# mkdir raw
# bdemount -o 2098200576 -r 630641-...-154814 image.raw raw

文件将出现在./raw目录中,你可以直接分析它,或将其挂载到循环设备上进行常规浏览。挂载命令与前面的 BitLocker 示例相同,因此此处不再重复。

Apple FileVault

苹果的文件系统加密内置在 OS X 中,名为 FileVault。它也是一种块级加密系统,市面上有几种开源工具可以用来解密它。我在这里描述的两个工具是 libfvde 和 VFDecrypt。(libfvde 软件包是由 Omar Choudary 和 Joachim Metz 编写的,你可以在* github.com/libyal/libfvde/ *找到它。)

在使用 libfvde 工具之前,你需要计算 FileVault 加密卷的正确字节偏移量。mmls命令提供了该卷的扇区偏移量,需要将其转换为字节:

# mmls image.raw
GUID Partition Table (EFI)
Offset Sector: 0
Units are in 512-byte sectors

     Slot    Start        End          Length       Description
00:  Meta    0000000000   0000000000   0000000001   Safety Table
01:  -----   0000000000   0000000039   0000000040   Unallocated
02:  Meta    0000000001   0000000001   0000000001   GPT Header
03:  Meta    0000000002   0000000033   0000000032   Partition Table
04:  00      0000000040   0000409639   0000409600   EFI System Partition
05:  01      0000409640   0235708599   0235298960   HDD
06:  02      0235708600   0236978135   0001269536   Recovery HD
07:  -----   0236978136   0236978175   0000000040   Unallocated
# echo $((409640*512))
209735680

使用简单的 Bash 数学扩展将扇区偏移量乘以扇区大小可以得到一个字节偏移量 209735680,可以用来进行 fvdeinfo 和 fvdemount 工具的操作。

fvdeinfo 工具提供了一个 FileVault 加密卷的概览:

# fvdeinfo -o 209735680 image.raw
fvdeinfo 20160108

Core Storage information:

Physical volume:
        Size: 120473067520             bytes
        Encryption method:             AES XTS

Logical volume:
        Size:                          120137519104 bytes

要解密 FileVault 卷,你需要恢复EncryptedRoot.plist.wipekey文件并提供用户密码或恢复密钥。你可以使用 Sleuth Kit 工具查找并提取wipekey文件,如下所示:

# fls -r -o 235708600 image.raw | grep EncryptedRoot.plist.wipekey
+++++ r/r 1036: EncryptedRoot.plist.wipekey
# icat -o 235708600 image.raw 1036 > EncryptedRoot.plist.wipekey

恢复 HD 分区的递归 fls 输出使用了通过 mmls 找到的扇区偏移量。输出通过 grep 查找EncryptedRoot.plist.wipekey文件。找到后,使用 icat 工具提取该文件(使用 inode,在这个例子中是 1036)。注意 fls 和 icat 使用的是扇区偏移,而不是字节偏移。

使用-r标志和现在恢复的EncryptedRoot.plist.wipekey文件,24 字符的恢复密钥被使用。然后,你可以使用这个密钥创建一个解密的卷的 FUSE 挂载,如下所示(恢复密钥已被简化):

# mkdir clear
# fvdemount -o 209735680 -r FKZV-...-H4PD -e EncryptedRoot.plist.wipekey image.raw
    clear
fvdemount 20160108

# ls -l clear
total 0
-r--r--r-- 1 root root 120137519104 Jan 20 22:23 fvde1
...

你可以提供用户密码(-p)代替恢复密钥(-r),并且通过使用EncryptedRoot.plist.wipekey文件,你可以使用常规取证工具访问结果卷镜像。下面展示了一个使用 Sleuthkit 的 fsstat 工具在解密卷上的示例:

# fsstat clear/fvde1
FILE SYSTEM INFORMATION
--------------------------------------------
File System Type: HFS+
File System Version: HFS+

Volume Name: HDD
...

你也可以将这个解密后的卷作为常规文件系统挂载进行浏览,如下所示:

# mkdir files
# mount -o loop,ro clear/fvde1 files
# ls -l files
total 8212
drwxrwxr-x 1 root   80      50 Mar  2  2015 Applications/
drwxr-xr-x 1 root root      39 Jun  2  2015 bin/
drwxrwxr-t 1 root   80       2 Aug 25  2013 cores/
dr-xr-xr-x 1 root root       2 Aug 25  2013 dev/
...

当分析工作完成后,你需要进行一些清理工作:

# umount files
# rmdir files
# fusermount -u clear
# rmdir clear

请注意,前面的示例是在 root 权限下完成的,以减少复杂性并使其更容易理解。大多数命令可以在非 root 用户下运行,但有一些例外情况。下面展示了在非特权用户下运行时命令有所不同的示例:

$ fvdemount -o 209735680 -r FKZV-...-H4PD -e EncryptedRoot.plist.wipekey image.raw
    -X allow_root clear
$ sudo mount -o loop,ro clear/fvde1 files
$ sudo ls files/Users/somebody/private/directory
$ sudo umount files

fvdemount命令中的-X allow_root字符串允许 root 访问 FUSE 挂载目录。sudo命令是挂载和卸载 hfsplus 文件系统所需的。当浏览文件系统时,如果文件系统权限限制了对文件或目录的访问,你可能也需要使用sudo命令。

还有一些其他著名的开源工具可以用于操作 FileVault 镜像。VFDecrypt 工具也提供 FileVault 镜像的解密。最初由 Ralf-Philipp Weinmann、David Hulton 和 Jacob Appelbaum 编写,现在由 Drake Allegrini 维护。你可以在* github.com/andyvand/VFDecrypt/*找到它。它可以将镜像解密为未加密的卷镜像。

FileVault 破解软件是由与 VFDecrypt 相同的一些作者创建的,你可以在* openciphers.sourceforge.net/oc/vfcrack.php*找到它。

Linux LUKS

开源世界中有许多文件加密系统。像 eCryptfs 或 encfs 这样的系统是基于目录的,而像 GPG 和各种加密工具则是针对单个文件操作的。

本节主要关注 LUKS 加密系统,但也会简要介绍纯 dm-crypt 和 loop-AES。使用 cryptsetup 工具,您可以设置这三者。(您还可以使用 cryptsetup 工具管理 True-Crypt 卷,我将在接下来的部分中描述。)

以下示例操作的是一个具有 LUKS 加密文件系统的取证获取映像。我们将创建一个块设备,表示加密文件系统的解密内容,并展示如何安全地挂载文件系统结构,以便使用常规工具浏览。三个目标是获取加密信息、创建一个可以用取证工具访问的设备,并安全地挂载文件系统以供常规浏览。

第一步需要获取 LUKS 加密分区的字节偏移量。扇区偏移量可以通过 Sleuth Kit 的mmls命令获取映像文件的偏移信息。字节偏移量是扇区偏移量与扇区大小的乘积,使用简单的 Bash 数学扩展计算得到 1048576:

# mmls luks.raw
DOS Partition Table
Offset Sector: 0
Units are in 512-byte sectors

     Slot    Start        End          Length       Description
00:  Meta    0000000000   0000000000   0000000001   Primary Table (#0)
01:  -----   0000000000   0000002047   0000002048   Unallocated
02:  00:00   0000002048   0058626287   0058624240   Linux (0x83)
# echo $((2048*512))
1048576

您可以使用字节偏移量通过losetup命令创建一个加密分区的 loop 设备,如下所示:

# losetup --read-only --find --show -o 1048576 luks.raw
/dev/loop0

LUKS 加密分区现在作为块设备可以访问,cryptsetup 工具可以使用它。您可以使用 cryptsetup 的luksDump命令查找有关加密分区的信息:

# cryptsetup luksDump /dev/loop0
LUKS header information for /dev/loop0

Version:        1
Cipher name:    aes
Cipher mode:    xts-plain64
Hash spec:      sha1
Payload offset: 4096
MK bits:        256
MK digest:      8b 88 36 1e d1 a4 c9 04 0d 3f fd ba 0f be d8 4c 9b 96 fb 86
MK salt:        14 0f 0d fa 7b c3 a2 41 19 d4 6a e4 8a 16 fe 72
                88 78 a2 18 7b 0f 74 8e 26 6d 94 23 3d 11 2e aa
MK iterations:  172000
UUID:           10dae7db-f992-4ce4-89cb-61d126223f05

Key Slot 0: ENABLED
        Iterations:             680850
        Salt:                   8a 39 90 e1 f9 b6 59 e1 a6 73 30 ea 73 d6 98 5a
                                e1 d3 b6 94 a0 73 36 f7 00 68 a2 19 3f 09 62 b8
        Key material offset:    8
        AF stripes:             4000
Key Slot 1: DISABLED
Key Slot 2: DISABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED

从取证角度来看,密钥槽可能会引起关注。一个 LUKS 卷最多可以有八个密钥,意味着有可能有八个不同的密码可以尝试恢复。

使用 LUKS 加密文件系统的密码后,您可以使用 cryptsetup 的open命令在 loop0 设备上创建一个映射设备。该设备提供了加密映像的解密表示。在此示例中,映射设备命名为clear

# cryptsetup -v --readonly open /dev/loop0 clear
Enter passphrase for /hyb/luks/luks.raw:
Key slot 0 unlocked.
Command successful.

使用--readonly标志打开加密的 loop 设备。还可以提供详细(-v)标志,以提供有关解密密钥成功的更多信息。输入成功的密钥后,将在/dev/mapper目录中出现一个新的(解密的)分区设备,并可以使用标准的取证工具进行操作。例如,您可以运行 Sleuth Kit 的 fsstat 工具:

# fsstat /dev/mapper/clear
FILE SYSTEM INFORMATION
--------------------------------------------
File System Type: Ext4
Volume Name: My Secrets
Volume ID: ba673056efcc5785f046654c00943860
...

您还可以将该分区设备挂载到本地机器上进行常规浏览:

# mkdir clear
# mount --read-only /dev/mapper/clear clear
# ls clear
lost+found/  the plan.txt

一旦检查工作完成,可以进行清理过程。每个步骤都按逆向顺序进行:

# umount clear
# rmdir clear
# cryptsetup close clear
# losetup --detach /dev/loop0

请注意,这是一个简化的示例,展示了单个非启动数据磁盘上的单个分区。带有可启动操作系统的 LUKS 加密磁盘可能会有一个额外的逻辑卷管理器(LVM)层。这类磁盘可能会在/dev/mapper目录中显示其他设备(如 root、swap 等)。您可以单独访问或挂载这些设备。在清理过程中,您需要在关闭 LVM 设备之前,使用 dmsetup 删除分区设备。

为了简便起见,本节所示的步骤是以 root 用户身份执行的。要以非 root 用户运行示例,losetupcryptsetupmountumount命令需要使用sudo执行,任何访问/dev/mapper分区设备的工具也是如此。根据挂载的文件系统,可能需要其他用户选项(例如uid=holmes)。

使用纯 dm-crypt 和 loop-AES 加密的镜像也可以使用 cryptsetup 工具解密。这些解密过程与前面的 LUKS 示例类似。cryptsetup 的open命令需要通过--type标志指定plainloopaes。例如:

# cryptsetup -v --readonly open --type plain /dev/loop0 clear
Enter passphrase:
Command successful.

使用--type loopaes也需要一个密钥文件。指定--type luks也是可能的,但不必要,因为它是默认选项。

您可以在gitlab.com/cryptsetup/cryptsetup/wikis/home/上找到更多关于 cryptsetup 和 LUKS 的信息。您还可以在github.com/t-d-k/librecrypt/找到兼容的 Windows 实现。

TrueCrypt 和 VeraCrypt

在 TrueCrypt 停止开发后,出现了多个分支。目前主流的分支是 VeraCrypt。它提供了向后兼容性以及新的扩展功能。

我将提供的 VeraCrypt 示例有两个:一个是普通加密容器,另一个是隐藏容器。我使用了标准的 VeraCrypt 命令行版本,并结合常用工具使这些容器可供进一步分析。

第一个示例展示了一个简单的加密 TrueCrypt 或 VeraCrypt 容器文件。--file-system=none标志非常重要,因为它防止 VeraCrypt 挂载任何文件系统:

$ veracrypt --mount-options=readonly --filesystem=none secrets.tc
Enter password for /exam/secrets.tc:
Enter PIM for /exam/secrets.tc:
Enter keyfile [none]:

使用-l标志,您可以按插槽编号列出主机系统上所有已解密的容器。插槽编号是后续命令中使用的重要标识符。在此示例中,插槽编号为1,并使用了熟悉的/dev/mapper/*目录:

$ veracrypt -l
1: /exam/secrets.tc /dev/mapper/veracrypt1 -

提供正确的凭据后,您可以通过指定插槽编号请求容器的更多信息,如下所示:

$ veracrypt --volume-properties --slot=1
Slot: 1
Volume: /exam/secrets.tc
Virtual Device: /dev/mapper/veracrypt1
Mount Directory:
Size: 2.0 GB
Type: Normal
Read-Only: Yes
Hidden Volume Protected: No
Encryption Algorithm: AES
Primary Key Size: 256 bits
Secondary Key Size (XTS Mode): 256 bits
Block Size: 128 bits
Mode of Operation: XTS
PKCS-5 PRF: HMAC-SHA-512
Volume Format Version: 2
Embedded Backup Header: Yes

已创建两个设备。设备/dev/loop0作为原始镜像进行了加密(与文件系统上的文件相同)。在卷属性中显示的设备/dev/mapper/veracrypt1是解密后的卷,您可以直接使用取证工具对其进行操作。以下是 Sleuth Kit 检查文件系统的示例:

$ sudo fls /dev/mapper/veracrypt1
r/r * 4:        photo.jpg
r/r 6:  spy-photo.jpg
v/v 66969091:   $MBR
v/v 66969092:   $FAT1
v/v 66969093:   $FAT2
d/d 66969094:   $OrphanFiles

你也可以在本地机器上挂载映射设备,并使用常规工具浏览文件系统,如下所示:

$ mkdir clear
$ sudo mount -o ro,uid=holmes /dev/mapper/veracrypt1 clear
$ ls -l clear
total 360
-rwxr-x--- 1 holmes root 366592 Jan 21 23:41 spy-photo.jpg

显然,已删除的文件在用户挂载区不会显示;它们只会在你通过 /dev/mapper/veracrypt1 设备使用取证工具时才会显示。

清理过程是设置过程的逆过程:

$ sudo umount clear
$ rmdir clear
$ veracrypt -d --slot=1

我将提供的第二个 VeraCrypt 示例演示了如何访问隐藏卷。TrueCrypt 和 VeraCrypt 的一个特点是可以有两个密码,分别揭示两个独立的卷。下面两个命令输出对比了同时使用这两个密码的效果。

在这里,hidden.raw 是一个包含隐藏卷的 VeraCrypt 驱动器。提供第一个密码会生成一个功能正常的标准 TrueCrypt 容器,容器里有文件,占用了整个 1GB 的驱动器容量,并显示 Type: Normal

$ ls -l
total 3098104
-rw-r----- 1 holmes holmes 1024966656 Jan 22 00:07 hidden.raw
...
$ veracrypt --mount-options=readonly --filesystem=none hidden.raw
Enter password for /exam/hidden.raw: [XXXXXXXXXXX]
...
$ veracrypt --volume-properties --slot=1
Slot: 1
Volume: /exam/hidden.raw
Virtual Device: /dev/mapper/veracrypt1
Mount Directory:
Size: 977 MB
Type: Normal
Read-Only: Yes
...
$ sudo fls /dev/mapper/veracrypt1
...
r/r 20: fake secrets.pdf
...

如果卷被卸载后再使用隐藏卷的密码重新挂载,你会看到完全不同的一组文件。挂载卷所需的时间也不同。以之前示例中的容器为例,解锁它需要 3.5 秒,而解锁同一文件中的隐藏容器需要 29 秒。这是因为首先尝试标准卷的解密(使用所有支持的算法),如果失败,才尝试解密隐藏卷。在卷属性中,实际大小现在显示,并且 Type: Hidden 被标注,如下所示:

$ veracrypt -d --slot=1
$ veracrypt --mount-options=readonly --filesystem=none hidden.raw
Enter password for /exam/hidden.raw: [YYYYYYYYYYY]
...
$ veracrypt --volume-properties --slot=1
Slot: 1
Volume: /exam/hidden.raw
Virtual Device: /dev/mapper/veracrypt1
Mount Directory:
Size: 499 MB
Type: Hidden
Read-Only: Yes
...
$ sudo fls /dev/mapper/veracrypt1
...
r/r 19: the real hidden secrets.pdf
...

隐藏卷的映射设备生成一个文件系统,你可以使用取证工具直接分析它。

TrueCrypt 和 VeraCrypt 卷也可以通过较新的 cryptsetup 版本(1.6.7 及以后的版本)进行管理,为你提供类似的挂载功能。

有商业和开源的破解工具可以破解 TrueCrypt/VeraCrypt 容器,但它们的使用超出了本书的范围。

总结思考

在本章中,你学会了将获取的映像文件作为块设备进行使用,创建分区设备,并安全地将它们提供给常规文件系统工具使用。你还学会了使用环回设备,并更熟悉了 /dev/mapper 设备。我展示了启动可疑映像的技巧,并演示了从各种虚拟机格式中访问虚拟机映像的方法。最后,你学会了如何将各种加密文件系统以解密形式提供访问。

第十章:提取法证图像的子集

image

本章介绍如何从附加驱动器或法证获取的镜像文件中选择性提取数据区域。你将学习如何提取整个分区、已删除或部分覆盖的分区、分区间隙以及各种卷和文件空闲区。此外,你将看到如何提取一些特殊区域,如统一可扩展固件接口(UEFI)分区、DCO 或 HPA 隐藏的扇区,以及休眠分区,如英特尔快速启动技术。

最后的部分演示了如何从已分配和未分配(可能已删除)区域提取数据,以便进一步检查,并使用偏移量手动提取扇区。我们从确定驱动器的分区布局开始。

评估分区布局和文件系统

一旦你将磁盘连接到系统或获取了镜像文件,你可以对磁盘的分区方案进行分析。本节解释如何识别文件系统、分区表和常用的磁盘分区方案。

磁盘布局,或称为 分区方案,指的是用于组织硬盘上的 分区(或 切片)的方法。你在消费级计算中最常见的分区方案有 DOS、GPT、BSD 和 APM(Apple Partition Map,有时称为 mac)。我们将从识别磁盘上使用的分区方案开始。

分区方案

磁盘上的每个分区或切片包含一个独立的文件系统,或者用于某些特殊目的。磁盘的一小部分(通常只是第一个扇区)通过指定每个分区的起始扇区、分区大小、分区类型、标签等信息来定义磁盘的布局。

要确定磁盘的分区方案,你可以检查磁盘的初始扇区以寻找指示标志。分区方案没有官方的“分配号码”指定(大约只有六种或更多)。不要将其与 DOS MBR 分区类型或 ID 混淆,后者列出了最多 255 种可能的文件系统和其他格式,这些格式可能存在于 DOS 分区中。当你将目标磁盘连接到工作站时,Linux 内核将尝试检测并解释所使用的分区方案,并为它找到的每个分区创建设备。

你可以使用 Sleuth Kit 的 mmstat 命令来识别最常见的分区方案。支持的分区方案列表如下:

# mmstat -t list
Supported partition types:
        dos (DOS Partition Table)
        mac (MAC Partition Map)
        bsd (BSD Disk Label)
        sun (Sun Volume Table of Contents (Solaris))
        gpt (GUID Partition Table (EFI))

运行 mmstat 将输出所使用的方案名称:

# mmstat image.raw
dos

或者,你可以使用 disktype 工具来识别分区方案。disktype 工具提供更详细的信息,支持分区、文件系统以及文件和归档容器。以下示例显示了 disktype 的输出:

$ sudo disktype /dev/sda

--- /dev/sda
Block device, size 27.96 GiB (30016659456 bytes)
DOS/MBR partition map
Partition 1: 27.95 GiB (30015610880 bytes, 58624240 sectors from 2048)
  Type 0x83 (Linux)

你可以在disktype.sourceforge.net/找到原始的 disktype 软件包。另外,你可以在github.com/kamwoods/disktype/github.com/Pardus-Linux/Packages/tree/master/system/base/disktype/files/github.com/ericpaulbishop/gargoyle/tree/master/package/disktype/patches/找到 disktype 的分支和多个补丁。

存储介质不需要分区表甚至文件系统。二进制数据可以直接写入原始磁盘,并且可以被任何能够理解它的程序访问(例如,一些数据库可以直接使用原始磁盘)。也有可能存在没有分区方案的磁盘。在这种情况下,文件系统从第零扇区开始,直到磁盘的末尾(即整个磁盘就是一个分区)。这在一些旧的 USB 闪存盘和软盘中很常见。在这种情况下,分区分析工具将无效,并且通常报告虚假的或不存在的分区表。如果工具无法检测到分区类型,值得检查是否将文件系统直接写入了原始设备。在这个例子中,mmstat找不到任何内容,但fsstat确实识别出了文件系统:

# mmls /dev/sdj
Cannot determine partition type
# disktype /dev/sdj

--- /dev/sdj
Block device, size 1.406 MiB (1474560 bytes)
FAT12 file system (hints score 5 of 5)
  Volume size 1.390 MiB (1457664 bytes, 2847 clusters of 512 bytes)

# mmstat /dev/sdj
Cannot determine partition type
# fsstat /dev/sdj
FILE SYSTEM INFORMATION
--------------------------------------------
File System Type: FAT12
...

一些加密卷试图隐藏其存在或有关使用的文件系统的信息,它们不会使用可识别的分区方案。

分区表

分区方案会有一个磁盘块或一组块,描述其如何组织。这些叫做分区表(或者 BSD 系统中的磁盘标签),你可以使用各种工具查询它们。

你可以使用 Sleuth Kit 的mmls命令列出磁盘或法医获取的映像上的分区表。在这个例子中,mmls找到了一个常规的 DOS 分区方案,包含一个 FAT32 分区:

# mmls image.raw
DOS Partition Table
Offset Sector: 0
Units are in 512-byte sectors

     Slot    Start        End          Length       Description
00:  Meta    0000000000   0000000000   0000000001   Primary Table (#0)
01:  -----   0000000000   0000000062   0000000063   Unallocated
02:  00:00   0000000063   0005028344   0005028282   Win95 FAT32 (0x0b)
03:  -----   0005028345   0005033951   0000005607   Unallocated

传统的 DOS 分区方案无法处理大于 2TB 的磁盘。GPT 分区方案的创建是为了允许更大的磁盘通过更多的分区进行组织。GPT 支持 128 个分区,而 DOS 只支持 4 个分区(不包括扩展分区)。我曾写过一篇关于 GPT 磁盘和 GUID 分区表的法医分析论文,你可以在这里找到:dx.doi.org/10.1016/j.diin.2009.07.001

现在大多数新的 PC 系统都使用 GPT 分区。以下是一个 Windows 8 系统的分区表示例:

# mmls lenovo.raw
GUID Partition Table (EFI)
Offset Sector: 0
Units are in 512-byte sectors

     Slot    Start        End          Length       Description
00:  Meta    0000000000   0000000000   0000000001   Safety Table
01:  -----   0000000000   0000002047   0000002048   Unallocated
02:  Meta    0000000001   0000000001   0000000001   GPT Header
03:  Meta    0000000002   0000000033   0000000032   Partition Table
04:  00      0000002048   0002050047   0002048000
05:  01      0002050048   0002582527   0000532480   EFI system partition
06:  02      0002582528   0003606527   0001024000
07:  03      0003606528   0003868671   0000262144   Microsoft reserved partition
08:  04      0003868672   1902323711   1898455040   Basic data partition
09:  05      1902323712   1953523711   0051200000

Gary Kessler 提供了几种分区表解析工具,这些工具可以提供更详细的信息。你可以在www.garykessler.net/software/index.html找到这些工具。

为了说明 Kessler 的解析工具提供的详细程度,以下是使用 gptparser.pl 工具生成的前面示例中的分区表部分输出:

$ gptparser.pl -i lenovo.raw

GPT Parser V1.4 beta - Gary C. Kessler (14 March 2013)

Source file = /exam/lenovo.raw
Input file length = 17408 bytes.

***** LBA 0: Protective/Legacy MBR *****

000:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
016:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
...
=== Partition Table #5 (LBA 3, bytes 0:127) ===
000-015  Partition type GUID: 0xA2-A0-D0-EB-E5-B9-33-44-87-C0-68-B6-B7-26-99-C7
         GUID: EBD0A0A2-B9E5-4433-87C0-68B6B72699C7
         Type: Data partition (Linux *or* Windows)
016-031  Partition GUID: 0x64-12-FF-80-A7-F7-72-42-B6-46-25-33-6D-96-13-B5
         GUID: 80FF1264-F7A7-4272-B646-25336D9613B5
032-039  First LBA: 0x00-08-3B-00-00-00-00-00 [3,868,672]
040-047  Last LBA: 0xFF-27-63-71-00-00-00-00 [1,902,323,711]
048-055  Partition attributes: 0x00-00-00-00-00-00-00-00
056-127  Partition name --
056:  42 00 61 00 73 00 69 00 63 00 20 00 64 00 61 00   B.a.s.i.c. .d.a.
072:  74 00 61 00 20 00 70 00 61 00 72 00 74 00 69 00   t.a. .p.a.r.t.i.
088:  74 00 69 00 6F 00 6E 00 00 00 00 00 00 00 00 00   t.i.o.n.........
104:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
120:  00 00 00 00 00 00 00 00                           ........
      Name: Basic data partition
...

该工具提供了关于每个 128 个 GPT 分区的详细信息。

文件系统识别

已在 “分区方案” 中介绍过的 disktype 工具(第 260 页)允许你识别分区方案和分区内的文件系统。Sleuth Kit 的 fsstat 工具提供关于文件系统的更全面信息。fsstat 工具可以直接在分区设备上操作,或者如果你指定了扇区偏移量,可以在取证获取的镜像上操作。

在之前的示例中,lenovo.raw 镜像文件上 Windows 卷的扇区偏移量是 3868672。你可以通过 -o 标志将此扇区偏移量提供给 fsstat 工具,以分析文件系统元数据:

# fsstat -o 3868672 lenovo.raw
FILE SYSTEM INFORMATION
--------------------------------------------
File System Type: NTFS
Volume Serial Number: 4038B39F38B39300
OEM Name: NTFS
Volume Name: Windows8_OS
Version: Windows XP

METADATA INFORMATION
--------------------------------------------
First Cluster of MFT: 786432
...

如果驱动器直接连接到你的工作站,Linux 内核将尝试解析分区表,并在 /dev 中提供磁盘和分区设备,你可以直接访问它们。

然而,如果你正在检查一个原始镜像文件(.raw.ewf 等),该镜像将没有设备文件。内核不会解析分区表,也不会创建熟悉的分区设备(/dev/sda1/dev/sda2 等)。在访问镜像文件中的分区时,你必须指定偏移量。

最好依赖取证工具来确定分区详情,而不是依赖内核。如果磁盘损坏或损坏,内核可能会拒绝创建分区设备,或者创建错误的设备。你在本节看到的示例始终指定了偏移量,而不是使用内核。在涉及恶意软件、防取证技术或其他恶意误导的情况下,应该优先使用取证工具,而不是内核。

分区提取

本节介绍了单个分区的提取、分区间隙和磁盘上其他区域(如 DCO 和 HPA)。我们从提取常规分区的一些基本示例开始。

提取单个分区

为了访问和提取单独的分区而非整个硬盘,你可以使用多种技术。我将展示一些使用直接连接的驱动器、分区设备、分区映射设备以及由 Sleuth Kit 的 mmcat 和 dd 风格工具操作的镜像文件进行分区提取的示例。

如果磁盘作为附加设备可访问,则获取分区的过程类似于使用原始驱动器设备进行完整获取,但使用的是分区设备。以下示例中,/dev/sda 的第一个分区被提取到文件中:

# dcfldd if=/dev/sda1 of=partition.raw

提取分区需要一定的容量规划,因为分区会占用磁盘空间(可能还会占用完整的驱动器镜像)。如果你仅需要临时访问一个获取的镜像文件中的分区,可以将其作为环回设备附加并进行访问。以下步骤演示了这种方法。

首先,使用 mmls 工具识别要作为环回设备附加的分区,方法如下:

# mmls lenovo.raw
GUID Partition Table (EFI)
Offset Sector: 0
Units are in 512-byte sectors
...
05:  01      0002050048   0002582527   0000532480   EFI system partition
...

然后使用 Bash 数学扩展将扇区偏移量和扇区长度转换为字节偏移量和字节长度:

# echo $((2050048*512))
1049624576
# echo $((532480*512))
272629760

计算出的字节偏移量和字节长度会传递给 losetup 来创建一个环回设备,方法如下:

# losetup --read-only --find --show --offset 1049624576 --sizelimit 272629760
    lenovo.raw
/dev/loop2

你可以像访问附加磁盘的分区设备一样,使用法医工具访问这个结果环回设备。这里是使用 Sleuth Kit fls 的一个示例:

# fls /dev/loop2
r/r 3:  SYSTEM_DRV (Volume Label Entry)
d/d 4:  EFI
d/d 5:  BOOT
d/d * 7:        MSIa11f8.tmp
d/d * 8:        _SI2DBB4.TMP
d/d * 9:        _190875_
...

如果你需要将已获取的镜像中的某个分区提取到一个单独的文件中,可以使用 dd 工具或 Sleuth Kit 的 mmcat 命令。

提取已获取镜像中的分区,初步步骤是识别分区和扇区的详细信息。在以下示例中,从获取的磁盘镜像中提取的分区表显示了要提取的分区:

# mmls image.raw
DOS Partition Table
Offset Sector: 0
Units are in 512-byte sectors

     Slot    Start        End          Length       Description
...
02:  00:00   0000000063   0078124094   0078124032   Linux (0x83)
...

使用 dcfldd 或 dd 从已获取的镜像文件中提取分区时,需要添加 skip(dc3dd 使用 iskip)和 count 参数,这些参数使得命令跳过(skip)分区的起始位置,并仅获取分区的大小:

$ dcfldd if=image.raw of=partition.raw bs=512 skip=63 count=78124032

在此命令中,块大小设置为 512 字节,以匹配扇区大小,分区起始位置在扇区 63,应该提取 78124032 个扇区。通过进行一些额外的计算,你可以通过将 512 字节块大小更改为更大的值来提高此命令的性能(但如果这样做,不要忘记调整 skipcount 参数)。

在 Sleuth Kit 3.0 及以后版本中,你可以使用 mmcat 工具轻松提取分区。要使用 mmcat 恢复前面示例中的第一个分区,你必须指定 mmls 插槽编号(而不是 DOS 分区编号)。在此示例中,第一个分区位于 mmls 插槽编号 2,可以按如下方式提取:

$ mmcat image.raw 2 > partition.raw

mmcat 工具会简单地将输出通过管道传递到标准输出(stdout),因此你必须将其重定向到文件或将其传递到其他程序中。

查找并提取已删除的分区

为了全面搜索法医获取的镜像中部分覆盖或已删除的分区,可以使用多种方法。Sleuth Kit 提供了一个名为 sigfind 的基本工具来搜索二进制签名字符串。gpart 和 testdisk 是两种用于全面分区搜索的有用工具。它们实现了文件系统识别算法,通过更智能的猜测来识别丢失的分区。

运行 gpart 命令而不加任何选项时,它会开始扫描分区,跳过已标记为已分配的区域。例如:

# gpart lenovo.raw

Begin scan...
Possible partition(Windows NT/W2K FS), size(1000mb), offset(1mb)
Possible partition(Windows NT/W2K FS), size(3mb), offset(1030mb)
Possible partition(Windows NT/W2K FS), size(3mb), offset(1494mb)
Possible partition(Windows NT/W2K FS), size(926980mb), offset(1889mb)
Possible partition(Windows NT/W2K FS), size(25000mb), offset(928869mb)
End scan.
...
Guessed primary partition table:
Primary partition(1)
   type: 007(0x07)(OS/2 HPFS, NTFS, QNX or Advanced UNIX)
   size: 1000mb #s(2048000) s(2048-2050047)
   chs:  (0/32/33)-(406/60/28)d (0/32/33)-(406/60/28)r
...

添加-f标志会告诉 gpart 执行更全面的扫描,检查整个磁盘的每个扇区,即使在没有预期分区的区域也会进行检查。与没有标志的默认 gpart 扫描相比,这将花费更多时间。

testdisk 工具(* www.cgsecurity.org/,由 Christophe Grenier 编写,他还编写了 photorec 数据恢复工具)提供了多个分区搜索功能。Testdisk 提供交互式界面,支持多种磁盘布局(DOS、GPT、BSD 等),检测多种分区类型,生成活动日志,并可以将发现的分区提取到文件中。你可以在设备、原始镜像文件甚至**.e01文件上使用 testdisk。

小心使用 testdisk 工具。此工具是为修复和恢复分区设计的,使用不当可能会轻易修改证据。在运行此工具之前,确保在附加的目标磁盘上使用写保护器。

工具还包括一个全面的用户交互菜单系统,用于定义选项和操作。这里展示的是一个在附加磁盘上运行的批处理模式示例:

# testdisk /list /dev/sdb
TestDisk 7.0, Data Recovery Utility, April 2015
Christophe GRENIER <grenier@cgsecurity.org>
http://www.cgsecurity.org
Please wait...
Disk /dev/sdb - 15 GB / 14 GiB - CHS 14663 64 32
Sector size:512
Model: SanDisk Ultra Fit, FW:1.00

Disk /dev/sdb - 15 GB / 14 GiB - CHS 14663 64 32
     Partition                  Start        End    Size in sectors
 1 P FAT32 LBA                0   1  1 14663  44 18   30031218 [NO NAME]
     FAT32, blocksize=16384

你可以进行一定量的手动分析,以搜索已删除的分区。如果分区表显示磁盘上有大片未分配空间,请检查该区域以确定是否存在分区。在以下示例中,mmls 显示在一个 U 盘的末尾有接近 2.5GB(4863378 个扇区)的空闲空间:

# mmls /dev/sdb
DOS Partition Table
Offset Sector: 0
Units are in 512-byte sectors

      Slot      Start        End          Length       Description
000:  Meta      0000000000   0000000000   0000000001   Primary Table (#0)
001:  -------   0000000000   0000002047   0000002048   Unallocated
002:  000:000   0000002048   0025167871   0025165824   Win95 FAT32 (0x0c)
003:  -------   0025167872   0030031249   0004863378   Unallocated

这个未分配空间可能是一个已删除的分区。在此示例中,通过使用空闲空间的偏移量运行 fsstat 可以发现一个有效的文件系统:

# fsstat -o 25167872 /dev/sdb
FILE SYSTEM INFORMATION
--------------------------------------------
File System Type: Ext3
Volume Name:
Volume ID: 74a2f1b777ae52bc9748c3dbca837a80

Last Written at: 2016-05-21 15:42:54 (CEST)
Last Checked at: 2016-05-21 15:42:54 (CEST)
...

如果你检测到有效的文件系统,可以使用其元数据来确定分区的可能大小。知道了大小和起始偏移后,你可以提取发现的分区或进一步分析它。你可以使用 dd 风格的工具提取它,或者使用 mmcat 更容易地提取,如下所示:

# mmcat /dev/sdb 3 > deleted_partition.raw

在这里,从 mmls 槽 003 中发现的已删除分区的 mmcat 输出被发送到名为deleted_partition.raw的文件中。

识别并提取分区间空隙

在某些情况下,分区之间可能会有意外的空隙,或者由于相邻分区在柱面或块边界上相遇所造成的空隙。也可能是为了隐藏数据而故意创建的空隙。你可以像提取分区一样识别并恢复这些分区间的空隙。使用 mmls 确定空隙的大小和扇区偏移,然后使用 dd 或 mmcat 来提取它。

这里展示了一个分区表的 mmls 输出。磁盘包含两个分区,并且它们之间存在空隙:

# mmls /dev/sdb
DOS Partition Table
Offset Sector: 0
Units are in 512-byte sectors

      Slot      Start        End          Length       Description
000:  Meta      0000000000   0000000000   0000000001   Primary Table (#0)
001:  -------   0000000000   0000002047   0000002048   Unallocated
002:  000:000   0000002048   0015626236   0015624189   Linux (0x83)
003:  -------   0015626237   0015626239   0000000003   Unallocated
004:  000:001   0015626240   0030031249   0014405010   Linux (0x83)

在此示例中,第一个分区结束于扇区 15626236,但相邻分区从扇区 15626240 开始,表明它们之间有一个三扇区的空隙。虽然你可以使用 dd 提取这个分区间空隙,但使用 mmcat 更简单:

# mmcat /dev/sdb 3 > gap.raw
# ls -l gap.raw
-rw-r----- 1 root root 1536 May 21 16:11 gap.raw

生成的文件大小为三个扇区,包含两个分区之间的空白区域。分区之间的较大空隙,如果包含部分重写、损坏或可识别的文件系统碎片,可以通过如 foremost 这样的雕刻工具进行分析。

最后一个分区与磁盘末尾之间的空隙也可能是值得关注的地方。它可能包含一些遗留物,比如先前重写的分区的内容、GPT 分区的备份副本,甚至是恶意软件试图隐藏二进制代码片段。

提取 HPA 和 DCO 扇区范围

你已经学会了如何识别并移除 HPA 和 DCO 限制。一旦移除,这些磁盘区域可以被提取出来进行单独分析。

在这个示例中,hdparm 显示存在 HPA,而 mmls 输出显示三个插槽,其中一个是 Linux 分区:

# hdparm -N /dev/sdh

/dev/sdh:
 max sectors   = 234441648/976773168, HPA is enabled
# mmls /dev/sdh
DOS Partition Table
Offset Sector: 0
Units are in 512-byte sectors

     Slot    Start        End          Length       Description
00:  Meta    0000000000   0000000000   0000000001   Primary Table (#0)
01:  -----   0000000000   0000002047   0000002048   Unallocated
02:  00:00   0000002048   0234441647   0234439600   Linux (0x83)

成功移除 HPA 后(并告诉内核重新扫描 SCSI 总线),再次运行相同的命令会产生不同的输出,如下所示:

# hdparm -N p976773168 /dev/sdh

/dev/sdh:
 setting max visible sectors to 976773168 (permanent)
 max sectors   = 976773168/976773168, HPA is disabled
# mmls /dev/sdh
DOS Partition Table
Offset Sector: 0
Units are in 512-byte sectors

     Slot    Start        End          Length       Description
00:  Meta    0000000000   0000000000   0000000001   Primary Table (#0)
01:  -----   0000000000   0000002047   0000002048   Unallocated
02:  00:00   0000002048   0234441647   0234439600   Linux (0x83)
03:  -----   0234441648   0976773167   0742331520   Unallocated

现在,hdparm 指示 HPA 已被禁用,而 mmls 输出显示一个额外的输出行(插槽 03),表示之前被 HPA 隐藏的扇区。

使用 mmcat 命令与分区插槽 03 结合,将提取来自 HPA 的数据,如下所示:

# mmcat /dev/sdh 3 > hpa.raw

本示例使用的是连接到获取主机的实时磁盘。当从移除 HPA 的磁盘中获取映像文件时,mmls 将看到这个隐藏的区域。

提取由 DCO 隐藏的扇区的方法与这里展示的 HPA 方法完全相同。首先使用 hdparm 显示 DCO 保护的扇区,然后使用 dd 或 mmcat 提取这些扇区。这个过程不需要通过额外的示例来重复,专门演示 DCO 扇区的提取。

其他分段数据提取

在本节的最后,我将描述各种其他的分段数据提取示例。本节内容(实际上是本章的大部分内容)与法医文件系统分析有些重叠,这不是本书的预期范围。因此,这些示例的描述略显简略。

提取文件系统松散空间

松散空间 是一个传统的数字取证概念,指的是位于磁盘扇区、文件系统块或文件系统末尾的已分配但未使用的数据(分别为 RAM 松散、文件松散和分区松散)。

为了可视化松散空间,假设这本书就是一个硬盘,其中段落是扇区,章节是文件,正文部分是分区。请注意,段落不会精确地在一行的末尾结束,章节不会精确地在一页的末尾结束,书的结尾可能会有几页空白。这些空白区域就是这本书的“松散空间”。对于存储介质,如果操作系统或物理驱动器没有明确地将零写入这些区域,它们可能仍然包含先前写入文件的数据。

历史上,提取和分析空闲空间在取证调查中一直很有用。然而,由于多个因素,空闲空间的价值正在下降:

• SSD 使用 TRIM 命令将未分配的块置零。

• 现代操作系统正在将零写回未使用的扇区和块的部分。

• 原生 4K 扇区的磁盘与文件系统块大小对齐。

• 操作系统创建的分区和文件系统对齐到块边界。

作为取证过程的一部分,获取和分析潜在的空闲区域仍然是需要认真完成的步骤。

要提取给定镜像的所有空闲空间,可以使用 Sleuth Kit 的blkls命令。空闲空间是文件系统特定的,因此必须在每个文件系统上单独提取空闲空间(不能仅使用整个原始磁盘)。在这个示例中,通过 mmls 找到了已获取镜像的文件系统偏移量,并提取了每个文件系统的空闲空间:

# mmls lenovo.raw
GUID Partition Table (EFI)
Offset Sector: 0
Units are in 512-byte sectors

     Slot    Start        End          Length       Description
04:  00      0000002048   0002050047   0002048000
05:  01      0002050048   0002582527   0000532480   EFI system partition
06:  02      0002582528   0003606527   0001024000
...
08:  04      0003868672   1902323711   1898455040   Basic data partition
...
# blkls -o 2048 -s lenovo.raw > slack.04
# blkls -o 2050048 -s lenovo.raw > slack.05
# blkls -o 2582528 -s lenovo.raw > slack.06
# blkls -o 3868672 -s lenovo.raw > slack.08

每个已识别文件系统的空闲空间被保存到文件中。blkls命令的-s标志提取所有空闲空间(仅空闲空间)。重要的是要理解,空闲空间并不指未分配的块或扇区。空闲空间是文件系统中已分配块和扇区内未使用的区域。

提取文件系统未分配的块

下面的示例将从已获取的镜像中的文件系统收集所有未分配的块。未分配的块是文件系统特定的,因此需要对每个识别的文件系统分别执行此操作。

在这里,mmls命令再次用于确定每个文件系统的偏移量,并使用blkls命令提取未分配的块:

# blkls -o 2048 lenovo.raw > unalloc.04
# blkls -o 2050048 lenovo.raw > unalloc.05
# blkls -o 2582528 lenovo.raw > unalloc.06
# blkls -o 3868672 lenovo.raw > unalloc.08

提取未分配块的正确blkls标志是-A,但是由于这是默认命令行为,因此可以省略它。

您还可以执行提取所有(仅限)分配块的反向操作,使用blkls -a命令。

使用偏移量进行手动提取

在某些情况下,您可能会使用 hex 编辑器浏览、搜索或手动分析磁盘或已获取的磁盘镜像的内容。hex 编辑器可能提供字节偏移量、扇区偏移量或两者。

这个示例使用基于控制台的 hexedit 工具来分析磁盘:

# hexedit -s /dev/sda

hexedit 工具允许您直接编辑块设备文件,并编辑非常大的镜像文件(无需加载到内存或临时文件),并提供扇区模式(显示整个扇区和扇区偏移量)。

在以下示例中,扇区偏移量为 2048(NTFS 分区的起始位置),字节偏移量为 0x100181,显示整个扇区(注意:hexedit 假设 512 字节扇区):

00100000   EB 52 90 4E 54 46 53 20  20 20 20 00 02 08 00 00  .R.NTFS    .....
00100010   00 00 00 00 00 F8 00 00  3F 00 FF 00 00 08 00 00  ........?.......
00100020   00 00 00 00 80 00 80 00  01 48 00 00 00 00 00 00  .........H......
00100030   04 00 00 00 00 00 00 00  80 04 00 00 00 00 00 00  ................
00100040   F6 00 00 00 01 00 00 00  22 90 FD 7E 2E 42 12 09  ........"..~.B..
00100050   00 00 00 00 FA 33 C0 8E  D0 BC 00 7C FB 68 C0 07  .....3.....|.h..
00100060   1F 1E 68 66 00 CB 88 16  0E 00 66 81 3E 03 00 4E  ..hf......f.>..N
00100070   54 46 53 75 15 B4 41 BB  AA 55 CD 13 72 0C 81 FB  TFSu..A..U..r...
00100080   55 AA 75 06 F7 C1 01 00  75 03 E9 D2 00 1E 83 EC  U.u.....u.......
00100090   18 68 1A 00 B4 48 8A 16  0E 00 8B F4 16 1F CD 13  .h...H..........
001000A0   9F 83 C4 18 9E 58 1F 72  E1 3B 06 0B 00 75 DB A3  .....X.r.;...u..
001000B0   0F 00 C1 2E 0F 00 04 1E  5A 33 DB B9 00 20 2B C8  ........Z3... +.
001000C0   66 FF 06 11 00 03 16 0F  00 8E C2 FF 06 16 00 E8  f...............
001000D0   40 00 2B C8 77 EF B8 00  BB CD 1A 66 23 C0 75 2D  @.+.w......f#.u-
001000E0   66 81 FB 54 43 50 41 75  24 81 F9 02 01 72 1E 16  f..TCPAu$....r..
001000F0   68 07 BB 16 68 70 0E 16  68 09 00 66 53 66 53 66  h...hp..h..fSfSf
00100100   55 16 16 16 68 B8 01 66  61 0E 07 CD 1A E9 6A 01  U...h..fa.....j.
00100110   90 90 66 60 1E 06 66 A1  11 00 66 03 06 1C 00 1E  ..f`..f...f.....
00100120   66 68 00 00 00 00 66 50  06 53 68 01 00 68 10 00  fh....fP.Sh..h..
00100130   B4 42 8A 16 0E 00 16 1F  8B F4 CD 13 66 59 5B 5A  .B..........fY[Z
00100140   66 59 66 59 1F 0F 82 16  00 66 FF 06 11 00 03 16  fYfY.....f......
00100150   0F 00 8E C2 FF 0E 16 00  75 BC 07 1F 66 61 C3 A0  ........u...fa..
00100160   F8 01 E8 08 00 A0 FB 01  E8 02 00 EB FE B4 01 8B  ................
00100170   F0 AC 3C 00 74 09 B4 0E  BB 07 00 CD 10 EB F2 C3  ..<.t...........
00100180   0D 0A 41 20 64 69 73 6B  20 72 65 61 64 20 65 72  ..A disk read er
00100190   72 6F 72 20 6F 63 63 75  72 72 65 64 00 0D 0A 42  ror occurred...B
001001A0   4F 4F 54 4D 47 52 20 69  73 20 6D 69 73 73 69 6E  OOTMGR is missin
001001B0   67 00 0D 0A 42 4F 4F 54  4D 47 52 20 69 73 20 63  g...BOOTMGR is c
001001C0   6F 6D 70 72 65 73 73 65  64 00 0D 0A 50 72 65 73  ompressed...Pres
001001D0   73 20 43 74 72 6C 2B 41  6C 74 2B 44 65 6C 20 74  s Ctrl+Alt+Del t
001001E0   6F 20 72 65 73 74 61 72  74 0D 0A 00 00 00 00 00  o restart.......
001001F0   00 00 00 00 00 00 00 00  80 9D B2 CA 00 00 55 AA  ..............U.

---  sda       --0x100181/0x6FD21E000--sector 2048---------------------------

从字节或扇区偏移量,可以构造 dd 命令来提取在 hex 编辑器中找到的内容。

以下示例使用 512 字节的扇区大小、扇区偏移量和扇区计数从镜像中提取一范围的数据(四个 512 字节的扇区):

# dd if=/dev/sda of=sectors.raw skip=2048 bs=512 count=4

下一个示例使用字节偏移量提取相同范围的数据。skip命令使用 Bash 数学扩展将十六进制转换为十进制,这是dd命令所需要的;块大小为 1 字节;count 为所需字节数。

# dd if=/dev/sda of=bytes.raw skip=$((0x100000)) bs=1 count=2048

前面的两个示例提取了相同的块(四个扇区或 2048 字节)数据。请注意,在提取磁盘区域时,确保你有扇区或块对齐的偏移量是明智的(即扇区大小或块大小的倍数)。

在需要提取一系列文件系统块的情况下,可以使用 Sleuth Kit 的blkcat命令。以下示例从文件系统中提取从块 100 开始的 25 个块:

# blkcat /dev/sda1 100 25 > blocks.raw

文件系统的块大小应由工具检测。

本章最后部分的示例展示了如何访问镜像;使用偏移量;并提取字节、扇区或块的范围。你还可以使用其他 Sleuth Kit 命令将扇区映射到块,将块映射到索引节点和文件名。这些任务是特定于文件系统的,涉及到文件系统取证分析的范畴。

结语

在本章的最后,你学习了如何提取驱动器和取证镜像的子集。本章重点介绍了如何提取镜像的不同部分,例如由 HPA 或 DCO 隐藏的扇区、已删除的分区和分区间隙。你还看到了如何手动提取指定的扇区和块,包括未分配的块和闲置空间。本章接近取证分析,讨论了如何识别分区方案、理解分区表和识别文件系统。由于本书的主题是取证采集而非取证分析,因此这也是一个合适的结尾章节。

第十一章:结束语

我希望你认为本书是一个有用的教育工具,也希望在未来你会继续发现它是一个有帮助的参考资料。无论你是专业的取证从业者,还是学习取证的学生,本书旨在展示基础概念,展示事物的运作方式,并提供一套基于 Linux 命令行的实用工具示例。

许多新的取证书籍专注于应用层分析、云取证、移动取证、大数据分析等新的激动人心的领域。与此相比,传统的数字取证获取和存储介质证据保护似乎不那么令人兴奋,但它仍然是新进取证调查员需要学习的基础功能。

社区在传统存储介质取证方面不能自满。这个领域仍在持续变化,我们作为一个社区需要跟上最新的发展。本书旨在作为一个资源,涵盖传统存储介质取证领域的最新变化。

很明显,这里展示的并非所有示例、工具和方法都适用于每个专业的取证实验室环境。许多开源取证工具是由志愿者(有时只是单个开发者)进行的小规模软件开发,有些甚至是被废弃的软件项目。这些工具无法轻松与大型商业软件公司的产品竞争。尽管如此,即使是处于实验阶段的工具也能让你理解问题所在,并了解解决方案的可能形态。此外,我鼓励你探索本书未涉及的其他工具和方法——开源工具持续且快速地变化,对于每个这里展示的工具和方法,都会有替代方案能够实现相同的结果。

作为对读者的最后鼓励:学习!

我被吸引到数字取证和调查领域,因为这是一个你总是在学习的领域。调查过程就是学习——学习事件在事故中是如何发生的。数字取证过程就是学习——学习技术如何相互作用,并重构一系列技术活动。数字取证的研究和开发就是学习——学习开发新工具和方法,以克服挑战,理解复杂的技术,推动知识体系的发展。

数字取证是一个令人着迷的领域。享受其中吧!

第十二章:索引

页面编号后跟字母 t 表示表格;页面编号后跟字母 f 表示图形。

数字

4Kn 磁盘, 12, 41–44, 42f

512e 扇区仿真, 41, 42, 43

A

抽象层,磁盘接口, 34, 35f

AccessData。参见 ftkimager 工具;FTK SMART 格式

Ace 实验室 PC-3000 工具, 122

ACPO(英国警察首席官员协会), 2, 6–7

获取主机

附加目标磁盘至

Apple 目标磁盘模式, 137–138

具有块或字符访问的设备, 140

启用访问隐藏扇区, 118–125

检查目标 PC 硬件, 101–102

识别目标驱动器, 105–107

NVME SSD, 138–139

查询目标磁盘, 107–118

可移动存储介质, 132–136

查看检查员工作站硬件, 103–104

性能优化, 88–90

获取过程。参见 取证获取

ACS(ATA 命令集)。参见 ATA 命令

高级取证格式。参见 AFF

高级格式 4Kn 磁盘, 12, 41–44, 42f

高级格式 512e 磁盘, 41, 42, 43

高级主机控制器接口(AHCI)模式,SATA, 23–24

高级技术附件命令。参见 ATA 命令

AFF(高级取证格式)

aff4imager 工具, 190

affcat 工具, 209–210

affconvert 工具, 204–205, 209

affcrypto 工具, 215

affinfo 工具, 198, 210, 211

AFFlib 软件包

affuse 工具, 196–197, 235

内置压缩, 190

内置加密, 215

概述, 62

管道, 209

签名和验证签名, 202

内置压缩, 190

内置加密, 215

将原始镜像转换为, 204–205

转换为其他格式, 209–211

概述, 62–63

管道, 209

重新计算取证镜像的哈希值, 198–199

AHCI(高级主机控制器接口)模式,SATA, 23–24

aimage 工具, 190

Jacob Appelbaum, 251

Apple

FileVault, 248–251

目标磁盘模式,31,137–138

雷电接口,30–32,31f,137

array-info 工具,178

英国首席警察官协会(ACPO),2,6–7

ATA(高级技术附件)命令

常见,35t

DCO 和 HPA 驱动区域,39–40

概述,34–36

密码保护的磁盘,126–128

和 SCSI,39

安全擦除命令,226–227

SSD 设备,16–17

ATA 命令集(ACS)。参见 ATA 命令

ATAPI(ATA 包装接口)

DCO 和 HPA 驱动区域,39–40

概述,35–36

密码保护的磁盘,126–128

SCSI 命令,39

Atola Insight Forensic,122

auditd 包,76

审计跟踪

概述,70

shell 历史,73–75

任务管理,70–73

终端监视器和 Linux 审计,76

终端记录器,75–76

aureport 命令,76

B

Bash(Bourne Again shell),56,73,74,82。另见 命令行

Bash 数学扩展,183,248,249,252,265,274

bdeinfo 命令,248

bdemount 命令,248

BDs。参见 蓝光光盘;光学存储介质

媒体开始(BOM)标记,磁带上,176

磁带上的开始标记(BOT),176

BitLocker,微软,243–248

blkcat 命令,274

blkls 命令,271–272

blktap-utils 工具,241

blockdev 命令,43,98,99,108

块设备

获取,172–173

附加到采集主机,140

从原始镜像创建,230

Linux,50–55

将 QCOW2 镜像设置为,237–239

块级加密系统。参见 加密文件系统,访问

蓝光光盘(BDs),19f,21–22。另见 光学存储介质

获取,174,175

转移取证镜像到,222,223

媒体开始(BOM)标记,磁带上,176

可启动的 Linux 光盘,98,99

准备启动镜像与 xmount,235–237

BOT(磁带开始)标记,在磁带上,176

BOT(仅大容量传输)USB 接口,29,40–41

性能瓶颈,88–90,91t

Bourne Again shell(Bash),56,73,74,82。另见 命令行

大容量传输(BOT)USB 接口,29,40–41

将取证镜像刻录到光盘,221–222

总线速度,90,91t另见 接口

bzip 工具,188,189

C

CA(证书颁发机构)证书,156,157,201–202

C.A.I.N.E. 启动 CD,99

卡片读卡器,18

Carrier,Brian,48

切割工具,165

cat 命令,196,199

cciss-vol-status 包,178

CDB(命令描述符块),36

cd-drive 命令,132–133

cd-info 命令,133

cdparanoia 工具,175

CDs(光盘)。另见 光学存储介质

获取,174,175

Linux 取证启动,98,99

作为存储介质,19f,20–21

将取证镜像传输到,221–222

证书颁发机构(CA)证书,156,157,201–202

CF(CompactFlash)卡,18

CFTT(计算机取证工具测试)项目

dd 实用程序测试,60

取证成像要求,9

HWB 设备规格,94

概览,3,6

软件写保护器,99

芯片脱除,15,125

Choudary,Omar,248

CipherShed,217

客户模式,rdd 工具,166,167–168

克隆磁盘,219–221

Coltel,Romain,243

命令描述符块(CDB),36

命令行。另见 Linux;特定命令/工具

审计追踪,70–76

命令权限,xxv,212,233

输出组织,76–83

输出

组织,76–83

重定向,81–83

可扩展的检查目录结构,79–81

使用原因,xx–xxi

使用重定向保存输出,81–83

shell 历史记录,73–75

任务管理,70–73

终端监视器和 Linux 审计,76

终端记录器,75–76

查看检查员工作站硬件,103–104

命令集

ATA,34–36,35t

NVME,37–38,37t

SCSI,36–37,37t,39

光盘。参见 CDs;光学存储介质

CompactFlash (CF) 卡,18

完整性,法医,10

估算完成时间,87–88

压缩

AFFlib 内置,190

与拆分结合,192

EnCase EWF 压缩格式,189

FTK SMART 压缩格式,190

SquashFS,66–67,191

计算机法医工具测试项目。参见 CFTT 项目

计算机相关的法医。参见 数字法医;法医采集

图像格式转换,202–211

conv=noerror 参数,dd 工具,143

复制法医图像,87

写时复制(CoW)快照,实时成像,172

死因调查工具包,2

Corsair Padlock2 优盘,228

CoW(写时复制)快照,实时成像,172

cpqarrayd 工具,178

加密学。另见 加密文件系统,访问;加密

基本哈希,151–152,151t

哈希窗口,143,152–154,199–200

密钥擦除程序,227–228

RFC-3161 时间戳,157–159

签名法医图像,154–157

验证法医图像完整性,197–202

cryptsetup 工具,251–254,257

CTRL-Z 快捷键,92–93,123

curl 命令,158

D

dares carver 工具,165

数据 CD,20。另见 CDs;光学存储介质

数据销毁,224–228

数据提取

手动使用偏移,272–274

分区提取,264–271

分区方案分析,259–264

空闲空间,271–272

未分配块,272

数据流,优化,90

数据恢复工具,61–62,162–163

dc3dd 工具

将图像采集到多个目标,150

加密哈希算法, 151–152, 151t

错误处理, 160–161

法医采集与, 142, 144–145

光盘成像, 174–175

概述, 61

分段哈希, 153–154

拆分功能, 193

SquashFS 法医证据容器, 65, 149

擦除功能, 225–226

将图像文件写入克隆磁盘, 220–221

dcfldd 工具

将图像采集到多个目的地, 150

压缩图像, 189

加密哈希算法, 151, 151t

采集过程中的加密, 212

错误处理, 160

法医采集与, 142, 144–145

哈希窗口, 153

概述, 61

分区提取, 266

拆分功能, 192–193

磁带, 从中提取数据, 177

DCO(设备配置覆盖)

提取属于的扇区范围, 269–271

概述, 39–40, 118

移除, 118–121

dd_rescue 工具, 61, 62, 142, 163, 215–216

ddrescue 工具, 61, 142, 162–163, 165

dd 工具

压缩与拆分结合, 192

加密哈希算法, 152

法医采集与, 142–144

法医变种, 61, 144–145

使用偏移量手动提取, 273–274

分区提取, 266

原始镜像, 60

安全远程成像, 168, 169–170

稀疏文件, 85

验证采集哈希值, 197–198

擦除功能, 226

调试端口,使用它们访问存储介质, 122–125

解密。 另见 密码学;加密文件系统,访问;加密

GPG 加密图像的, 212, 213

OpenSSL 加密文件的, 213–214

DEFT(数字证据与法医工具包), 98–99

删除的分区, 提取, 266–268

删除法医图像数据, 224–228

Linux 桌面环境, 56

/dev 目录,Linux,50,51–52

设备配置覆盖。 DCO

设备映射器,179–182,231–232,253,255–256

设备树,Linux,50–51

DFRWS(数字取证研究研讨会),2,8,59

诊断端口,使用访问存储介质,122–125

迪亚兹·迪亚兹(Antonio),61,162

diff 工具,200

数字证据与取证工具包(DEFT),98–99

数字证据袋。 取证文件

格式,数字取证研究研讨会(DFRWS),2,8,59

数字取证。另见 取证采集

定义,2

历史,1–4

Linux 与 OSS 在此背景下,48–50

同行评审研究,7–8

原则,6–10

标准,6–7

趋势与挑战,4–5

数字调查:国际数字取证与事件响应期刊,7

数字签名,154–157

数字多功能光盘。 DVDs;光学存储介质

目录

命名约定,76–79

可扩展检查结构,79–81

磁盘块恢复工具,162–163

磁盘克隆与复制,219–221

磁盘冷却器,93

磁盘映像。 取证采集

磁盘分区方案,分析,259–264

磁盘。 取证采集;存储介质;目标磁盘

disktype 工具,260–261,263

dislocker 包,243–247

卸载 VeraCrypt 卷,218。另见 卸载

数据处置,224–228

发行版,Linux,55–56

dm-crypt 加密,251,254

dmesg 工具,206

dmraid 工具,178–179

dmsetup 工具,159–160,179–180,182,183

记录设备识别详细信息,107–108

DOS 分区方案,262

dpt-i2o-raidutils 包,178

驱动器维护扇区,40,122–125

驱动器。 取证采集;特定媒体;存储介质;目标磁盘

杜兰诺伊(Alexandre),61

复制,磁盘,219–221

DVD(数字多功能光盘), 19f, 21。另见 光学存储介质

获取, 174, 175

概述, 21

重新组装分割的取证图像, 196

转移取证图像到, 222

动态磁盘,Microsoft, 181–182

E

EIDE(增强型集成驱动电子技术), 32

eject shell 命令, 133

电子犯罪现场调查:第一响应者指南(美国司法部), 3, 7

EnCase EWF

内建加密, 215

压缩格式, 189

将 AFF 图像转换为, 209–210

将 FTK 文件转换为, 208

将原始图像转换为, 202–203

转换为其他格式, 205–208

取证采集, 145–146

哈希窗口, 153

图像访问任务, 233–234

概述, 62

重新计算取证映像的哈希值, 198

远程取证采集, 171–172

在采集过程中分割图像, 193

加密文件系统, 访问

Apple FileVault, 248–251

Linux LUKS, 251–254

Microsoft BitLocker, 243–248

概述, 243

TrueCrypt, 254–257

VeraCrypt, 254–257

EncryptedRoot.plist.wipekey 文件, 249–250

加密。另见 密码学;加密文件系统,访问

闪存驱动器, 17, 131, 131f, 228

清除密钥的程序, 227–228

Opal, 128–131

使用 211–218 保护磁盘映像

增强型集成驱动电子技术(EIDE), 32

环境因素, 91–93

EO1. 参见 EnCase EWF

磁带上的 EOD(数据结束)标记, 14, 176

磁带上的 EOF(文件结束)标记, 176

磁带上的 EOM(介质结束)标记, 176

磁带上的 EOT(磁带结束)标记, 176

擦除取证图像数据, 224–228

驱动器错误, 159–165

估算完成时间, 87–88

证据

容器。参见 取证文件格式

磁盘。参见 主题磁盘

完整性, 197–202。另见 密码学

组织, 76–83

EWF。参见 EnCase EWF

ewfacquirestream 工具, 172, 210

ewfacquire 工具

压缩图像, 189

将原始镜像转换为 EWF, 202–203

加密哈希算法, 151, 151t

错误处理, 161

法医获取, 141, 145–147

获取期间分割镜像, 193

ewfexport 工具, 205, 206, 207

ewfinfo 工具, 206, 207

ewfmount 工具, 233, 234

ewfverify 工具, 198

检查目录结构, 79–81

检查主机。参见 获取主机

专家证人格式。参见 EnCase EWF

EXTENDED SECURITY ERASE 命令, 227

可扩展主机控制器接口(xHCI), 29–30

外部驱动器,加密, 216, 217–218

提取文件,命名规范, 77–78

提取数据子集。参见 数据提取

F

故障,硬盘, 159–165

FC(光纤通道)接口, 25–26, 26f

FDE(全盘加密), 128–131, 216–218

fg 命令, 93

光纤通道(FC)接口, 25–26, 26f

文件压缩, 85

文件格式。参见 法医文件格式

文件,命名规范, 76–79

文件销毁器, 224–225

文件大小,报告, 86–87

文件空闲区, 43

文件系统。参见 加密文件系统,访问

作为法医文件格式访问, 233–235

数据 CD, 20

通用磁盘加密, 216–217, 218

识别, 263–264

Linux 内核和, 52–55

提取空闲空间, 271–272

提取未分配的块, 272

文件传输协议, 224

FileVault,苹果, 248–251

FileVault 破解软件, 251

FireWire(IEEE1394)接口, 33, 33f, 137

第一个响应者对活跃 PC 的分诊, 102

闪存驱动器, 17, 131, 131f, 173, 228

闪存。参见 非易失性存储器

闪存转换层(FTL), 15

fls 命令, 180, 238, 242, 249–250, 265–266

法医采集。另请参见 数据提取;数字取证;法医镜像管理;镜像访问任务

完整性, 10

基于 dd 的工具, 142–145

在期间加密, 212, 213, 214

使用法医格式, 145–150

作为平台的 Linux, 47–57

管理驱动器故障和错误, 159–165

向多个目标传输, 150

通过网络, 166–172

概述, 141, 275–276

同行评审研究, 7–8

性能, 88–90, 91t

前提条件, 9

RAID 和多磁盘系统, 178–184

可移动介质, 172–178

签名法医镜像, 154–157

在期间拆分镜像, 192–194

标准, 6–7

暂停过程, 92–93

选择工具, 141–142

趋势和挑战, 4–5

在期间验证哈希值, 197–198

将镜像文件写入克隆磁盘, 220–221

法医启动 CD, 98, 99

法医文件格式。另请参见具体格式

使用获取镜像, 145–150

内置加密, 214–216

在之间转换, 202–211

镜像访问任务, 233–235

镜像压缩支持, 188

命名约定, 77

概述, 59–60

原始镜像, 60–62

SquashFS, 63–67

法医文件系统分析, 271, 274

法医镜像管理

压缩, 187–191

在镜像格式之间转换, 202–211

磁盘克隆和复制, 219–221

概述, 187

安全擦除和数据处理, 224–228

使用加密保护镜像, 211–218

拆分镜像, 191–197

传输和存储, 221–224

验证镜像完整性, 197–202

法医影像。请参见 法医采集

法医准备状态, 69–70

法医写保护器。请参见 写保护器

在开源软件中的分叉, 49

格式,文件。请参见 法医文件格式

FreeTSA, 158, 159, 201

冻结命令,ATA 密码保护的磁盘, 127

冻结 DCO 配置, 119–120

fsstat命令, 263–264

ftkimager 工具

内置加密, 214–215

压缩镜像, 190

将文件从 EnCase 转换为 FTK, 207–208

从 FTK 格式转换, 208–209

将原始镜像转换为 FTK SMART, 203

加密哈希算法, 151, 151t

错误处理, 161–162

取证采集, 141, 147–149

概述, 62

采集过程中分割镜像, 193–194

FTK SMART 格式

压缩格式, 190

将 AFF 镜像转换为, 209–210

将 EnCase EWF 文件转换为, 207–208

将原始镜像转换为, 203

转换为另一种格式, 208–209

概述, 62

远程取证采集, 171–172

FTL(闪存转换层), 15

全盘加密 (FDE), 128–131, 216–218

FUSE 文件系统, 196, 233, 241–243, 245, 246, 250–251

fusermount 命令, 234

fvdeinfo 工具, 249

fvdemount 工具, 250–251

G

Garfinkel, Simson, 62

Garloff, Kurt, 62, 163

全局唯一标识符(GUID), LDM 磁盘组, 181

GNU dd. 参见 dd 工具

GNU dd_rescue 工具, 61, 62, 142, 163, 215–216

GNU ddrescue 工具, 61, 142, 162–163, 165

GNU 隐私保护工具(GnuPG 或 GPG), 155–156, 200–201, 211–213

GNU screen 终端复用器, 75–76

GNU split 命令, 192

gpart 工具, 267

GPG(GNU 隐私保护工具), 155–156, 200–201, 211–213

gpgsm 工具, 156–157

gptparser.pl 工具, 263

GPT 分区方案, 262

Grenier, Christophe, 267

growisofs 命令, 222

GUID(全局唯一标识符), LDM 磁盘组, 181

Guidance Software. 参见 EnCase EWF

GUI 界面

与命令行相比, xxi

Linux, 55–56

gunzip 工具, 188, 213

gzip 工具,188–189,192,204,214

H

Harbour,Nicholas,61

硬盘。参见 法医获取;存储介质;目标磁盘

磁性,12–13,13f

服务区域,40

将法医映像传输到,223

硬件

检查员工作站,查看,103–104

管理驱动器故障和错误,159–165

检查目标 PC,101–102

写保护器,39,94–97,94f,95f,97f,107–108

硬件写保护(HWB)设备规格,版本 2.0,94

哈希

基础,151–152,151t

GPG 加密,213

OpenSSL 加密,214

概述,197

重新计算哈希,198–199

拆分原始图像,199

验证获取过程中哈希值,197–198

哈希窗口,143,152–154,199–200

HBA(主机总线适配器),36

hd(hexdump)工具,226

HDDGURU,125

HDD Oracle,125

hddtemp 工具,91

hdparm 工具

ATA 密码保护磁盘,126,127

ATA 安全擦除单元命令,227

DCO,移除,118–120

HPA

移除,121–122

使用复制扇区大小,220

扇区范围,提取,270

使用查询磁盘功能和特性,108–112

只读属性,98

SSD,16–17

热量,监控,91–93

散热片,93

hexdump(hd)工具,226

隐藏扇区,启用访问

移除 DCO,118–121

移除 HPA,121–122

概述,118

系统区域,122–125

隐藏卷,VeraCrypt,256–257

历史,外壳,73–75

主机总线适配器(HBA),36

HPA(主机保护区域)

提取属于的扇区范围,269–271

概述,39–40,118

移除,121–122

使用复制扇区大小,219–220

Hulton,David,251

HWB(硬件写保护)设备规格,版本 2.0,94

hxxp,79

I

IAAC(信息保障咨询委员会),8

icat 工具,249–250

IDE(集成驱动电子),18,32,32f

IEEE1394(FireWire)接口,33,33f,137

图像访问任务。另请参见 加密文件系统,访问

启动镜像,使用 xmount 准备,235–237

法医格式镜像文件,233–235

概览,229–230

原始镜像,230–233

VM 镜像,237–243

图像采集/成像。参见 法医采集

img_stat 命令,59–60,194,195,197–198

行业

内部协作,5

法规和最佳实践,8–9

信息保障咨询委员会(IAAC),8

信息安全,211–218

启动器,SCSI 命令,36

集成驱动电子(IDE),18,32,32f

完整性。参见 加密学;验证法医镜像完整性

接口。另请参见特定接口

总线速度,90,91t

遗留,32–34,32f,33f,34f

NVME,27–29,27f,28f

概览,22

SAS 和光纤通道,25–26,25f,26f

SATA,22–25,23f,24f,25f

Thunderbolt,30–32,31f

USB,29–30,29f,30f

国际标准化组织(ISO),6

国际计算机证据组织(IOCE),2,3

物联网,4

分区间隙,提取,269

IOCE(国际计算机证据组织),2,3

ISO(国际标准化组织),6

iStorage datashur 驱动器,228

J

越狱设备,5

JBOD(仅一堆磁盘),179–180

JTAG 接口,125

跳线设置,Advanced Format 512e 磁盘,43

仅一堆磁盘(JBOD),179–180

K

Kali Linux,99

内核,Linux

定义,55

确定分区详细信息,264

和文件系统,52–55

和存储设备,50–52

内核补丁,写保护,98–99

内核环形缓冲区,106

凯斯勒,盖瑞,262–263

密钥擦除程序,227–228

科恩布鲁姆,杰西,61

kpartx 工具,231,233,234,241,242

L

执法机构和数字取证

合作,5

历史,1–2

LDM(逻辑磁盘管理器),181

ldmtool 工具,181

传统技术

磁性,15

光学存储介质,22

存储介质接口,32–34,32f,33f,34f

联想 ThinkPad 安全硬盘,216,216f

libata 库,39

libbde 包,247–248

libewf 库,62,215

libfvde 软件包,248–251

libqcow-utils 包,237

libvhdi 工具,241

libvmdk-utils 软件包,240

链接层,磁盘接口,34,35f,38

Linux。参见命令行;特定命令

高级格式 4Kn 磁盘,42–43

Apple 目标磁盘模式,137–138

审计跟踪,76

命令执行,56

压缩工具,188–189

发行版,55–56

法医启动 CD,98,99

在法医环境中,48–50

内核和文件系统,52–55

内核和存储设备,50–52

循环设备,230–233

LUKS,251–254

概览,xx–xxi,47,57

管道和重定向,56–57

RAID-5 采集,183–184

SCSI 命令,36–37

shell 历史,73,74

shell,56

软件 RAID,178

Thunderbolt 接口,31–32

Linux 存储堆栈图,52,53f

使用 CoW 快照进行实时成像,172

实时 PC,分类,102

锁定 DCO 配置,119–120

逻辑磁盘管理器(LDM),181

逻辑卷管理器(LVM)层,254

物流问题

环境因素,91–93

估算任务完成时间,87–88

文件压缩,85

镜像大小和磁盘空间要求,83–84

移动和复制法医镜像,87

概述,83

性能和瓶颈,88–90,91t

报告的文件和镜像大小,86–87

稀疏文件,85–86

日志,SMART,115

法医镜像的长期存储,221–224

循环设备,183–184,230–233,252–253,265–266

loop 选项,mount 命令,245,247

losetup 命令,183,230,231,252,265

Lougher, Phillip,63

lsblk 命令,106–107,108

ls 命令,86–87,196

lshw 工具,103,104,133–134

lspci 工具,103–104

lsscsi 命令,105,108

lsusb 工具,104,105,108

luksDump 命令,252–253

LUKS 加密系统,251–254

LVM(逻辑卷管理)层,254

M

M.2 接口

NVME,27,27f

SATA, 24, 24f

磁性存储介质。参见 硬盘;磁带

传统,15

概述,12

磁带,14f

获取,176–178

连接到采集主机,133–135

概述,13–14

物理只读模式,100

维护扇区,40,122–125

管理镜像文件。参见 法医镜像管理

使用偏移量进行手动提取,272–274

映射设备,179–182,231–232,253,255–256

大容量存储技术。参见 存储介质

主引导记录(MBR),129

主密码,ATA 密码保护磁盘,126–127,128

克隆驱动器上的最大可见扇区,220

MBR(主引导记录),129

md5sum 工具,152,154,207

mdadm 工具,183,184

媒体。参见 存储介质

内存。参见特定类型的内存;存储介质

存储卡,18f

获取,173–174

附加到采集主机,136

概览,17–18

内存空闲,43

元数据,取证文件格式,62

Metz, Joachim,62,237,247,248

微型 IDE ZIF 接口,33,33f

微型 SATA 接口,24,24f

Micro SD 卡,173–174

Microsoft BitLocker,243–248

Microsoft 动态磁盘,181–182

Microsoft VHD 格式,241–243

迷你 IDE 接口,33,33f

Mini-SAS HD 接口,26f

迷你 SATA(mSATA)接口,23,23f

镜像磁盘,RAID-1,182–183

不匹配的哈希窗口,199–200

mkisofs 命令,221–222

mksquashfs 工具,63,170,206–207

mmcat 工具,266,268,269,270

mmls 命令,262

mmstat 命令,260,261

mount 命令,184,241,245,247

挂载

解密的文件系统镜像,245,246,247,250,253,256

Linux 中的文件系统,53–54

取证格式图像文件,233–235

将图像文件作为常规文件系统,229

循环分区,232–233

SquashFS 容器,66

VeraCrypt 卷,218

虚拟机镜像,236,238–239,240–243

移动取证镜像,87

mpt-status 工具,178

mSATA(迷你 SATA)接口,23,23f

msed 工具,129

mt 工具,134–135

多磁盘系统,获取

JBOD 和 RAID-0 条带磁盘,179–180

Linux RAID-5,183–184

Microsoft 动态磁盘,181–182

概览,178

专有系统,178–179

RAID-0 条带磁盘,179–180

RAID-1 镜像磁盘,182–183

多功能驱动舱写保护器,94,95f

多个目的地,法医采集到,150

音乐 CD,20,175。另见 CD;光学存储介质

myrescue 工具,163

N

命名空间,NVME,44–45,138,139,226

文件和目录的命名约定,76–79

NAND 闪存技术,15

国家标准与技术研究院

技术。 CFTT 项目

nbd 内核模块,237–238,239

错误扇区,40,122–125

荷兰法医研究院(NFI),166

网络

图像采集

转到 EnCase 或 FTK 格式,171–172

使用 CoW 快照进行实时映像,172

概览,166

使用 rdd,166–168

转到 SquashFS 证据容器,169–171

使用 ssh,168–169

转移采集图像,223–224,223t

性能调优,90

下一代封装形式(NGFF),27

NFI(荷兰法医研究院),166

NIST。 CFTT 项目

非特权用户,241–243,246,251,254

非易失性存储器

遗留,19

概览,15–16

可移动内存卡,17–18,18f

固态硬盘,16–17,16f

USB 闪存驱动器,17,17f

非易失性存储器快闪(NVME)

命令集,37–38,37t

接口,27–29,27f,28f

命名空间,44–45,138,139,226

nvme-cli 软件包,44–45

nvme 工具,138,139

SSD,138–139

擦除驱动器,226

nwipe 工具,226

O

of= 标志,dc3dd 工具,150

--offset 标志,losetup 命令,231

偏移量,手动提取,272–274

Opal 自加密硬盘,128–131,228

opengates 工具,236

openjobs 工具,236

开源软件(OSS),48–50,276

OpenSSH 软件包,224

OpenSSL 命令行工具,157–159,201–202,213–214

光学存储介质

获取,174–175

附加到获取主机,132–133

蓝光光盘,19f,21–22

获取,174,175

转移取证镜像到,222,223

光盘,19f,20–21

获取,174,175

Linux 取证启动,98,99

转移取证镜像到,221–222

损坏,165

光盘,19f,21

获取,174,175

重新组装分割的取证镜像,196

转移取证镜像到,222

传统,22

概述,19–20

转移取证镜像到,221–223

操作系统加密文件系统。参见 加密文件系统,访问

操作系统镜像,在虚拟机中启动,235–237

OSS(开源软件),48–50,276

OS X,在虚拟机中启动镜像,236

超额配置,15–16

P

并行 ATA(PATA),18

并行接口,22

解析工具,262–263

分区设备,51–52,231–233,238,239–240

分区提取

删除,266–268

HPA 和 DCO 扇区范围,269–271

个人,264–266

分区间间隙,269

概述,264

分区方案,分析,259–264

分区表,261–263

密码保护磁盘,126–128

密码恢复技术,125

PATA(并行 ATA),18

PC-3000 工具,Ace 实验室,122

PCI 总线,列出连接到的设备,103–104

PCI Express 写保护器,96,97f

PEM 签名文件,157,201

Pentoo 取证 CD,99

PEOT(磁带物理结束)标记,176

性能,取证获取,88–90,91t

PGP(非常好的隐私),155–156

PHY 设备,38

磁带物理结束(PEOT)标记,176

物理错误,SMART 数据, 117–118

物理层,磁盘接口, 34, 35f, 38–39

物理 PC 检查, 102

物理只读模式,带有介质的, 100, 100f

物理安全 ID (PSID), 128, 129f, 228

分段数据提取。另见 数据提取

分段哈希, 152–154, 199–200

管道

将图像获取到多个目标, 150

使用 AFF 文件, 209

压缩与分割结合, 192

使用压缩图像, 189

分割原始图像的加密哈希, 199

加密哈希算法, 152

在 Linux 中, 56–57

验证获取哈希值, 197–198

PKI(公钥基础设施), 156, 216

普通的 dm-crypt 加密, 251, 254

法医获取计划。另见 准备性法医任务

获取后的任务。另见 数据提取;法医图像管理;图像访问任务

死后计算机法医学。另见 数字法医学;法医获取

电源管理, 93

准备性法医任务。另见 物流问题

审计追踪, 70–76

组织收集的证据和命令输出, 76–83

概述, 69–70

写保护, 93–100

优良隐私 (PGP), 155–156

私营部门法医准备工作, 70

特权,命令,xxv, 212, 233。另见 非特权用户

proc 文件系统,Linux, 107

专有 RAID 获取, 178–179

假定义文件, mksquashfs, 206

PSID(物理安全 ID), 128, 129f, 228

公钥基础设施 (PKI), 156, 216

公共部门法医准备工作, 70

Q

QCOW2 格式, 237–239

qcowinfo 工具, 237

qcowmount 工具, 237

QEMU 模拟器, 237–239

qemu-img 命令, 237

qemu-nbd 工具, 237–238, 239

查询目标磁盘

记录设备标识详细信息, 107–108

提取 SMART 数据, 112–118

使用 hdparm, 108–112

概述, 107

R

RAID(独立磁盘冗余阵列)系统,获取

JBOD 条带磁盘,179–180

Linux RAID-5,183–184

Microsoft 动态磁盘,181–182

概述,178

专有系统,178–179

RAID-0 条带磁盘,180

RAID-1 镜像磁盘,182–183

RAM 空闲,43

在 Linux 中的原始设备,51,52

原始镜像

访问取证文件格式,233–235

转换为 AFF 格式,209

转换为另一种格式,202–205

拆分的加密哈希,199

数据恢复工具,61–62

dd 工具,60

取证 dd 变体,61

镜像访问任务,230–233

命名约定,77

概述,60

使用 xmount 工具准备启动镜像,236

重新组装,196–197

写入克隆磁盘,220–221

rdd 工具,166–168

读取错误,dd 工具,143–144

只读模式,带有的媒体,100,100f

只读属性,使用写保护器设置,97–98

重新组装拆分的取证镜像,195–197

重新计算取证镜像的哈希值,198–199

记录器识别码(RID),光盘,21

recoverdm 工具,163

重定向

使用 AFF 文件,209

使用压缩镜像,189

在 Linux 中,56–57

使用保存命令输出,81–83

独立磁盘冗余阵列(RAID)。参见 RAID 系统,获取

行业特定的法规,8–9

重新映射的扇区,40

远程访问命令行,xxi

远程取证获取

转换为 EnCase 或 FTK 格式,171–172

使用 CoW 快照进行实时成像,172

概述,166

使用 rdd,166–168

安全,使用 ssh,168–169

转换为 SquashFS 证据容器,169–171

转移获取的镜像,223–224,223t

可移动存储介质。参见特定的介质类型;存储介质

获取,172–178

附加到获取主机,132–136

加密,216

将取证镜像传输到,221–223

报告的文件和镜像大小,86–87

研究,同行评审,3,7–8

RFC-3161 时间戳, 157–159, 201

RID(记录器识别码),CD, 21

环形缓冲区, 内核, 106

提取音乐 CD, 175

S

S01. 参见 FTK SMART 格式

SAS(串行附加 SCSI)接口, 25–26, 25f, 26f, 37

SAT(SCSI-ATA 转换), 39

SATA(串行 ATA)接口, 16, 22–25, 23f, 24f, 25f, 94f

SATA Express 磁盘接口, 25, 25f

可扩展的检查目录结构, 79–81

数字证据科学工作组(SWGDE), 3

scp(安全复制)工具, 224

屏幕终端多路复用器, 75–76

script命令, 75

脚本编写,命令行, xxi

scriptreplay命令, 75

SCSI-ATA 转换(SAT), 39

SCSI 接口, 34f

命令集, 36–37, 37t, 39

记录设备识别详细信息, 108

识别目标驱动器, 105

概述, 33–34

查询驱动器, 112

磁带驱动器,查询, 134

SD(安全数字)标准, 18

sdparm命令, 112

扇区偏移

转换为字节偏移, 247–248, 249, 252, 265

文件系统识别, 263–264

使用手动提取, 272–274

扇区。另见 隐藏扇区,启用访问;4Kn 磁盘

硬盘, 12, 40

使用 HPA 进行复制, 219–220

用户可访问的, 擦除, 225–226

安全复制(scp)工具, 224

secure_deletion 工具包, 224

安全数字(SD)标准, 18

安全/多用途互联网邮件扩展(S/MIME), 155, 156–157, 201

安全网络数据传输, 223–224

安全远程成像, 168–169

安全擦除和数据处置, 224–228

安全擦除命令, ATA, 226–227

安全特性, 目标磁盘

ATA 密码保护磁盘, 126–128

加密闪存 U 盘, 131

概述, 125

自加密驱动器, 128–131

安全级别,ATA 密码保护硬盘,127

法医图像的安全性,211–218

SEDs(自加密硬盘),128–131,218,228

sedutil-cli命令,129–130,218,228

在压缩文件中进行查找,188,204

自加密硬盘(SEDs),128–131,218,228

自监控、分析和报告技术(SMART)

使用smartctl提取数据,112–118

管理硬盘故障和错误,163–164

NVME 硬盘,139

自测,SMART 数据,115–116

磁盘的串行访问,122–125

串行 ATA(SATA)接口,16,22–25,23f,24f,25f,94f

串行附加 SCSI(SAS)接口,25–26,25f,26f,37

串行总线控制器类,104

串行点对点连接,22

服务器模式,rdd 工具,166,167,168

服务区域,40,122–125

会话,CD,20

sfsimage 工具

获取图像,149–150

将 AFF 文件转换为压缩的 SquashFS,210

将 FTK 文件转换为 SquashFS,208–209

将原始图像转换为 SquashFS,203–204

dcfldd 和 dc3dd 工具,145

图像访问任务,235

概述,63

远程法医采集,169–171

可移动媒体,获取图像,174

SquashFS 压缩,191

SquashFS 证据容器,64–67

sg3_utils 软件包,36–37

Opal SEDs 上的影像 MBR,129–130,131

共享总线,22

shell 别名,72–73

shell 历史记录,73–75

Shells。参见 Bash;命令行

擦除文件,224–225

SID(源唯一标识符),CD,21

sigfind 工具,266

确认签名的有效性,200–202

签名法医图像,154–157

大小

磁盘映像,83–84

报告的文件和图像,86–87

skip参数,用于 dd 分区提取,266

闲置空间,43,271–272

Sleuth Kit

blkcat 命令,274

blkls 命令,271–272

fls 命令,180,238,242,249–250,265–266

fsstat 命令,263–264

img_stat 命令,59–60,194,195,197–198

mmcat 工具,266,268,269,270

mmls 命令,262

mmstat 命令,260,261

sigfind 工具,266

SMART(FTK 法医格式)。参见 FTK SMART 格式

SMART(自监控、分析与报告技术)

使用 smartctl 提取数据,112–118

管理驱动故障和错误,163–164

NVME 驱动,139

smartctl 命令,91–92,112–118

S/MIME(安全/多用途互联网邮件扩展),155,156–157,201

Snoopy 命令日志记录器,74–75

软件

开源,48–50

专有,49–50

写保护器,97–99,108

固态硬盘(SSDs),12,16–17,16f,43,138–139

固态混合硬盘(SSHDs),45

源代码级访问,开放源代码软件,48

源唯一标识符(SID),CDs,21

空间要求,83–84

稀疏文件,85–86

split 命令,192

拆分法医镜像

访问,194–195

加密哈希值,199

获取过程中,192–194

概述,191–192

重新组装,195–197

SquashFS

背景,63

将文件刻录到 CD,221–222

转换 AFF 文件为压缩格式,210–211

转换 FTK 文件到,208–209

转换原始镜像,202–205

法医证据容器,64–67,149–150,191

镜像访问任务,235

手动容器创建,205–207

概述,63

远程法医获取,169–171

squashfs-tools 包,64

SSD(固态硬盘),12,16–17,16f,43,138–139

ssh 命令,168–172

SSHD(固态混合硬盘),45

标准,数字取证,6–7

标准错误(stderr),82

标准输入(stdin),82,189

标准输出(stdout),81–82,189

存储,取证镜像,221–224

存储介质。参见 取证采集;特定介质类型;目标磁盘

高级格式 4Kn 硬盘,12,41–44,42f

DCO 和 HPA 驱动器区域,39–40

加密,216–218

检查员工作站硬件,103–104

镜像大小和磁盘空间要求,83–84

接口和连接器,22–32

Linux 内核和,50–52,53f

磁性,12–15

命名约定,77,78

非易失性存储器,15–19

NVME 命名空间,44–45

光学,19–22

概述,11–12,46

重新映射扇区,40

可扩展的检查目录结构,80,81

安全磁盘擦除,225–226

固态混合硬盘,45

系统区域,40,122–125

使用的术语,xxvi

趋势与挑战,4

UASP,29,40–41

写入阻止保护,93–100

strace 命令,195

条带化硬盘,179–180

目标磁盘。参见 取证采集;存储介质

附加到采集主机

苹果目标磁盘模式,137–138

具有块或字符访问的设备,140

启用访问隐藏扇区,118–125

检查目标 PC 硬件,101–102

识别目标驱动器,105–107

NVME SSD,138–139

概述,101

查询目标磁盘,107–118

可移动存储介质,132–136

安全功能,125–131

查看检查员工作站硬件,103–104

定义,xxvi

镜像大小和磁盘空间要求,83–84

使用 xmount 工具准备启动镜像,235–237

从 PC 移除,102

温度监控,91–93

数据子集,提取。参见 数据提取

sudo 命令, 212, 242–243, 246, 251, 254

支持, 开源软件, 48, 49

嫌疑磁盘。参见 主题磁盘

暂停采集过程, 92–93

SWGDE(数字证据科学工作组), 3

对称加密, 211–213, 215–216

sync 参数, dd 工具, 143

/sys 伪文件系统, 42–43

系统区域, 40, 122–125

T

tableau-parm 工具, 95–96, 121

Tableau 写入阻断器, 94f, 95–96

tapeinfo 工具, 134–135

磁带, 14f

获取, 176–178

附加到采集主机, 133–135

概述, 13–14

物理只读模式, 100

目标, SCSI 命令, 36

目标磁盘模式(TDM),苹果, 31, 137–138

任务完成时间, 估算, 87–88

任务管理, 70–73

Taskwarrior, 71–72

TCG(受信计算组织), 128

tc-play, 217

TDM(目标磁盘模式),苹果, 31, 137–138

tee 命令, 152

温度数据, SMART, 116–117

温度监控, 91–93

终端监视器, 76

终端复用器, 75–76

终端记录器, 75–76

testdisk 工具, 267–268

文本文件, 命名约定, 78, 79

U 盘, 17, 131, 131f, 173, 228

Thunderbolt 接口, 30–32, 31f, 137

Thunderbolt 转 FireWire 适配器, 137–138

time 命令, 82

时间戳, 82–83, 157–159, 201–202

tmux 终端复用器, 75–76

todo.txt 文件格式, 72

转移, 法医镜像, 221–224

传输层, 磁盘接口, 34, 35f

Trapani, Gina, 72

活跃 PC 的分类, 102

TRIM 命令, ATA, 16–17

TrueCrypt, 216–217, 254–257

可信计算组(TCG),128

TSA 证书, 201

ts 命令, 83, 158–159

tsget 命令, 158

Type C 接口, USB, 30, 30f

U

U.2 接口,NVME,28, 28f

UASP(USB 附加 SCSI 协议),29, 40–41

UDF(通用磁盘格式),21

udevadm 工具, 50–51

udev 系统,Linux,50–51

umount 命令, 54, 207, 232–233, 234, 241

提取未分配的块, 272

唯一标识符, 77, 105

通用磁盘格式(UDF),21

通用串行总线。参见 USB

卸载解密后的文件系统映像, 245, 251, 254, 256

Linux 中的文件系统, 54

法医格式的映像文件, 234

循环分区, 232–233

VeraCrypt 卷, 218

虚拟映像, 236

unsquashfs 命令, 207

URL 命名约定, 79

USB(通用串行总线),29f, 30f

卡片读取器, 18

记录设备识别详细信息, 108

闪存驱动器, 17, 17f, 131, 131f, 173, 228

列出附加设备, 104, 105

多功能设备, 140

概述, 29–30

串行访问磁盘, 122–125

USB 附加 SCSI 协议(UASP),29, 40–41

usb_modeswitch 工具, 140

无用的 cat 命令使用(UUOC),199

用户可访问的扇区,擦除, 225–226

用户密码,ATA 密码保护的磁盘, 126–127

UUOC(无用的 cat 命令使用),199

V

varmon 工具, 178

VBoxManage 工具, 239

VDI 格式, 236, 239–240

VeraCrypt, 217–218, 254–257

验证法医映像完整性

GPG 加密, 213

手动创建 SquashFS 容器, 207

不匹配的哈希窗口, 199–200

OpenSSL 加密, 214

概述, 197

重新计算哈希值,198–199

签名和时间戳,200–202

拆分原始镜像,199

验证哈希值在获取过程中的应用,197–198

VFDecrypt 工具,251

VFS (虚拟文件系统) 抽象层,52

VHD 格式,Microsoft,241–243

vhdiinfo 命令,241–242

vhdimount 命令,242

VirtualBox VDI 镜像,236,239–240

虚拟文件系统 (VFS) 抽象层,52

虚拟机磁盘 (VMDK) 格式,240–241

重要产品数据 (VPD),112

vmdkinfo 命令,240

虚拟机镜像,访问

dislocker 包,244–245

Microsoft VHD,241–243

概述,237

QEMU QCOW2,237–239

VirtualBox VDI,239–240

VMWare VMDK,240–241

虚拟机,启动主题驱动,235–237

VMWare VMDK 格式,240–241

VPD(重要产品数据),112

W

穿戴均衡,15

Weinmann, Ralf-Philipp,251

窗口管理器,Linux,55–56

Windows,在虚拟机中启动镜像,236

擦除取证镜像数据,224–228

世界范围名称 (WWN),111–112

写保护器

记录使用证据,107–108

硬件,39,94–97,94f, 95f,97f

重要性,93–94

用于遗留接口,34

Linux 取证启动 CD,99

物理只读模式的介质,100,100f

NVME,28–29

概述,21

软件,97–99,108

用于 USB 设备,30

挂载文件系统时,54

WWN(世界范围名称),111–112

X

X11 窗口系统,Linux,55

Xen blktap xapi 接口,241

xHCI(可扩展主机控制器接口),29–30

xmount 工具,使用其准备启动镜像,235–237

Z

zcat 工具,189,196,199

ZIP 压缩档案格式,211

zuluCrypt,217

image

第十三章

更新

访问 www.nostarch.com/forensicimaging/ 获取更新、勘误和其他信息。

更多务实的书籍来自 image NO STARCH PRESS

image

汽车黑客手册

渗透测试员指南

作者: CRAIG SMITH

2016 年 3 月,304 页,$49.95

ISBN 978-1-59327-703-1

image

实用恶意软件分析

恶意软件剖析实用指南

作者: MICHAEL SIKORSKI ANDREW HONIG

2012 年 2 月,800 页,$59.95

ISBN 978-1-59327-290-6

image

IDA PRO 书籍,第 2 版

世界上最受欢迎反汇编工具的非官方指南

作者: CHRIS EAGLE

2011 年 7 月,672 页,$69.95

ISBN 978-1-59327-289-0

image

实用数据包分析,第 3 版

使用 Wireshark 解决真实世界的网络问题

作者: CHRIS SANDERS

2017 年冬季,304 页,$49.95

ISBN 978-1-59327-802-1

image

网络安全监控实战

理解事件检测与响应

作者: RICHARD BEJTLICH

2013 年 7 月,376 页,$49.95

ISBN 978-1-59327-509-9

image

如何运行 Linux,第 2 版

每个超级用户应该知道的

作者: BRIAN WARD

2014 年 11 月,392 页,$39.95

ISBN 978-1-59327-567-9

电话:

800.420.7240 或

415.863.9900

电子邮件:

SALES@NOSTARCH.COM

网站:

WWW.NOSTARCH.COM

第十四章:“任何负责保存数字证据的人都不可或缺的参考书。” — 洛桑大学教授 Eoghan Casey

取证图像采集是事后响应和证据收集的重要部分。数字取证调查员收集、保存和管理数字证据,以支持民事和刑事案件;调查组织政策违规;解决争议;并分析网络攻击。

《实用数字取证成像》 详细介绍了如何使用基于 Linux 的命令行工具来保护和管理数字证据。这本重要的指南带你全面了解整个取证采集过程,并涵盖了与存储介质成像相关的广泛实际场景和情况。

你将学习如何:

image 对磁性硬盘、SSD 和闪存驱动器、光盘、磁带以及传统技术进行取证成像

image 保护附加的证据介质免受意外修改

image 管理大型取证图像文件、存储容量、图像格式转换、压缩、拆分、复制、安全传输与存储以及安全处置

image 使用加密和分段哈希、公钥签名以及 RFC-3161 时间戳来保存和验证证据的完整性

image 使用更新的驱动器和接口技术,如 NVME、SATA Express、4K 原生扇区驱动器、SSHD、SAS、UASP/USB3x 和 Thunderbolt

image 管理驱动器安全,如 ATA 密码;加密 U 盘;Opal 自加密驱动器;使用 BitLocker、FileVault 和 TrueCrypt 加密的操作系统驱动器;以及其他相关驱动器。

image 从更复杂或具有挑战性的情况中获取可用的图像,如 RAID 系统、虚拟机镜像和损坏的介质

《实用数字取证成像》 独特地聚焦于数字取证采集和证据保存,是希望提升其 Linux 技能的资深数字取证调查员和希望学习数字取证的资深 Linux 管理员的宝贵资源。这是每个数字取证实验室的必备参考书。

关于作者

Bruce Nikkel 是一家全球金融机构的网络犯罪 / IT 调查与取证部门主管,自 2005 年以来,他一直管理该机构的 IT 取证部门。他是 《数字调查》 的编辑,并已在多个数字取证主题上发表了研究。Bruce 拥有网络取证博士学位。

image

极客娱乐的最佳之作™

www.nostarch.com

第十五章:脚注

第零章:数字法医概述

  1. Gary Palmer, “数字法医研究路线图。” 数字法医研究研讨会 (DFRWS),2001 年。技术报告 DTR-T0010-01,纽约尤蒂卡。2. www.dfrws.org/about-us/3. utica.edu/academic/institutes/ecii/publications/articles/A04BC142-F4C3-EB2B-462CCC0C887B3CBE.pdf4. “硬盘驱动器的法医成像—我们曾经认为我们知道的”,法医焦点,2012 年 1 月 27 日,articles.forensicfocus.com/2012/01/27/forensic-imaging-of-hard-disk-drives-what-we-thought-we-knew-2/

第一章:存储介质概述

  1. Jeff Hedlesky, “固态硬盘法医取证的进展” (报告, CEIC2014, 拉斯维加斯, NV, 2014 年 5 月 19 日至 22 日).2. Bruce Nikkel, 数字调查 16 (2016): 38-45, doi:10.1016/j.diin.2016.01.001.3. LAN/WAN 层次网络通过开放系统互联(OSI)模型的七层抽象来描述网络通信。4. 磁盘驱动器的 AT 附加接口,ANSI X3.221-199x,修订版 4c,X3T10,1994 年。5. ATA/ATAPI 命令集-2(ACS-2),修订版 2。6. Mayank R. Gupta, Michael D. Hoeschele 和 Marcus K. Rogers, “隐藏磁盘区域:HPA 和 DCO,” 国际数字证据期刊 5, 第 1 期 (2006), www.utica.edu/academic/institutes/ecii/publications/articles/EFE36584-D13F-2962-67BEB146864A2671.pdf

第二章:Linux 作为法医采集平台

  1. Erin Kenneally, “Gatekeeping Out of the Box: Open Source Software as a Mechanism to Assess Reliability for Digital Evidence,” 弗吉尼亚法律与技术期刊 6, 第 13 期 (2001).2. Brian Carrier, “Open Source Digital Forensic Tools: The Legal Argument” [技术报告] (Atstake 公司, 2002 年 10 月).3. FUSE 是一个用户空间文件系统实现(参见 en.wikipedia.org/wiki/Filesystem_in_Userspace)。4. 关于将GNULinux合并的命名争议,参见 en.wikipedia.org/wiki/GNU/Linux_naming_controversy

第三章:法医图像格式

1。Philip Turner,“来自不同来源的数字证据统一(数字证据包)”(论文发表于数字取证研究研讨会[DFRWS],路易斯安那州新奥尔良,2005 年 8 月 18 日)。dfrws.org/2005/proceedings/turner_evidencebags.pdf。2。M.I. Cohen,Simson Garfinkel 和 Bradley Schatz,“扩展高级取证文件格式,以容纳多个数据源、逻辑证据、任意信息和法医工作流程,”数字调查 6(2009):S57–S68。3。在基于 Debian 的系统上,使用 apt-get install squashfs-tools 安装此软件包。

第四章:规划与准备

1。此示例中的点可以解释为正则表达式。为了简化起见,这里忽略了这一点。2。GNU cp 命令还允许在复制过程中创建稀疏文件。3。在典型的 i7 PC 上使用两个 SATA3 硬盘,使用 dd 测试。4。法医采集还涉及数据的完整性和保存完整性。5。“Tableau Bridge Query—技术文档”,访问日期:2005 年 12 月 8 日,之前可以下载。欲了解更多信息,请联系 Guidance Software。

第五章:将目标媒体附加到采集主机

  1. lsusb -v 输出中,Linux Foundation...root hub 设备中的 iSerial 设备描述符将指向 USB 控制器的 PCI 设备地址。2. 可用的 SMART 统计数据和日志因硬盘厂商而异。3. 关于 HPA 和 DCO 区域的取证论文,见 Mayank R. Gupta、Michael D. Hoeschele 和 Marcus K. Rogers,“隐藏磁盘区域:HPA 和 DCO”,国际数字证据杂志 第 5 卷,第 1 期(2006)。4. 一些主板要求在 BIOS 中配置 SATA 端口以支持热插拔。5. 关于在服务扇区中隐藏数据的研究,见 Ariel Berkman,“在硬盘的服务区中隐藏数据”,Recover Information Technologies LTD,2013 年 2 月 14 日,* www.recover.co.il/SA-cover/SA-cover.pdf 。6. Todd G. Shipley 和 Bryan Door,“硬盘驱动器的取证影像:我们曾经认为我们知道的”,取证焦点,2012 年 1 月 27 日, articles.forensicfocus.com/2012/01/27/forensic-imaging-of-hard-disk-drives-what-we-thought-we-knew-2/ *。7. 联合测试行动小组(JTAG)定义了用于访问电子组件的标准化调试接口。8. 在撰写本文时,我没有测试访问任何支持多个命名空间的 NVME 驱动器。这些结论基于对标准和文档的阅读。

第六章:取证影像采集

  1. 假设授权人已安装 GnuPG 并安全地生成了密钥对。2. PEM 最初在隐私增强邮件标准中定义,今天通常指用于存储 X.509 证书的文件格式。3. 也可以使用不同人提供的多个签名来降低密钥被窃取或某人恶意篡改的风险。4. 在某些系统中,这是一个 Perl 脚本,位于 /usr/lib/ssl/misc。5. 在数据恢复行业中,这被称为 捐赠盘。6. Andrew S. Tanenbaum 的名言在这里是适用的:“永远不要低估一辆装满磁带的旅行车飞速驶过公路的带宽。”7. cdparanoia 是在 CD 驱动器的质量问题比今天的驱动器更多时开发的。8. Heinz Mauelshagen,“dmraid - 设备映射 RAID 工具:通过通用 Linux 设备映射器支持 ATARAID 设备。” 论文在 2005 年 7 月 20-23 日的渥太华 Linux 研讨会上发布。9. Linux md 驱动程序最初意味着 镜像设备,一些操作系统称之为 元设备

第七章:取证影像管理

1。截至本文写作时,ewfacquire 的最新版本暂时禁用了 bzip2 支持(请参阅 libewf 软件包的ChangeLog文件中的 20160404 节)。2。也可以使用 DCO 来复制扇区大小。3。我是加拿大人,因此偏爱 RCMP 方法。😃

第八章:特殊镜像访问主题

1。术语slices来源于 BSD UNIX,并且它是 UNIX 世界中常见的分区方案。

posted @ 2025-12-01 09:42  绝不原创的飞龙  阅读(0)  评论(0)    收藏  举报