volatility内存取证工具的学习和使用
我最近正在学习misc的内存取证和日志分析,volalility是一个常用的内存取证分析工具,接下来我们一起来看看它的几个使用方法和典型CTF赛题
volatility下载地址:https://github.com/volatilityfoundation/volatility
本文使用的版本非volatility3版本,而是老版本,需要python2运行
例题:
选自 [陇剑杯 2021]内存分析:
1.网管小王制作了一个虚拟机文件,让您来分析后作答:
虚拟机的密码是_____________。
首先,我们下载附件之后,看到压缩包里有一个vmem格式的文件

Tip:什么是VMEM格式的文件?
VMEM格式的文件通常与虚拟机有关。VMEM文件是VMware虚拟机使用的分页或交换文件,用来备份主内存文件(以.VMX后缀的文件)中的数据,在虚拟机电源被关闭时使用。当虚拟机正在运行而主机的物理内存不足以支持它时,系统会将一部分虚拟机内存数据存储到VMEM文件中。 这个文件通过存储虚拟机的物理RAM内容,可以在虚拟机启动时提供状态恢复功能。如果您需要处理此类文件,通常是因为您正在管理虚拟机或者需要分析虚拟机的运行状态。 在某些情况下,如果虚拟机没有正常关闭,例如突然断电,VMEM文件就可以用来恢复虚拟机运行前的状态。然而,由于这些文件可能非常大,并且包含了大量的数据,所以通常不会被移动或编辑。 正常的虚拟机操作不需要用户直接与VMEM文件交互。
我们这时就需要用到volatility工具分析这个vmem格式的文件,将其拖入kali linux 虚拟机中,我们可以使用
1 | python2 vol.py -f Target.vmem imageinfo |

来查看Target.vmem文件的镜像信息,这里的-f 指的是 file ,用于指定文件,imageinfo是查看镜像文件的信息,imageinfo在内存取证中一般都是经常使用的

这里的profile给出了一堆操作系统的名称,这是volatility工具预测的该我文件可能的操作系统版本,如果你能确定是哪个就选择哪个,否则可能需要挨个尝试,我们直接选择第一个尝试
我们通过命令
1 | python2 vol.py -f Target.vmem --profile Win7SP1x64 lsadump |
lsadump 插件用于提取的LSA(本地安全权限)密钥信息包括几个敏感部分,如:
- SAM (安全账户管理器) 哈希: 这是存储本地账户密码哈希的地方。在系统不加密这些密码的情况下(例如在未启用系统加密的老旧系统中),这些哈希可以被破解以还原出用户的明文密码。
- LSA Secrets: Windows系统用来存储各种系统级别的敏感信息的加密库,比如服务账号密码、系统加密密钥等。这可以包括用于自动登录功能的账户密码等。
- 缓存的域验证信息: 当用户登录到域控制器时,系统会缓存一份密码验证信息供以后使用,这在用户无法连接到域控制器时仍允许其登录。
来提取和密码有关的信息,提取密码这样的敏感信息我们可以使用lsadump插件

于是我们得到了flag
可以使用python脚本提取
1 | flag_str = "f.l.a.g.{.W.3.1. C.0.M.3...T.0... T.H.i.S...3.4.S. Y...F.0.R.3.N.S. i.C.X.}" |
网管小王制作了一个虚拟机文件,让您来分析后作答:
虚拟机中有一个某品牌手机的备份文件,文件里的图片里的字符串为_____________。(解题过程中需要用到上一题答案中flag{}内的内容进行处理。)
我们还是采用volatility进行分析
1 | python2 vol.py -f Target.vmem --profile Win7SP1x64 filescan | grep "Desktop" |
filescan是Volatility框架中的一个插件,它用于扫描整个物理内存的转储,以搜索Windows文件对象。这个插件会检索表示打开文件的_FILE_OBJECT结构的列表,并提供关于这些文件的详细信息,例如文件的名称、文件的大小、文件的位置以及关联的文件句柄等。
filescan插件非常有用,因为即便是已经被删除的文件,只要它们的文件对象仍然存在于内存中,这个插件依然能够检索到这些文件的信息。这对于取证分析来说是非常重要的,因为它可以揭示系统在某一特定时间点的文件活动情况。

我们发现了有华为手机品牌的名字,接着我们尝试提取它

提取
1 | python2 vol.py -f Target.vmem --profile Win7SP1x64 dumpfiles -Q 0x000000007d8c7d10 -D./ |
-Q后面跟的是偏移量
参数
-D后面跟随的./表示当前目录,也就是说,此命令将会把提取的文件保存在你正在执行这个Volatility命令时所在的目录。通常在一个 Linux 或类 Unix 系统中,.表示当前目录,而/是路径分隔符



再使用binwalk分离,注意要加上–run-as=root
1 | binwalk -e file.None.0xfffffa80037e0af0.dat --run-as=root |

提取后得到了一个压缩包文件,但是unzip解压不了,给给权限后图形界面解压,得到是华为的文件

这可能是一个华为手机的备份文件,我们使用华为备份工具kobackupdec恢复
kobackupdec:https://github.com/UltraUser/kobackupdec
输入命令,”W31C0M3_T0_THiS_34SY_F0R3NSiCX“这个是上题的flag,题目说有用,其实就是在这里当作密码
1 | python3 kobackupdec.py -vvv W31C0M3_T0_THiS_34SY_F0R3NSiCX "/home/kali/volatility-master/_file.None.0xfffffa80037e0af0.dat-0.extracted/HUAWEI P40_2021-aa-bb xx.yy.zz" ./backup |
得到
1 | ──(kali㉿kali)-[~/volatility-master/_file.None.0xfffffa80037e0af0.dat-0.extracted/kobackupdec-master] |
查看提取到的文件,发现了flag照片

新发现:
- 才发现unzip命令不能解压tar文件
- tar压缩文件可以使用 tar -xzf filename.tar来解压
在Linux系统中,使用
tar命令来解压缩文件非常常见。tar是一种归档打包工具,可以将多个文件和目录打包成一个.tar文件。它还可以与压缩工具结合使用,比如gzip或bzip2,来减小归档文件的大小。 解压tar文件的基本命令是:
1 tar -xvf file.tar
-x表示解压缩(extract)。-v表示显示详细过程(verbose)。-f表示指定文件名(file)。如果tar文件还经过gzip压缩(文件扩展名通常为
.tar.gz或.tgz),可以使用:
1 tar -zxvf file.tar.gz
-z选项会告知tar命令要调用gzip来进行解压。如果tar文件是使用bzip2压缩的(文件扩展名为
.tar.bz2),可以这样操作:
1 tar -jxvf file.tar.bz2
-j选项指定tar命令调用bzip2进行解压。要记住的关键是,解压tar文件的话,就添加
-x参数;如果tar文件还经过了压缩,那么就根据压缩类型添加相应的参数(gzip是-z,bzip2是-j)。对于.xz使用-J,对于.tar.zst使用--zstd选项。