内存取证工具Volatility - Framework - 图文

更新时间:2023-12-02 19:10:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

内存取证工具Volatility Framework

作者 神探

Email 904788895@qq.com

学校 重庆邮电大学

2012年 12 月 21 日

第 1 页

摘要

计算机取证技术可以在案件发生以后,采取有效的信息技术手段对存储在网络中的计算机及其相关设备中的数据进行收集、固定与分析,从而寻找出与犯罪事实相符的电子证据。内存取证是当前计算机取证技术研究的热点问题之一,本文主要介绍内存取证工具Volatility Framework的简单使用与分析。全文主要包括三个部分。第一部分简单介绍内存取证问题产生的背景。第二部分简单介绍如何进行内存取证环境的搭建工作。第三部分重点介绍Volatility工具的一些取证分析实例,主要的例子有查看内存基本信息、查看内存中进程和动态链接库信息、查看内存中注册表信息等。

【关键字】内存取证,命令,Volatility Framework

第 2 页

1问题背景

在互联网产业高度发达的21世纪,互联网在给我们带来大量信息,提供大量机会的同时,信息安全也正面临着日益严峻的考验,随之而来的信息安全问题也日益突出。为了牟取非法利益,各种计算机犯罪活动层出不穷,比如窃取与破坏商业机密、攻击和破坏政府或金融网站、网络传销与诈骗等等。为了有效的打击这类与信息安全相关的犯罪活动,必须对如何打击计算机犯罪进行深入研究,而在案件侦破过程中,如何获取犯罪分子在作案过程中遗留的电子证据成为了当前研究的热点问题。

计算机取证技术是信息安全领域的一个重要分支,它是计算机与法学的一门交叉学科,正在受到科研机构和司法部门的重视。计算机取证技术可以在案件发生以后,采取有效的信息技术手段对存储在网络中的计算机及其相关设备中的数据进行收集、固定与分析,从而寻找出与犯罪事实相符的电子证据。2012年通过的新刑事诉讼法正式将“电子数据”规定为法定证据种类之一,电子证据将在案件侦破过程中扮演更加重要的角色。

计算机取证主要包括两个阶段:物理证据获取和信息发现。内存取证主要通过对内存数据及其缓存硬盘数据进行分析,提取那些对案件侦破可能有重要意义的易失性数据,这些易失性数据的特点是存在于正在运行的计算机或网络设备的内存中,关机或重启后这些数据将不再存在。Volatility Framework是最知名的内存取证工具之一,下面我们就主要来介绍该款取证工具的主要功能及其使用方法。

2内存取证环境的搭建

2.1 Volatility简介

Volatility是一款基于GNU协议的开源框架,使用Python语言编写而成的内存取证工具集,可以分析内存中的各种数据。Volatility支持对32位或64位Wnidows、Linux、Mac、Android操作系统的RAM(随机存储器)数据进行提取与分析。

当前的Volatility Framework的最高版本为发布于2012年10月8号的Volatility 3.0,但目前这还只是一个技术预览版,主要用于用户的讨论和测试。本文使用的是发布于2012年10

第 3 页

月1号的最新可用版本Volatility 2.2。Volatility 2.2有多种格式的软件包,包括volatility-2.2.zip、volatility-2.2.tar.gz、volatility-2.2.win32.exe和volatility-2.2.standalone.exe 四种格式。volatility-2.2.zip和volatility-2.2.tar.gz是Volatility 2.2工具源代码文件的zip压缩包和tar gz压缩包。volatility-2.2.win32.exe是安装Volatility到Python系统目录的安装程序。

volatility-2.2.standalone.exe是使用PyInstaller(PyInstaller可以将Python程序打包成Windows、Linux等操作系统下可执行的exe文件)编译完整的exe文件,内部包含有Python运行所需要的核心组件和Volatility模块.。

2.2 Volatility 2.2 安装

对应与上文提到的Volatility 2.2工具的多种格式,安装Volatility Framework的方法主要有三种。

第一,如果你使用的是单独的Windows可执行文件,无需其它任何安装操作,只要进入DOS界面,以命令提示符方式运行该程序即可。

第二,如果你使用的是volatility-2.2.win32.exe,需要双击该程序,按照安装提示安装即可。但前提是你的电脑上已经安装了Python 2.6或Python 2.6。图2.1是使用

volatility-2.2.win32.exe安装Volatility 2.2工具的初始画面,画面中的PYTHON Powered告诉我们后面的安装过程需要Python的支持。

第 4 页

图2.1 使用volatility-2.2.win32.exe安装Volatility 2.2工具

第三,如果你使用的Volatility 2.2工具源代码文件压缩包,则情况比较复杂,有兴趣的读者可以查看相关帮助文档。

2.3 获取内存副本

MoonSols DumpIt是一款同时支持Win32dd和Win64dd的内存副本获取工具。用户只需双击DumpIt.exe可执行程序,并在提示问题后面输入y(如图2.2所示),等待几分钟时间即可在当前目录下生成主机物理内存的副本(如图2.3所示),该副本文件是以*.raw为后缀的镜像文件。raw是未经处理的意思,即使用该工具对物理内存进行拷贝是按每一个bit进行深度复制,即按原样进行复制,这样可以避免丢失一些重要数据。

第 5 页

图2.2 使用DumpIt工具获取内存副本

图2.3 物理内存副本文件

3 Volatility工具的使用实例

3.1 Volatility使用的基础知识

前面我们已经安装好了Volatility Framework取证工具(本文后面的实验使用的是第一种

第 6 页

安装方法,即直接使用可执行程序volatility-2.2.standalone.exe),再加之已经通过MoonSols DumpIt获取了内存的实时副本文件。所以我们要对内存数据进行分析,就转换为对该副本文件PC-200910021344-20121216-102752.raw进行分析。

由于Volatility是以命令提示符方式使用的,所以同DOS下面的命令一样,Volatility Framework的开发人员也同样为我们提供了使用该工具的帮助命令。即通过-h 或-help选项可以显示该工具的帮助列表信息,其命令输出结果如图3.1所示。该命令显示了可用的命令选项(Options)以及支持当前操作系统版本的插件命令(Supported Plugins Command)。

下面我们参照图3.1来解释说明几个基本的命令选项,以期给读者建立一个感性的认识,以便能够大概了解Volatility工具使用哪些功能来对内存数据进行分析。

例如-f FILENAME选项的功能是说明打开一个镜像文件所使用的文件名,这个命令选项几乎在所有命令中都会用到。

--profile=WinXPSP2x86选项的功能是说明装载的操作系统配置。 --cache选项的功能是使用缓存。

--dtb=DTB选项的功能是说明DTB(Directory Table Base)页目录表的基地址。 -k KPCR 选项的功能是说明一个指定的内核处理器控制区的虚拟地址。 Apihooks插件命令的功能是监测在进程和内核中的API钩子。 Bioskbd插件命令的功能是动态地从内存中读取键盘缓冲区的数据。

Cmdscan插件命令的功能是通过访问_COMMAND_HISTORY获取历史命令记录。Connections插件命令查看当前内存中活跃的TCP连接。

第 7 页

图3.1 显示Volatility 2.2工具的帮助信息

3.2 取证分析实例

3.2.1 查看内存的基本信息

使用imageinfo命令可以查看我们正在分析的内存样本的摘要信息。具体来说,这个命令可以显示主机所使用的操作系统版本、服务包以及硬件结构(32位或64位)、页目录表的起始

第 8 页

地址和该获取该内存镜像的时间等基本信息。该命令的输出结果如图3.2所示。

图3.2 imageinfo命令输出结果

从图3.2我们可以得到内存的一些基本信息。比如Suggested Profiles中的Instantiated with WinXPSP2x86表明操作系统版本为Windows XP、服务包为SP2、硬件结构是x86(即32位)。 PAE type为PAE表明采用了物理地址扩展技术。页目录表基地址(DTB)为0x709000L,内核调试器(KDBG)的地址为0x8054ee2e0L,CPU的个数为2,CPU 0的内核处理器控制区域(KPCR)地址为0xffdff000L,CPU 1的内核处理器控制区域(KPCR)地址为0xb8340000L,内核和用户空间的共享内存区(KUSER_SHARED_DATA)的起始地址为0xffdf0000L,Image local date time表明内存镜像文件创建的时间是2012-12-16 18:28:53,对比图2.3物理内存副本文件的属性的创建时间,我们可以发现这两个时间是完全一致的。

由于这是第一个命令,所以我们详细介绍该命令的输出信息,事实上有些信息对取证来说帮助不是很大,后面的一些命令我们将只介绍其主要功能以及该命令输出信息在内存取证分析中存在的价值,而不再详细解读输出结果的每一行信息。

下面我们再看下一个命令:kprcscan。该命令查找内存中用于定义内核处理器控制区域(KPCR)的_KPCR结构体信息,在_KPCR的帮助下我们可以枚举机器上运行的进程列表。

由于Windows需要支持多个CPU,因此Windows内核中为此定义了一套以处理器控制区(Processor Control Region)即KPCR为枢纽的数据结构,使每个CPU都有个KPCR。 其中KPCR这个结构中有一个域KPRCB(Kernel Processor Control Block)结构,这个结构扩展了KPCR,这两个结构用来保存与线程切换相关的全局信息。

第 9 页

具体的说,该命令可以显示每个处理器的详细信息,包括IDT(线程控制符)和GDT(全局段描述符表)地址,当前运行的线程和空闲线程,CPU数量、制造厂商及其速度,CR3寄存器或页目录表基地址的值等信息。该命令的运行结果如图3.3所示,这条命令的输出结果要等待大概几个小时的时间,读者一定要耐心等待。

图3.3 kprcscan命令输出结果

3.2.2 查看进程和动态链接库信息

查看内存中进程信息的命令主要有两个:pslist和psscan。

使用pslist可以枚举系统中的进程,这条命令通过遍历PsActiveProcessHead指针指向的双向链表枚举当前内存中活跃的所有进程信息,主要包括偏移地址、进程ID号、父进程ID号、线程数量、句柄数量、进程会话ID号以及进程开始和退出的时间。

Pslist命令不能够检测到内存中的隐藏进程以及由于系统受攻击导致未在链表中出现的进程信息,但psscan命令能够解决这个问题。使用psscan命令能够通过内存池标签查找的方式枚举系统中的所有进程,这条命令不仅能够显示当前内存中活跃的进程信息,还能够枚举以前终止的进程和被隐藏以及被rootkit破坏的未在活跃进程链表中出现的进程,而正是这些隐藏的或掉链的进程在内存取证中具有重要的参考价值。所以,此处只显示psscan命令查看内存进程信息,其运行结果如图3.4所示。由于该命令输出结果较多,我们通过>psscan.txt将其输出结果重定向到psscan.txt文件中,如图3.5所示。

第 10 页

图3.4 psscan命令结果输出重定向到psscan.txt文件

图3.5 psscan命令部分运行结果

从图3.5的部分运行结果,我们可以发现用户曾经做过的哪些操作。比如图中加下划线的三行显示了我们熟悉的一些进程运行情况。从这三行数据我们可以分析得到如下三条线索:第一,用户在2012-12-16 09:58:10这个时刻打开了一个记事本程序,其执行进程notepad.exe的ID号为784,然后用户在1s种后即2012-12-16 09:58:11这个时刻又马上关掉了该记事本程序;第二,用户在2012-12-16 09:35:55的时刻也打开了一个记事本程序,其执行进程notepad.exe的ID号为2912,然后再用户在大概两分半钟后即2012-12-17 09::38:09这个时刻关掉该记事本程序;第三,用户在2012-12-16 07:15:12这个时刻点执行了NetKeeper.exe这个进程,在获取该内存镜像的时候,该进程一直处于运行状态。

注意输出列表中显示的时间都是世界统一时间UTC,而中国在东八区,所以真实时间需要转换才能得到。通过上面命令的运行结果,取证人员可以进一步顺藤摸瓜,从可疑进程出发,深入利用其它更高级的命令挖掘出内存中更多有价值的电子证据,而这些电子证据极有可能为计算机犯罪案件的侦破提供极大的帮助。

第 11 页

查看内存中动态链接库的信息的命令是dlllist。

Dlllist命令能够显示一个进程装载的动态链接库的信息,该命令通过遍历被PEB's InLoadOrderModuleList指向的由LDR_DATA_TABLE_ENTRY 组成的双向链表。通常情况下,当一个进程调用LoadLibrary函数(该函数的主要作用是加载指定目录下的DLL库到进程的虚拟地址空间),动态链接库DLLs被自动添加到这条双向链表上,直到进程调用FreeLibrary函数(该函数的作用是释放DLLs模块占用的资源)和该进程对DLLs的引用计数为0的时候,对应的DLLs信息才从该双向链表上删除。

如果我们只需要查看某个指定进程而不是所有进程在运行期装载的动态链接库文件,我们可以使用-p PID选项过滤输出结果,比如我们想要查看图3.5显示的PID为1128的NetKeeper.exe进程在运行过程中加载了哪些动态链接库就可以通过在dlllist后面加上选项-p 1128,即可显示其详细信息,其显示列表主要包括加载的动态链接库文件的基地址、文件大小以及文件所在路径。其运行结果如图3.6所示,这个进程正好是重邮学生每次上网都要使用的Netkeeper2.5客户端登陆器时执行的进程。

图3.6 dlllist命令显示ID号为1128的进程NetKeeper.exe所加载的动态链接库文件 3.2.3 查看系统注册表信息

注册表在计算机操作系统配置和控制方面起着十分重要的作用,它主要用于存储操作系统和用户应用程序的设置信息。注册表不是一个简单的大文件,而是一个集合,由称为“注册表文件(hive)”的分散文件组成。注册表文件主要包括两类,第一类是存储在磁盘上的静态数据,这类注册表文件一般被保存在操作系统的system32\\config文件夹下;第二类是易失性注册表数据,这类注册表文件是由Windows内核负责维护的RAM中的数据,它们在系统每次启动的时候才会被创建。

第 12 页

一般地,取证人员可以从注册表数据中获取相关软硬件配置信息、用户优先权、系统初始化配置信息以及用户登录和密码等信息。查看第一类注册表信息可以在开始?运行中输入regedit即可进入注册表编辑器。查看第二类注册表信息就可以使用本文的Volatility工具了,下面就简单介绍一下使用Volatility 2.2查看临时存储在内存中的注册表文件信息的一些简单操作。由于篇幅有限,本文只介绍两个典型的命令:hivelist命令和lsadump命令。

使用hivelist命令可以定位与硬盘上对应的注册表文件在内存中的虚拟地址和物理地址。特别是当你想打印某个注册表文件的值时,就需要先运行这个命令。hivelist 命令运行结果如图3.7所示。

图3.7 hivelist 命令运行结果

从图3.7我们运行结果的几处下划线的地方我们可以发现,SECURITY注册表文件在内存中的虚拟地址是0xe21dd910,SYSTEM注册表文件在内存中的虚拟地址是0xe1035b60,这两个值我们稍后马上会用到。

下面介绍lsadump命令。在介绍这个命令之前,现简单介绍一下LSA术语。LSA(Local Security Authority)即本地安全授权。Windows系统中一个相当重要的服务,所有安全认证相关的处理都要通过这个服务。

第 13 页

使用lsadump命令可以读取注册表中的与本地安全授权相关的秘密数据。比如系统自动登录的缺省密码、远程桌面协议的公钥、Windows数据保护应用程序编程接口使用的授权证书等信息。

使用该命令的时候,需要把上文提到的SYSTEM注册表的虚拟地址作为-y选项的参数和SECURITY注册表文件的地址作为-s选项的参数,lsa命令运行的部分结果如图3.9所示。

图3.8 lsadump 命令结果输出重定向到lsadump.txt

图3.9 lsadump命令部分运行结果

从图3.9的部分运行结果可以看见两条有用信息。第一处下划线的地方显示的是本地主机Administrator用户的密码:it19891004(这也确实是我电脑的开机密码);第二处下划线的地方15340529109@cqupt这个正好是我登陆NetKeeper连接互联网所使用的账号名称。当然,这只是部分与LSA相关的账户和密码信息,更多的信息还有待进一步挖掘。

第 14 页

参考文献

[1] 陈龙,麦永浩,黄传河.计算机取证技术.武汉大学出版社. 2007.3 [2] 王永全,齐曼.信息犯罪与计算机取证.北京出版社.2010.8 [3] 王艳平,张铮.Windows程序设计.人民邮电出版社.2008.2

[4] 徐志强.浅谈计算机内存数据获取及分析.全国计算机安全学术交流会论文集 [5] The Volatility Framework. http://code.google.com/p/volatility/ [6] MoonSols DumpIt goes mainstream.http://www.moonsols.com

[7] Stefan Vomel,Felix Freiling. A survey of main memory acquisition and analysis

techniques for the windows operating system.Digital Investigation 8 (2011)3-22

第 15 页

本文来源:https://www.bwwdw.com/article/g3tt.html

Top