如何在Haystack中找到Needle:使用MemLabs
2020-05-03 10:30:00 Author: www.4hou.com(查看原文) 阅读量:309 收藏

最近,我遇到了一个基于内存取证的新发布的CTF,称为MemLabs,并且由于内存取证在恶意软件分析中是一个非常重要的手段,因此我决定放弃我常用的Volatility Framework,Volatility是一款基于GNU协议的开源框架,使用Python语言编写而成的内存取证工具集,可以分析内存中的各种数据。Volatility支持对32位或64位Wnidows、Linux、Mac、Android操作系统的RAM(随机存储器)数据进行提取与分析。

从本文开始,我将分别讲述如何使用Volatility,GHex和GIMP来完成内存取证。

挑战1

在第一个挑战中,我们获得了一个大内存转储文件。与大多数CTF不同,它没有关于我们应该寻找的内容或任何初始提示的真实描述。虽然这看起来没什么帮助,但它可以很好地复制现实运行中的情况,在查明Rootkit或逃避间谍软件等恶意软件的位置时,没有任何提示。因此,首先,我们需要获取有关映像的一些信息,例如映像来自什么操作系统。为此,我们可以运行以下命令:

volatility -f MemoryDump_Lab1.raw imageinfo

查看上图的输出结果,我们可以看到第一个建议的配置文件是Win7SP1x64,因此我们将其添加到我们使用的每个命令中:

–profile=Win7SP1x64

现在我们知道这是来自使用Windows 7系统的计算机,让我们继续检查运行的进程,看看是否有异常运行。为了检查这一点,我们可以使用pslist模块,该模块列出了内存转储时所有正在运行的进程。为了执行此模块,我们可以使用以下命令:

volatility -f MemoryDump_Lab1.raw --profile=Win7SP1x64 pslist

在进程列表中扫描,有几个值得注意的正在运行的进程; mspaint.exe,WINRAR.exe,DumpIt.exe和cmd.exe。此时,我将假设DumpIt.exe只是用来创建内存转储的工具,因此我们将只在其他3个文件之后研究它。让我们首先看一下cmd.exe,因为它一个非常简单地转储命令行参数。我们需要做的(请注意PID: 1984)是执行控制台模块,因此该命令最终如下所示:

volatility -f MemoryDump_Lab1.raw --profile=Win7SP1x64 consoles

查看输出的命令结果,我们可以看到cmd.exe和conhost.exe都已传递了某种形式的命令行,但是我们主要对cmd.exe感兴趣。在命令提示符中发生的所有事情是执行命令St4G3$1,该命令返回以下值:

ZmxhZ3t0aDFzXzFzX3RoM18xc3Rfc3Q0ZzMhIX0=

可以看到它是经过Base64编码的,因此让我们继续使用CyberChef对其进行解码。

果然,解码后,我们得到了我们想要的结果。

挑战2

以上,我们从cmd.exe中获得了一个想要的输出结果,让我们来看看mspaint.exe。这个挑战比上一个要难得多,但是我仍然可以完成!

在尝试挑战之前,我已经猜到了该挑战可能是在mspaint中打开的映像,所以我想先将实际的进程转储到一个更小的文件中,以便使用。为此,我们可以使用以下命令,其中-D表示要存储转储文件的目录,-p是mspaint的PID:

volatility -f MemoryDump_Lab1.raw --profile=Win7SP1x64 memdump -p 2424 -D Dump/

此时,我尝试了用几种不同的方法来从转储中转储映像,直到我偶然发现这篇关于从内存中提取原始映像的文章。当文件在mspaint中打开时,魔法字节似乎并不存储在内存中,因此尝试用模块转储它们或从内存中删除它们是徒劳的。因此,我们必须将转储2424.dmp重命名为2424.data,然后使用GIMP将其打开。

打开它后,我们会得到一个弹出框,首先需要将映像类型更改为RGB Alpha,然后我们要增大宽度和高度。

注意:要缓慢增加偏移量,尽管二进制数据太小而无法显示,但我们可以开始在二进制文件中看到一些数据。因此,我们需要缓慢减小或增大宽度,直到变得更清晰为止。

当映像完全清晰后,可以对其进行微调,然后单击“确定”,将映像旋转180度(BMP的存储位置是颠倒的),然后阅读文字内容即可!

令人烦恼的是,这篇文章似乎有一部分是倒着的,所以它不是最容易辨认的,但是经过一番凝视,我们终于看到了下面的内容!

flag_2.png

现在进入最后一个挑战!

挑战3

还记得我是怎么说的吗?主要原因是,我没有执行模块控制台,而是执行cmdline。这显示了每个进程的命令行,因此我注意到WINRAR.exe具有以下命令行:

************************************************************************
WinRAR.exe pid:   1512
Command line : "C:\Program Files\WinRAR\WinRAR.exe" "C:\Users\Alissa Simpson\Documents\Important.rar"
************************************************************************

很明显, Important.rar中有我们需要的信息。从以上命令行中,我们知道该文件已被发送到WinRAR中,很可能存储在内存中,所以我首先要做的是在进程上运行memdump,然后搜索.rar魔术字节:Rar!。

果然,我能够在内存中找到它,并查看压缩文件的内容;一个名为flag3.png的PNG。由于将它从内存中取出会花费太长时间,因此我们可以使用列出了由Volatility定位的所有文件的模块filescan,并且我们可以将这个输出grep为只显示带有“Important”的字符串,以便找到我们的RAR文件。得到的命令如下:

volatility -f MemoryDump_Lab1.raw --profile=Win7SP1x64 filescan | grep “Important”

最左边的值是内存中文件的偏移量,我们可以使用它来非常简单地提取RAR文件。幸运的是,所有的文件都是相同的,所以我们不需要担心选择哪个偏移量。我们可以使用以下命令来转储它:

volatility -f MemoryDump_Lab1.raw --profile=Win7SP1x64 dumpfiles -Q 0x000000003fb48bc0 -D Dump/

文件被转储出来后,我们现在可以提取flag3.png并查看它!

很不幸这些时受密码保护的,于是我只能回到我做的原始memdump,在转储中运行字符串,并对字符串“pass”进行grep,以查看是否在任何地方提到了它。

果然,破解成功,而且RAR文件的密码似乎是Allisa帐户密码的NTLM哈希,这很容易找到,仅需执行模块hashdump,我们就可以查看每个用户的NTLM哈希,包括Allisa的:

f4ff64c8baac57d22f22edc681055ba6

将其用大写形式输入并作为RAR的密码,就得到了最终的内存结果!

恭喜你!你已经成功完成了MemLabs CTF的第一个挑战!我计划在接下来的几周内完成其他挑战。

本文翻译自:https://0ffset.net/reverse-engineering/mem-forensics-lab-1/如若转载,请注明原文地址:


文章来源: https://www.4hou.com/posts/0XZN
如有侵权请联系:admin#unsafe.sh