i春秋作家:lem0n
原文来自:浅谈内存取证
0x00 前言
网络攻击内存化和网络犯罪隐遁化,使部分关键数字证据只存在于物理内存或暂存于页面交换文件中,这使得传统的基于文件系统的计算机取证不能有效应对.内存取证作为传统文件系统取证的重要补充,是计算机取证科学的重要组成部分,通过全面获取内存数据、详尽分析内存数据,并在此基础上提取与网络攻击或网络犯罪相关的数字证据,近年来,内存取证已赢得安全社区的持续关注,获得了长足的发展与广泛应用,在网络应急响应和网络犯罪调查中发挥着不可替代的作用.首先回顾了内存取证研究的起源和发展演化过程;其次介绍了操作系统内存管理关键机制;然后探讨了内存取证的数据获取和分析方法,归纳总结目前内存取证研究的最新技术;最后讨论了内存取证存在的问题、发展趋势和进一步的研究方向.
? ——《内存取证研究与进展[J].软件学报,2015, 26(5): 1151-1172》
0x01 实验材料
kali 渗透测试系统
easy_dump.img 内存镜像
Volatility Framework 内存取证工具
TestDisk 文件恢复工具
0x02 Volatility Framework
volatility 框架是一款用于易失性内存取证的重量级框架。在该框架下我们可以完成许多取证的操作,获取我们想取得的信息。其支持的操作系统也非常广泛,同时支持 windows , linux, Mac OSX,甚至也支持 Android 手机使用ARM处理器的取证。因此,它也是所有网络取证爱好者的必学框架。
- volatility 使用:
- volatility -f <文件名> -–profile=<配置文件> <插件> [插件参数]
- 通过volatility --info获取工具所支持的profile,Address Spaces,Scanner Checks,Plugins
- 常用插件:
- imageinfo:显示目标镜像的摘要信息,知道镜像的操作系统后,就可以在 –profile 中带上对应的操作系统
- pslist:该插件列举出系统进程,但它不能检测到隐藏或者解链的进程,psscan可以
- psscan:可以找到先前已终止(不活动)的进程以及被rootkit隐藏或解链的进程
- pstree:以树的形式查看进程列表,和pslist一样,也无法检测隐藏或解链的进程
- mendump:提取出指定进程,常用foremost 来分离里面的文件
- filescan:扫描所有的文件列表
- hashdump:查看当前操作系统中的 password hash,例如 Windows 的 SAM 文件内容
- svcscan:扫描 Windows 的服务
- connscan:查看网络连接
0x03 实验过程
利用 volatility -f easy_dump.img imageinfo
查看镜像信息
- root@kali:~/Desktop# volatility -f easy_dump.img imageinfo
- Volatility Foundation Volatility Framework 2.6
- INFO : volatility.debug : Determining profile based on KDBG search...
- Suggested Profile(s) : Win7SP1x64, Win7SP0x64, Win2008R2SP0x64, Win2008R2SP1x64_23418, Win2008R2SP1x64, Win7SP1x64_23418
- AS Layer1 : WindowsAMD64PagedMemory (Kernel AS)
- AS Layer2 : FileAddressSpace (/root/Desktop/easy_dump.img)
- PAE type : No PAE
- DTB : 0x187000L
- KDBG : 0xf8000403f070L
- Number of Processors : 1
- Image Type (Service Pack) : 0
- KPCR for CPU 0 : 0xfffff80004040d00L
- KUSER_SHARED_DATA : 0xfffff78000000000L
- Image date and time : 2018-09-28 09:02:19 UTC+0000
- Image local date and time : 2018-09-28 17:02:19 +0800
根据Suggested Profile(s)
值猜测他是Win7SP1x64,所以利用--profile=Win7SP1x64
利用volatility -f easy_dump.img --profile=Win7SP1x64 hashdump
查看当前操作系统中的 password hash
- root@kali:~/Desktop# volatility -f easy_dump.img --profile=Win7SP1x64 hashdump
- Volatility Foundation Volatility Framework 2.6
- Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
- Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
- n3k0:1000:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
将hash复制到文档中,用john FileName --format=nt
进行密码破解(本次破解为空密码)
注:john破解的密码会保存在本地目录.john
中的john.pot
文件,如需再次破解相同密码需要使用--show或者将john.pot
文件删除。
- root@kali:~/Desktop# john hashdump.txt
利用volatility -f easy_dump.img --profile=Win7SP1x64 psscan
查看所有进程,通过所有进程来查看是否有可疑进程出现,进行进一步取证。
- root@kali:~/Desktop# volatility -f easy_dump.img --profile=Win7SP1x64 psscan
- Volatility Foundation Volatility Framework 2.6
- Offset(P) Name PID PPID PDB Time created Time exited
-
- ------
-
- 0x000000001a453a70 WmiApSrv.exe 2760 492 0x000000001a9ab000 2018-09-28 09:01:58 UTC+0000
- 0x0000000022e4e060 VSSVC.exe 2168 492 0x0000000002a44000 2018-09-28 09:01:39 UTC+0000
- ···
- 0x0000000022fd1b30 notepad.exe 2616 1312 0x000000000221c000 2018-09-28 09:01:51 UTC+0000
- ···
- 0x0000000023963b30 DumpIt.exe 2500 1312 0x000000000788b000 2018-09-28 09:02:18 UTC+0000
- 0x00000000239712a0 svchost.exe 716 492 0x000000000b836000 2018-09-28 09:01:34 UTC+0000
- ···
- 0x00000000250a3b30 dllhost.exe 2900 600 0x00000000226ab000 2018-09-28 09:02:14 UTC+0000
- 0x0000000025101930 dllhost.exe 2932 600 0x000000000d0c2000 2018-09-28 09:02:15 UTC+0000
- 0x0000000025131b30 smss.exe 248 4 0x000000001a0a6000 2018-09-28 09:01:33 UTC+0000
- 0x0000000025749b30 System 4 0 0x0000000000187000 2018-09-28 09:01:33 UTC+0000
通过观察进程可以看到 DumpIt.exe
此项进程,这个便是dump内存时的进程。
进程中有notepad.exe进程PID为2616我们提取一下,看看有无线索.
利用volatility -f easy_dump.img --profile=Win7SP1x64 memdump -p 2616 -D ./
文件将以进程号命名
- root@kali:~/Desktop# volatility -f easy_dump.img --profile=Win7SP1x64 memdump -p 2616 -D ./
- Volatility Foundation Volatility Framework 2.6
- ************************************************************************
- Writing notepad.exe [ 2616] to 2616.dmp
通过strings命令查看进程中有无关于flag的文字提示
- root@kali:~/Desktop
根据他的提示可以了解到flag并不在其中,应该在一个奇怪的图片里。
利用volatility -f easy_dump.img --profile=Win7SP1x64 filescan | grep -E 'jpg|png|jpeg|bmp|gif'
查看内存镜像中的文件,观察有无提示中所说的图片。
- root@kali:~/Desktop
内存镜像中只有phos.jpg这一张图片,下面尝试提取出来
利用volatility -f easy_dump.img --profile=Win7SP1x64 dumpfiles -Q 0x000000002408c460 -n --dump-dir=./
插件进行文件提取
-Q参数使用物理偏移量进行转储
-n以文件名保存
--dump-dir=目标存储位置
- root@kali:~/Desktop# volatility -f easy_dump.img --profile=Win7SP1x64 dumpfiles -Q 0x000000002408c460 -n --dump-dir=./
- Volatility Foundation Volatility Framework 2.6
- DataSectionObject 0x2408c460 None \Device\HarddiskVolume1\phos.jpg
- SharedCacheMap 0x2408c460 None \Device\HarddiskVolume1\phos.jpg

图片中并没有需要的内容,
因为文字提示是在2616.bmp中给出的,因此将之前提取出来的2616.dmp进行文件提取看看会不会有线索。
利用foremost 2616.dmp
提取文件
- root@kali:~/Desktop# foremost 2616.dmp
- Processing: 2616.dmp
- |***|
- root@kali:~/Desktop# cat output/audit.txt
- Foremost version 1.5.7 by Jesse Kornblum, Kris Kendall, and Nick Mikus
- Audit File
- Foremost started at Mon Oct 15 04:14:57 2018
- Invocation: foremost 2616.dmp
- Output directory: /root/Desktop/output
对提取的文件进行分析,发现其中zip文件中包含一个img镜像利用binwalk message.img
分析其包含的数据。
- root@kali:~/Desktop/output/zip# binwalk message.img
-
里面包含一个ext2的文件系统用binwalk -e message.img
分离出来
- root@kali:~/Desktop# binwalk -e message.img
-
挂载文件系统
- root@kali:~/Desktop
里面只有一个txt文件打开后发现里面是类似坐标的数字,由之前的提示说一张奇怪的图片联想这可能是图片的坐标点,所以编写python脚本尝试将图片提取出来。
- root@kali:/mnt# cat hint.txt
- 10 10
- 10 11
- 10 12
- 10 13
- ···
- 269 265
- 269 266
- 269 267
- 269 268
- 269 269
python脚本:
- import Image
- flag_image = Image.new('RGB',(300,300),(0,0,0))
- f = open('hint.txt')
- for line in f.readlines():
- point = line.split()
- flag_image.putpixel([int(point[0]),int(point[1])],(255,255,255))
- f.close()
- flag_image.save('flag_image.jpg')

识别结果:Here is the vigenere key: aeolus, but i deleted the encrypted message。
根据提示说用了vigenere并且key为aeolus,但是他删除了信息...
那么接下来就要用到testdisk /dev/loop0
来进行文件恢复。

将此文件复制到桌面提取其中信息
- root@kali:~/Desktop/_message.img.extracted/.Trash-0/files
最下面的字符串应该就是flag了,根据之前提示的vigenere加密并且key为aeolus进行解密
结果:yeetjustfindandsolve
———————————————自此护网杯easy_dump的取证工作完毕——————————————
0x04 知识延伸
本文未用到dll,注册表等取证使用方法,其他取证方法我附上网址供大家学习
https://digital-forensics.sans.org/media/volatility-memory-forensics-cheat-sheet.pdf
0x05 制作内存镜像
DumpIt 是一款绿色免安装的 windows 内存镜像取证工具。利用它我们可以轻松地将一个系统的完整内存镜像下来。
只要双击打开DumpIt.exe输入y等待一会出现Success就是dump成功。
默认情况下,文件名是主机名(主机名),其后是执行映像过程的日期。该文件默认保存为“raw”格式。


利用kali分析

大家有任何问题可以提问,更多文章可到i春秋论坛阅读哟~