打CTF这么久,内存取证的题也就做过一次,刚好安恒四月月赛出了一题,简单记录一下。

内存取证题附件后缀一般为rawdmpimgvmem 等,此类问题一般可以通过volatility 取证大师等工具解决,volatility是Kali下自带的一款工具,直接调用命令即可,而取证大师则为执法人员取证工具,功能强大,一般情况下搞不到这个工具,虽然我有那个工具,但是想记录一下volatility的使用,就不用取证大师了。

关于volatility的一些常用命令:

imageinfo

识别操作系统:

1
volatility -f example.raw imageinfo

pslist/pstree/psscan

扫描进程:

1
volatility -f example.raw --profile=Win7SP1x64 pslist

filescan

扫描文件:

1
volatility -f example.raw --profile=Win7SP1x64 filescan | grep -E 'txt|png|jpg|gif|zip|rar|7z|pdf|doc'

cmdscan

查看终端输入历史

dumpfile/memdump

导出文件:

1
2
3
4
5
volatility -f example.raw --profile=Win7SP1x64 memdump -p [PID] -D ./

or

volatility -f example.raw --profile=Win7SP1x64 dumpfiles -Q [Offset] -D ./

调用插件

1
volatility [plugins] -f example.raw --profile=Win7SP1x64

[2020安恒四月月赛]

首先识别一下操作系统,发现为Win7SP1x64系统:

1
volatility -f Keyboard.raw imageinfo

接下来看一下进程,发现一个keyboard-log.e文件:

1
volatility -f Keyboard.raw --profile=Win7SP1x64 pslist

接着扫一下文件,发现keyboard-log.e下有一个可疑文本文件t.txt

1
volatility -f Keyboard.raw --profile=Win7SP1x64 filescan | grep -E 'txt|png|jpg|gif|zip|rar|7z|pdf|doc'

导出该文本文件,并查看:

1
volatility -f Keyboard.raw --profile=Win7SP1x64 dumpfiles -Q 0x000000003d700880 -D ./

得到如下内容,ctfwikiCRYPTO ABC提示下一行密文加密方式,搜了一下为电脑键盘 QWE加密,解密后得到veracryptpasswordiskeyboarddraobyek,也就是提示veracrypt的密码是keyboarddraobyek,同时由下面的提示得知密码为大写,所以得到密码KEYBOARDDRAOBYEK

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2020- 3-29 22:35:25
[BP][BP][BP][BP]hhhhh flag is not n[BP]here

2020- 3-29 22:35:30

2020- 3-29 22:36:41
ctfwikiCRYPTO ABC
CTKQEKNHZHQLLVGKROLATNWGQKRRKQGWNTA

2020- 3-29 22:37:23
[BP][BP]decrypto hou xiao xie geng[BP][BP] yi kan chu
#解密后小写更易看出

2020- 3-29 22:39:24
But the password is in uppercase
#但是密码是大写的

2020- 3-29 22:38:55
a

网上找了一个QWE解密脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def search(x):
return {'q': 'a', 'w': 'b', 'e': 'c', 'r': 'd', 't': 'e', 'y': 'f', 'u': 'g', 'i': 'h', 'o': 'i',
'p': 'j', 'a': 'k', 's': 'l', 'd': 'm', 'f': 'n', 'g': 'o', 'h': 'p', 'j': 'q', 'k': 'r',
'l': 's', 'z': 't', 'x': 'u', 'c': 'v', 'v': 'w', 'b': 'x', 'n': 'y', 'm': 'z',
}.get(x, x)


def main():
crypto = 'CTKQEKNHZHQLLVGKROLATNWGQKRRKQGWNTA'
crypto = crypto.lower()
for i in crypto:
print(search(i), end='')


if __name__ == "__main__":
main()

根据上一步以及另一个附件名secret可知该附件为一个加密磁盘,接着使用磁盘分区加密工具veracrypt挂载,挂载后打开得到另一个磁盘,直接打开得到假flag:flag{flag_Hidden_in_zhe_but_not_me},接下来有两种解决方法

Strings打印字符串

1
strings here.vhd

NTFS隐写

首先挂载vhd硬盘镜像文件,Win10上面直接点击这个文件就可挂载,然后发现假的flag为一个隐藏文件,取消隐藏后终端运行dir /r,发现为NTFS隐写,然后可以通过Ntfs Streams Editor工具或者notepad命令读取flag:

1
notepad flag.txt:hahaha.txt

[RoarCTF2019]forensic

这道题能读到很多可以信息,但是似乎都是属于另一道题的,解决该题其实需要的线索很少,看到这么多可疑信息本来很懵,后来发现挺简单。

依旧是那一套操作

首先识别操作系统,为Win7SP1x86

1
volatility -f mem.raw imageinfo

然后查进程,发现几个可疑进程:

1
volatility -f mem.raw --profile=Win7SP1x86 pslist

Name PID

TrueCrypt.exe 3260 #虚拟磁盘加密工具

notepad.exe 3524 #记事本

mspaint.exe 3620 #画图

iexplore.exe 3700 #浏览器

DumpIt.exe 3380 #内存镜像取证工具

TrueCrypt是虚拟磁盘加密工具,down下来看看有没有东西:

1
volatility -f mem.raw --profile=Win7SP1x86 memdump -p 3260 -D ./

foremost分离down下来的文件,发现存在flag.txt文件,打开发现在一个压缩包里,并且压缩包是加密的:

1
foremost 3260.dmp

接着扫文件,发现可疑文件无标题.png

1
volatility -f mem.raw --profile=Win7SP1x86 filescan | grep -E 'txt|png|jpg|gif|zip|rar|7z|pdf|doc'

将该图片down下来,发现是一个无序字符串,疑似解压密码:

1
volatility -f mem.raw --profile=Win7SP1x86 dumpfiles -Q 0x000000001efb29f8 -D ./

仔细辨别并尝试解压后为得到1YxfCQ6goYBD6Q,也可以使用掩码爆破,最终在压缩包内得到flag:

首发于Sec-IN安全论坛:记一次CTF简单内存取证