背景与工具
内存是计算机或其他数字设备运行时必要的组成部分,所有程序的运行,CPU的运算数据以及硬盘等外部存储设备交换的数据都在内存中进行,这些数据通常在程序关闭或设备关机重启时丢失。内存取证就是对这些数据进行采集和分析,了解设备在特定时间点的状态和活动,以免重要信息丢失,司法部发布的《电子证据数据现场获取通用规范》 中也规定了对这类易失性数据提取和固定的标准步骤。
由于内存中的易失性数据远复杂于传统Windows系统数据,因此使用适当的工具对内存进行取证具有重要的影响。市面上常见的内存固定工具有Magnet RAM Capture,FTK Imager和Linux系统可使用的LiME(Linux Memory Extractor)。至于内存分析工具,调查人员主要使用Rekall 和Volatility 进行分析工作。Rekall工具在2017年11月发布了最后一版1.7.1后已经停止维护;Volatility最成熟的版本是基于python 2的Volatility 2 v2.6.1,并且拥有大量的插件和社区支持,该组织如今也正在基于python 3开发新的Volatility 3,相比于Volatility 2而言,其使用更加流畅快捷。但Volatility 3仍在开发流程中,某些功能还未与Volatility 2达到对等且可能存在bug。笔者平时对内存镜像进行分析时,经常是使用Volatility 2与3同时进行分析,对比结果确保其准确性。
除这两个工具外,新一代的内存取证工具MemProcFS 也为内存取证提供了新方向,该工具可以将内存镜像挂载为虚拟文件系统,为取证人员提供了更便捷的调查方式。本文以仍在继续维护的Volatility 2,3和MemProcFS工具为对象,使用Windows系统内存镜像进行一系列实验,介绍这些工具的功能和使用方法并加以对比。
本文实验中使用的工具:
- Volatility 2的实验版本为v2.6.1,笔者是在其Github官网:https://github.com/volatilityfoundation/volatility上直接Clone下来的源代码,再在本地电脑上搭建Python2环境以进行使用,其支持对Windows10 19041版本的解析
- Volatility 3的实验版本为v2.4.1,下载地址:https://github.com/volatilityfoundation/volatility3/releases,需要在本地电脑上搭建python3环境进行使用,目前有更新的版本v2.7.0
- MemProcFS的实验版本为v5.8.19,下载地址:https://github.com/ufrisk/MemProcFS/releases,其更新速度较快,目前已经更新到v5.11
Volatility工具介绍
Volatility是一个命令行工具,用户输入的命令中需要指定内存镜像的路径和完成的指令和相关参数。它可以在Windows,Linux,Mac系统运行,支持多种内存镜像格式,不仅包括内存镜像制作工具制作的raw,mem镜像,还支持VMware虚拟机目录下的vmem格式的虚拟机内存文件。
Volatility 2未有官方的GUI界面工具支持,Volatility 3则存在开源GUI界面工具Volatility Workbench ,用户不用重复输入繁琐的命令,但是界面较为简陋,并且支持的命令较少,如图1所示。
图1. volatility workbench页面
功能比较
Volatility支持对内存镜像进行多方面的解析,工具支持对Windows内存镜像中计算机的基本信息,如正在运行的进程,DLL,注册表,驱动,打开的文件,网络信息进行检查,还支持解析计算机内的主引导记录(MBR)和NTFS系统内的主文件表($MFT)信息。本实验中根据计算机版本新旧创建了两个1GB的内存镜像:Win10x64_10586版本和最新的Win10x64_19045版本,使用Volatility对其进行基础信息的提取,通过完成分析网络流,检查进程树,提取文件三个角度的操作,分析比较不同版本的使用情况。
Volatility 2解析镜像时首先需要使用imageinfo命令确定系统版本号,从而指定适配版本的profile再进一步解析,见图2。解析步骤多,且由于软件为单线程执行,命令imageinfo解析内存镜像时需要较长时间,尤其是内存镜像较大时,需求时间可能更久。
图2. volatility 2识别镜像profile
新构筑的Volatility 3命令更加便捷,它将命令按照不同的系统分为三类(Linux,MAC,Windows),调查人员可以根据镜像系统选定不同的命令执行,如本次实验中使用windows.info命令查看Windows系统的信息。在解析过程中,它在线下载对应的配置文件到本地,后续分析中也不需要在命令中指定该profile,如图3。且其优化为多线程运行,运行速度大幅度提升,命令运行时也增加了进度条,可以查看命令运行进展。
图3. volatility 3识别镜像基本信息
确定好配置文件后调查人员即可开始对内存镜像进行检查,第一项实验为检查主机名,从注册表内读取信息。Volatility 2和3命令类似,首先使用hivelist列出镜像内的注册表文件,再使用printkey在选定的注册表内查找具体条目。图4为Volatility 3的查找过程,查找过程较为繁琐,调查人员需要知道查找对象在注册表内的路径并输入到命令中,再得到对应内容。除此方法外,还可使用dumpregistry命令将注册表文件导出,在本地使用其他工具进行查看。
图4. volatility 3识别主机名
基础信息检查完成后,就可以对计算机制作内存镜像时的状态进行分析,首先解析的是网络流信息,使用命令为netscan,Volatility 2在解析TCP连接时无法解析状态为CLOSED的网络连接的进程名和建立时间,只能获取IP地址和端口号,如图5所示。
图5. volatility 2识别网络信息
相较于Volatility 2,新版本可以解析出已关闭连接的进程名和创建时间,且读取出来了更多的网络连接条目,见图6,可以解析出更多信息对于电子数据取证领域来说是极为重要的,意味着调查人员可以发现更多潜在的线索。
图6. volatility 3识别网络信息
网络流信息检查完成后,接下来就是检查运行进程的相关信息,识别与案件相关的进程,使用命令为psscan(显示隐藏进程)和pstree(显示父子进程树)。两者在返回进程信息时区别并不明显,列出结果在图7中列出,主要有进程名,进程ID和父进程ID,所在的虚拟内存地址,使用的线程(Threads)和句柄(Handles)等。Volatility 2使用pstree命令时不显示进程的终止时间(使用psscan命令时显示),Volatility 3还支持显示程序是否以32位兼容运行,如图中的进程TrueCrypt.exe,它以32位兼容在64位机上运行,此栏设置为True。
图7.1,7.2 volatility 2,3识别进程树
确定好目标进程后,接着就是对该进程相关的文件进行识别,提取和分析。两者使用的命令大致类似:提取进程本体的命令为memdump -p [PID]或procdump -p [PID](3暂未支持两命令)。
图8. volatility 2导出进程
扫描内存中所有文件的命令为filescan,需要使用grep按需过滤返回结果,发现目标文件后则使用dumpfiles命令,根据filescan确定的虚拟内存地址提取。图9为Volatility 3使用dumpfiles提取docx文件的命令过程,保存路径为工具根目录。
图9. volatility 3依据内存地址导出文件
Volatility 2中使用filescan时可以读取出比3更多的信息,包括文件所在线程,句柄和文件权限信息,但是使用dumpfiles指定内存地址提取文件时,提取失败。在网络上搜索可用信息时发现相同命令在WinXP,Win7等较老的系统上可使用,原因可能是Volatility 2对重构的win10系统的支持不够完善,其他功能如clipboard等也只能在win7等系统可用,win10无法使用。
图10. volatility 2依据内存地址导出文件失败
但Volatility 2除了上述方法外,还可使用dumpfiles加-r参数(使用正则表达式匹配)匹配文件后缀来导出文件。本实验中,调查人员需要导出docx文件时,可以使用dumpfiles -r docx$ -i命令来导出(导出所有不区分大小写,匹配到docx后缀的文件),结果如图11所示。Volatility 3的dumpfiles暂不支持该参数,只能指定进程ID,物理内存地址和虚拟内存地址来导出文件。
图11. volatility 2依据文件后缀导出文件
Volatility获取特定进程的相关文件则使用handles命令,扫描选定进程所创建的文件句柄,命令为handles -p [PID] -t File(Volatility 3暂未支持-t参数,需要使用grep / findstr筛选文件),此处使用Volatility 2对WINWORD.exe相关文件句柄进行扫描,返回结果见图12。找到需要提取的文件后,调查人员即可使用dumpfiles命令进行提取,分析。
图12. volatility 2识别进程使用的文件句柄
MemProcFS工具介绍与安装
MemProcFS与Volatility不同,它将内存镜像挂载为一个虚拟的文件系统,将各种数字痕迹(Artifact),如进程,注册表,系统信息以文件夹的形式列出相关内容。调查人员只需要点击文件夹,就可以直接查看各类文件和分析结果,进行深入的分析操作,而不用像Volatility一样需要输入繁复的命令才能进行解析,对调查人员更加友好。
MemProcFS的安装也较为简单,这里以Windows系统的安装为例。首先其需求python 3.6以上版本,可以在python官网下载安装 ,安装完成后,使用命令pip install leechcorepyc来安装依赖库LeechCore(允许分析实时内存)。此工具运行还需要支持库 Microsoft Visual C++ Redistributables for Visual Studio 2019,可以在Microsoft官网获取安装程序。最后,该工具需要安装Dokany文件系统库,在其GitHub中下载DokanySetup.exe,双击运行即可进行安装。上述依赖安装完成后,在MemProcFS的Github内下载(图13),解压缩此文件即可使用。
图13. MemProcFS下载
在工具安装根目录下打开CMD,输入命令:MemProcFS.exe -device [镜像所在路径] -forensic 1(开启取证模式)即可使用,挂载结果见图14,其默认挂载目录为M盘。如果M盘已存在,可以使用参数-mount [空闲的盘符],如想要挂载在Z盘,则使用命令:MemProcFS.exe -device [镜像所在路径] -forensic 1 -mount Z。
图14. MemProcFS挂载内存镜像
功能使用
本部分中进行与Volatility中相同的实验对MemProcFS进行介绍和测试。调查人员在挂载好虚拟文件系统后,直接点击进入盘符内即可进行分析,挂载根目录的文件夹以及其存放数据见表1。除文件夹外,根目录还存在有两个文件:memory.dmp和memory.pmem,第一个是轻微修改过以符合Windows故障转储格式的内存镜像,可使用WinDbg工具进行调试,第二个则为原始内存镜像,如图14。
了解目录信息后,调查人员即可对内存镜像进行分析,首先需要查找的信息为主机名和网络信息。MemProcFS挂载时就已经做好基本的解析工作,打开sys文件夹下的computername.txt即可看到主机名称。
图15. MemProcFS解析主机名
网络信息在M:\sys\net下的netstat-v.txt文件中记录,该信息的解析结果较少,从图16中可以看到TCP的解析记录里面只有LISTENING的条目,而其他状态ESTABLISHED和CLOSED的条目并未解析出来,较Volatility的解析结果较少。
图16. MemProcFS解析网络信息
除了sys文件夹中解析出来的基本信息,调查人员想要查看如计算机最近打开文件等其他信息时,可以去registry文件夹下查看注册表信息,MemProcFS还将HKLM和HKU重建为文件系统,方便调查人员查看(内存中重建出来的注册表信息并不完全,只有部分条目存在)。例如本次实验镜像中,最近打开文件的目录在:M:\registry\HKU\eraser\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RecentDocs下,结果见图17。相较于Volatility中调查人员每次查询注册表特定键值对,都需要输入很长的命令行,MemProcFS只需要点击文件夹,打开文件查看这样简单的操作即可查找注册表信息。
图17. MemProcFS解析最近打开的文件记录
基本信息解析完成后下一个检查目标为进程信息,MemProcFS的进程树解析在M:\sys\proc下的proc.txt中,其中解析出来的信息与Volatility结果类似(图18),缺少了使用线程和句柄,wow64信息,但是增加了进程的使用用户和所在路径,方便用户查找在路径下查找进程。
图18. MemProcFS解析进程树
找到需要检测的进程信息后,调查人员就可以根据进程名和进程ID在M:\name或M:\pid中查找对应的进程文件夹,作为内存分析中最重要的部分,MemProcFS也解析了很多信息,目录内具体的文件和文件夹信息见下方表2和图19。
图19. MemProcFS进程目录文件详解
根据调查人员的需求,可以从具体进程文件夹中查找对应信息,例如调查人员想要查找word和7z程序相关的使用文件记录,就可以去检查对应进程文件夹内的files\handles子文件夹,文件记录见图20。
图20. MemProcFS解析进程相关文件
除了这些基本的内存取证操作外,MemProcFS还有更深入的取证功能可以为调查人员提供内存取证的新视角,提供分析时间线和$MFT文件,恶意软件检测,浏览器历史记录检测和镜像系统重构等功能,这里主要介绍恶意软件检测和镜像系统重构功能。
恶意软件检测结果在M:\forensic\findevil下,依据一系列行为规则对内存镜像中存在的恶意软件进行检测,图21说明MemProcFS检测到explorer.exe有PE注入,私有读写执行等操作,可能是恶意软件,但其也存在一定的误报率。
图21. MemProcFS识别恶意进程
重构镜像文件系统结果在M:\forensic\files文件夹下,MemProcFS将内存镜像尽可能恢复成正常的文件系统,有Windows,Program Files和Users等文件夹。由于内存大小以及不完整的$MFT文件,其恢复的文件路径可能有误或是存在文件丢失的情况,在图22中列出,可以看到有些文件夹名称为错误编码,但依稀可辨认归属,如XXX Files (x86)可能是Program Files (x86)下的文件,需要调查人员进一步分析,不过如果已知需要寻找的文件名或者其他信息,也可以通过资源管理器的搜索来进行查找。注意,MemProcFS暂未根据盘符路径对文件夹进行分类,如果待分析的内存镜像所在电脑中存在多个盘符,该文件夹下不仅有C盘的文件夹,还存在其他盘符下正在使用的文件夹。
图22. MemProcFS重构镜像文件系统
工具比较
上述实验流程中MemProcFS显示出,其在进行基础的取证操作中拥有比Volatility更高的效率,允许调查人员脱离出输入复杂的命令,在资源管理器中在文件夹级别对内存镜像进行分析,并且其已经对内存镜像进行了解析,对于简单的系统信息不需要调查人员输入命令才能获取,并且将注册表,内存镜像恢复为文件系统这类功能极大的便利了调查人员查找信息,提高了调查效率。
但是MemProcFS也存在一些问题。其显示网络流信息时,显示的信息较Volatility更少,且如果没有Wiki的参照,调查人员一开始在上手MemProcFS的时候,会对其构建的文件系统树产生疑惑,需要时间去搞明白每个文件夹所包含的数据,很难查找需要的数字痕迹,而Volatility则可以使用--help参数,寻找需要的使用的命令,使用即所得。除外,Volatility还有完善的社区支持,可以在线寻找问题的解决方案或是其他用户编写的插件,如mimikatz破密,BitLocker解密等插件,这一点是新生的MemProcFS无法比拟的,但相信其开发者在后续的更新中会修补这些问题。
结论
本文对MemProcFS和Volatility的使用和功能通过实验进行了介绍,并对其功能进行了比较。MemProcFS的出现为内存镜像的分析流程提供了新视角,其允许调查人员以更直观的分析内存镜像中的数字痕迹,不需要记住繁复的命令,面对着命令框进行分析,但在网络信息,社区支持等方面也与Volatility存在差距。作为一个新兴的内存分析工具,其也拥有极大的潜力,在真正的案件分析中,调查人员可以将它与Volatility同时使用,提高办案分析效率,挖掘出更多线索。