内存取证_从镜像文件到信息获取


文章主要整理了一下内存取证相关内容,主要是基于Kali下的volatiliy工具为依托所进行的题目复盘与分析

工具准备

Kali2020版的话系统本身不携带volatiliy工具,需要手动进行下载

apt-get install volatility

题目复盘

ICS2020-工业安全靶场内存镜像分析

image.png-36.2kB

题目给了一个名为memory的文件,file命令看一下文件类型

root@kali:~/ncqz# file memory 
memory: data

正常的data数据,使用binwalk命令看一下

image.png-157.5kB

根据memory中存在的文件,我们可以推断该文件为内存镜像文件,这里借助volatiliy进行分析,首先判断镜像系统

root@kali:~/ncqz# volatility -f memory imageinfo
Volatility Foundation Volatility Framework 2.6
INFO    : volatility.debug    : Determining profile based on KDBG search...
          Suggested Profile(s) : WinXPSP2x86, WinXPSP3x86 (Instantiated with WinXPSP2x86)
                     AS Layer1 : IA32PagedMemoryPae (Kernel AS)
                     AS Layer2 : FileAddressSpace (/root/ncqz/memory)
                      PAE type : PAE
                           DTB : 0xad6000L
                          KDBG : 0x80546ae0L
          Number of Processors : 1
     Image Type (Service Pack) : 3
                KPCR for CPU 0 : 0xffdff000L
             KUSER_SHARED_DATA : 0xffdf0000L
           Image date and time : 2019-01-16 03:19:05 UTC+0000
     Image local date and time : 2019-01-16 11:19:05 +0800

判断出镜像为WinXP的系统,根据题目给我们的提示,需要找到黑客的登陆密码,首先获取一下系统中的用户名,这里需要知道WinXP的用户信息存储位置,

位置为:

SAM\SAM\Domains\Account\Users\Names #在Names下的各个子键就是当前系统所有的账户列表,包括隐藏的账户

因为SAM表属于注册表,我们可以使用volaility中printkey参数进行信息获取

volatility -f memory --profile=WinXPSP2x86 printkey -K "SAM\Domains\Account\Users\Names"

image.png-71.7kB

可以看到系统中的用户都为WinXP自带的用户,没有黑客自主创建的用户,那么唯一的可能就是黑客通过自带用户的弱口令登陆了系统,再尝试获取一下系统的用户名密码,要获取系统的用户名和密码首先要知道,系统的SAM表和SYSTAM表的虚拟位置,使用hivelist进行查看

volatility -f memory hivelist

image.png-173.7kB

使用hashdump指令对系统中的用户密码进行提取

volatility -f memory --profile=WinXPSP2x86 hashdump -y (注册表 system 的 virtual 地址 )-s (SAM 的 virtual 地址)
root@kali:~/ncqz# volatility -f memory --profile=WinXPSP2x86 hashdump -y 0xe101b008 -s 0xe1451b60
Volatility Foundation Volatility Framework 2.6
Administrator:500:0182bd0bd4444bf867cd839bf040d93b:c22b315c040ae6e0efee3518d830362b:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
HelpAssistant:1000:132893a93031a4d2c70b0ba3fd87654a:fe572c566816ef495f84fdca382fd8bb:::

成功获取到三个用户的hash加密的密码,使用cmd5进行解密

Administrator:123456789
Guest:空密码
HelpAssistant:8v@9dknykalak3

尝试使用用户的密码进行提交,最后flag为

flag{md5(123456789)}

某CTF内存取证

题目是在一次项目中甲方让帮忙看的一道题目,还是挺有意思的,就在这里记录一下

image.png-65.6kB

1GB的文件,仍然是脱到Kali下进行分析,文件名为mem.dump很明显的内存镜像,直接使用volatility查看系统版本

root@kali:~/ncqz# volatility -f mem.dump imageinfo
Volatility Foundation Volatility Framework 2.6
INFO    : volatility.debug    : Determining profile based on KDBG search...
          Suggested Profile(s) : Win7SP1x64, Win7SP0x64, Win2008R2SP0x64, Win2008R2SP1x64_24000, Win2008R2SP1x64_23418, Win2008R2SP1x64, Win7SP1x64_24000, Win7SP1x64_23418
                     AS Layer1 : WindowsAMD64PagedMemory (Kernel AS)
                     AS Layer2 : FileAddressSpace (/root/ncqz/mem.dump)
                      PAE type : No PAE
                           DTB : 0x187000L
                          KDBG : 0xf80003e02110L
          Number of Processors : 1
     Image Type (Service Pack) : 1
                KPCR for CPU 0 : 0xfffff80003e03d00L
             KUSER_SHARED_DATA : 0xfffff78000000000L
           Image date and time : 2019-11-13 08:39:44 UTC+0000
     Image local date and time : 2019-11-13 16:39:44 +0800

系统类型为Win7,简单的收集一下信息,查看一下cmd的历史命令

volatility -f mem.dump --profile=Win7SP1x64 cmdscan

image.png-86.7kB

看到提示,flag.ccx的文件密码与系统用户admin的登陆密码一样,那么我们的思路就比较清晰了,首先要获得到admin的登陆密码,之后再获取到加密的flag.ccx文件,即可获取到flag文件

获取admin用户的密码思路和第一题一样,首先获取SAM表和SYSTEM表的虚拟地址

volatility -f mem.dump --profile=Win7SP1x64 hivelist

image.png-141.9kB

之后使用hashdump命令获取系统用户的密码

root@kali:~/ncqz# volatility -f mem.dump --profile=Win7SP1x64 hashdump -y 0xfffff8a000024010 -s 0xfffff8a001590010
Volatility Foundation Volatility Framework 2.6
Administrator:500:6377a2fdb0151e35b75e0c8d76954a50:0d546438b1f4c396753b4fc8c8565d5b:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::

使用在线网站进行解密cmd5

image.png-30.1kB

成功获取到admin用户的密码

下一步获取系统中的flag.ccx文件,这里可以用filescan参数进行查询

root@kali:~/ncqz# volatility -f mem.dump --profile=Win7SP1x64 filescan | grep "flag.ccx"
Volatility Foundation Volatility Framework 2.6
0x000000003e435890     15      0 R--rw- \Device\HarddiskVolume2\Users\Administrator\Desktop\flag.ccx

可以看到flag.ccx文件在admin用户的桌面下,下一步根据文件的进行虚拟位置进行提取,使用dumpfiles指令进行提取

 volatility -f name --profile=Win7SP1x64 dumpfiles -Q (文件虚拟地址)--dump-dir=(指定输出目录) 

提取:

root@kali:~/ncqz# volatility -f mem.dump --profile=Win7SP1x64 dumpfiles -Q 0x000000003e435890 --dump-dir=./
Volatility Foundation Volatility Framework 2.6
DataSectionObject 0x3e435890   None   \Device\HarddiskVolume2\Users\Administrator\Desktop\flag.ccx
root@kali:~/ncqz# ls
file.None.0xfffffa800e4651a0.dat  mem.dump  memory

成功提取出文件,根据查询ccx可以使用挂载系统加密卷的方式进行访问,可以使用CnCrypt进行加载

image.png-37.3kB

使用我们获取到的admin的密码进行解密

image.png-15.8kB

成功挂载加密卷,读取flag文件

image.png-8.7kB

HDCTF-2019-内存取证

去年海南大学举办CTF的一道题目,最近又进行了一次复盘,考点也是很不错的

image.png-12.9kB

给了一个光盘映像文件,直接告诉我们是镜像了,呢就还是借用volatility进行分析把,还是先确定一下系统版本类型

root@kali:~/ncqz# volatility -f memory.img imageinfo
Volatility Foundation Volatility Framework 2.6
INFO    : volatility.debug    : Determining profile based on KDBG search...
          Suggested Profile(s) : Win2003SP0x86, Win2003SP1x86, Win2003SP2x86 (Instantiated with Win2003SP1x86)
                     AS Layer1 : IA32PagedMemoryPae (Kernel AS)
                     AS Layer2 : FileAddressSpace (/root/ncqz/memory.img)
                      PAE type : PAE
                           DTB : 0xe02000L
                          KDBG : 0x8088e3e0L
          Number of Processors : 1
     Image Type (Service Pack) : 1
                KPCR for CPU 0 : 0xffdff000L
             KUSER_SHARED_DATA : 0xffdf0000L
           Image date and time : 2019-04-25 08:43:06 UTC+0000
     Image local date and time : 2019-04-25 16:43:06 +0800

系统为Win2003版本,简单的收集一下信息,首先看看cmd的历史命令

 volatility -f memory.img --profile=Win2003SP1x86 cmdscan

image.png-46.3kB

没有有效的消息,看一下进程中是否存在可疑进程

volatility -f memory.img --profile=Win2003SP1x86 psscan

image.png-92.4kB

image.png-102.5kB

没有明显可疑的进程,看一下文件,是否存在可疑文件

root@kali:~/ncqz# volatility -f memory.img --profile=Win2003SP1x86 filescan | grep "flag"
Volatility Foundation Volatility Framework 2.6
0x000000000484f900      1      0 R--r-- \Device\HarddiskVolume1\Documents and Settings\Administrator\桌面\flag.png
0x000000000726a0f0      1      0 RW-rw- \Device\HarddiskVolume1\Documents and Settings\Administrator\Recent\flag.png.lnk

发现admin用户桌面上存在flag.png,dump出来看一下

volatility -f memory.img --profile=Win2003SP1x86 dumpfiles -Q 0x000000000484f900 --dump-dir=./

image.png-54kB

查看一下内容

image.png-91.6kB

是一个二维码,查看一下内容

image.png-37.1kB

jfXvUoypb8p3zvmPks8kJ5Kt0vmEw0xUZyRGOicraY4=

base64不能直接解密,猜测是AES或者DES加密,需要获取更多的信息才能解密,继续回到系统中查找信息,查看一下系统的窗口列表,哪个程序在调用flag.png,借用windows参数

 volatility -f memory.img --profile=Win2003SP1x86 windows | grep "flag.png"

image.png-29.7kB

根据获取到的信息找一下pid

image.png-87.3kB

根据pid分离一下进程,这里借用memdump

volatility -f name --profile=Win2003SP1x86 memdump -n chrome -D .
volatility -f name --profile=Win2003SP1x86 memdump -p pid -D .

分离:

root@kali:~/ncqz# volatility -f memory.img --profile=Win2003SP1x86 memdump -p 1992 -D ./
Volatility Foundation Volatility Framework 2.6
************************************************************************
Writing explorer.exe [  1992] to 1992.dmp
root@kali:~/ncqz# ls
1992.dmp 

binwalk看一下分离出的数据

image.png-113.5kB

存在不少数据,直接foremost强制分离一下

image.png-56kB

逐步看一下数据,看一下几个png文件

image.png-221.2kB

给了我们Key和iv,推测让我们AES解密,使用在线网站解密一下

image.png-54.2kB

2020-高校战“疫”—ez_mem&usb

这个是在年初的时候比赛遇到的,在博客上已经写过一次了,就直接转载过来了

首先解压获得流量包,分析流量,先去分析HTTP流了,发现在upload_file.php存在上传的压缩文件,手动进行导出分离

image.png-46kB

image.png-52.2kB

导出字节流,对压缩文件进行分析,解压出data.vmem文件

对data.vmem进行分析,先使用foremost分离文件,获取到压缩包

image.png-98kB

但是压缩包有密码需要进行破解,使用volatility对data.vmem进行分析,在查看cmd历史命令时发现提示

image.png-50.9kB

在cmd命令中获取到密码,解密获取到usedata.txt,标准的usb流量,使用脚本进行解密

mappings = { 0x04:"A",  0x05:"B",  0x06:"C", 0x07:"D", 0x08:"E", 0x09:"F", 0x0A:"G",  0x0B:"H", 0x0C:"I",  0x0D:"J", 0x0E:"K", 0x0F:"L", 0x10:"M", 0x11:"N",0x12:"O",  0x13:"P", 0x14:"Q", 0x15:"R", 0x16:"S", 0x17:"T", 0x18:"U",0x19:"V", 0x1A:"W", 0x1B:"X", 0x1C:"Y", 0x1D:"Z", 0x1E:"1", 0x1F:"2", 0x20:"3", 0x21:"4", 0x22:"5",  0x23:"6", 0x24:"7", 0x25:"8", 0x26:"9", 0x27:"0", 0x28:"\n", 0x2a:"[DEL]",  0X2B:"    ", 0x2C:" ",  0x2D:"-", 0x2E:"=", 0x2F:"[",  0x30:"]",  0x31:"\\", 0x32:"~", 0x33:";",  0x34:"'", 0x36:",",  0x37:"." }
nums = []
keys = open('usbdata.txt')
for line in keys:
    if line[0]!='0' or line[1]!='0' or line[3]!='0' or line[4]!='0' or line[9]!='0' or line[10]!='0' or line[12]!='0' or line[13]!='0' or line[15]!='0' or line[16]!='0' or line[18]!='0' or line[19]!='0' or line[21]!='0' or line[22]!='0':
         continue
    nums.append(int(line[6:8],16))
keys.close()
output = ""
for n in nums:
    if n == 0 :
        continue
    if n in mappings:
        output += mappings[n]
    else:
        output += '[unknown]'
print 'output :\n' + output

即可获取到flag

image.png-55kB

总结

最后整理一下volatility一些常用命令,方便复习和使用了

查看镜像版本

volatility -f name imageinfo

查看历史命令

volatility -f name --profile=Win2003SP1x86 cmdscan

列举进程

volatility -f name pslist

查看历史进程

volatility -f name --profile=Win2003SP1x86 psscan

查看文件

volatility -f name --profile=Win2003SP1x86 filescan

根据关键词查找文件

volatility -f name --profile=Win2003SP1x86 filescan | grep "strings"

获取SAM表中的用户:

volatility -f name --profile=WinXPSP2x86 printkey -K "SAM\Domains\Account\Users\Names"

获取网络连接情况

volatility -f name --profile=WinXPSP2x86 netscan

分离进程

volatility -f name --profile=Win2003SP1x86 memdump -n chrome -D .
volatility -f name --profile=Win2003SP1x86 memdump -p pid -D .

查看系统注册表信息

volatility -f memory hivelist

导出用户名和密码

volatility -f memory --profile=Win2003SP1x86 hashdump -y (注册表 system的虚拟地址 )-s (SAM的虚拟地址)

获取注册表中数据

volatility -f name  --profile=Win2003SP1x86 hivedump -o 注册表的虚拟地址

获取系统和桌面文件信息

volatility -f name --profile=Win2003SP1x86 userassist

获取系统里窗口列表

volatility -f name --profile=Win2003SP1x86 windows

获取桌面截图

volatility -f name –profile=Win2003SP2x86 screenshot –dump-dir=.

总的来说,内存取证还是比较有意思的一种题目类型,不过是在实际环境中取证,还是在CTF中作为题目让我们获取flag,都是一种总体的信息收集,这里总结的命令是我经常用的一些命令,以后再遇到新的点了再次进行更新


2 thoughts on “内存取证_从镜像文件到信息获取”

发表评论

电子邮件地址不会被公开。 必填项已用*标注