内存取证实用指南-一-

142 阅读1小时+

内存取证实用指南(一)

原文:annas-archive.org/md5/4485621706f1c64128a5ddfcd6116461

译者:飞龙

协议:CC BY-NC-SA 4.0

前言

内存取证是一种强大的分析技术,可以应用于从事件响应到恶意软件分析的多个领域。对于经验丰富的调查员来说,内存是获取宝贵数据的重要来源。内存取证不仅能提供关于用户上下文的关键信息,帮助你寻找恶意软件的独特痕迹,而且在某些情况下,还能帮助拼凑出复杂目标攻击的全貌。

本书将带你了解内存取证的概念,并逐步深入到更高级的概念,讲解如何使用免费工具和内存分析框架来捕猎和调查高级恶意软件。本书采用实践导向,通过来自实际事件的内存映像帮助你更好地理解该主题,从而掌握调查和应对恶意软件事件及复杂目标攻击所需的技能。本书涉及 Windows、Linux 和 macOS 的内部结构,并涵盖了使用内存取证检测、调查和捕猎威胁的概念、技术和工具。

本书结束时,你将精通内存取证,并获得使用相关工具的实际操作经验。你将能够独立创建和分析内存转储,检查用户活动,检测无文件恶意软件的痕迹,并重建威胁行为者的行动过程。

本书适用对象

本书面向事件响应人员、数字取证专家、网络安全分析师、系统管理员、恶意软件分析师、学生以及对内存取证感兴趣的好奇的网络安全专业人士。假设读者已具备对恶意软件及其工作原理的基本理解。掌握操作系统内部结构的知识将有所帮助,但并非强制要求。对于该领域的新手,本书将提供足够的信息帮助理解。

本书内容

第一章为什么选择内存取证?,通过现实世界的例子解释了内存取证为何成为如今许多数字取证检查中的重要部分,描述了 DFIR 专家使用的主要目标和调查技巧,并讨论了他们面临的日常挑战。

第二章获取过程,介绍了内存获取的基本技巧和工具,以及与此过程相关的可能问题。此外,你将有机会比较实时内存分析与内存转储分析,了解各自的优缺点。

第三章Windows 内存获取,讨论了 Windows 内存获取工具及其对内存工作的处理方式。书中还将讨论如何选择合适工具的一些建议,并提供全面的示例。

第四章通过 Windows 内存取证重构用户活动,探讨了重构用户活动的重要性,因为它可以更好地帮助理解发生了什么。本章将提供一些基于运行进程、网络连接、Windows 注册表和内存中的文件系统分析的用户行为恢复技术的见解。

第五章通过 Windows 内存取证进行恶意软件检测与分析,探讨了现代恶意软件往往尽可能减少在磁盘上的痕迹,这也是内存分析成为法证调查关键要素的原因。本章将解释如何在进程内存中以及在 Windows 注册表、事件日志和内存中的文件系统遗留物中搜索恶意软件痕迹。

第六章易失性内存的替代数据源,讨论了有时无法创建内存转储进行分析的情况,然而,总有机会在磁盘上找到一些易失性内存。本章介绍了 Windows 中易失性数据的替代来源,以及它们的分析工具和技术。

第七章Linux 内存获取,展示了 Windows 和 Linux 内存获取之间的核心差异。将介绍用于 Linux 内存获取的工具,并讲解其配置和使用案例。

第八章用户活动重构,探讨了在 Linux 系统中重构用户活动与 Windows 中有所不同的方式。本章将介绍如何通过 Linux 内存转储追踪用户活动的几种技巧。

第九章恶意活动检测,重点介绍了在 Linux 系统中搜索恶意活动并进行分析所需的技术。

第十章MacOS 内存获取,与获取过程相关,重点介绍 macOS 内存获取工具及其使用,帮助你能够从所有流行的操作系统中创建内存转储。

第十一章使用 macOS 内存取证进行恶意软件检测与分析,探讨了可以帮助我们获取必要数据来追踪用户行为并检测和分析 macOS 内存中恶意活动的技术。

如何最大限度地利用本书

在本书中,我们试图以非常详细的方式描述所有内容,并一步步带领你完成整个过程。因此,你所需要的只是一台安装了 Windows 和 Linux 的计算机或虚拟机。

由于本书以实践为导向,我们建议您尝试书中描述的所有方法和工具,以最大程度地利用本书的内容。

下载彩色图片。

我们还提供了包含本书中使用的截图/图表的彩色图片 PDF 文件。您可以在此下载:static.packt-cdn.com/downloads/9781801070331_ColorImages.pdf

使用的约定

本书中使用了多种文本约定。

文本中的代码:表示文本中的代码词汇、数据库表名、文件夹名称、文件名、文件扩展名、路径名、虚拟网址、用户输入和 Twitter 用户名。举个例子:“要找到这样的进程,您可以使用 psscan 插件。”

任何命令行输入或输出都如下所示:

C:\WINDOWS\system32> wmic process list full

粗体:表示新术语、重要词汇或您在屏幕上看到的词汇。例如,菜单或对话框中的词汇在文本中呈现如下:这是一个例子:“依赖本地资源是一种非常流行的方法,攻击者利用内置工具和已安装的合法软件为自己谋取利益。”

提示或重要注意事项

如下所示。

联系我们

我们始终欢迎读者的反馈。

customercare@packtpub.com

勘误:尽管我们已尽最大努力确保内容的准确性,但错误还是会发生。如果您发现本书中的错误,我们将非常感激您能向我们报告。请访问 www.packtpub.com/support/err…,选择您的书籍,点击“勘误提交表单”链接,并输入相关详情。

copyright@packt.com 并附带该材料的链接。

如果您有兴趣成为作者:如果您对某个主题有专业知识,并且有兴趣编写或参与编写一本书,请访问 authors.packtpub.com

分享您的想法

阅读完《实用内存取证》后,我们很想听听您的想法!请点击 packt.link/r/1-801-07033-4 直接前往亚马逊的评论页面,并分享您的反馈。

您的评论对我们和技术社区至关重要,将帮助我们确保提供高质量的内容。

第一部分:内存取证基础

本节不仅将向你介绍内存取证的好处,还将介绍易失性内存的基本概念及其获取与分析的过程,让你对该主题有一个大致的了解。

本书的这一部分包括以下各章:

  • 第一章为什么选择内存取证?

  • 第二章获取过程

第一章:为什么选择内存取证?

我们生活在一个变化无常的世界里,而网络犯罪也不例外。新的攻击技术不断被开发出来,数百种恶意程序和脚本被编写并测试,以绕过安全控制,同时扫描器也在互联网世界中仔细检查易受攻击的主机和公开的服务。这就是为什么保持与时俱进并拥有各种工具和技术以便与威胁行为者保持同步显得尤为重要。

那么,为什么内存取证在今天的许多数字取证检查事故响应工作中是至关重要的一部分?数字取证和事故响应专业人员使用的主要调查目标和技术是什么?他们每天面临哪些挑战?你将在本章中找到这些问题的答案。

本章将涵盖以下主题:

  • 了解内存取证的主要好处

  • 了解调查目标和方法

  • 发现内存取证的挑战

了解内存取证的主要好处

自然地,对于拿起这本书的读者来说,好处是显而易见的。既然你已经决定深入了解内存取证,想必你有自己的原因。不过,让我们再来看看随机存取内存RAM)调查可以在以下几种常见情况下发挥重要作用的场景(不仅仅是在数字取证中,还有事故响应和恶意软件分析中),也许你会发现自己所学的知识和技能还有新的应用场景。

没有留下任何痕迹

过去几年,使用地面生存无文件攻击技术的威胁行为者数量大幅增加。攻击者不再像以前那样关心清除自己的痕迹,而是尽量留下尽可能少的痕迹以避免被检测到。这使得信息安全专业人员的工作变得更加困难,因为内建工具的使用和磁盘上没有恶意文件可供扫描意味着一些传统的安全解决方案可能失效。缺乏日志记录可能使得在事后检查过程中很难重建威胁行为者如何滥用内建的双用途工具,例如各种命令和脚本解释器,因此获取和分析内存可能在这些案例中起到关键作用。

让我们分别讨论每个案例。

在内存中找到我

让我们从专门在内存中工作的恶意软件谈起。这个概念本身并不新鲜。当谈到内存驻留恶意软件的时代初期时,一些研究人员提到马耳他变形虫,这是一种 1991 年在爱尔兰首次发现的病毒。也有些人喜欢从 2001 年出现的Code Red蠕虫谈起。无论如何,自 21 世纪初以来,无文件攻击势头越来越强,并变得越来越流行。例如,载荷可能通过 PowerShell 直接注入到内存中,这已经变得极为普遍。进程注入技术本身已被许多网络安全厂商列入 2020 年 MITRE ATT&CK®十大技术之一。例如,以下是Red Canary 2021 年威胁检测报告中的十大技术,来源于redcanary.com/threat-detection-report/techniques/

图 1.1 – 2020 年 MITRE ATT&CK 十大技术

图 1.1 – 2020 年 MITRE ATT&CK 十大技术

进程空洞化、动态链接库注入、进程双胞胎等进程注入子技术不仅被高级的国家支持的威胁团体使用,甚至普通的恶意软件操作者也会使用。

工作框架

另一个问题是使用大量后渗透框架,如 Metasploit、Cobalt Strike 或 PowerShell Empire。这些工具为攻击者提供了广泛的选项,可以生成各种恶意载荷并将其注入内存。

这些框架最初是为进攻性安全而设计的,最先让渗透测试人员和红队员使用,随后各种威胁行为者也开始使用它们。这些框架使得即便没有出色的恶意软件开发经验的攻击者,也能以非常有限的磁盘足迹使用各种技术。例如,Cobalt Strike 的 Beacon 载荷的非托管 PowerShell 功能允许威胁行为者在不实际运行powershell.exe的情况下执行,反而是滥用 Windows API 来实现。

像 Cobalt Strike 这样的框架已经变得如此普遍,以至于一些威胁行为者甚至使用它们代替定制恶意软件。例如,臭名昭著的 Evil Corp 集团,其成员被认为是多个高知名度勒索软件攻击的幕后黑手,包括 Garmin 公司,已将 Dridex 木马转为 Cobalt Strike 的 Beacon,在其WastedLocker攻击活动中使用。

利用现有资源

利用现有资源是一种非常流行的方法,攻击者利用内置工具和已安装的合法软件来达到自己的目的。例如,大多数工具,如 PowerShell 或 WMI,通常由系统管理员用于执行日常任务,这使得不仅仅是发现攻击者变得困难,而且要阻止攻击者使用的工具也非常有挑战性。

攻击者可以利用“以土地为生”(living-off-the-land)技术,采取多种策略。PowerShell 可以用于从攻击者控制的服务器下载初始有效载荷,像rundll32.exeregsvr32.exe这样的二进制文件可以用于执行和防御规避,Ntdsutil可以被用来访问凭证,PsExecWMIC则可以被滥用进行远程执行。有许多类似的例子,如果 IT 基础设施没有先进的日志记录功能,分析师提取这些信息的机会可能非常低。如果能及时获取,内存分析可能会提供极大的帮助!

另一个重要的提醒是,在许多情况下,你只能在磁盘上找到恶意二进制文件的第一阶段——下一阶段(甚至可能是接下来的多个阶段!)直接从服务器加载到内存中,因此,如果没有内存镜像,在事后分析时你将无法看到它。

更重要的是,现在大多数恶意二进制文件都经过打包、编码和加密,以避免被检测到,但在内存中却不会如此!因此,你可以使用像 PE-sieve 这样的工具来收集潜在的恶意代码进行进一步分析。当然,我们将在接下来的章节中向你展示如何操作。

隐私保护者

近年来,隐私问题变得更加严峻。每天都有大量个人数据、照片和消息出现在网络上。服务提供商收集关于我们个性、兴趣和日常习惯的信息,以提高工作效率和实用性。即时通讯工具、带隐私模式的浏览器、内存文件系统、密码管理器和加密容器应运而生。

当然,隐私是每个人关心的问题,但它与网络犯罪分子最为相关,因为他们确实有东西需要隐藏。我们不止一次看到过在嫌疑人计算机上发现的感兴趣文件被加密或保存在加密容器中的情况。在这种情况下,内存收集和分析是打开所有大门的钥匙,因为它可以帮助调查人员恢复解密所需的密码和密钥。

正如你所见,存在不同的案例,但它们都有一个共同点,那就是在每一个案例中,内存取证都可以发挥极其重要的作用。

了解调查目标和方法

任何取证调查的基础都是目标设定。目标决定了要寻找的证据、使用的方法以及我们需要的工具。正确的目标设定方法有助于快速高效地实现预期结果。还记得那个著名的"分而治之"原则吗?尽管它的起源和主要目的是如此,这个原则对于实现任何目标都非常有效,关键是理解该分解什么,以及如何使用它。作为调查目标设定的一部分,这一原则可以用来将主要目标分解成更小、更简单的目标。因此,通过将目标分解成各个部分,我们得到了一个具体行动的集合,最终的结果就是拼凑出事件的全貌,所有我们需要做的就是将这些碎片拼接起来。

让我们从更一般的目标开始。如果我们接收到与事件相关的设备进行检查,那么很可能它是以下之一:

  • 被害人的设备

  • 嫌疑人的设备

让我们在接下来的部分中探讨这两者。

被害人的设备

假设被害人的设备正在调查中。在这种情况下,主要目标是回答问题,发生了什么? 一种方法是将这个问题分解成几个部分:

  1. 攻击者是如何进入系统的?

  2. 启动了哪些工具?

  3. 攻击者是否获得了持久性?

  4. 是否有横向移动的迹象?

  5. 在目标上执行了哪些操作?

现在让我们用相同的方法来思考问题,攻击者是如何进入系统的?

  1. 是否有潜在恶意文件/链接被打开的痕迹?

  2. 是否有远程连接服务正在运行?

  3. 是否有可疑连接的痕迹?

  4. 是否有可移动设备连接的痕迹?

让我们也提问有关恶意文件的问题:

  1. 是否有保存可疑文件的痕迹?

  2. 是否有打开可疑链接的痕迹?

  3. 是否有可疑文件被打开的痕迹?

寻找这些问题的答案不仅需要了解数字证据及其来源,还需要了解攻击者的战术、技术和程序,因此这样的评估必须是以网络威胁情报为驱动的。

这是每个上级问题应该分解的层次。因此,我们最终得出了一个问题列表,这些问题将帮助我们拼凑出事件的整体情况,并详细回答第一个问题,发生了什么?

嫌疑人的设备

可以使用类似的方法来调查可能是攻击源的设备。在这种情况下,问题将根据该设备的所有者被怀疑的行为来提出。例如,如果他们被怀疑是恶意软件开发者,我们的问题将与开发工具、源代码的痕迹、恶意软件销售等相关。

所以,我们已经讨论了内存取证如何帮助我们的调查以及我们可以应用的调查方法。然而,我们不能沉默不语,忽视其中的弱点和潜在的风险。让我们来讨论内存取证中的挑战。

发现内存取证中的挑战

我们希望你已经意识到内存分析的重要性。现在是时候去寻找其中的陷阱了。RAM 是一个非常有用且极其脆弱的东西。任何对系统的交互,哪怕是最小的,都可能导致不可逆的后果。因此,内存分析中最重要的挑战之一就是数据保存

下一部分列出了与内存转储创建相关的几个重要事项。

工具

由于大多数操作系统没有内置的解决方案来创建完整的内存转储,因此你必须使用专门的工具。目前市面上有各种各样的工具可用于创建完整的内存转储以及提取单个进程。调查员在选择工具时可能会根据不同的考量做出选择:

  • 对系统的更改

  • 成本

  • 远程转储创建的可能性

不幸的是,即使使用受信任的工具,也无法保证 100% 成功。而且,这可能会破坏系统,这引出了下一个问题。

关键系统

在某些情况下,运行工具创建内存转储可能会导致系统过载。这就是为什么决定创建内存转储的调查员必须准备好承担可能的风险。被调查的系统可能是一个关键对象,禁用该系统不仅可能导致重要数据丢失,还可能导致关键业务流程中断,极少数情况下甚至可能威胁到人们的生命和健康。对这类系统进行内存转储的决策应当是经过深思熟虑的,考虑到所有的利与弊。

不稳定性

如果被调查的系统感染了编写不当的恶意软件,它本身就会是不稳定的。在这种情况下,尝试创建内存转储可能会导致不可预测的后果。

此外,有时恶意软件会尝试使用反取证技术,并尽一切可能防止内存保存,这同样会导致不可预测的后果。这种情况发生得很少,但这个因素也应该被考虑在内。

总结

内存在经验丰富的调查员手中是一个重要的取证来源。内存分析提供了关于恶意软件活动及其功能、用户上下文,包括最近的操作、浏览活动、消息传递以及独特证据,如无文件恶意软件、内存中的应用数据、加密密钥等信息。

内存分析就像其他任何事情一样,都必须以某种方式进行。最重要的一点是设定调查目标,并将其拆解成简单的组成部分,以便更快速高效地进行调查,更重要的是,决定是否有必要进行调查,或者磁盘上留下的数据是否足够提供答案。

当然,没有万全之策,内存取证也有其缺点。主要的问题是数据保存,但如果你能够妥善处理这一点,你将会获得丰厚的回报。

既然你已经了解了内存取证的好处以及相关挑战,并且理解了调查的方法,那么接下来该做什么呢?我们认为是时候深入实际内容了,我们的第一站是内存获取过程,我们将在下一章中讨论这个话题。

第二章:获取过程

内存获取通常指的是将易失性内存的内容复制到非易失性存储设备中以供保存的过程。为了充分理解这一过程,调查员需要至少了解一些内存管理原则,理解内存提取工具的工作原理,并能够选择最合适的工具并正确使用。此外,重要的是要理解,创建完整的内存转储并不总是唯一的解决方案。还有实时内存分析,它也有其优点,在某些情况下,可能比内存获取更为合适。

在本章中,你将学习以下内容:

  • 介绍内存管理概念

  • 什么是实时内存分析?

  • 理解部分与完整内存获取

  • 探索流行的获取工具和技术

介绍内存管理概念

有几个与随机访问内存RAM)的组织和管理相关的概念。理解这些概念将帮助你使内存调查过程更加有意识和有效。我们从地址空间开始。

地址空间

RAM 是一个内存单元的数组,每个单元都有自己的物理地址,用于访问该单元。然而,进程不能直接访问物理内存。这是因为进程与物理内存交互时,可能会轻易损害操作系统,甚至导致其完全崩溃。此外,进程使用物理地址使得同时执行程序的组织变得困难。为了解决这些问题,创建了一个叫做地址空间的抽象概念。

地址空间是一组可以用来访问内存的地址。每个进程都有自己隔离的地址空间,这解决了进程之间以及进程与操作系统之间的安全和隔离问题。但是,如果没有足够的物理内存来容纳所有正在运行的进程的代码和数据,该怎么办呢?

这里我们来到了下一个抽象概念。

虚拟内存

0x000000000x7FFFFFFFF,如下面的图示所示:

图 2.1 – x86 系统中内核空间和用户空间的默认分配

图 2.1 – x86 系统中内核空间和用户空间的默认分配

对半分割是标准做法,但不是强制要求。例如,在 Windows 中,有一个选项可以使用 3:1 的分割,其中 3 GB 属于用户空间。

在 x64 架构中,可以为进程分配更多的内存。在这种情况下,用户空间占用地址 0x00000000000000000x000007ffffffffffffff,而内核空间从地址 0xffffff08000000000000 开始。

分页

整个进程地址空间被划分为固定大小的块。这样的块被称为,它们代表一系列连续的地址。正是这些页被映射到物理内存中。

内存管理器负责卸载页面并释放物理内存。内存管理器还通过硬件的帮助将虚拟地址转换为物理地址。

因此,进程使用其地址空间中的虚拟地址来访问内存,操作系统将此地址转换为物理地址,以从内存中检索所需的数据。

以下图表直观地展示了分页

图 2.2 – 分页概念的示意图

图 2.2 – 分页概念的示意图

这种方法使得我们可以仅将那些在特定时间内程序正常运行所需的页面加载到物理内存中。其余的页面存储在磁盘上,等待加载。

决定哪些进程内存页应该位于物理内存中,哪些应该保留在磁盘上的机制称为分页。存在许多页面替换算法(FIFO、LRU、Clock、WSClock 等)。它们的共同目标是:提高稳定性和性能

为了存储未使用的内存页面,操作系统会使用一个单独的文件(pagefileswapfile)或磁盘上的特殊分区(交换区)。因此,在创建内存转储时,我们只会获取加载到 RAM 中的页面内容。同时,包含对调查员有重要信息的页面可能位于磁盘上。为了获得完整的画面,建议将内存转储分析与非内存驻留数据的分析结合起来。

共享内存

如前所述,每个进程都有自己的隔离地址空间,但也有例外。开发者总是寻求提高性能、增加效率并减少资源消耗,而内存也不例外。结果就是共享内存

共享内存是多个进程可以同时访问的内存区域。这个机制有几个用途。首先,能够访问同一内存空间的进程可以利用它来交换数据或执行相同的代码段。其次,这个机制提高了使用库的效率。例如,如果多个进程使用相同的动态库,那么将库的一个实例放入物理内存,并将所有需要它的进程的虚拟内存页映射到这个实例中会更简单。

栈和堆

每个进程包含静态数据和动态数据。静态数据被放置在与进程虚拟地址空间相关联的区域中。动态数据通常存储在称为的内存区域中。为了更好地理解这些概念,这里有一张进程虚拟内存的示意图:

图 2.3 – 进程虚拟内存的示意图

图 2.3 – 进程虚拟内存的示意图

堆栈存储与可执行代码直接相关的数据。如果程序执行过程中调用了某个函数,就会为该函数分配一个独立的堆栈帧。被调用函数的参数、变量和返回地址会被放入其中。堆栈帧数据只存在于给定函数执行的范围内;然而,这一部分的内容能够告诉调查员在特定时刻该进程执行了哪些函数。

与堆栈不同,堆中的数据会在进程的整个生命周期中存储,这对于数字取证专家来说至关重要。此外,它存储动态分配的数据,例如在文本编辑器中输入的文本、可能包含密码的剪贴板,或正在运行的消息软件中的聊天内容。

我们已经讲解了基本概念,接下来我们将在后续章节中提及。现在是时候进入下一个主题——实时分析了。

什么是实时内存分析?

有几种情况是无法创建内存转储的。我们已经在第一章中讨论了这些情况,为什么选择内存取证? 另外,对于远程系统或内存大于 32 GB 的系统,内存提取可能变得低效。在这种情况下,您可以使用实时内存分析手动检查正在运行的进程、它们的内存内容、网络连接以及当前的系统状态。

重要提示

请记住,您通常需要一个具有管理员权限的用户才能执行实时分析。如果攻击者能够访问目标系统并使用凭证挖掘工具,那么以特权用户身份登录就相当于直接泄露了您的凭证。

Windows

要在 Windows 主机上执行实时内存分析,有许多工具可供选择,从内置工具到高级取证框架都有。此外,现在许多 EDR/XDR 解决方案也允许事件响应人员执行实时内存分析。

让我们来看一个非常常见的实时分析工具,Process Hacker,如下图所示:

图 2.4 – Process Hacker 进程标签

图 2.4 – Process Hacker 进程标签

Process Hacker 允许您获取以下信息:

  • 正在运行的进程列表

  • 启动的服务

  • 活跃的网络连接

  • 磁盘使用情况

此外,双击正在运行的进程可以进入该进程的内存。您可以在其中找到有关使用的资源的信息,查看进程的地址空间,包括堆栈和堆,甚至可以使用正则表达式在其中搜索特定数据。

当你已经知道需要寻找什么时,这种方法可能非常有用。例如,你知道某个恶意软件将有效负载注入到explorer.exe(Windows 资源管理器)中。通常,explorer.exe的实例不多;而且,它通常不应该进行网络连接。因此,使用如 Process Hacker 等工具和一些网络威胁情报,你可以轻松地发现恶意进程。

如前所述,也有一些内建工具,如Windows 命令行PowerShellWindows 管理工具WMI)。这些工具提供了广泛的功能,帮助你获取活动进程列表、它们使用的资源、内存内容、活动网络连接等。

让我们看一下以下命令:

C:\WINDOWS\system32> wmic process list full
CommandLine=powershell.exe -nop -w hidden -enc SQBmACg<edited>
CSName=DESKTOP-1J4LKT5
Description=powershell.exe
ExecutablePath=C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe

该命令通过wmic(WMI 命令行工具)列出所有活动进程,包括它们的命令行和可执行文件路径。

Linux 和 macOS

对于运行 Linux 和 macOS 的系统,前面描述的方法同样有效。Apple TerminalLinux Terminal都允许你查看网络连接信息、资源使用情况或正在运行的进程,如下截图所示:

图 2.5 – 基于 Linux 系统的活动进程列表

图 2.5 – 基于 Linux 系统的活动进程列表

尽管实时分析方便且快速,但它也有其缺点。检查实时系统无法查看已终止进程和关闭的网络连接信息,限制了与内核对象的交互,并且可能导致重要痕迹被抹去,因为与目标系统的任何交互都会导致内存中的变化。

还值得注意的是,内存内容是不断变化的,在实时分析过程中很容易忽视某些信息,这也是为什么在可能的情况下进行转储永远不会多余。我们将在下一部分中讨论这一点。

理解部分与完整内存获取

我们已经确定,处理内存转储有其一定的优势。剩下的唯一问题是要转储什么。Windows 系统上有一些工具允许你创建特定进程的转储。其中一个工具是ProcDump,它是Sysinternals Suite的一部分。

以下截图展示了使用Telegram Messenger通过 ProcDump 创建完整进程转储的示例:

图 2.6 – Telegram 进程的内存转储

图 2.6 – Telegram 进程的内存转储

图 2.6中,ProcDump 也有适用于类似 Linux 系统的工具,它提供了一种方便的方式来创建 Linux 应用程序的核心转储。同样,通过GDBGNU 调试器)也可以在 macOS 上创建进程转储,但这是一项更复杂的任务,因为它需要直接指定内存地址来创建转储。

单个进程的转储可以稍后通过调试器进行分析。以下截图展示了在WinDbg中打开的 Telegram 进程的转储:

图 2.7 – 在 WinDbg 中打开的 Telegram 进程转储

图 2.7 – 在 WinDbg 中打开的 Telegram 进程转储

这种分析技术适用于例如事件响应过程中,当需要从内存中快速提取某些数据(如 IP 地址或可执行代码)时。然而,如果需要进行全面调查,提取用户数据或加密密钥,或者构建基于 RAM 的时间线,则需要创建完整的内存转储。接下来,我们将讨论这一点。

探索流行的获取工具和技术

创建内存转储并非一项简单的任务,涉及多个因素。我们将在本章的这一部分单独讨论它们。

虚拟或物理

环境在转储创建过程中起着重要作用。这是因为虚拟机内存的转储不需要额外的工具。

事实上,虚拟机内存的内容部分或完全被放置在具有特定扩展名的文件中,因此获取转储实际上就是获取该精确的文件。以下截图展示了用于存储虚拟机内存的基本虚拟化工具和文件:

图 2.8 – 虚拟化工具和包含内存相关数据的文件

图 2.8 – 虚拟化工具和包含内存相关数据的文件

获取虚拟机内存的一个重要标准是其状态。需要理解的是,如果虚拟机正在运行,内存内容是不断变化的。因此,有两种可能的解决方案:

  • 挂起:虚拟机的内存将在稳定状态下保存到磁盘。然而,一些解决方案在挂起虚拟机之前执行几个进程,这可能导致重要数据丢失。例如,VMware 在虚拟机进入挂起状态之前关闭所有活动的网络连接。

  • 创建快照:创建快照时,虚拟机当前的状态和内存将被写入单独的文件中,不做任何更改。

因此,为了保存原始数据,创建快照以获取虚拟机内存更为可取。之后对虚拟机文件的进一步操作将取决于具体的供应商和内存保存的格式。

本地或远程

如果我们的目标系统是裸金属,我们无法避免使用额外的工具来创建内存转储。在这种情况下,物理访问主机起着关键作用。

在当今世界,远程从目标系统收集数据并不罕见。可以使用以下方案,在最简单的情况下远程创建内存转储:

  1. 创建一个带有管理员权限的临时用户,这将帮助您防止攻击者窃取特权用户的凭据。

  2. 创建一个网络共享$C$ADMIN),并复制所需的工具以创建转储。

  3. 使用任何远程控制工具、服务创建或任务调度来运行您的工具,然后通过反向连接将转储发送到网络共享。

  4. 删除临时管理员账户。

    重要提示

    确保在将转储文件发送到网络之前和之后计算其校验和以检查其完整性。

如果可以物理访问主机,则我们需要解决的第一个问题是在哪里存储数据。强烈建议不要将内存转储保存在目标系统上,因为这可能导致在磁盘上覆盖法庭重要数据。在写入转储时,应预先准备可移动设备。不建议使用同一设备处理多个疑似感染主机,以及将设备直接连接到调查员计算机。这是因为存在恶意软件(主要用于对能源部门的攻击,例如USBferryCrimson.USBWormUSBCulprit),这些恶意软件使用可移动设备进行自我传播和数据传输。在这种情况下,最好将设备连接到中间主机,从中将所有必要的数据发送到调查员的主机,例如通过网络。

如果可以物理访问目标系统,则可以使用硬件和软件解决方案创建内存转储。

一种硬件解决方案是使用直接内存访问DMA),例如FireWire。应该立即指出的是硬件解决方案有许多限制(例如,从 Windows 10 和 macOS 10.7.2 开始,对于锁定系统,DMA 被禁用),并且通常需要额外的驱动程序,这并不是一个优点。

使用软件解决方案完全是另一回事。市场上有大量免费和商业工具,可以创建不同格式的内存转储。总的来说,大多数工具的工作方式相似。在转储时,加载内核模块,将物理地址映射到进程的虚拟地址空间,从中写入数据到文件。重要的是要注意设备内存的存在。设备内存是保留给固件使用的物理内存的一部分。尝试访问内存的这一部分可能会导致不可预测的结果。这就是为什么大多数现代工具设计为跳过设备内存区域。

如何选择

对于这么多工具的显而易见的问题是如何选择最合适的工具。这个问题非常个体化。我们只想列举一些在选择工具时应考虑的因素:

  • 支持的操作系统和硬件架构

  • 远程转储能力

  • 对目标系统的影响

  • 可靠性

前两个因素是情境性的——根据必须进行转储的环境,可能适合某些工具。后两个因素则更为普遍。无论背景如何,我们始终尽量减少对目标系统的影响。至于可靠性,必须强调的是,不要使用你之前未在目标系统上使用过并测试过的工具,因为它们可能会出现不可预测的行为。因此,建议在创建目标系统的内存转储之前,先在相同条件下测试该工具。

是时候了

唯一需要弄清楚的是,何时进行转储最为合适。显然,转储创建的时刻在很大程度上决定了其内容。让我们回想一下在第一章中讨论的两个主要案例,为什么选择内存取证?

  • 嫌疑人设备:在这种情况下,我们很可能希望在攻击者没有明显活跃时创建内存转储。这将帮助我们避免外部干扰转储过程。

  • 嫌疑人设备:这里的情况恰恰相反,因为重要的是要找到设备所有者非法活动的证据。基于这一点,最好在目标主机上有任何活动时进行内存转储。

关于转储时间的一般建议是选择启动、关机、重启、系统更新以及其他活动较多的时段之外的时间。

总结

对内存结构和内存管理概念的基本理解是进行智能有效调查过程的关键。

在某些情况下,创建内存转储可能变得复杂或效率低下。在这种情况下,实时内存分析提供了帮助,它允许你获取目标系统当前状态的基本信息。

创建完整内存转储的另一种替代方法是提取单个进程的内存。这在事件响应中可能会有所帮助,但它无法提供完整的图景,极大地限制了调查员的能力。

创建内存转储是一个复杂的过程,取决于多个因素。为了成功创建转储,检查员应考虑各种细微差别,包括数字环境、远程数据提取的需求、使用工具的可靠性以及转储创建的时间。

在接下来的章节中,我们将更详细地介绍在不同操作系统上创建内存转储所需的工具,并进行实际操作。

第二部分:Windows 取证分析

本部分将带你了解 Windows 内存获取过程和内存转储分析,包括恢复用户操作和在内存中追踪恶意活动。

本书的这一部分包含以下章节:

  • 第三章Windows 内存获取

  • 第四章通过 Windows 内存取证重建用户活动

  • 第五章使用 Windows 内存取证进行恶意软件检测与分析

  • 第六章易失性内存的替代来源

第三章:Windows 内存获取

你已经掌握了一些理论知识,但正如你所知道的,理论和实践本质上是没有区别的,但实际上是有差别的。所以,让我们继续深入实际任务,从Windows 内存获取开始,因为 Windows 是最广泛使用的操作系统。

这意味着什么?它是威胁行为者最常见的目标!这也意味着在你处理事件响应时,你会经常遇到它(当然,也包括一些刑事案件)。因此,了解如何从 Windows 主机获取内存是一个非常好的起点。

本章将向你介绍用于 Windows 内存获取的四种最常见工具,当然,你还将学习如何使用它们并获取内存镜像,以供后续分析。

我们将讨论以下主题:

  • 了解 Windows 内存获取问题

  • 准备进行 Windows 内存获取

  • 使用 FTK Imager 获取内存

  • 使用 WinPmem 获取内存

  • 使用 Belkasoft Live RAM Capturer 获取内存

  • 使用 Magnet RAM Capture 获取内存

了解 Windows 内存获取问题

在上一章中,我们详细介绍了内存转储的基本概念,并讨论了可能出现的问题。然而,每个操作系统都有其特殊性。与 Windows 内存提取相关的主要特点是访问随机访问内存RAM),但首先还是从基础开始。

还记得我们之前谈到过的设备内存吗?那是为设备保留的物理内存区域。这些设备包括显卡、声卡、外部组件互联(PCI)卡等等。它们直接访问物理内存对其高效且质量良好的运行至关重要。你还记得尝试访问设备内存可能会导致什么吗?没错——它可能会导致不可预测的后果

问题在于,尝试访问或写入设备内存会被转换为发送到相应设备的请求。然而,不同的设备可能会对试图与它们保留的物理内存交互的尝试做出不同的反应。在某些情况下,这可能会导致依赖于设备功能的关键信息发生变化。然而,从法医角度来看,这种后果可能是重要证据的丧失,或者在最坏的情况下,系统的冻结或关闭。

在 Windows 操作系统中,访问物理内存是通过 \Device\PhysicalMemory 内核对象实现的。以前,这个文件很容易操作,因为它对用户空间程序完全可访问。然而,如果我们考虑之前的信息,很明显这种方法并不是完全安全的。

这一切都随着**Windows Server 2003 Service Pack 2 (SP2)**的发布发生了变化。当然,用户空间程序仍然可以读取这个文件,但写入访问现在只能从内核空间进行。因此,获取工具必须在内核级别工作,或者使用特殊的驱动程序来创建内存转储。

另一个影响内存提取工具变化的因素是虚拟化的广泛使用。这导致当在启用虚拟安全模式VSM)的系统上运行这些工具时,系统会崩溃。尽管如此,最常用工具的最新版本已经成功解决了这个问题。

尽管这些变化发生了,但用于 Windows 内存获取的工具数量仍然很大。

让我们在接下来的章节中看一下最常用的一些工具。

准备 Windows 内存获取

在我们开始使用映像工具之前,我们需要准备一些东西。首先,你需要找到一个闪存驱动器,用来存储工具本身和创建的内存转储,所以确保它有足够的空间。其次,你需要对它进行清理。这意味着你需要法证擦除驱动器。

重要说明

在标准删除过程中,与已删除文件相关的元数据会被更改,并且这些文件所在的空间会被标记为可供重用。换句话说,删除后,文件的内容仍会保留在驱动器上,并且可以恢复。格式化过程也非常相似。一些特定的主文件会被重写,但信息仍然可以从驱动器中提取。因此,要安全地删除文件,你需要用零或随机数据覆盖内容。

要擦除驱动器,可以根据可移动介质的类型使用不同的工具和方法。我们已经决定使用闪存驱动器;在这种情况下,有两种非常有效且快速的选项,概述如下:

  • 写入一个与闪存驱动器整个容量成比例的预先准备好的文件。

  • 使用**Secure Erase(安全擦除)**选项。

不幸的是,并不是所有厂商都有自己的工具,允许你使用安全擦除选项来安全地擦除他们的驱动器。你可以在闪存驱动器厂商的官方网站上查看这些信息。

当你的闪存驱动器被清理干净后,你可以在其中添加一些映像工具。

使用 FTK Imager 获取内存

AccessData FTK Imager是最受欢迎的免费工具之一。它通常被法证分析师和事件响应人员用来查看磁盘映像预览,甚至进行实时响应,因此它不仅可以用于按位映像,还可以用于创建自定义内容映像,当然也可以用于创建内存映像。让我们更详细地了解一下!请按照以下步骤操作:

  1. 要获取FTK Imager,请访问AccessData的官方网站:accessdata.com/products-services/forensic-toolkit-ftk/ftkimager

  2. 选择产品与服务 | FTK® Imager。点击立即下载 FTK Imager!链接并按下立即下载。你将被要求填写一份包含你联系信息的简短表格。之后,一个链接将发送到你提供的电子邮件地址。

现在,你需要在闪存驱动器上安装 FTK Imager。你可以使用InstallShield 向导工具,它提供了逐步安装说明。

要创建内存转储,FTK Imager 会将设备驱动程序加载到内核中,并随后通过映射 \Device\PhysicalMemory 内核对象来读取内存。从用户的角度来看,使用 FTK Imager 进行内存获取非常简单直观。按照以下步骤创建你的内存映像:

  1. 将闪存驱动器连接到目标系统,并运行 FTK Imager。主窗口将出现,如下所示:

图 3.1 – FTK Imager 主窗口

图 3.1 – FTK Imager 主窗口

  1. 进入文件,点击捕获内存…,或者在工具栏上找到相关图标。下图展示了前一种选项:

图 3.2 – FTK Imager 文件菜单

图 3.2 – FTK Imager 文件菜单

  1. 在对话框中,点击 memdump.mem。我们还建议你勾选包括页面文件复选框,如下所示:

图 3.3 – 内存捕获对话框窗口

图 3.3 – 内存捕获对话框窗口

  1. 按下捕获内存按钮。结果,你将看到如下所示的对话框,展示了转储创建的进度:

图 3.4 – 映像进度

图 3.4 – 映像进度

等待几分钟后,我们获得了内存转储,这是一个 .mem 扩展名的文件。该映像已准备好使用你选择的工具进行分析——例如,Volatility 框架

FTK Imager 是一款功能强大的工具,具有广泛的功能,但我们希望你有选择权,所以让我们看看其他一些工具。

使用 WinPmem 获取内存

WinPmem最初由谷歌开发,并作为Rekall 框架的一部分发布,但现在已作为独立的内存获取工具发布。该工具支持从XP10的各种 Windows 版本,并且为 32 位和 64 位系统提供独立的可执行文件。

WinPmem 使用三种独立的方法来创建内存转储,具体如下:

  • 页面表项 (PTE) 重映射

  • 使用 MMMapIoSpace 内核 应用程序编程接口 (API)

  • 传统的 \Device\PhysicalMemory 映射

上述方法中的第一种方法默认使用,因为它被认为是最稳定的。然而,用户可以手动选择其他任何方法。

要下载此工具,请访问 Velocidex GitHub 页面上的 WinPmem 仓库,github.com/Velocidex/WinPmem

页面如下所示:

图 3.5 – WinPmem GitHub 仓库

图 3.5 – WinPmem GitHub 仓库

在页面的右侧,找到winpmem_mini_x64.exe。将该可执行文件复制到你的闪存驱动器。此程序无需任何额外的依赖项,且是独立运行的。同时,你不必担心 x64 和 x86 的区别,WinPmem 会自动加载正确的驱动程序。

以下说明将帮助你使用 WinPmem 获取内存:

  1. 将闪存驱动器连接到目标系统。以管理员身份运行cmdPowerShell,如下图所示:

图 3.6 – 从搜索框运行 PowerShell

图 3.6 – 从搜索框运行 PowerShell

  1. 移动到你的闪存驱动器,并以内存转储文件名作为参数运行winpmem_mini_x64.exe。如下面的截图所示,memdump.raw是提供的参数:

图 3.7 – WinPmem 执行

图 3.7 – WinPmem 执行

  1. 在内存转储过程中,你将能够看到所有相关信息,如下图所示:

图 3.8 – 使用 WinPmem 创建转储

图 3.8 – 使用 WinPmem 创建转储

一会儿后,我们将得到一个指定名称的原始内存转储。

这是我们如何使用 PowerShell 和 WinPmem 提取 Windows 内存的方法,但这还不止这些。让我们再添加几个工具到我们的工具集。

使用 Belkasoft RAM Capturer 获取内存

Belkasoft RAM Capturer是另一个免费的内存获取工具。与前述工具类似,它使用内核驱动程序提取物理内存并创建转储。该工具兼容所有 32 位和 64 位版本的 Windows,包括 Windows XP、Windows Vista、Windows 78、Server 2003 和 2008 以及 Windows 10

你需要采取以下步骤:

  1. 要获取此工具,请访问官方Belkasoft网页的下载标签:belkasoft.com/。

  2. 选择x64x86文件夹,这些文件夹应当被提取到闪存驱动器中。

  3. 这次,你需要找出你正在处理的是 x64 还是 x86 系统。为此,使用system并运行系统信息应用程序,如下图所示:

图 3.9 – 从搜索框运行系统信息

图 3.9 – 从搜索框运行系统信息

在打开的窗口中,搜索系统类型,位于系统摘要下,如下图所示。x64 基础 PC值表示 64 位系统:

图 3.10 – 系统类型检测

图 3.10 – 系统类型检测

如果是x64文件夹,请选择它;否则,选择x86文件夹中的其他一个。你准备好创建内存转储了。请按照以下步骤操作:

  1. 将闪存驱动器连接到目标系统并运行RamCapture可执行文件。

  2. 在指定字段中输入输出文件夹路径,并按下**Capture!**按钮。

转储创建过程将如下所示:

图 3.11 – 使用 Belkasoft RAM Capturer 进行成像

图 3.11 – 使用 Belkasoft RAM Capturer 进行成像

最终,我们得到一个 .mem 扩展名的内存转储。默认情况下,文件名由采集日期组成,但你可以将其替换为更具描述性的名称。

现在,你可以使用三种不同的工具创建内存转储。让我们来看看最后一个工具,虽然它并不是最不重要的。

使用 Magnet RAM Capture 获取内存

Magnet Forensics 也发布了自己的免费内存获取工具,名为 Magnet RAM Capture,它可以用来从 Windows 系统中获取内存。为了提取物理内存,Magnet RAM Capture 使用内核模式驱动程序。它创建的是原始格式的内存转储,这种格式既可以被开源内存取证工具支持,也可以被功能完整的数字取证套件支持。

下载 Magnet RAM Capture 时,按照以下步骤操作:

  1. 访问官方 Magnet Forensics 网页的 RESOURCES 标签页,然后点击 FREE TOOLS 标签页:www.magnetforensics.com/

  2. 选择 MRCv120.exe 文件到你的闪存驱动器。

使用 Magnet RAM Capture 进行内存转储非常简单,按照以下步骤操作即可:

  1. 将闪存驱动器连接到目标系统,并以管理员身份运行 MRCv120.exe

  2. 在下拉菜单中选择一个 Segment size 选项(默认值为 Don't Split,这是推荐的模式)。

  3. 点击 Browse… 按钮,选择内存镜像的文件名和保存位置。

  4. 点击 Start 按钮。

成像过程将开始;你应该等待进度条达到 100%。这是使用 Magnet RAM Capture 进行成像过程的一个例子:

图 3.12 – 使用 Magnet RAM Capture 进行成像过程

图 3.12 – 使用 Magnet RAM Capture 进行成像过程

处理完成后,你将在之前指定的位置找到一个原始内存镜像文件。

总结

在创建内存镜像时,你不仅需要考虑一般概念,还需要考虑每个操作系统独有的因素。对于 Windows 操作系统来说,一个重要因素就是访问 /Devices/PhysicalMemory 内核对象。

大多数现代工具使用内核驱动程序来创建转储,但一些工具有自己独特的方法,表现为使用与经典的 /Devices/PhysicalMemory 映射不同的替代方案。

尽管有多种 Windows 内存提取工具,但值得记住的是,最好的工具是那些已经在与目标系统相同或至少非常相似的系统上经过成功测试的工具。

在本章中,我们已经学习了如何使用各种免费工具创建内存转储。现在,到了深入查看这些转储内容的时候了!在下一章,我们将了解 Windows 内存转储分析工具,并学习如何搜索用户活动的痕迹。

第四章:通过 Windows 内存取证重建用户活动

用户活动重建对于许多使用场景至关重要,因为它帮助我们更好地理解发生了什么。在第一章中,我们讨论了如果收到参与事件的设备,受害者或嫌疑人可能是设备的拥有者。如果我们分析受害者的设备,用户活动可以告诉我们感染是如何发生的,或者攻击者在远程访问计算机时是如何行动的。如果我们谈论的是攻击者的设备,这种分析可以帮助我们了解攻击准备是如何进行的,威胁行为者执行了哪些操作,并且如何找到非法活动的证据。另外,如果您处理的案件与黑客攻击无关,而是涉及传统犯罪,如儿童色情、人口贩卖和毒品交易,内存镜像可能包含关键证据来源。在这里,您可能能够恢复私人通信和浏览器历史记录,以及嫌疑人用来隐藏数据的容器的加密密钥。

本章将提供一些有关用户行为恢复技术的见解,这些技术不仅基于正在运行的进程,还基于分析内存中的 Windows 注册表和文件系统。

本章将涵盖以下主题:

  • 分析已启动的应用程序

  • 搜索已打开的文档

  • 调查浏览器历史记录

  • 检查通信应用程序

  • 恢复用户密码

  • 检测加密容器

  • 从注册表中提取最近的活动

技术要求

使用下一章介绍的工具并进行 Windows 内存取证时,您不需要满足特定的技术要求。只需要在主机或虚拟机上安装 Windows 操作系统即可。

分析已启动的应用程序

应用程序分析可以帮助调查员建立嫌疑人的档案。分析运行中的进程可以帮助我们了解嫌疑人是否在使用一些具有高度匿名性的消息应用程序或网络浏览器,或者是否有加密容器正在挂载。这些数据源可能充满了有价值的取证文物,且在事后分析中可能无法访问。

每次用户启动程序时,相应的进程会在内存中创建并添加到活动进程列表中。通过分析这个列表,我们可以获得关于在转储时运行的程序的信息。这就是我们一旦掌握分析工具后将要做的事情。

介绍 Volatility

Volatility 框架是最流行的免费内存转储分析工具。许多厂商已经在他们的解决方案中加入了对该工具的支持,包括AutopsyMagnet AXIOM。该工具的源代码是用 Python 编写的,因此 Volatility 可以在不同的操作系统上使用。此外,Volatility 还允许你分析各种操作系统,从Windows XPLinuxmacOS。当然,我们也决定以 Volatility 为基础,但我们不会仅限于此。

要运行 Volatility,你可以使用以下其中一种选项:

  • Volatility 独立版:此版本是一个独立的可执行文件。最后发布的该格式版本是Volatility 2.6。你可以从官方网站下载:www.volatilityfoundation.org/26。只需下载适合你操作系统的版本并将可执行文件复制到一个方便的位置。

  • Python 脚本:使用脚本有其优势,因为它们更新频繁,支持更多的配置文件。要获取这些脚本,你只需访问 Volatility 的 GitHub 仓库并克隆该项目:github.com/volatilityfoundation/volatility

  • Volatility Workbench:此选项适用于那些喜欢使用具有图形界面的工具的用户。Workbench 的开发者定期更新该工具,因此它也支持 Volatility 的最新版本,包括 Volatility 3。然而,它也有一些缺点,比如对 Volatility 中所有可用参数的支持不完整。你可以从官方网站免费下载 Workbench:www.osforensics.com/tools/volatility-workbench.html

Volatility 项目得到了积极支持,因此你总能在适当的公共资源中找到详细的安装说明、官方插件描述、社区插件以及更多信息。这些资源包括官方网页、Volatility 的 GitHub 仓库以及各种论坛。

截至写作时,Volatility 的最新版本是 Volatility 3。然而,该版本仍在开发中,我们所需的一些插件尚未开发完成,甚至完全缺失。此外,Volatility 3 的输出处理不像 2.6 版本那么简便,因此我们优先选择了之前的版本。

截至写作时,Volatility 的最新版本是 Volatility 3。然而,该版本仍在开发中,我们所需的一些插件尚未开发完成,甚至完全缺失。此外,Volatility 3 的输出处理不像 2.6 版本那么简便,因此我们优先选择了之前的版本。

我们将选择简单的方式,使用独立版本。如果你在 Windows 系统上运行,下载 Volatility 后,你将获得 volatility_2.6_win64_standalone.exe 可执行文件。Volatility 是一个命令行工具,因此你需要使用 Windows PowerShellWindows 命令提示符 来运行它。为了检查一切是否正常工作,你可以打开 PowerShell,进入包含工具的文件夹(在我们的案例中是 D:\ 驱动器),并使用 --info 选项运行 Volatility。该选项会打开帮助菜单,如下图所示:

图 4.1 – Volatility 信息

图 4.1 – Volatility 信息

请注意 Profiles 部分,因为它列出了你的 Volatility 版本支持的所有操作系统版本。如果没有正确指定配置文件,工具将无法按预期工作。

配置文件识别

imageinfo 插件中的每个配置文件都会尝试为你找到最合适的配置文件。运行此插件时,你还需要使用 -f 选项,并指定你要分析的内存转储路径。我们使用的内存转储文件名为 Win10Mem.vmem,位于 D:\user activity 文件夹中。整个命令应如下所示:

图 4.2 – Volatility imageinfo

图 4.2 – Volatility imageinfo

如果你成功运行该命令,Suggested profiles 行会显示 Volatility 认为适合分析的配置文件列表。在大多数情况下,列表中的第一个配置文件是最合适的,但如果你发现某些插件在该配置文件下无法正常工作(可能是没有输出、不正确的输出或错误消息),可以尝试更换配置文件。

另一个重要的点是,如果转储的操作系统非常新,可能没有适合的配置文件。在这种情况下,你可以在 GitHub 上搜索并将新的配置文件添加到 Volatility,查看 Volatility 的下一个版本——此时是 Volatility 3——或者使用其他工具。当然,如果你无法找到合适的配置文件,你也可以自己编写,但这将需要更深入的编程和操作系统知识。

在我们的案例中,我们将使用 Win10x64_14393 配置文件来分析 Win10Mem.vmem 转储文件。

到此,我们已经拥有工具和合适的配置文件。现在,我们可以分析活动进程列表了。

搜索活动进程

Volatility 提供了多个插件,用于列出内存转储创建时系统上运行的进程。第一个插件 pslist 允许你按时间获取进程列表。如果你更关心父进程与子进程之间的关系而非创建时间,使用 pstree 插件会更好。两个插件都使用内存中活动进程的列表,并显示可以在实时系统中通过 任务管理器 获取的数据。

启动任何插件的通用命令如下:

volatility_2.6_win64_standalone.exe -f <memory dump location> --profile <suitable profile from profile list> <plugin to run>

让我们尝试按时间排序获取活动进程的列表:

图 4.3 – Volatility pslist

图 4.3 – Volatility pslist

看一下前面的截图。在插件的输出中,我们不仅可以找到正在运行的进程的名称,还能找到其唯一标识符、父进程的标识符、关联的句柄和线程数、进程创建的时间以及如果进程已经终止,则可以看到它退出的时间。

重要提示

内核对象种类繁多。当一个进程需要打开某个特定对象时,会为其打开一个称为句柄的引用。由于每个活动进程必须至少有一个线程(表示最小程序指令序列的对象),因此这种类型的对象总是有一个句柄。此外,句柄通常还会为文件、注册表项,甚至是其他进程等对象创建。

然而,如果进程最近已经终止,并且它的信息已经从活动进程列表中删除了,那该怎么办呢?

正在查找已结束的进程

从操作系统的角度来看,所有进程都是某种_EPROCESS结构的对象。当一个进程完成工作后,它的数据仍会在内存中保存一段时间,直到被该进程占用的空间被覆盖。Volatility 允许你通过类似_EPROCESS结构的对象搜索来查找这些进程。

要查找这些进程,可以使用psscan插件。其执行过程如下所示:

图 4.4 – Volatility psscan

图 4.4 – Volatility psscan

如你所见,显示的信息与pslist的结果非常相似,但现在我们可以获得更多关于已终止进程的信息。

现在,我们可以搜索在创建转储时由用户运行的程序或最近终止的程序。然而,如果我们需要进一步查找,并搜索那些较早终止的程序呢?

在这种情况下,Volatility 提供了一个userassist插件,它可以获取用户经常运行的程序的信息。它还包括用户最近操作过的程序。

我们可以获取这样的数据,如通过Windows 资源管理器启动的应用程序的名称、运行次数以及最后一次运行的时间:

图 4.5 – Volatility userassist

图 4.5 – Volatility userassist

首先,在执行后,你将能够看到关于信息所在具体位置的详细信息。例如,\??\C:\Users\Ben\ntuser.dat意味着显示的子键和值与用户Ben相关。

以下截图展示了与每个应用程序相关的独立条目:

图 4.6 – Userassist 条目

图 4.6 – Userassist 条目

如你所见,userassist显示了可执行文件的完整路径、运行次数、聚焦时间,以及与应用程序最后一次运行时间相关的键更新的日期和时间。在这里,你不仅可以找到内存转储创建时正在运行的程序,还可以找到之前启动的程序。

现在,假设在正在运行或最近完成的进程列表中,我们有WINWORD.exe(当你启动 MS Word 时,会创建这样的进程):

图 4.7 – 活跃的 MS Word 进程

图 4.7 – 活跃的 MS Word 进程

哪个文档在这里被打开了?我们能从内存中获取这些信息吗?

查找已打开的文档

在某些情况下,你可能想了解是否有任何微软 Office 文件或只是文本文件被相应的应用程序打开。为什么?它们可能包含密码或一些从调查角度来看有价值的数据。Volatility 有多个插件可以让你在内存中处理文件。例如,filescan插件可以让你获取内存转储中遇到的所有文件的信息,而dumpfiles插件则可以尝试提取这些文件(记住,有些文件在转储创建时可能已被卸载)。那么,我们如何找到在 MS Word 中打开的文件呢?

进程内存中的文档

如果我们注意到-p选项,只对该进程运行 Volatility 插件。如果我们想查看我们的进程使用了哪些资源,handles插件可以帮助我们。让我们使用-p选项和-t File选项,它将帮助我们仅显示与文件相关的资源。

图 4.8 – Volatility 句柄

图 4.8 – Volatility 句柄

在前面的截图中,我们可以看到我们的进程资源提到了一个名为GOT-7_HR的文件。让我们来找出这个文件在内存中的位置。为此,我们需要运行filescan插件,并将其输出重定向到一个文本文件,如下所示:

PS D:\> .\volatility_2.6_win64_standalone.exe -f '.\user activity\Windows7x64.vmem' --profile Win7SP1x64 filescan > D:\filescan.txt

当插件运行完成时,我们可以在指定路径下找到一个名为filescan.txt的文本文件,其中包含以下内容:

图 4.9 – Volatility filescan 输出

图 4.9 – Volatility filescan 输出

在这里,我们可以看到文件被找到的物理偏移量,一些相关的属性,以及文件在磁盘上的完整路径。让我们来找找我们的文件:

图 4.10 – 文件偏移

图 4.10 – 文件偏移

我们现在知道了文件的物理偏移量,并且可以使用dumpfiles插件从内存中提取它。这里,我们将使用-Q选项来指定物理偏移量,并使用-D选项来指定我们希望保存文件的路径。

图 4.11 – Volatility dumpfiles

图 4.11 – Volatility dumpfiles

如你所见,我们的文件在这个偏移位置被检测到。现在,D:\user activity 文件夹中出现了两个新文件,分别是 file.None.0xfffffa80282a6b80.vacbfile.None.0xfffffa80258625f0.dat

文件数据扩展名标识数据提取自的对象:

  • dat:DataSectionObject

  • vacb:ImageSectionObject

  • img:SharedCacheMap

这些文件是容器,其中存储着文件的内容和数据。要获取原始文件,尝试使用其扩展名重命名容器。通过这种方式,你可以使用合适的工具打开提取的文件并继续分析。

重要提示

如果你导出了一个你认为是恶意的文件,请确保不要在你的工作机器上运行它进行分析。最好在沙箱中处理此类文件,或使用专门的工具处理它们,我们将在下一章讨论这些工具。

文件已经处理完了,那么与浏览器相关的进程呢?

调查浏览器历史记录

浏览器中可能包含很多有用的数据。通过分析浏览器历史记录,我们可以了解用户访问了哪些网站、执行了哪些搜索查询以及下载了哪些文件。即使用户使用了隐私模式或特殊浏览器(例如 Tor Browser)上网,我们仍然可以在内存中找到有用的信息。

下图显示了 pslist 插件的输出,我们可以看到几个与Google ChromeMozilla FirefoxTor Browser 相关的进程:

图 4.12 – 浏览器相关进程

图 4.12 – 浏览器相关进程

那么,如何获取访问过的资源信息呢?有几种方法可以做到这一点:

我们有三个浏览器和三个选项,因此这个计划看起来不错。让我们从 Google Chrome 和正则表达式搜索开始。

使用 yarascan 分析 Chrome

Yarascan 是 Volatility 插件之一,允许你使用正则表达式或 YARA 规则搜索特定的信息。

重要提示

YARA 最初是为帮助恶意软件研究人员检测和分类恶意软件样本而开发的。然而,这个工具也适用于内存取证,因为它允许我们使用文本或二进制数据创建搜索模式。有关更多信息,请参阅 yara.readthedocs.io/en/v4.1.0/gettingstarted.html

要使用 yarascan 和 YARA 规则文件,我们需要提供 .yar 文件的路径,并使用 -Y 选项。在我们的案例中,我们将使用 -y 选项,并使用 /(https?:\/\/)?([\w\.-]+)([\/\w \.-]*)/ 正则表达式。此外,我们只扫描一个 Chrome 进程——ID 4236 的进程,如下所示:

图 4.13 – Volatility yarascan

图 4.13 – Volatility yarascan

在这里,你可以看到我们通过这个正则表达式直接找到了几个链接——这些链接存在于 ID 4236 的 Google Chrome 进程的内存中。

现在我们已经看过 Chrome,让我们继续分析 Firefox。

使用 bulk extractor 进行 Firefox 分析

Bulk extractor 是一个命令行工具,允许你在不同来源中搜索特定的信息,例如 URL、电子邮件和 PDF 文件。还有 BEViewer,这是一个用于 bulk extractor 的图形界面,但需要额外安装。

在使用此工具之前,我们需要转储 Firefox 进程的内存。memdump 插件非常适合此任务,因为我们只需添加 -p 选项,并指定所需进程的 ID,还需要添加 -D 选项,并指定保存转储的文件夹。在我们的案例中,ID 为 6380,路径为 .\user activity\firefox

当插件完成时,一个以进程 ID 为文件名并带有 .dmp 扩展名的文件将在指定的目录中出现。

现在,我们可以启动我们的 bulk extractor。

图 4.14 – Volatility memdump 和 bulk extractor

图 4.14 – Volatility memdump 和 bulk extractor

对于 bulk extractor,我们使用了几个选项:

  • -o:提供输出目录

  • -x all:禁用所有扫描器

  • -e email:启用电子邮件扫描器,搜索电子邮件和 URL

最终,我们需要提供我们要分析的文件路径。

重要说明

要查看所有可用的 bulk extractor 扫描器,只需运行 bulk_extractor.exe,而不添加任何选项。

结果,多个文件将出现在指定的目录中:

图 4.15 – Bulk extractor 的输出

图 4.15 – Bulk extractor 的输出

在这些文件中,我们可以找到有关在 Firefox 内存中出现的电子邮件和 URL 的信息。例如,我们可以查看 url_histogram.txt 文件:

图 4.16 – URL 直方图文件内容

图 4.16 – URL 直方图文件内容

或者,我们可以检查通过 Firefox 浏览器进行的搜索,查看 url_searches.txt 文件:

图 4.17 – URL 搜索

图 4.17 – URL 搜索

从中我们可以看到,用户正在搜索 Tor 浏览器。

既然我们已经看过了 Chrome 和 Firefox,现在是时候进入最有趣的部分了。让我们尝试使用Strings工具分析 Tor 进程。

使用 Strings 工具分析 Tor

Tor 是一款私人浏览器,它不仅可以访问标准资源,还能访问深网和暗网中的网站,这些网站上有一些私人或有时是非法的资源。因此,我们不能忽视这个过程。

在分析时,我们将使用 Strings 工具,它是 Sysinternals Suite 的一部分,可以用来搜索文件中的不同字符。在分析像 Tor 这样的私人浏览器时,这个工具非常有用。

在开始之前,我们需要转储 Tor 内存。我们可以使用之前的技术来进行。我们的 tor.exe 文件的 ID 是 4708,因此我们将使用 -p 选项和 memdump 插件。不要忘记添加 -D 选项,并提供存储转储文件的路径。

创建转储文件后,我们可以运行 Strings 工具。为此,我们必须将进程转储的路径作为参数传递,并将输出重定向到文本文件中,正如我们之前所做的那样。结果将得到以下输出:

图 4.18 – Volatility memdump 和 Strings 工具

图 4.18 – Volatility memdump 和 Strings 工具

这个选项需要更长的时间,最终的文件也更难以处理,但可以找到比标准 URL 更多的数据。

最终我们得到的文本文件大致如下:

图 4.19 – Tor 内存中的 URL

图 4.19 – Tor 内存中的 URL

我们也可以使用正则表达式或常规关键词搜索,快速找到感兴趣的信息。

这样,我们已经了解了浏览器的历史,甚至简要涉及了电子邮件分析的话题。现在,让我们更进一步,仔细看看电子邮件和即时通讯工具。

分析通讯应用程序

你多久使用一次通讯应用程序进行聊天、发送视频或查看你收到的可爱猫咪照片?答案可能是每天。电子邮件和即时通讯工具已经成为我们生活的必需品,因此我们无法避免它们。在分析受害者电脑的内存转储时,我们可能会发现通过电子邮件发送的恶意文档,而在嫌疑人电脑的内存转储中,可能会找到与同谋的通信记录。

我们已经讨论过电子邮件了,因此从这里开始。

电子邮件,电子邮件,电子邮件

如今,有许多不同的电子邮件客户端,一些人更喜欢使用浏览器来查看邮件。因此,我们可以将分析简化为以下几点:

  • 如果在运行的进程列表中看到与电子邮件客户端相关的进程,我们可以使用 handles 插件检查该进程所使用的资源,并寻找可能是附件的文件。

  • 此外,如果有一个活跃的电子邮件客户端进程,我们可以使用memdump插件提取其内存,并使用Strings工具处理转储文件。这将使我们不仅能搜索附件中的文件名,还能查找电子邮件内容的片段。

  • 按照前一节中的方法运行 bulk extractor,但这次用它来分析整个内存转储。在这种情况下,我们将能够收集所有电子邮件和附件的信息,无论是使用电子邮件客户端还是浏览器。不过,要小心,因为 bulk extractor 运行的时间会比之前更长。

由于这些方法已经有详细的描述,我们将只关注其中一种:使用 bulk extractor 进行分析。

由于我们现在将使用整个转储进行搜索,我们无需单独提取每个进程的内存。相应的命令如下所示:

图 4.20 – 使用 bulk extractor 的完整内存转储分析

图 4.20 – 使用 bulk extractor 的完整内存转储分析

现在,我们可以检查email_histogram.txt文件,其中包含了所有在内存中出现的电子邮件地址的信息:

图 4.21 – 电子邮件直方图

图 4.21 – 电子邮件直方图

我们还可以在url_histogram.txt文件中进行关键词搜索,以查找关于邮箱和附件的信息:

图 4.22 – URL 直方图中的电子邮件附件

图 4.22 – URL 直方图中的电子邮件附件

关于电子邮件一切似乎都很清楚,但即时通讯软件呢?我们如何查看对话并从中找到有用的内容?

即时通讯软件

说到即时通讯软件,最简单的方法是使用即时通讯内存分析工具。我们再看看进程列表:

图 4.23 – 活跃进程列表

图 4.23 – 活跃进程列表

在活跃进程列表中,我们可以看到一些知名的即时通讯软件,包括TelegramDiscord。我们可以转储这些进程的内存,并使用Strings工具进行解析,如下图所示:

图 4.24 – Telegram 内存提取与解析

图 4.24 – Telegram 内存提取与解析

在输出文件中,你可以搜索特定的用户名、消息、网址或关键词:

图 4.25 – Telegram 内存中的消息历史

图 4.25 – Telegram 内存中的消息历史

这就是我们如何获得即时通讯软件内存中的一些信息。顺便提一下,有些人可能会用即时通讯软件和自己聊天,在多个设备间共享密码,所以你也可以检查密码的出现情况。

恢复用户密码

即时消息并不是我们唯一可以搜索密码的位置。我们还可以在缓存中、文本编辑器的内存中、缓冲区、命令行中,甚至一些特定的系统进程中找到它们。Volatility 有多个插件可以收集有关凭证的信息:

  • hashdump

  • lsadump

  • cachedump

让我们一一查看它们。

Hashdump

hashdump插件可以用于转储 Windows 8 之前的 Windows 系统上本地用户密码的哈希。命令如下所示:

图 4.26 – Volatility hashdump

图 4.26 – Volatility hashdump

在输出中,你可以看到账户名,接着是相对标识符、LM 和 NT 哈希。请注意,我们在管理员和来宾用户上有相同的哈希值。这些特定的哈希值表示空密码。

另一种转储凭证的方法是使用cachedump插件。

Cachedump

这个插件可以用于转储缓存的域用户密码哈希。默认情况下,我们的系统会存储最多 10 个最新的域帐户凭证。我们可以尝试使用cachedump访问它们。其执行方式与hashdump非常相似:

图 4.27 – Volatility cachedump

图 4.27 – Volatility cachedump

在这里,你可以看到域用户名,接着是密码哈希和域名本身。

另一件我们可以做的事情是搜索本地安全权限LSA)信息。

Lsadump

LSA 子系统服务负责用户身份验证,因此其分析可以帮助我们获取一些有用的信息。请看以下示例:

图 4.28 – Volatility lsadump

图 4.28 – Volatility lsadump

在这里,我们可以看到来自不同资源的信息,并且在其中一些资源中,我们能够识别出明文密码。明文密码的其他位置可以在文本编辑器进程的内存中,或一些特定工具的命令行中找到,例如PsExec

明文密码

由于我们已经学习了如何提取和分析进程内存,现在让我们集中精力分析命令行。Volatility 有多个插件可以让我们检索命令行参数。其中一个插件是cmdline,它不需要任何额外的参数:

图 4.29 – Volatility cmdline

图 4.29 – Volatility cmdline

从一开始,我们就可以看到关于系统进程启动的信息以及为此目的使用的命令行。在需要传输明文密码的程序运行情况下,我们将能够找到类似于以下内容的信息:

图 4.30 – PsExec 命令行中的明文密码

图 4.30 – PsExec 命令行中的明文密码

在这种情况下,我们可以看到 PsExec 已被用来远程连接到win7主机,并且最大用户密码已以明文传输。

现在,您有几种方法可以获取用户的密码信息。但是,那些使用加密和加密容器的用户怎么办呢?

检测加密容器

Windows 上有几种流行的加密工具:

  • Bitlocker

  • TrueCrypt

  • VeraCrypt

虽然这些工具的实现有所不同,但它们的目的是相同的——加密用户数据。对于某些人来说,这可能是保持数据私密的机会,而对其他人来说,这可能是隐藏非法活动的机会。对于我们这些调查人员来说,重要的是要理解,如果加密磁盘在转储时正在使用,我们可能会找到缓存的卷密码、主加密密钥、一些未加密文件的部分内容或它们在内存中的确切位置。

我们调查的第一步是确定是否存在任何加密工具以及哪些数据被加密。有时,我们可以轻松从正在运行的进程列表中识别该工具,正如以下截图所示:

图 4.31 – VeraCrypt 进程

图 4.31 – VeraCrypt 进程

不幸的是,Volatility 提供的功能不足以与不同的加密解决方案配合使用,但它为 TrueCrypt 提供了一套很好的插件:

  • truecryptmaster 搜索加密主密钥。

  • truecryptpassphrase 搜索所使用的密码短语。

  • truecryptsummary 收集与 TrueCrypt 相关的信息。

最后一个插件允许我们收集关于 TrueCrypt 进程、服务、驱动程序、相关符号链接和文件对象的信息。

图 4.32 – Volatility TrueCrypt 总结

图 4.32 – Volatility TrueCrypt 总结

在这里,我们可以看到其中一个驱动器被TrueCrypt加密了,因此我们可以尝试从内存中提取主密钥:

图 4.33 – Volatility TrueCrypt 主密钥

图 4.33 – Volatility TrueCrypt 主密钥

默认情况下,TrueCrypt 和一些其他工具使用 AES 进行加密。这就是为什么获取加密主密钥的另一种方式是使用任何具有 AES 检测功能的工具。我们已经讨论过这样一个工具:可以使用其中一个批量提取器扫描器来实现这一目的。让我们运行 AES 扫描器:

图 4.34 – 批量提取器 AES 扫描器

图 4.34 – 批量提取器 AES 扫描器

作为结果,我们将得到一个名为 aes_keys.txt 的文本文件。该文件的内容如下所示:

图 4.35 – 提取的 AES 密钥

图 4.35 – 提取的 AES 密钥

在这里,我们发现了几对 AES256 密钥。通过将这些 256 位密钥对结合起来,我们可以获得 512 位的主密钥。

这个过程并不容易,这也是一些取证软件开发人员在他们的解决方案中包含密钥提取功能的原因。

Passware 是最流行的工具之一,用于搜索加密文件、解密加密驱动器以及恢复 Windows 密码和存储在密码管理器中的密码。此工具支持大多数全盘加密解决方案,包括BitLockerTrueCryptPGP

图 4.36 – Passware

图 4.36 – Passware

如果你想尝试这个工具,可以从他们的官方网站申请一个演示版:www.passware.com/kit-forensic/

我们已经讨论了如何查找已启动的程序和打开的文档,如何恢复密码以及如何检测加密驱动器。然而,还有一件重要的事情被忽视了——Windows 注册表。

调查 Windows 注册表

关于用户常用的程序、最近打开的文档、外发的 RDP 连接等信息都被写入计算机的注册表中,我们总是能在内存中找到它们的最新版本。为了避免混淆,我们需要理解注册表在 Windows 中的工作原理。

虚拟注册表

为了正常工作,你的计算机需要存储关于硬件和软件配置的信息、所有系统用户的数据、每个用户的设置,以及更多信息。当我们的系统启动时,它会从硬件和存储在非易失性内存中的注册表文件中收集这些信息,并在内存中创建一个虚拟注册表。这个虚拟注册表是当前配置存储的地方,也是所有将被写入磁盘的更改的初始存储位置。与注册表的交互过程是持续进行的,因此我们总是能够在内存转储中找到虚拟注册表的蜂巢和相关文件。

大多数时候,我们需要处理多个文件:

  • SAM包含关于组和用户的信息,包括他们的权限、密码和最后登录日期。

  • SYSTEM包含操作系统相关的信息,例如计算机的名称、服务、连接的 USB 设备、时区信息和网络适配器配置。

  • SOFTWARE包含已安装软件、计划任务、自动启动和应用程序的向后兼容性信息。

  • NTUSER.DAT包含与特定用户相关的信息:最后查看的文档、常用的程序、资源管理器历史记录以及外发的 RDP 连接。

还记得userassist插件吗?它从注册表中提取信息——更确切地说,是从NTUSER.DAT文件中提取。hashdumpcachedump也使用注册表。

让我们看看如何在内存中处理注册表文件。

重要提示

我们不会深入讲解 Windows 注册表取证的细节,因为这个主题需要深入研究。然而,我们将拆解出为实现目的所需的主要键。

Volatility 提供了几个插件用于一般的注册表工作:

  • Printkey 显示注册表键、它们的子键及其值。

  • hivelist 列出了可访问的注册表 hive。

  • dumpregistry 允许我们从内存中提取注册表文件。

  • 一些插件还提取了某些键的值:

  • userassist

  • shutdowntime

  • shellbags

所有这些插件在启动后都会显示具有相同名称的键的值。

然而,以这种方式处理注册表并不总是方便。此外,它们并不适应与更新版本的 Windows 10 一起使用。如果我们需要分析一个新的构建版本,应该怎么办呢?有一个很棒的工具,可以让你将物理内存作为虚拟文件系统中的文件查看。它叫做 MemProcFS

安装 MemProcFS

查看这个链接,了解 MemProcFS 的安装过程:github.com/ufrisk/MemProcFS/blob/master/README.md

该工具有多个依赖项。首先,你需要安装 LeechCore。为此,你需要在 PowerShell 中执行以下命令:

图 4.37 – 安装 LeechCore

图 4.37 – 安装 LeechCore

下一步是安装 Microsoft Visual Studio 2019 的 Visual C++ 可再分发组件。你可以从 go.microsoft.com/fwlink/?LinkId=746572 获取安装程序。接下来,你需要安装 DokanSetup_redist 版本。你所需要的最后一个组件是 Python 3.6 或更高版本。你可以从官方网页获取适合的 Python 版本:www.python.org/downloads/windows/

恭喜 – 你现在已经准备好下载 MemProcFS!前往 MemProcFS 的 GitHub 仓库 github.com/ufrisk/MemProcFS,并搜索最新版本。

图 4.38 – MemProcFS GitHub 仓库

图 4.38 – MemProcFS GitHub 仓库

下载 files_and_binaries ZIP 压缩包并解压到合适的位置。要运行 MemProcFS,打开 PowerShell 并进入你解压文件的文件夹。运行以下命令以从你的内存转储创建一个虚拟文件系统(使用 -device 选项提供你的内存转储位置)。

图 4.39 – MemProcFS 执行

图 4.39 – MemProcFS 执行

如你所见,我们的操作系统已被识别,转储成功地挂载在 M:\ 驱动器上。现在,我们可以通过资源管理器打开这个驱动器,并搜索一些有趣的内容。

与 Windows 注册表的工作

我们决定告诉你这个工具的原因。因为使用 MemProcFS,你可以轻松地从内存中提取所有的注册表文件。(老实说,你甚至不需要提取任何东西。)打开你的驱动器(在我们的例子中是M:\驱动器),进入registry > hive_files,如下图所示。在这里,你将找到我们在转储中所有可用的注册表文件。

图 4.40 – MemProcFS Hive 文件

图 4.40 – MemProcFS Hive 文件

所以,我们找到了注册表,但接下来该做什么呢?这里有几种选择。首先,你可以使用Eric Zimmerman 的 Registry Explorer 工具。最新版可以从官方仓库下载:ericzimmerman.github.io/#!index.md。包含工具的压缩包必须用 7-Zip 解压,否则工具将无法正常工作。Registry Explorer 允许你查看各种键值,并使用包含有用信息的预设书签。

图 4.41 – 注册表查看器

图 4.41 – 注册表查看器

另一方面,你也可以使用RegRipper来解析这些文件。这样,所有信息都会作为一个单一的文本文件提供给你。你可以从以下 GitHub 仓库下载这个工具:github.com/keydet89/RegRipper3.0

要运行图形界面工具,你需要使用rr.exe文件。在出现的窗口中,你需要指定要处理的文件路径和保存执行结果的文本文件路径。填写完所有字段后,点击ntuser文件夹中的文件,从我们的hive_files文件夹中复制它到方便的位置,然后尝试分析它。

图 4.42 – RegRipper

图 4.42 – RegRipper

结果是,你将得到两个文本文件。第一个文件,带有.log扩展名,是程序的日志。第二个文件,带有.txt扩展名,包含了解析结果。你可以在任何文本编辑器中打开它并使用关键词搜索。例如,要查找用户运行的程序,你可以搜索userassist

图 4.43 – Userassist 注册表键

图 4.43 – Userassist 注册表键

如果你想查看用户最近处理的文档,可以查找opensaverecentdocs

图 4.44 – RecentDocs 注册表键

图 4.44 – RecentDocs 注册表键

最后,如果你想查看用户在本地或远程主机上访问过的目录,可以从相应的 GitHub 仓库下载ShellbagsExplorerericzimmerman.github.io/#!index.md)…

图 4.45 – ShellBags Explorer

图 4.45 – ShellBags Explorer

请注意,这个文件是从内存转储中提取的,我们在其中发现了由 TrueCrypt 加密的 S 盘的痕迹。通过分析usrclass文件,我们能够看到加密磁盘的一部分内容。

总结

分析用户活动是内存调查中的一个非常重要的部分。在本章中,你学到了可以恢复很多痕迹。这对于刑事调查尤为重要,因为这些痕迹能帮助你重建用户活动,即使他们使用了匿名浏览器或安全通讯工具。

波动性是内存转储分析的一个重要工具,但不要因此而停滞不前。在需要时,千万不要害怕使用额外的工具或替代解决方案。

尽管进程内存中信息丰富,但不要忽视虚拟注册表,它存储了大量有用的信息,包括与用户活动相关的信息。此外,一些注册表键值能够告诉我们很多关于恶意软件活动和持久性痕迹的信息。我们将在下一章讨论这些及其他恶意活动的痕迹。

第五章:使用 Windows 内存取证进行恶意软件检测与分析

内存转储的取证分析并不仅限于分析用户的行为,尤其是在处理受害者计算机时。在这种情况下,专家通常需要进行分析,以寻找恶意活动的痕迹。这些痕迹可能是恶意进程、网络连接、代码注入,或者任何与恶意软件或攻击者工具行为相关的内容。由于现代恶意软件倾向于尽可能少地在磁盘上留下痕迹,而威胁行为者会使用 PowerShell 和批处理脚本保持隐蔽,内存分析正成为取证调查中的一个关键元素。

本章将解释如何在网络连接和活动进程中搜索恶意活动的痕迹,同时还会分析 Windows 注册表、事件日志和文件系统伪迹。

本章将涵盖以下主题:

  • 搜索恶意进程

  • 分析命令行参数

  • 检查网络连接

  • 检测进程内存中的注入

  • 寻找持久化证据

  • 创建时间线

搜索恶意进程

我们已经学会了如何分析在转储时活跃的进程,以识别用户活动。类似的技术也可以用于搜索攻击者留下的痕迹;然而,在这里,我们的重点将转向检测一些特定标志,帮助识别恶意活动。用户程序,如浏览器或 MS Office 组件,不会像云存储相关进程那样,成为关于用户及其近期活动的信息来源,而更可能成为初始访问痕迹的潜在来源。与此相关的进程,将被视为可能的数据外泄技术。我们调查的主要目标是寻找潜在恶意活动的标志和各种异常——如奇怪的进程名称或不寻常的参数、它们的非典型行为等。然而,先从最简单的开始——进程名称。

进程名称

在上一章中,我们讨论了如何获取活跃进程列表以及一个名为 pslist 的插件。所以我们不会重复这一部分;我们只会讨论你需要注意的要点。

首先,你需要了解系统进程。Windows 有许多这样的进程,负责运行个别服务和系统本身。这些进程常常成为恶意软件的目标,恶意软件会试图伪装成系统进程,或者在最坏的情况下,利用一个合法进程。但我们会在后面详细讨论这一点。让我们看看下面的示例:

图 5.1 – Volatility pslist 插件

图 5.1 – Volatility pslist 插件

图 5.1显示了通过pslist插件收集的进程列表。我们故意添加了一个正则表达式,用于选择那些包含host的进程名称。请注意svchost进程。这些是从动态库加载的服务的标准进程。现在,看看ID 1664的进程名称。你能看到不同之处吗?这个转储来自一个被IcedID感染的主机,IcedID是一种非常常见的恶意软件,通过钓鱼邮件传播,并与恶名昭著的勒索病毒运营者如 REvil、Conti 和 Egregor 有关联。在执行过程中,这种恶意软件会将一个名为svhost.exe的可执行文件丢入临时目录并将其作为子进程运行。

为了快速找到这种伪装的进程,不仅需要了解关键系统进程的名称及其特点,还需要考虑上下文,因为不同版本的 Windows 系统中的进程可能有所不同。这些差异通常是微不足道的,但了解这些差异将帮助你更有效地浏览进程列表并进行分析。

虽然一些恶意程序隐藏在合法进程的伪装后面,但另一些则非常公开地运行。这就是双重用途工具和一些攻击者使用的程序的情况。让我们看一下进程列表,如图 5.2所示:

图 5.2 – 正在运行的进程列表

](tos-cn-i-73owjymdk6/c663e287c53046c39595db5ade7cd599)

图 5.2 – 正在运行的进程列表

在这里,我们可以看到大量看似合法的进程:whoami.exeipconfig.exenetstat.exe等。这些工具可以被系统管理员或高级用户用来检查设置和配置网络。然而,这些相同的工具也可以被攻击者用来收集关于系统的信息,正如我们在场景中所做的那样。

cmd.exepowershell.exewscript.execscript.exerundll32.exe这样的进程需要特别注意,因为它们经常被攻击者和现代恶意软件用作执行、持久化、防御规避、发现、收集等战术的一部分。在进程列表中出现这些进程不仅仅是重要的,相关的父进程同样也至关重要。父子进程的不典型组合是潜在恶意行为的标志之一。

检测异常行为

异常行为可能表现为许多不同的形式。对于某些进程,建立网络连接是非常不典型的,而对于其他进程,生成新进程或访问某些文件系统对象则是不典型的。

让我们考虑以下示例:

图 5.3 – 进程树

](tos-cn-i-73owjymdk6/1be58236f5924d42b04756398fa64b80)

图 5.3 – 进程树

这里,WINWORD.EXE 进程生成了一个子进程 rundll32.exe,这在正常情况下是非常不典型的行为。这种行为可能是由嵌入在用户打开的文档中的宏所引起的。通常,MS Office 文档会成为网络钓鱼电子邮件的附件,长期以来,这一直是用于初始访问的最常用技术之一。Trickbot、Qakbot、Dridex 和 IcedID 都是通过这种方式传播的。例如,在 Trickbot、IcedID 和 Qakbot 的网络钓鱼活动中,用户会收到一封网络钓鱼邮件,其中附带了一个包含以下内容的文档:

图 5.4 – 欺骗性文档

图 5.4 – 欺骗性文档

你可能会问:为什么不同的威胁行为者使用相同的诱饵? 其实,他们利用了另一个威胁行为者 Shathak(也称为 TA551)的服务,后者专注于恶意软件分发。

在我们的案例中,要验证恶意文档的假设,我们需要找出哪个文件在 MS Word 中被打开,并尝试将其导出以供进一步分析。为此,我们可以使用 handlesfilescandumpfiles 插件。我们回顾一下操作的顺序,如下所示:

  1. 使用 handles 插件并结合 -t file--silent 选项来获取有关我们进程使用的文件的信息,并查找由用户打开的文档。

  2. 使用 filescan 插件来搜索有关包含所需文档的物理偏移量的信息。

  3. 使用 dumpfiles 插件,并结合 -Q 选项以及先前步骤中获得的物理偏移量,再加上 -D 选项和我们想要保存文件的路径。

在上一章中,我们已经从 WINWORD.EXE 的内存中转储了 GOT-7_HR (00000007).docm 文件。现在让我们探索如何分析这个文档是否含有恶意内容。为此,你可以使用 https://github.com/decalage2/oletools)。Oletools 是一个 Python 工具包,用于分析 Microsoft OLE2 文件,如 MS Office 文档或 Outlook 消息。你只需安装 Python 3,并在 PowerShell 中运行以下命令,就可以安装这些工具:

pip3.exe install -U oletools

必要的依赖项将自动安装。因此,你将能够通过 PowerShell 使用 oletools 包中的任何工具来分析可疑文档。让我们检查导出的文档:

图 5.5 – olevba 输出

图 5.5 – olevba 输出

在该工具的输出中,你还可以找到有关宏、参数、导入的库等更详细的信息:

图 5.6 – 详细的宏描述

图 5.6 – 详细的宏描述

如你在前面的屏幕截图中看到的,我们的文档包含了内嵌的宏,具有混淆字符串和向进程注入代码所需的功能。

那么,我们在这里得到了什么?好吧,用户在 MS Word 的未保护模式下打开了文档,然后嵌入的脚本被执行,创建了rundll32.exe进程,该进程产生了多个相同名称的子进程。

让我们来看另一个例子,如图 5.7所示:

图 5.7 – 进程树

图 5.7 – 进程树

你是否记得svhost.exe进程伪装成合法的svchost.exe?让我们考虑它的父进程——nwe.exe,其PID 1744。即使我们在最初的分析中没有注意到 svhost 名称中缺少 c,父进程仍然会揭示它的秘密。因为svchost进程是系统进程,它们有一个预定义的父进程——services.exe

注意

除了某些父进程外,所有系统进程都有固定的实例数量、预定义的用户、启动时间和磁盘上可执行文件的位置。任何偏离定义参数的情况都会引起怀疑,并需要额外检查。

回到我们的nwe.exe进程,注意到除了恶意的svhost.exe,它还创建了几个cmd.exe进程。像cmd.exepowershell.exe等嵌入式工具常被攻击者用来进行无文件攻击。通过这种方式,攻击者利用经过批准的应用程序执行恶意命令和脚本。与传统方法不同,这种方式不需要在目标系统上安装任何代码,从而使检测变得更加困难。

让我们考虑无文件勒索软件的例子。在第一阶段,向用户发送一封钓鱼邮件,其中包含一个恶意宏,如前面所讨论的那样。运行宏会启动一个命令行,执行 PowerShell 脚本。该脚本下载加密密钥和额外模块——其执行结果是数据加密和赎金通知展示。

这样的攻击场景已经变得越来越经典。这就是为什么我们需要找出启动这些进程时使用了哪些参数,以及执行了什么。

分析命令行参数

分析命令行参数非常重要,因为它允许你检查可执行文件运行的位置以及传递给它的参数。这些参数可能包括其他受感染主机的 IP 地址或主机名、被盗的凭证、恶意文件名和整个脚本,如下图所示:

图 5.8 – Emotet 操作员使用的命令行参数

图 5.8 – Emotet 操作员使用的命令行参数

让我们探索几种获取感兴趣数据的方法。

进程的命令行参数

首先,我们可以使用我们已经熟悉的pstree插件并添加-v选项。这将允许我们输出进程树,同时显示启动特定程序时使用的命令行详细信息。这就是添加-v选项后,输出如图 5.7所示的变化:

图 5.9 – 详细的 pstree 输出

图 5.9 – 详细的 pstree 输出

如你所见,我们有了新的行:auditcmdpath。在这里,我们可以找到关于可执行文件的位置以及启动它时使用的参数的信息。你也可以使用一个独立的插件——cmdline,它的输出将如下所示:

图 5.10 – cmdline 输出

图 5.10 – cmdline 输出

为了清晰起见,cmdline是使用-p选项和进程 ID 运行的,如前面的示例所示。从两个命令的输出中,我们可以看到我们的svhost.exe文件是从C:\Users\lesly\AppData\Local\Temp目录可执行的,这对于合法的svchost进程来说也不标准。这是另一个标志,表明该进程是恶意的。

让我们来看另一个例子,展示参数的作用:

图 5.11 – 通过正则表达式选择的进程的 cmdline 输出

图 5.11 – 通过正则表达式选择的进程的 cmdline 输出

在这种情况下,我们可以观察到运行 PsExec 时使用的参数,PsExec 是一种在攻击中经常用来远程执行命令和在主机上运行脚本的工具。那么,这告诉调查员什么呢?首先,它告诉我们攻击者正在使用PsExec进行执行和横向移动。其次,它揭示了他们正在交互的主机的名称。第三,它识别了已被攻破的用户凭据。

除了关于启动程序时使用的参数的信息之外,了解攻击者通过命令行执行的命令也会很有用。我们接下来讨论这个问题。

命令历史记录

自然,通过命令行执行的命令信息也会存储在内存中。为了获取这些数据,你可以使用 Volatility cmdscan 插件,它可以帮助你在内存中查找命令历史记录对象。该插件的输出如图 5.12所示:

图 5.12 – cmdscan 输出

图 5.12 – cmdscan 输出

请注意,这个插件的功能是有限的。例如,它只搜索默认历史记录大小的实例。如果你愿意,可以使用-M选项并设置其他任何值;然而,如果历史记录大小已被更改,找到该值会存在问题。

这个插件的替代方案是使用yarascan,我们在cmd命令中已经讨论过它,你可以编写规则来查找 PowerShell 和其他感兴趣的工具:

图 5.13 – 使用 YARA 规则检测恶意 PowerShell

图 5.13 – 使用 YARA 规则检测恶意 PowerShell

图 5.13展示了一个简单的YARA 规则示例,用于搜索带有典型-nop-w hidden-enc选项的恶意 PowerShell 脚本。使用带有此规则的yarascan插件,你不仅可以找到恶意脚本本身,还可以获得在其中找到它们的进程的相关信息。

能够理解命令行上执行了什么是好的,而知道执行结果更好。consoles插件允许你获取不同命令行解释器执行的命令的数据:cmdPowerShell、Python shell 和 Perl shell。consoles的主要优势是,它还允许你输出来自输入和输出缓冲区的信息,这样你就可以查看命令执行的结果。运行consoles与运行cmdline类似。让我们来看一个使用此插件获取的输出示例:

图 5.14 – Volatility 的 consoles 插件

图 5.14 – Volatility 的 consoles 插件

图 5.14中,首先,我们查看关于conhost.exe进程及其附加进程的信息,并伴随着当前使用的设置详情。最有趣的部分是dump。在这里,我们可以观察到实际执行的内容。请注意,在顶部,我们可以看到关于cmd.exe进程和updater.bat文件的信息,而在dump中,我们看到的是 PowerShell。那么,发生了什么呢?让我们稍微明确一点,并将30083672进程的cmdline插件输出添加到这里:

图 5.15 – 所选进程的 cmdline 输出

图 5.15 – 所选进程的 cmdline 输出

图 5.15中,我们可以观察到,ID 为3008的进程是通过cmd.exe /c启动的。在我们的案例中,这意味着Updater.bat文件(其路径在/c选项后面指定)必须通过cmd来运行。在consoles插件的 dump 中,我们看到 PowerShell 正在运行,因此我们可以得出结论,PowerShell 及其所有选项是在同一个Updater.bat文件的内容中,这个文件是通过cmd执行的。

请注意 PowerShell 运行时的-enc选项。这个选项告诉我们,后面跟着的是 Base64 编码的命令。在法医调查中,这并不罕见。你可以使用在线的 CyberChef 工具(https://gchq.github.io/CyberChef/)解码这样的代码。你只需将 PowerShell 中的编码部分复制并粘贴到输入窗口中。接下来,选择需要应用的配方,搞定,一切准备好:

图 5.16 – 使用 CyberChef 解码的 Base64 代码

图 5.16 – 使用 CyberChef 解码的 Base64 代码

请注意,这个脚本的一个功能是创建一个WebClient对象。这类对象通常用于执行网络通信。

网络可以被恶意软件用来与命令与控制C2)服务器进行通信并下载恶意负载。除此之外,如果攻击者以交互方式连接到远程主机,也会建立网络连接。因此,分析网络连接并寻找其中的异常是搜索恶意活动痕迹的另一个关键部分。

检查网络连接

Volatility 的netscan插件用于分析网络连接。它可以帮助你收集有关所有活动和最近连接的信息,以及打开的套接字。让我们看一个例子:

图 5.17 – Volatility netscan 输出

图 5.17 – Volatility netscan 输出

图 5.17中,我们可以查看标准的netscan输出。这为我们提供了有关 OSI 传输层协议及其版本、涉及的 IP 地址和端口、PID,以及启动网络活动的进程名称和创建时间等信息。对于 TCP 协议,它与 UDP 不同,建立连接来传输数据,还会指定连接状态。例如,如果一个进程在某个端口上监听并等待传入连接,状态将是LISTENING。此外,如果连接到远程主机已建立,状态将是ESTABLISHED,而如果连接已终止,状态则是CLOSED。那么,我们如何处理这些信息?我们该寻找什么呢?

进程 – 启动者

让我们从一个简单的开始。就像在分析进程时,我们通过分析父子关系来寻找不典型的组合一样,我们也可以从启动连接的进程数据开始。显然,对于一些进程来说,创建网络连接是正常的。我们可以将这些进程称为浏览器、邮件代理或即时通讯工具。此外,一些程序可能会建立网络连接以检查更新和下载,这也是正常行为。现在,假设一个由资源管理器进程建立的网络连接。该进程需要通过图形用户界面向用户提供文件和目录的访问,或显示开始菜单。它创建网络连接并不 100%典型。当然,explorer.exe确实有可能会创建网络连接;例如,在传输 Windows 遥测数据时,特别是在开始菜单设置发生变化时。然而,请记住,这些连接将使用特定的 IP 地址建立,因此外部地址将是恶意活动的标志。不过,我们稍后会更详细地讨论这一点。

除了非典型的发起者外,还有一些进程我们需要特别注意。包括 cmd.exepowershell.exe。如果你检测到这些进程建立的连接,一定要检查 Foreign Address 字段中指定的 IP 地址:

图 5.18 – cmd.exe 进程连接到远程 IP 地址

](tos-cn-i-73owjymdk6/f313a35e63b04d25b3bd1412ec54f473)

图 5.18 – cmd.exe 进程连接到远程 IP 地址

看一下前面的示例。在这里,cmd.exe 进程(PID 2860)与 IP 地址 216.58.207.206 建立了网络连接。我们来检查一下这个地址。为此,你可以使用各种在线资源,例如 VirusTotal(www.virustotal.com/gui/home/search)。这个资源允许你搜索 IP 地址、URL、文件哈希值或文件本身的信息:

图 5.19 – VirusTotal 中的可疑 IP 地址

](tos-cn-i-73owjymdk6/5d0a3f4d161145bebc98075fd83693c0)

图 5.19 – VirusTotal 中的可疑 IP 地址

图 5.19中,你可以查看我们 IP 地址的搜索结果。乍一看,一切似乎都很好——没有检测到任何威胁。然而,请注意 10+ 个检测到的文件与此 IP 地址通信 的消息。为了查看更多关于与这个 IP 地址通信的文件的信息,你可以切换到RELATIONS标签,找到Communicating Files字段,如下截图所示。如果你在 VirusTotal 上有账户,你还可以点击右侧的图标查看所有的通信,以图形化方式展示:

图 5.20 – VirusTotal 通信文件

](github.com/OpenDocCN/f…)

图 5.20 – VirusTotal 通信文件

图 5.20中,我们可以看到,尽管这个 IP 地址没有被识别为恶意的,但它与很多恶意文件相关联,这意味着它并不安全。

如你所见,IP 地址在取证调查中起着重要作用。

IP 地址和端口

不仅仅是 IP 地址和端口的使用情况能告诉你某个网络连接是否恶意,有时候,它们还可以告诉你攻击者使用了哪些工具。我们来看看接下来的截图:

图 5.21 – Volatility netscan

](tos-cn-i-73owjymdk6/c8f6d01c5f5c45e895165d5758a27be7)

图 5.21 – Volatility netscan

显示的信息不多;然而,即使在这里,你也可以看到可以通过 RDP 连接到此主机。那么,接下来的连接呢?你看到什么可疑的地方吗?来看看:

图 5.22 – 另一个可疑的连接

](github.com/OpenDocCN/f…)

图 5.22 – 另一个可疑的连接

成功了!你可以看到 UWkpjFjDzM.exe 进程,而这个奇怪的名字背后是一个 meterpreter

重要提示

Meterpreter 是 Metasploit 负载之一,提供交互式 shell,攻击者可以用它在目标机器上执行各种操作。

那么,我们是如何仅通过一行网络连接信息就知道这些的呢?事实上,端口在这里发挥了重要作用。我们已经提到过用于建立连接的传输层协议。当两个主机使用这些协议建立连接时,它们会根据端口号进行识别。通常,特定用途的端口是由互联网号码分配局IANA)分配和注册的,尽管在实际操作中,经常会出现非官方使用的情况。然而,确实有一份用于特定用途的默认标准端口列表。有时,使用这些默认端口可以泄露攻击者使用的某些服务或工具。以下是最常用的 TCP 端口及其用途:

图 5.23 – 常用端口及其用途

图 5.23 – 常用端口及其用途

如你所见,前表中列出的部分端口可以被攻击者利用。例如,804434453389

除了标准服务常用的端口外,还有一些工具使用的默认协议,例如端口扫描器或后期利用框架。下表列出了这些工具及其默认端口:

图 5.24 – 特定工具使用的默认端口

图 5.24 – 特定工具使用的默认端口

这样,就解决了 Meterpreter 载荷的其中一个谜团。但这可真是个棘手的问题,不是吗?通常,Meterpreter 是通过注入进程的内存来部署的。它完全存在于内存中,因此不会写入磁盘。此外,也不会创建新的进程。这是因为 Meterpreter 被注入到一个受感染的进程中,然后它可以迁移到其他正在运行的进程。因此,攻击的取证痕迹非常有限。你明白这意味着什么吧?是时候谈谈注入和如何检测它们了。

检测进程内存中的注入

进程内存中有不同类型的注入。有些相似,而有些则差异很大。根据使用的技术,检测注入的方法可能会有所不同。我们将尝试讨论最相关的几种注入类型及其检测方法。

动态链接库注入

攻击者可以利用此技术进行防御规避或特权提升战术。通常,动态链接库DLLs)注入是用于在合法进程的地址空间中执行任意代码的方法之一。DLL 注入有两种主要类型:远程注入和反射注入。

远程 DLL 注入

恶意进程获取 SeDebugPrivilege 权限,这使它能够作为调试器操作,并获得对其他进程地址空间的读写权限。利用这些权限,恶意进程打开目标进程的句柄,访问其地址空间,并将恶意库的完整路径写入其中。该库应该已经存在于磁盘上。然后,恶意进程使用 Windows API 函数在目标进程的上下文中创建一个新线程。这个新线程是用来将恶意库加载到目标进程地址空间中的。当这一过程发生时,恶意进程会清除写入磁盘的库路径所在的内存位置,并关闭目标进程的描述符。如果我们将这一过程整合成一个算法,它会是以下内容:

  1. 获取权限并打开目标进程的句柄。

  2. 将恶意 DLL 的完整路径写入目标进程的地址空间。

  3. 创建一个新线程,使用 Windows API 函数从磁盘加载 DLL。

  4. 从目标进程的内存中删除恶意 DLL 的路径。

  5. 关闭目标进程的句柄。

由于远程 DLL 注入会将库写入磁盘,我们可以使用像 dlllistldrmodules 这样的 Volatility 插件来检测这一点。

有趣的是,dlllist 是一个插件,允许你获取已加载到进程中的库列表:

图 5.25 – Volatility dlllist 插件

图 5.25 – Volatility dlllist 插件

请注意,关于进程使用的库的信息存储在三个不同的列表中:

  • LoadOrderList组织了模块加载到进程中的顺序。

  • MemoryOrderList组织了模块在进程虚拟内存中出现的顺序。

  • InitOrderList组织了 DllMain 函数执行的顺序。

dlllist 插件只与 LoadOrderList 一起工作。问题在于,有时候恶意库可能会从此列表中取消链接以隐藏它们的存在。这也会影响 dlllist 插件的输出,因为有关取消链接库的信息将不会显示。在这种情况下,ldrmodules 插件将提供帮助,因为它不仅输出三个列表中的所有信息,还提供关于该库是否存在于每个列表中的数据:

图 5.26 – Volatility ldrmodules 插件

图 5.26 – Volatility ldrmodules 插件

通过这种方式,你可以检测已被取消链接的库。这些库在 InLoad 列中会显示为 False,而在其他列中则显示为 True

重要提示

可执行文件本身也出现在这两个插件的输出中。在 ldrmodules 的输出中,InInit 列始终显示为 False。这是因为它的初始化方式不同,不像其他模块那样。

那么,如何判断这些插件提取的库中是否包含恶意库呢?你可以通过分析库的名称和位置来开始。注意一些不寻常的名称和库所在的磁盘目录。特别关注用户目录和临时目录。如果你在视觉上很难识别异常,可以随时使用dlldumpdumpfiles插件,并尝试将 DLL 提取到磁盘上进行额外检查。运行dlldump插件类似于dumpfiles插件。你只需要使用-p选项指定你感兴趣的进程 ID,使用-D选项指定你希望保存结果的目录路径。带有标准.dll扩展名的文件将出现在你指定的目录中。此时,你可以统计库的哈希值,并在VirusTotal上检查它们。

假设我们已为进程 ID 为1072的进程运行了以下命令,我们认为它可能是可疑的:

PS D:\> .\volatility_2.6_win64_standalone.exe -f .\dll.bin 
--profile=Win7SP1x64 dlldump -p 1072 -D .\output\

结果,我们的库已保存在输出目录中。为了快速计算 DLL 的哈希值,你可以使用以下 PowerShell 命令:

图 5.27 – 使用 PowerShell 计算 DLL 的哈希值

图 5.27 – 使用 PowerShell 计算 DLL 的哈希值

这个命令对目录中的每个文件调用Get-FileHash函数。

让我们用 VirusTotal 检查我们的哈希值:

图 5.28 – 使用 VirusTotal 检测到的恶意 DLL

图 5.28 – 使用 VirusTotal 检测到的恶意 DLL

这是我们的恶意 DLL。现在,我们可以分析它是如何进入系统的,并更详细地探讨它的功能。

另一个需要记住的重要点是,恶意 DLL 可能会使用打包工具进行打包。如果在解包阶段 DLL 代码被写入新的内存区域,我们可以使用malfind插件来检测它,稍后会讨论该插件。

反射式 DLL 注入

另一种注入库的方法是通过反射式 DLL 注入。这种方法更受欢迎,因为它不需要库存在磁盘上,因此留下的痕迹更少。这样的库可以通过网络下载,并立即注入到进程内存中。此方法的另一个特点是使用反射加载器,它嵌入在库本身中,而不是标准的 Windows 加载器。这个加载器会处理执行环境,并运行DllMain函数。

反射式 DLL 注入的逐步算法如下:

  1. 获取权限并打开目标进程的句柄。

  2. 在目标进程中分配内存并将恶意 DLL 写入其中。

  3. 创建一个新线程以调用反射加载器。

  4. 关闭目标进程的句柄。

这种技术被商业恶意软件广泛使用。例如,SDBbot 从 C2 下载恶意库并将其注入到新创建的 rundll32.exe 进程中。Netwalker 勒索病毒也使用相同的方式,将库反射性地注入到 explorer.exe 进程中。除此之外,许多后渗透框架也具备反射注入 DLL、shellcode 或可执行文件到进程的功能。我们熟知的 Metasploit、CobaltStrike 和 PowerShell Empire 都具有此功能。

你可以使用 malfind 插件来检测反射 DLL 注入。关键是,当使用这种技术时(就像使用压缩工具一样),会在目标进程内存中创建一个带有 EXECUTE_READWRITE 保护的页面。这是为了能够在该页写入恶意代码并执行它。malfind 插件可以帮助你找到这样的页面,并检查它们是否包含可执行文件头或者正确的 CPU 指令。

重要提示

一些程序可能会作为其合法活动的一部分注入库或代码。例如,反病毒解决方案就具有这样的功能。

malfind 插件有几个有用的选项,你可以根据需要单独或组合使用它们:

  • -p <PID> 允许你在具有特定 ID 的进程中搜索注入内容。

  • -n <正则表达式> 允许你搜索所有进程中与正则表达式匹配的注入内容。

  • -D 允许你转储注入的代码段。

让我们来看一下以下示例:

图 5.29 – Volatility malfind 插件

图 5.29 – Volatility malfind 插件

在这里,我们用 rundll32.exe 的进程 ID 运行了 malfind,并使用 -D 选项将注入的代码转储保存到输出目录。正如你所看到的,在这种情况下,我们的插件发现了具有有效 CPU 指令的 PAGE_EXECUTE_READWRITE 页面。

继续检查插件的输出,你还可以观察到带有可执行文件魔术数字的页面,如下图所示:

图 5.30 – 带有 MZ 魔术数字的 malfind 输出

图 5.30 – 带有 MZ 魔术数字的 malfind 输出

你并不总是能够找到这些魔术数字。这是因为攻击者通常会使用各种掩蔽技术,包括移除头部信息。因此,你不应该只关注这些魔术数字的存在;更好的做法是检查所有看起来可疑的内容。

由于我们已经将 malfind 的输出提取到磁盘上,我们可以检查它们是什么内容。为此,你可以使用专门的工具,如 CFF Explorer(https://ntcore.com/?page_id=388)。另外,你还可以回到我们熟悉的 VirusTotal,它不仅可以给出提取代码的恶意性,还能帮助分析其性质。

在我们的案例中,以下是一个有趣的结果:

图 5.31 – malfind 检测到的恶意 DLL

图 5.31 – 被 malfind 检测到的恶意 DLL

在这里,我们转储的一个注入被识别为恶意的。在右侧,注意到转储的内容是一个 DLL 文件。

如前所述,可执行文件也可以以类似的方式注入到进程中。接下来我们来看一个例子。

可移植执行文件注入

这种注入方式背后的思想非常简单。如前所述,它首先通过获得调试器权限并为目标进程打开句柄开始。接下来,在目标进程的地址空间中分配一块内存区域,然后用来写入恶意代码。当代码写入完成后,会创建一个新线程,目的是执行注入的恶意代码。通过这种方式,我们能够使恶意代码在合法进程的上下文中运行。

在这种情况下,逐步算法如下:

  1. 获取权限并打开目标进程的句柄。

  2. 在目标进程中分配内存并在其中写入恶意代码。

  3. 创建一个新线程来运行注入的代码。

  4. 关闭目标进程的句柄。

正如你所看到的,一切尽可能简单,最重要的是,磁盘上没有留下任何痕迹。第二步中分配的页面通常具有 EXECUTE_READWRITE PROTECTION 权限。这意味着 Volatility 的 malfind 插件也能帮助我们检测这种类型的注入。然而,请注意,malfind 只分析具有读、写和执行权限的私有内存区域。这意味着该插件的可检测性是可以被绕过的。想象一下,攻击者最初分配一个具有读写权限的页面;然后,在写入恶意代码后,他们将其更改为读和执行权限。从恶意活动的角度来看,一切照常工作,但 malfind 无法检测到。此时,我们可以使用手动分析。

进行这种分析的一个方便工具是 Fireeye 的 Redline,它可以通过填写一个简短的表单从官网 (www.fireeye.com/services/freeware/redline.html) 下载。这个工具有图形界面,可以让你查看内存区域及其内容和保护标志:

图 5.32 – 使用 Redline 进行内存分析

图 5.32 – 使用 Redline 进行内存分析

正如你在前面的截图中看到的,我们可以在表格视图中检查感兴趣的信息。如果我们需要了解某个特定区域的更多细节,可以双击该区域进行查看:

图 5.33 – Redline 完整详细信息

图 5.33 – Redline 完整详细信息

除了malfind,还有其他插件可以用于查找特定的注入。例如,cobaltstrikescan是由日本 CERT 专家开发的。它专门用于通过YARA 规则查找注入到进程中的 Cobalt Strike 信标。

重要提示

除了内置的 Volatility 插件外,您还可以使用社区开发的插件。为此,您需要在与 Volatility 版本相同的目录中创建一个plugins文件夹,并将您要使用的插件代码放入其中。要启动一个新的插件,只需在 Volatility 命令行中添加--plugins=<插件文件夹路径>,并且不要忘记指定插件名称。

要使用此插件,我们在与 Volatility 本身相同的目录中创建一个plugins文件夹,并在其中保存从 GitHub 仓库下载的.py扩展名的文件(github.com/JPCERTCC/aa-tools/blob/master/cobaltstrikescan.py)。启动 Volatility 时,我们指定--plugins=./plugins。为了检查插件是否已成功加载,我们可以使用-- info命令,此时插件列表中应显示一个新名称:

图 5.34 – 检查已添加的社区插件

图 5.34 - 检查已添加的社区插件

现在我们可以进行测试了。让我们来看看cobaltstrikescan如何处理注入信标的搜索:

图 5.35 – cobaltstrikescan 的结果

图 5.35 – cobaltstrikescan 的结果

如上图所示,Cobalt Strike 信标在Outlook.exerundll32.exe进程中被检测到。这意味着在这些进程的内存中,您可以找到其配置文件,其中包含诸如 C2 IP 地址等有用参数。

像 DLL 注入和代码/可执行文件注入这样的技术已经存在相当长的时间,因此已经有了或多或少可靠的检测方法。当检测到较新的技术时,事情变得更加复杂,但这些技术被攻击者频繁使用。当前最流行的技术之一是进程空壳化。

进程空壳化

空壳进程注入的基本思路是创建一个合法进程的新实例,并将其设置为SUSPEND状态,然后用恶意代码覆盖其可执行代码所占据的地址空间。因此,与以前的技术不同,经过进程空壳化后,合法进程的可执行代码将不再存在。与此同时,进程环境块PEB)中的进程数据保持不变。因此,我们最终得到一个容器,包含合法进程的数据(DLL、堆、堆栈和句柄),其中执行恶意代码。

重要提示

PEB 是一个存储有关 DLLs、堆、环境变量以及进程命令行参数、当前工作目录和标准句柄信息的结构。

为了便于理解,我们再来看看操作的算法:

  1. 启动一个合法进程的新实例,并使其第一个线程挂起。

  2. 释放或取消映射包含合法进程代码的内存区域。

  3. 分配一个新的内存段,具有读、写和执行权限。

  4. 将从磁盘或网络上获得的恶意代码复制到新分配的内存段中。

  5. 将挂起线程的起始地址设置为恶意代码的入口点。

  6. 恢复线程。

由于这些操作,恶意代码会在由合法进程创建的容器中执行。进程空洞化的使用并不罕见。例如,Trickbot 就使用这种技术将其有效载荷注入到 wermgr.exe 进程中。

可以使用两种方法来检测进程空洞化。第一种方法涉及比较 PEB 和 虚拟地址描述符 (VAD) 结构,寻找不一致之处。

重要提示

VAD 是另一个重要的结构,用于跟踪已保留或已提交的、虚拟上连续的页面集合。这些描述符包含内存映射文件的名称、初始保护设置及一些与页面及其内容相关的其他标志。

这可以通过由 Monnappa K. A. 编写的 psinfo 插件来完成。该插件从 VAD 和 PEB 中收集信息,并以易于比较的格式输出。此外,psinfo 还尝试检测具有执行可能性的可疑内存区域:

图 5.36 – psinfo 输出

图 5.36 – psinfo 输出

图 5.36 中,你可以看到 psinfo 输出显示了来自 VAD 和 PEB 的基地址、进程路径和保护设置,以及命令行和其他与进程相关的详细信息。那么,我们在进程空洞化的情况下会看到什么呢?从 PEB 获取的信息将与作为容器的进程匹配,但 VAD 结构将不再将文件映射到此内存区域。

另一种检测空洞进程的方法是使用我们已经知道的 ldrmodules 插件。你还记得在那里的可执行文件是什么样子的吗?没错;在除 InInit 外的所有列表中,它设置为 True,然后是文件在磁盘上的完整路径信息。在进程空洞化的情况下,标志(True False True)仍然会保持,但可执行文件的路径将会缺失。

除了进程空洞化,攻击者还常用另一种注入方式:进程双胞胎(Process Doppelgänging)。

进程双胞胎

该技术首次在 2017 年的 BlackHat 大会上介绍,此后一直被攻击者广泛使用。例如,Bazar Loader 就使用进程双胞胎技术来注入其有效载荷。

该技术基于 NTFS 事务的使用。事务性 NTFS 是在 Windows Vista 中引入的,目的是使文件系统的更改更加安全高效。使用事务时,会创建特殊的事务文件,任何预期的更改都写入这些文件中。一旦更改完成,可以提交事务以一次性应用所有更改,或者通过删除事务文件及其更改来回滚事务。此技术在安装新程序时非常有用,因为如果在更改过程中发生崩溃,事务将被回滚,系统将恢复到原始的稳定状态。让我们看看该技术如何在进程双重伪装算法中使用:

  1. 创建事务并打开一个干净的交易文件。

  2. 用恶意代码覆盖交易文件。

  3. 创建一个内存区域,指向交易文件。

  4. 回滚事务(这将从文件系统中删除所有交易文件的痕迹,但不会删除映射了恶意代码的内存区域)。

  5. 创建对象,进程和线程对象;将线程的起始地址设置为恶意代码的入口点。

  6. 创建进程参数并将其复制到新创建的进程地址空间。

  7. 运行双重伪装的进程。

使用此技术相当难以检测。对于 Windows 10 之前的系统,你可以检查与可疑进程相关联的File_Object。如果该文件启用了写访问权限,可能是进程双重伪装。对于 Windows 10 系统,由于_EPROCESS结构的新成员,这会稍微容易些。关键在于,对于双重伪装的进程,_EPROCESSImageFilePointer被设置为NULL。要检查可疑进程的相关信息,可以使用 Volatility 的volshell

首先,在volshell中运行ps()来识别可疑进程的偏移量:

图 5.37 – 执行 volshell ps()

图 5.37 – 执行 volshell ps()

然后,使用dt('_EPROCESS',<offset>)来获取与目标进程相关的信息:

图 5.38 – 获取进程相关数据

图 5.38 – 获取进程相关数据

搜索0x448 ImageFilePointer。如果出现NULL而不是正常值(如图 5.39所示),恭喜!看起来你刚刚找到了双重伪装的进程:

图 5.39 – 正常的 ImageFilePointer 值

图 5.39 – 正常的 ImageFilePointer 值

值得在这里提到的是,即使攻击者使用隐秘的注入技术,如进程双胞胎(Process Doppelgänging),也有可能使用广泛使用的工具,如mimikatz或来自后期利用框架的 payload,在合法进程的上下文中执行。这为我们提供了使用关键字、正则表达式和YARA 规则搜索进程内存的可能性。让我们来看一下以下的例子。我们有一个名为wscript.exe的进程。如前所述,这是我们必须警惕的进程之一,因为威胁行为者可以利用wscript.exe来执行他们的恶意脚本。

重要提示

WScript 是微软 Windows 的一个组件,旨在运行用脚本语言(如 Visual Basic)编写的脚本。

在我们的场景中,调查命令行参数和进程使用的文件句柄仅让我们得到了正在使用的脚本的名称。因此,我们转储进程内存并使用strings工具来获取 ASCII 和 UNICODE 字符:

图 5.40 – 转储 wscript 的内存并使用 strings64 解析

图 5.40 – 转储 wscript 的内存并使用 strings64 解析

在生成的文本文件中,你可以使用powershellcmdvbsbase64关键字来搜索任何感兴趣的信息:

图 5.41 – Base64 关键字搜索结果

图 5.41 – Base64 关键字搜索结果

图 5.41中,你可以查看使用base64关键字找到的 Base64 编码代码。为了更好地理解该代码的性质,你可以使用CyberChef解码它:

图 5.42 – 解码后的 Base64

图 5.42 – 解码后的 Base64

CyberChef 已经自动检测到我们的 Base64 编码代码是一个 PE 文件。此时,我们可以保存生成的 PE 文件进行进一步分析。通过继续分析这些行,我们发现该文件是通过网络下载的,并且随后被注入到一个新的进程中。

这就是我们如何检测恶意进程并在内存转储中找到各种注入。然而,这并不是全部。攻击者通常需要在系统上保持持久性,以保持对受感染主机的访问。可以通过多种方式实现这一点。接下来让我们讨论这些方式。

寻找持久化证据

恶意软件和攻击者有许多技术可以用于在系统中占据立足点。这些技术包括已经使用多年的经典技术。此外,还有一些相对较新的技术,正逐渐流行起来。我们并不是在这里讲解每一个存在的技术,而是提供一些我们认为最有可能帮助你发现系统中恶意软件持久性工具的工具。当然,例子也不会缺少。

启动或登录自动启动执行

在这种技术中,攻击者通过更改系统设置,在系统启动或登录时自动执行程序。例如,他们可以将恶意可执行文件的路径添加为以下键的某个值的数据:

  • HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon

  • HKLM\Software\Microsoft\Windows\CurrentVersion\Run

  • HKLM\Software\Microsoft\Windows\CurrentVersion\RunOnce

  • HKCU\Software\Microsoft\Windows\CurrentVersion\Run

  • HKCU\Software\Microsoft\Windows\CurrentVersion\RunOnce

在上一章中,我们讨论了几种从内存中提取注册表的方法。你可以选择最适合你的方式,导出与前述键对应的SOFTWARENTUSER.DAT注册表文件。要处理这些文件,你可以使用Registry ExplorerRegRipper,就像我们之前所做的那样:

图 5.43 – 运行键分析

图 5.43 – 运行键分析

在前面的截图中,可以清楚地看到Temp值和temp.bat。你还可以使用 Volatility 的prinkey插件,配合-K选项,检查虚拟注册表中该键的内容。

如果你想更有逻辑地构建搜索持久化使用的键,你可以先检查handles插件的输出,使用-t Key选项,它会显示该进程使用的所有注册表键:

图 5.44 – Volatility handles

图 5.44 – Volatility handles

这种方法不仅加速了搜索用于持久化的注册表键,而且还提供了恶意软件感兴趣的注册表键的信息,以及它可能如何使用这些键。需要注意的是,如果你在handles插件的输出中没有看到你寻找的键,不能保证它没有被使用。因此,如果结果不理想,建议你还是检查注册表。如果仍然能找到该键,你可以使用prinkey -K <key>检查其内容,如图 5.45所示:

图 5.45 – 使用 Volatility printkey 检查 Load 值

图 5.45 – 使用 Volatility printkey 检查 Load 值

当然,通过滥用运行键来实现持久化并不是威胁行为者使用的唯一技术,另一个常见的技术是 Windows 注册表操作。以下是一些其他示例:

  • Winlogon 助手 DLL(MITRE ATT&CK 中的 T1547.004):威胁行为者修改Software\Microsoft\Windows NT\CurrentVersion\Winlogon注册表键来实现持久化。

  • 图像文件执行选项注入(MITRE ATT&CK 中的 T1546.012):威胁行为者修改HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution OptionsHKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SilentProcessExit注册表键来实现持久化。

  • 登录脚本 (T1037.001,依据 MITRE ATT&CK):威胁行为者修改HKCU\Environment\UserInitMprLogonScript注册表键值来实现持久化。

让我们继续查看其他流行的持久化技术。例如,创建新账户。

创建账户

这种技术通常被勒索软件操作员使用,因为它非常适合保持对受感染系统的访问。可以再次使用注册表查找新账户的痕迹。记住,在前一章中,我们讨论了 SAM 注册表文件及其如何包含用户信息,包括创建日期。为了便于分析用户创建数据,最好使用Registry Explorer工具和书签选项卡。操作方法是,将导出的 SAM 文件拖入 Registry Explorer,点击书签,然后选择用户。这将显示一个包含所有用户的表格:

图 5.46 – 用户书签

图 5.46 – 用户书签

如你所见,在前面的截图中,创建时间列显示了每个用户的创建日期和时间。你可以通过比较这些时间戳来识别在攻击期间创建的用户。

当然,这种方法有一个显著的局限性——关于域用户的相关信息可能缺失。因此,我们将考虑的另一种方法是导出事件日志。

重要提示

Windows 事件日志是位于C:\Windows\System32\winevt\Logs目录下的.evtx文件。它们包含与系统操作、用户活动等相关的各种事件。

这种方法与常规文件导出没有区别。操作步骤如下:

  1. 运行filescan插件,并将其输出重定向到文本文件中。

  2. 打开包含filescan结果的文本文件,并找到你感兴趣的日志。

  3. 从文本文件中复制所需日志的偏移量。

  4. 运行dumpfiles -Q <offset>

  5. 重命名生成的文件,包括扩展名。

与创建新用户相关的事件存储在Security.evtx日志中。请注意,在普通用户的计算机上,这个日志会记录本地用户创建的信息,而对于域用户,你需要查看位于域控制器上的日志。

要在 Windows 中打开导出的事件日志,你可以使用内置的事件查看器。有关创建和启用用户的其他信息可以在47204722事件中找到。你可以使用这些事件 ID 来创建过滤器。最终结果应该是这样的:

图 5.47 – 通过事件查看器打开的 Security.evtx

图 5.47 – 通过事件查看器打开的 Security.evtx

在这里,我们有关于在seriouscats域中创建honka用户的信息。还有一个时间戳,表示事件发生的时间,也就是用户被创建的时间。

重要提示

有时候,事件日志在从内存转储中导出时会损坏。若要尝试恢复来自损坏日志的事件,您可以使用 CQURE 的优秀工具CQEvtxRecovery

因此,根据情况,你可以在注册表或事件日志中寻找新用户创建的痕迹。

事件日志本身是关于系统中发生的事情的极好数据来源:远程连接、创建用户及更改其属性、启动 PowerShell 脚本、Windows Defender 崩溃等。让我们来探索导出的内存事件日志还可以用来做什么。

创建或修改系统进程

当使用这种持久化技术时,攻击者会安装一个新服务,该服务应该运行磁盘上的可执行文件或执行脚本。通常,像EmotetTrickbot这样的木马会利用安装新服务的方式。

有关服务安装的附加信息记录在System.evtx事件日志中,这也可以从内存转储中导出。我们会关注事件 ID 为7045的记录:一个服务被安装到系统中。分析此类事件时,您应该注意可执行文件的名称和位置,以及在脚本的情况下,所使用的参数:

图 5.48 – System.evtx

图 5.48 – System.evtx

图 5.48中,你可以看到一个恶意服务的示例。请注意,可执行文件位于用户的临时文件夹中。

分析服务的另一种方式是使用专门的 Volatility 插件。例如,你可以使用svcscan插件获取关于正在运行的服务、服务名称、类型、状态、二进制路径等信息,如图 5.49所示:

图 5.49 – svcscan 输出

图 5.49 – svcscan 输出

还有一个由社区开发的插件,名为autorunsgithub.com/tomchop/volatility-autoruns/blob/master/autoruns.py):

图 5.50 – autoruns 输出

图 5.50 – autoruns 输出

这个插件不仅收集有关服务的信息,还收集可能被用于持久化的各种注册表键值。一方面,插件提供了相当简便的方式来访问各种信息;另一方面,收集的数据集是有限的。因此,在使用该插件之前,我们建议您阅读收集的数据列表,该列表可以在同一 GitHub 仓库中找到。

除了安装新服务外,攻击者还可以通过调度器创建任务。让我们来看看这一技术及如何检测它。

调度任务

创建调度任务是最常见的技术之一。它被商用恶意软件广泛用于在被感染系统上获取持久性。有关调度任务的信息存储在多个位置:

  • C:\Windows\System32\Tasks:在这里,你可以找到带有任务描述的 XML 文件。

  • Microsoft-Windows-TaskScheduler%4Operational.evtx:你可以分析与创建新任务相关的事件 ID 106。

  • SOFTWARE:任务缓存的信息也存储在注册表中。

我们将继续进行注册表分析。所以,我们需要像之前一样导出 SOFTWARE 文件。这次,我们将使用 RegRipper 来解析我们的注册表文件:

图 5.51 – 使用 RegRipper 解析 SOFTWARE

图 5.51 – 使用 RegRipper 解析 SOFTWARE

我们可以使用 taskcache 关键字来搜索所需的信息。有两个插件可以显示与任务相关的数据:taskstaskcache。这两个插件都显示关于任务的路径和创建时间的信息,但第二个插件还会显示任务 ID,如下所示:

图 5.52 – taskcache 和 tasks 插件

图 5.52 – taskcache 和 tasks 插件

如你所见,存在各种持久性技术,这只是其中的一小部分。然而,利用我们已经回顾过的分析方法,你将能够分析更多的技术。

法医调查中的另一个重要步骤是时间线的创建。其应用在很大程度上取决于你的目标,因为你不仅可以寻找与恶意活动相关的信息,还可以收集关于用户文件的数据。让我们更详细地看看这个话题。

创建时间线

时间线非常有用。它们在调查中扮演着重要角色,因为你不仅可以了解目标系统在特定时间段内发生了什么,还可以一步步重建攻击者的行动。以下是使用时间线的几种方法:

  • 事件期间系统变化分析:如果你已经有了事件发生时的数据,可以使用时间线分析目标系统在此期间发生的变化。

  • 文件时间戳分析:通过基于文件系统的时间线,你可以搜索与特定文件相对应的条目,并分析它们的出现时间戳或对其执行的操作。

  • .pf 扩展名的文件在 C:\Windows\Prefetch 目录中创建,文件与正在运行的程序相对应。这个文件的名称通常包含正在运行的程序的名称。因此,时间线中关于预取文件创建的记录不仅可以告诉你某个程序已启动,还可以让你确定到底是哪个程序启动了。

如你所见,时间线有多种类型。我们将讨论那些可以通过内存转储构建的时间线。

基于文件系统的时间线

这个时间线基于文件系统元文件。例如,对于 NTFS 文件系统,这个文件可能是主文件表$MFT)。这个文件包含关于文件系统中所有文件及其时间戳的信息。

要基于 MFT构建时间线,首先需要获取其数据。这可以通过Volatilitymftparser插件完成,该插件从内存中收集所有MFT 构建时间线,首先需要获取其数据。这可以通过 Volatility 的 `mftparser` 插件完成,该插件从内存中收集所有 MFT 条目。运行此插件的过程如下:

图 5.53 – Volatility mftparser

图 5.53 – Volatility mftparser

注意所使用的选项;它们用于以我们想要的格式保存数据。结果是一个包含无序 MFT 记录的文本文件。要将它们转换为时间线,您可以使用 TheSleuthKit 中包含的 mactime 工具。要运行此工具,您需要安装 Perl。为此,您只需从官方网站下载安装程序并按照说明进行操作(strawberryperl.com/)。

要获取 mactime 工具本身,请访问 TheSleuthKit 的官方网站(www.sleuthkit.org/sleuthkit/download.php)并下载 Windows 版本的二进制文件。将下载的压缩包解压到您方便的目录中。

现在我们准备将 MFT 记录转换为时间线。使用以下命令:

PS D:\> C:\Strawberry\perl\bin\perl.exe .\sleuthkit-4.10.2-win32\bin\mactime.pl -b .\output\body.txt > .\output\timeline.txt

使用 -b 选项时,我们指定了以正文格式传递文件。我们将工具的输出重定向到 timeline.txt 文本文件中。

您可以使用文本编辑器或 MS Excel 来查看此文件:

图 5.54 – 基于文件系统的时间线

图 5.54 – 基于文件系统的时间线

在之前的时间线中,我们可以看到 Gnh3J8f.EXE 的预取文件被创建,这表明它已被执行。

自然地,时间戳不仅存储在文件中,还存储在创建的进程、网络连接等内容中。所有这些信息也可以添加到时间线中。让我们来看看如何做。

基于内存的时间线

您可以使用 Volatility 的 timeliner 插件来构建存储在内存中的所有信息的时间线。由于此插件的输出非常庞大,我们建议您立即将其重定向到磁盘上的文本文件中:

PS D:\> .\volatility_2.6_win64_standalone.exe -f .\nwe.mem 
--profile=Win7SP1x64 timeliner > .\output\timeline.txt

这次,我们的文件中将有更多的信息:

图 5.55 – 基于内存的时间线

图 5.55 – 基于内存的时间线

有时候,这些信息量过大,特别是当以文本文件的形式处理这些数据时并不太方便。作为替代方案,您可以使用 Redline,它也允许基于内存转储中的数据构建时间线。与此不同的是,您将拥有一个图形界面,并且可以轻松地添加和删除某些数据源:

图 5.56 – Redline 的时间线

图 5.56 – Redline 的时间线

看起来更方便了,不是吗?

通过这种简单的方式,我们可以构建不同的时间线并将其添加到我们的调查中。

总结

搜索恶意活动的痕迹是一个复杂但有趣的过程。

你可以使用各种标记来检测恶意进程。这些标记可以包括进程名称、可执行文件位置、启动参数、非标准的父子进程组合以及异常行为。此外,与恶意软件或攻击工具相关的进程通常会执行网络活动。对这些活动的内存分析不仅可以帮助你检测恶意进程并获取 C2 服务器的 IP 地址,还能帮助你了解攻击者使用的工具。

如果你检测到一个进程正在与远程 IP 地址通信,但没有发现其他恶意标记,那么是时候在内存中寻找恶意软件注入的痕迹了。最常见的注入类型包括 DLL 注入、可执行文件注入、进程空洞化以及 Process Doppelgänging。可以在内存转储中找到这些注入的痕迹。

一旦识别出恶意进程,值得寻找持久化痕迹,这些痕迹通常在攻击中用于维持对受损主机的访问。为了搜索这些痕迹,你可以使用专门的 Volatility 插件,或进行注册表和事件日志分析。

在调查中,构建时间线是一个很好的补充,它不仅可以帮助你查找与系统中某个变更相关的时间戳,还能帮助你将所有信息整理到一起。

这就是我们如何进行内存转储的取证调查,寻找恶意活动的痕迹。然而,内存转储并不是唯一的易失性数据来源。Windows 还具有其他来源,如pagefileswapfilehibernation filescrash dumps。我们将在下一章讨论这些来源并进行分析。

第六章:易失性内存的替代来源

在前几章中,我们讨论了内存转储作为法医调查中有用数据来源的重要性。我们查看了许多不同的分析工具,讨论了用户活动检查的技巧,并讨论了检测恶意软件痕迹的技术。然而,关于 Windows 操作系统内存取证的内容还没有结束。

我们一开始就提到过,除了主内存本身外,还有其他可能包含相似信息的内存来源。如果由于某些原因,你无法创建完整的内存转储或其分析失败,你总是可以转向这些来源:休眠文件、页面文件、交换文件和崩溃转储。这正是我们将在本章中讨论的内容。

本章将解释如何访问其他易失性数据来源,使用哪些工具进行分析,当然,还会讲解使用哪些技术来检索特定的信息。

本章将涵盖以下主题:

  • 调查休眠文件

  • 检查页面文件和交换文件

  • 分析崩溃转储

调查休眠文件

我们将首先查看的替代来源是休眠文件。我们之所以从这里开始,是因为休眠文件是关闭电源前hiberfil.sys文件的压缩副本。这是睡眠模式和休眠模式之间的主要区别,因为休眠模式下电源完全切断。

由于休眠文件是计算机进入节能模式时 RAM 的副本,它可以包含用户正在处理的文件,即使这些文件在休眠文件进行分析时已经不再存在于磁盘上。因此,这个来源可能在法医调查中起着重要作用,那么我们该如何获取这个文件呢?

获取休眠文件

完整的休眠文件通常位于根目录下;然而,该文件受系统保护,默认情况下是隐藏的。如果你正在处理一台运行中的计算机,并且休眠文件已经创建,你可以使用成像工具将文件复制到可移动媒体上。

你可以使用著名的法医工具包成像工具FTK Imager)来完成这项工作。在目标主机上运行它,点击文件 -> 添加证据项...,如以下截图所示:

图 6.1 – FTK Imager 的添加证据项选项

图 6.1 – FTK Imager 的添加证据项选项

在出现的窗口中,选择逻辑驱动器,如以下截图所示,然后点击下一步

图 6.2 – 选择源窗口

](tos-cn-i-73owjymdk6/12ca7d4ebeda4687b27b216de5390198)

图 6.2 – 选择源窗口

从下拉菜单中选择根目录(C:\),然后点击完成,如以下截图所示:

图 6.3 – 选择驱动器窗口

](tos-cn-i-73owjymdk6/b4a53e9726e24ea19c38229fed2a65fd)

图 6.3 – 选择驱动器窗口

然后你将看到目标主机的文件系统出现在主窗口的左侧。在根目录下,你可以找到休眠文件。为了将其复制到可移动媒体,右键点击该文件并选择 导出文件…,如以下截图所示:

图 6.4 – 导出文件选项

图 6.4 – 导出文件选项

在对话框中,选择你想要保存休眠文件的可移动媒体,并点击确定,如以下截图所示:

图 6.5 – 目标路径

图 6.5 – 目标路径

你应该看到一个进度条,显示将文件复制到可移动媒体的过程,如下截图所示:

图 6.6 – 导出过程

图 6.6 – 导出过程

这将导致一个 hiberfil.sys 文件出现在可移动媒体上,准备进一步处理。

如果目标主机上没有休眠文件,但你仍然想创建一个,你需要执行以下操作:

  1. 确保已启用休眠模式。

为此,请以管理员身份运行 PowerShell 并执行以下命令:

PS C:\windows\system32> .\powercfg.exe /availablesleepstates
  1. 如果休眠已启用,你将在出现的列表中看到 Hibernate。否则,你可以通过执行以下命令启用它:

    PS C:\windows\system32> .\powercfg.exe /hibernate on 
    

命令示例如下截图所示:

图 6.7 – powercfg.exe

图 6.7 – powercfg.exe

  1. 创建一个休眠文件。

要执行此操作,只需运行以下命令:

PS C:\windows\system32> .\shutdown.exe /h 

该命令将使目标计算机进入休眠模式,你将得到一个带有时间戳的 hiberfil.sys 文件,时间戳对应命令执行的时间。然后你可以使用 FTK Imager 导出这个文件。

请注意,在法医调查中,你更可能与法医镜像打交道,而不是与实时系统打交道。要从法医镜像中提取休眠文件,只需使用特殊工具打开它。你可以使用相同的 FTK Imager 和 添加证据项… 菜单选项,但现在,你必须选择镜像文件,并指定驱动器上法医副本的路径,而不是实时系统的逻辑驱动器。导出休眠文件到磁盘的其余过程将与之前描述的过程类似。

现在我们已经成功获取了休眠文件,接下来让我们看看如何分析它。

分析 hiberfil.sys

由于休眠文件是 RAM 的压缩副本,我们首先需要解压它并获取原始副本。这可以通过使用一个名为 imagecopy 的 Volatility 插件来完成。这个插件允许我们将内存转储转换为不同的格式,并将休眠文件转换为原始格式。它的界面如下所示:

图 6.8 – Volatility imagecopy

图 6.8 – Volatility imagecopy

我们使用 -f 选项指定休眠文件的路径,使用 -O--output-image 选项指定我们希望保存结果的路径,并指定文件名和扩展名。别忘了使用 --profile 选项,在此处需要指定与目标主机操作系统版本相对应的配置文件。这将为您提供一个准备好进行分析的文件,在本例中是 hiberfil.raw

将休眠文件转换为原始格式的另一种方法是使用 Comae 工具包中包含的 Hibr2Bin 工具。要获取此工具,您需要通过在官方网站上注册成为测试计划的成员,网址是 www.comae.com/

该工具可以通过命令行运行。除了输入和输出文件外,还必须指定多个选项,例如平台以及操作系统的主版本和次版本,如下所示:

图 6.9 – Comae 工具包 Hibr2Bin

图 6.9 – Comae 工具包 Hibr2Bin

Hibr2Bin 支持以下版本:

  • /MAJOR 5 /MINOR 1 Windows XP

  • /MAJOR 5 /MINOR 2 Windows XP x64;Windows 2003 R2

  • /MAJOR 6 /MINOR 0 Windows Vista;Windows Server 2008

  • /MAJOR 6 /MINOR 1 Windows 7;Windows Server 2008 R2

  • /MAJOR 6 /MINOR 2 Windows 8;Windows Server 2012

  • /MAJOR 6 /MINOR 3 Windows 8.1;Windows Server 2012 R2

  • /MAJOR 10 /MINOR 0 Windows 10;Windows Server 2017

这也将产生一个原始文件。此类文件可以使用您已经熟悉的工具进行分析。例如,您可以使用 Volatility 获取活动进程列表,搜索文件,或者检测恶意活动的痕迹。

重要提示

由于休眠文件有其自身的结构,因此其中某些信息仍然会缺失。例如,当您进入休眠模式时,关于活动网络连接的信息会被清除,因此您无法从 hiberfil.sys 文件中获取有关网络连接的完整信息。

让我们看看如何使用 Volatility 从休眠文件中获取活动进程列表。为此,我们使用 pslist 插件,如下图所示:

图 6.10 – 来自休眠文件的活动进程列表

图 6.10 – 来自休眠文件的活动进程列表

同样,我们可以获取休眠文件中遇到的文件的详细信息,如下图所示:

图 6.11 – 来自休眠文件的文件列表

图 6.11 – 来自休眠文件的文件列表

我们甚至可以尝试提取它们,如下所示:

图 6.12 – 从休眠文件提取文件

图 6.12 – 从休眠文件提取文件

如您所见,这一分析步骤与完整内存转储的分析没有太大区别。因此,您可以毫无疑虑地应用我们在前几章中讨论的技术。

对于休眠文件的自动处理和分析,您可以使用如 Arsenal Recon 的 Hibernation Recon 等付费工具,或像 Magnet AXIOM 或 Belkasoft Evidence Center 这样复杂的解决方案。

这就是我们分析休眠文件的方式,但这只是我们考虑的替代数据源之一。接下来,我们继续。

检查页面文件和交换文件

我们在前几章中已经提到过页面文件和交换文件。在那里,我们讨论了操作系统用来让大量进程同时运行的机制。当物理内存不足时,该机制会将临时进程数据存储到磁盘上一个专门保留的空间——页面文件中。

重要提示

数据按页面逐页加载到页面文件中,每页大小为 4 千字节KB),因此数据可以占据连续区域以及页面文件的不同部分。因此,在分析过程中,您可以同时使用文件雕刻和字符串搜索。此外,Windows 在运行时仅在内存中跟踪页面文件条目及其与特定进程的关系,因此无法在页面文件分析过程中恢复这种关系。

交换文件和页面文件的主要区别在于,交换文件存储来自 Microsoft Store 应用程序(以前称为 Metro 应用程序)的数据。它存储那些当前不需要,但在切换应用程序或从动态磁贴打开应用程序时可能需要的数据,这些数据存储在 pagefile.sys 中。

获取页面文件

默认情况下,页面文件是启用的,因此您无需手动创建它。此外,系统中可能会有多个此类文件,它们不一定位于根目录。要查找分页文件,您需要检查 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management 注册表项中的 ExistingPageFilesPagingFiles 值。这可以通过在在线机器上使用注册表编辑器,或通过分析从取证映像中获得的 SYSTEM 注册表文件来完成,如下图所示:

图 6.13 – SYSTEM 注册表文件中的 ExistingPageFiles 和 PagingFiles 值

图 6.13 – SYSTEM 注册表文件中的 ExistingPageFiles 和 PagingFiles 值

一旦检查了分页文件的数量和位置,您可以像提取休眠文件一样提取它们,如下所示:

图 6.14 – 页面文件提取

图 6.14 – 页面文件提取

此外,一些工具允许您在创建内存转储的同时创建页面文件的副本。回顾 FTK Imager 转储创建过程;在那里,您可以通过启用 包含页面文件 复选框来捕获页面文件,如下图所示:

图 6.15 – FTK Imager 包含页面文件

图 6.15 – FTK Imager 包含页面文件

这将创建两个文件:一个内存转储文件和一个页面文件的副本。

一旦你成功提取了页面文件,就可以开始分析它了。

分析 pagefile.sys

分析页面文件有不同的方法。我们将尽量详细阐述一些最重要的方法,以便你可以选择最适合你调查目标的方法。

重要说明

10525版本开始,Windows 10 使用页面文件压缩。这意味着你需要先解压页面文件才能进行分析。你可以使用 Maxim Sukhanov 开发的winmem_decompress工具来实现这一目的(github.com/msuhanov/winmem_decompress)。

一些工具——例如 MemProcFS——允许联合分析内存转储、页面文件和交换文件。为此,-pagefile0...9选项会添加到-device选项中。页面文件的默认值为 0;而交换文件则是 9。下面展示了运行 MemProcFS 的一个示例:

图 6.16 – 联合分析内存转储与相应页面文件

图 6.16 – 联合分析内存转储与相应页面文件

在这种情况下,页面文件中的数据将补充内存转储中的数据,但在这种情况下更容易遗漏特定信息。因此,最好使用独立工具来分析页面文件。

我们之前已经提到,页面文件中的数据是以 4 KB 的块存储的。由于这些块可能占据文件的不同部分,而且很难获得数据内容的结构化表示,因此页面文件分析不会很直接。因此,开始分析页面文件的最佳方法之一是查找字符串。

字符串搜索

分析页面文件最简单的方法是查找特定的字符串。你可以使用你已经熟悉的Strings工具来提取给定文件中所有的 ASCII 和 Unicode 字符。运行该工具时,可以通过 PowerShell 和以下命令来执行:

PS D:\> .\strings64.exe .\pagefile.sys > D:\output.txt

输入是我们页面文件的路径,输出会重定向到一个文本文件,即 output.txt。在生成的文件中,像之前一样,我们可以使用关键词搜索,或者简单地检查输出,查看是否有与执行任何程序(可能是攻击者使用的程序)相关的字符串,如下图所示:

图 6.17 – 字符串输出

图 6.17 – 字符串输出

你可以在前面的截图中看到,Strings工具的分析结果检测到了一个HTTPS 反向 shell运行。

既然我们在谈论字符串搜索,自然不能忘记使用yara工具来帮助我们。这个工具的原理与 Volatility 的yarascan插件相同。你可以通过官方的 GitHub 仓库下载这个工具,链接为 github.com/VirusTotal/yara/。你可以在以下截图中看到 GitHub 页面:

图 6.18 – yara GitHub 仓库

图 6.18 – yara GitHub 仓库

页面右侧有一个指向最新版本发布的链接,这正是你需要的。在Releases页面,选择所需的版本,然后下载并解压包含可执行文件的档案。你可以使用 PowerShell 来运行它。要查看所有可用的选项,请运行以下命令,如下图所示:

图 6.19 – yara 选项

图 6.19 – yara 选项

你可以使用来自公共来源的 YARA 规则,也可以编写自己的规则。我们来使用一个 YARA 规则来查找文件中的 URL。规则及其结果如下所示:

图 6.20 – yara 扫描结果

图 6.20 – yara 扫描结果

我们还可以通过 bulk_extractor 扩展搜索,查找域名、电子邮件、SQL 查询等,正如以下截图所示:

图 6.21 – bulk_extractor 执行

图 6.21 – bulk_extractor 执行

在这里,我们不仅能找到 IP 地址和域名,还能找到完整的 URL,如下所示:

图 6.22 – bulk_extractor URL 直方图

图 6.22 – bulk_extractor URL 直方图

请注意 IP 地址。你可以随时在 VirusTotal 或任何你喜欢的资源上检查它们。如果你检查我们找到的其中一个地址,你将看到以下结果:

图 6.23 – VirusTotal 结果

图 6.23 – VirusTotal 结果

VirusTotal 已检测到多个包含此 IP 地址的恶意文件。最好检查我们的页面文件是否包含此类文件。

文件切割

除了字符串搜索外,你还可以使用工具进行文件切割。你可以使用 PhotoRec 作为工具。此工具支持基于签名的搜索,可以识别超过 300 种文件类型,包括归档文件、图片、Microsoft Office 文件、PDF 文件等。

PhotoRec 可以和 TestDisk 工具一起从官方网站下载,网址是 www.cgsecurity.org/wiki/PhotoRec。为此,在页面右侧找到最新版本的链接并点击它。在打开的窗口中选择适当的版本,然后下载并解压档案。你需要一个名为 photorec 的可执行文件。

运行以下命令分析分页文件:

PS D:\> .\testdisk-7.2-WIP\photorec_win.exe D:\pagefile.sys

这将打开一个独立的窗口,如下所示:

图 6.24 – PhotoRec 媒体选择

图 6.24 – PhotoRec 媒体选择

Enter继续,你将看到如下内容:

图 6.25 – PhotoRec 文件系统类型

图 6.25 – PhotoRec 文件系统类型

由于我们的文件系统是新技术文件系统NTFS),无需更改任何设置,直接再次按Enter。在接下来的窗口中,您需要选择保存结果的目录,如下图所示:

图 6.26 – PhotoRec 目标文件夹选择

图 6.26 – PhotoRec 目标文件夹选择

在我们的例子中,output文件夹将用来保存雕刻结果。当指定了output目录时,必须按下C键开始。文件恢复过程将是这样的:

图 6.27 – PhotoRec 雕刻过程

图 6.27 – PhotoRec 雕刻过程

雕刻过程需要一些时间,所以请耐心等待。最终,所有恢复的文件将出现在您选择的目录中,如下图所示:

图 6.28 – 雕刻结果

图 6.28 – 雕刻结果

正如前面的截图所示,我们能够恢复大量的动态链接库(DLL)文件,以及一些文本和可执行文件。现在我们可以检查是否有包含我们之前检查过的 IP 地址的文件。我们可以使用 PowerShell 和Select-String命令,如下图所示:

图 6.29 – Select-String 结果

图 6.29 – Select-String 结果

请注意我们检测到 IP 地址的文件的上下文和扩展名。该内容类似于防病毒解决方案用来查找恶意软件的签名。这是一个相当常见的情况,所以要小心。在这种情况下,该文件更可能是合法的;然而,仍然没有什么可以阻止我们检查其他文件是否含有恶意软件。例如,以下是检查其中一个恢复的库文件的结果:

图 6.30 – 恶意 DLL 检测

图 6.30 – 恶意 DLL 检测

几个厂商已将我们的文件识别为恶意文件。这不能被忽视,因此可以对恢复的 DLL 文件进行更深入的分析。

正如你所看到的,分页文件也是一个很好的数据来源。你可能会找到不仅是有趣的 IP 地址、域名、部分电子邮件或 Shell 命令,甚至是完整的文件。所有这些数据将帮助你补充拼图中的缺失部分,完整事件的全貌。

现在,到了查看我们最新的替代来源——崩溃转储的时候。

分析崩溃转储

当系统进入不稳定状态时——例如,因无法正确处理的异常——会发生 Windows 崩溃。这是因为内核驱动程序或其他在内核级别运行的代码存在 bug。在这种情况下,Windows 会尝试保存与崩溃相关的信息,并可以用于调试。由于系统在崩溃期间处于不稳定状态,数据首先会写入分页文件,然后在下一次启动时转移到适当的转储文件中。根据系统配置,可以创建不同的崩溃转储。以下截图显示了 Windows 10 提供的转储格式:

图 6.31 – Windows 10 中的崩溃转储格式

图 6.31 – Windows 10 中的崩溃转储格式

让我们更仔细地看看这些格式,如下所示:

  • 小型内存转储:这些文件在 32 位和 64 位系统中分别为 64 KB 和 128 KB。它们包含正在运行的进程、加载的驱动程序和错误检查信息。

  • 内核内存转储:这些文件仅包含内核模式中的内存页面。因此,它们包含有关内核使用的内存的信息。通常,这种转储文件的大小大约为系统物理内存的三分之一。

  • 完整内存转储:这些是最大的内核模式转储。它们包含崩溃时的物理内存的完整转储。未映射的内存不包括在内。

  • 自动内存转储:此转储类似于内核内存转储。主要区别在于信息的存储方式。对于自动内存转储,Windows 会设置系统分页文件的大小。从 Windows 8 开始,这是创建崩溃转储的默认方法。

  • 活动内存转储:此转储是在 Windows 10 中引入的,类似于完整内存转储,包含来自用户模式和内核模式的活动内存。然而,不太可能与主机计算机故障排除相关的页面将被过滤掉。

您可能会根据创建的转储类型获取不同数量的信息。要检查特定主机上创建了哪些崩溃转储,可以检查实时系统上的设置。为此,请转到 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CrashControl 注册表键。要从法医映像中检索此数据,可以参考 SYSTEM 注册表文件,如下图所示:

图 6.32 – CrashControl 注册表键

图 6.32 – CrashControl 注册表键

CrashDumpEnabled 值定义了要创建的转储类型。在 Windows 10 上,以下值是可能的:

  • 0:无

  • 1:完整或活动内存转储

  • 2:内核内存转储

  • 3:小型内存转储

  • 7:自动内存转储

请注意,在此处,您还可以找到创建崩溃转储的路径。默认情况下,这是 %SystemRoot%\MEMORY.DMP 文件。

除了系统崩溃外,某些特定应用程序发生问题并且系统保持稳定的情况也可能发生。在这种情况下,会创建包含错误代码、应用程序和主机详细信息的迷你崩溃转储。这些转储由 C:\ProgramData\Microsoft\Windows\WER 生成。WER 还可以配置为创建用户模式进程的完整内存转储。为此,在 HKLM\Software\Microsoft\Windows\Windows error reporting 注册表项中创建一个 LocalDumps 键,并设置 DumpType 的值为 DWORD = 00000002。通过此设置,创建的用户进程转储将存储在出现错误的用户的 %LocalAppData%\Crashdumps 文件夹中,而系统进程的转储将存储在 C:\Windows\System32\config\systemprofile\AppData\Local\CrashDumps\ 文件夹中。

进程崩溃转储的分析在事件响应中尤其重要,因为恶意软件利用应用程序漏洞后,通常会导致该应用程序崩溃。分析应用程序崩溃转储可以告诉我们攻击者在初始访问中使用了哪些技术。

前面描述的所有文件都是系统在不同崩溃过程中创建的。你可以在取证镜像中搜索这些文件,并按前面描述的方式提取它们,就像休眠文件一样。

如果你正在处理一个实时系统,在必要时你可以自己创建这些文件。

崩溃转储创建

在开始创建崩溃转储之前,你需要确保已启用其创建功能。别忘了选择你想要的转储类型。你可以通过进入我的电脑 -> 系统和安全 -> 系统 -> 高级设置 -> 启动和恢复来完成这一步。准备好后,你就可以开始创建崩溃转储了。

模拟系统崩溃有不同的方式——例如,使用标准的 Windows 工具或Windows 调试器WinDbg)。然而,最简单且最可靠的方式仍然是使用来自SysinternalsNotMyFault工具。要使用此工具,只需从官方网站下载并解压缩存档,docs.microsoft.com/en-us/sysinternals/downloads/notmyfault。在存档中,你将找到适用于 32 位和 64 位系统的可执行文件。

系统崩溃模拟

以管理员身份运行notmyfault.exe。在弹出的窗口中,你将看到与系统崩溃最常见原因对应的选项,如下图所示:

图 6.33 – NotMyFault 主窗口

图 6.33 – NotMyFault 主窗口

选择适合你的选项并点击MEMORY.DMP文件,这是一个崩溃转储文件。

对于应用程序转储则是另一回事。创建它们的过程更简单且更灵活,因为你可以使用标准的 Windows 工具,如任务管理器,或者第三方工具。让我们来看一下如何创建进程转储。

进程转储创建

让我们从内置工具开始——更具体地说,是任务管理器。

要转储进程,按Ctrl + Alt + Delete启动任务管理器。在弹出的窗口中,找到可疑进程并右键点击其名称。在弹出的菜单中,选择创建转储文件,如截图所示:

图 6.34 – 使用任务管理器创建进程转储

图 6.34 – 使用任务管理器创建进程转储

如果转储文件成功创建,你将看到如下窗口:

图 6.35 – 进程转储结果

图 6.35 – 进程转储结果

在这里,你可以找到你创建的转储文件及其所在位置。正如你所见,这种方法易于使用,但不允许选择转储格式。另一个工具,Process Hacker(processhacker.sourceforge.io/downloads.php)可以以类似的方式使用。你可以在下图中看到该工具的使用场景:

图 6.36 – 使用 Process Hacker 创建进程转储

图 6.36 – 使用 Process Hacker 创建进程转储

如果你想能够创建不同类型的进程转储,Sysinternals 还提供了另一个工具,叫做 ProcDump。顾名思义,这个工具专门用于创建进程转储。与 NotMyFault 一样,它可以从官方网站下载:docs.microsoft.com/en-us/sysinternals/downloads/procdump。这个工具支持下图所示的转储类型:

图 6.37 – ProcDump 支持的格式

图 6.37 – ProcDump 支持的格式

正如你可能已经注意到的,你需要使用 PowerShell 来运行该工具。你可以通过任务管理器的 详细信息 标签页中的 PID 来指定要转储的进程,如下图所示:

图 6.38 – 识别 PID

图 6.38 – 识别 PID

要创建包含进程、线程、模块、句柄、地址空间和堆栈信息的小型转储,你需要使用 -mm 选项,而要创建完整转储,则使用 -ma 选项。效果如下所示:

图 6.39 – 小型转储和完整转储的创建

图 6.39 – 小型转储和完整转储的创建

这些是你可以用来创建各种转储的工具。现在,我们来谈谈如何分析这些转储。

分析崩溃转储

由于系统崩溃和应用程序崩溃会创建不同的转储,因此一些分析方法会有所不同。让我们从分析系统崩溃时创建的转储开始。

系统崩溃转储

分析系统崩溃转储最直接的方法是使用 WinDbg。这个工具专为调试设计,不仅可以分析崩溃转储,还能帮助你找出崩溃原因。使用以下链接下载该工具:docs.microsoft.com/en-us/windows-hardware/drivers/debugger/debugger-download-tools。找到 从 Microsoft Store 下载 WinDbg Preview 选项,并点击 WinDbg Preview 链接。点击 GET,然后你将被重定向到 Windows Store。再次点击 GET 进行安装。

安装完成后,你可以启动 WinDbg。进入 文件 菜单,选择 打开转储文件,如下图所示:

图 6.40 – WinDbg 文件菜单

图 6.40 – WinDbg 文件菜单

选择你的崩溃转储文件,加载完成后,使用命令行运行!analyze -v命令,如下所示的截图所示:

图 6.41 – WinDbg !analyze -v 命令

图 6.41 – WinDbg !analyze -v 命令

此命令允许你显示有关崩溃原因的详细信息,如下所示:

图 6.42 – WinDbg Bugcheck 分析

图 6.42 – WinDbg Bugcheck 分析

在这里,你可以找到例如有缺陷的驱动程序信息、异常错误和代码、故障 IP、失败 ID 哈希字符串等数据。

另一个可以进行类似分析的工具是BlueScreenView,由NirSoft公司开发 (www.nirsoft.net/utils/blue_screen_view.html),该工具在下方的截图中展示:

图 6.43 – NirSoft BlueScreenView

图 6.43 – NirSoft BlueScreenView

请记住,这个工具在处理实时系统上的小型转储时效果最佳,因此不适合用于事后分析。

还有另一种解决方案可以帮助你进行事后分析:SuperDump (github.com/Dynatrace/superdump)。它的主要优势在于可以自动化分析过程,并以图形报告的形式提供所有数据。该工具在下面的截图中展示:

图 6.44 – SuperDump

图 6.44 – SuperDump

SuperDump 是一个自动化崩溃转储分析服务,提供 Web 界面以及REST表现性状态转移)接口来上传 Windows 崩溃转储。此外,它还允许你分析 Linux 核心转储。不过,要运行该工具,你需要安装 Docker。

现在,你已经拥有了几种用于系统崩溃转储分析的工具。你可以选择最适合你操作的工具。接下来我们将进入更有趣的内容:进程转储分析。

进程转储分析

进程转储分析是调查单个可疑进程的绝佳方式,而无需创建完整的内存转储。此技术在事件响应过程中常常被使用。

调试器自然可以用于分析进程转储,但也可以应用更经典的方法——例如,字符串搜索或基于 YARA 规则的搜索。在这里,使用bulk_extractor进行分析也是可行的。

让我们考虑一个关于可疑进程explorer.exe的转储分析示例。我们从Strings工具开始。我们将使用标准命令,如下所示:

PS D:\> .\strings64.exe .\explorer.exe_210813_000718.dmp > D:\explorer.txt

生成的文本文件可以通过关键字进行搜索。在我们的案例中,通过搜索cmd关键字,我们找到了恶意软件执行的命令,如下所示的截图所示:

图 6.45 – Strings 输出中的恶意 cmd 命令

图 6.45 – Strings 输出中的恶意 cmd 命令

bulk_extractor 也会非常有用。我们可以通过以下命令找到恶意软件使用的 IP 地址和域名:

PS D:\> .\bulk_extractor.exe -o D:\output\ .\explorer.exe_210813_000718.dmp

扫描结果如下所示:

图 6.46 – bulk_extractor 域名直方图

图 6.46 – bulk_extractor 域名直方图

检查这些 IP 地址后发现,许多与恶意文件相关,如下所示:

图 6.47 – 来自 bulk_extractor 输出的 IP 地址

图 6.47 – 来自 bulk_extractor 输出的 IP 地址

最后,我们回到 Strings 工具的结果。搜索关键字 exe 也得到了极其有用的信息,如下所示:

图 6.48 – 检测恶意文件

图 6.48 – 检测恶意文件

在这种情况下,我们可以看到恶意软件使用的目录名称,以及可执行文件和库的名称。使用新的关键字让我们发现了更多与恶意活动相关的数据,如下所示:

图 6.49 – yrpoykg 关键字搜索

图 6.49 – yrpoykg 关键字搜索

如你所见,一些分析技术对整个内存转储和单个进程的内存转储都非常有效。

总结

分析 Windows 内存转储是一个耗时的过程,但可以产生非常宝贵的结果。除了检查完整的转储外,你还不应忽视其他来源,它们在法医调查和事件响应中也能提供很大的帮助。

替代来源包括休眠文件、页面文件和交换文件,以及崩溃转储和进程内存转储。部分文件,如页面文件和交换文件,是默认启用并在操作系统运行时自动创建的。其他文件则在系统进入特定状态时创建——例如,当系统进入休眠模式时,会创建休眠文件。后者的崩溃转储在系统崩溃或应用程序崩溃时生成,但你也可以人为触发这些状态。除此之外,还有一些特殊工具,可以在不直接影响进程状态的情况下,创建独立的进程转储,例如进程内存转储。

对于替代来源的分析,可以使用调试器等特殊工具,或是允许你通过字符串、正则表达式、YARA 规则和签名搜索的通用工具。

在这一点上,我们完成了对 Windows 内存的分析。尽管这个系统多年来一直是桌面操作系统市场的领导者,但其他系统如 macOS 和 Linux 正逐年变得越来越受欢迎。现在是时候谈论它们的分析了。在接下来的部分中,我们将详细讲解如何创建 Linux 内存转储,并继续进行其分析。像往常一样,我们将介绍 Linux 数字取证调查中使用的关键技术和工具,并附上我们实践中的示例。下部分见!