文章主要整理了一下内存取证相关内容,主要是基于Kali下的volatiliy工具为依托所进行的题目复盘与分析
Contents
工具准备
Kali2020版的话系统本身不携带volatiliy工具,需要手动进行下载
apt-get install volatility
题目复盘
ICS2020-工业安全靶场内存镜像分析
题目给了一个名为memory的文件,file命令看一下文件类型
root@kali:~/ncqz# file memory
memory: data
正常的data数据,使用binwalk命令看一下
根据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"
可以看到系统中的用户都为WinXP自带的用户,没有黑客自主创建的用户,那么唯一的可能就是黑客通过自带用户的弱口令登陆了系统,再尝试获取一下系统的用户名密码,要获取系统的用户名和密码首先要知道,系统的SAM表和SYSTAM表的虚拟位置,使用hivelist进行查看
volatility -f memory hivelist
使用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内存取证
题目是在一次项目中甲方让帮忙看的一道题目,还是挺有意思的,就在这里记录一下
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
看到提示,flag.ccx的文件密码与系统用户admin的登陆密码一样,那么我们的思路就比较清晰了,首先要获得到admin的登陆密码,之后再获取到加密的flag.ccx文件,即可获取到flag文件
获取admin用户的密码思路和第一题一样,首先获取SAM表和SYSTEM表的虚拟地址
volatility -f mem.dump --profile=Win7SP1x64 hivelist
之后使用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
成功获取到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进行加载
使用我们获取到的admin的密码进行解密
成功挂载加密卷,读取flag文件
HDCTF-2019-内存取证
去年海南大学举办CTF的一道题目,最近又进行了一次复盘,考点也是很不错的
给了一个光盘映像文件,直接告诉我们是镜像了,呢就还是借用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
没有有效的消息,看一下进程中是否存在可疑进程
volatility -f memory.img --profile=Win2003SP1x86 psscan
没有明显可疑的进程,看一下文件,是否存在可疑文件
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=./
查看一下内容
是一个二维码,查看一下内容
jfXvUoypb8p3zvmPks8kJ5Kt0vmEw0xUZyRGOicraY4=
base64不能直接解密,猜测是AES或者DES加密,需要获取更多的信息才能解密,继续回到系统中查找信息,查看一下系统的窗口列表,哪个程序在调用flag.png,借用windows参数
volatility -f memory.img --profile=Win2003SP1x86 windows | grep "flag.png"
根据获取到的信息找一下pid
根据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看一下分离出的数据
存在不少数据,直接foremost强制分离一下
逐步看一下数据,看一下几个png文件
给了我们Key和iv,推测让我们AES解密,使用在线网站解密一下
2020-高校战“疫”—ez_mem&usb
这个是在年初的时候比赛遇到的,在博客上已经写过一次了,就直接转载过来了
首先解压获得流量包,分析流量,先去分析HTTP流了,发现在upload_file.php存在上传的压缩文件,手动进行导出分离
导出字节流,对压缩文件进行分析,解压出data.vmem文件
对data.vmem进行分析,先使用foremost分离文件,获取到压缩包
但是压缩包有密码需要进行破解,使用volatility对data.vmem进行分析,在查看cmd历史命令时发现提示
在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
总结
最后整理一下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,都是一种总体的信息收集,这里总结的命令是我经常用的一些命令,以后再遇到新的点了再次进行更新
fafuRichard says:
kali2020 apt-get不到volatility了,博主可以出一个volatility3的安装教程吗
Pdsdt says:
那应该是源的问题,我这里是比较方便的,直接apt-get install volatility即可,我用的是国内的清华源