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
2
3
4
5
6
7
8
9
10
11
12
13
14
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.}"
filteres_flag = ""
i = 0
while (i<len(flag_str)):
if flag_str[i:i+3] == "...":
filteres_flag += " "
i+=3
elif flag_str[i] in ['.',' ']:
filteres_flag += ''
i+=1
else:
filteres_flag+=flag_str[i]
i+=1
print(filteres_flag)

网管小王制作了一个虚拟机文件,让您来分析后作答:
虚拟机中有一个某品牌手机的备份文件,文件里的图片里的字符串为_____________。(解题过程中需要用到上一题答案中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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
──(kali㉿kali)-[~/volatility-master/_file.None.0xfffffa80037e0af0.dat-0.extracted/kobackupdec-master]
└─$ 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
INFO:root:searching backup in [/home/kali/volatility-master/_file.None.0xfffffa80037e0af0.dat-0.extracted/HUAWEI P40_2021-aa-bb xx.yy.zz]
INFO:root:got info.xml, going to decrypt backup files
INFO:root:Parsing file /home/kali/volatility-master/_file.None.0xfffffa80037e0af0.dat-0.extracted/HUAWEI P40_2021-aa-bb xx.yy.zz/info.xml
DEBUG:root:Ignoring HeaderInfo entry.
DEBUG:root:Ignoring BackupFilePhoneInfo entry
DEBUG:root:Ignoring BackupFileVersionInfo entry
DEBUG:root:Parsing BackupFilesTypeInfo
DEBUG:root:crypto_init: using version 3.
DEBUG:root:SHA256(BKEY)[16] = b'b42ec8a3ef141e7af8f32ddd74c08cd2'
WARNING:root:Empty CheckMsg! Cannot check backup password!
WARNING:root:Assuming the provided password is correct...
INFO:root:parsing xml file picture.xml
DEBUG:root:DecryptInfo dump ---
password:b'W31C0M3_T0_THiS_34SY_F0R3NSiCX', good:True, has media:False, file info:1, media info:0, multimedia file:1, system data info:0, system folder data info:0
DUMPING FILE INFO ITEMS
NAME: alarm, TYPE: BackupFileModuleInfo,
DUMPING MEDIA INFO ITEMS
DUMPING MULTIMEDIA FILE ITEMS
NAME: None, TYPE: Multimedia, PATH: storage/MediaTar/images/images0.tar,
DUMPING SYSTEM DATA INFO ITEMS
DUMPING SYSTEM DATA FOLDER INFO ITEMSINFO:root:working on alarm.db
DEBUG:root:searching key [alarm] of info_type.SYSTEM_DATA
DEBUG:root:unable to get [alarm], trying on all types
DEBUG:root:decrypt info [alarm] found
INFO:root:working on [images0.tar.enc]
DEBUG:root:searching key [storage/MediaTar/images/images0.tar] of info_type.MULTIMEDIA
DEBUG:root:decrypt info [storage/MediaTar/images/images0.tar] found
INFO:root:No media folder found.
INFO:root:setting all decrypted files to read-only

查看提取到的文件,发现了flag照片

新发现:

  1. 才发现unzip命令不能解压tar文件
  2. 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选项。