usb&内存取证

预备知识:wireshark流量分析、binwalk、内存取证、USB、volatility 、strings、grep

参考、致敬:CTF 内存取证 USB流量分析

附件分析

拿到附件后,只有一个数据包文件。不用想,直接用wireshark打开分析一波。
##文件分析
这玩意确实挺大的,首先考虑包含了文件,使用kali linux 下的工具binwalk分析一波。
但是binwalk出来的附件在解压时都损坏了,此路不通。
继续分析我们的流量包,追踪http协议。
发现了巨大的包,可能有附件,于是在wireshark中导出http对象。(左上角文件-导出对象-http)
接下来观察导出的文件
有两个一样的较大的php文件,考虑文件包含。再次丢到binwalk里面分析一波。
果不其然,分离出了data.vmem文件。可以理解为vmem文件保存了当时内存中的数据,以支持在虚拟机中的暂停功能。
接下来用内存分析工具volatility 分析data.vmem
使用方法: volatility -f filename imageinfo //查看镜像信息。
通过imageinfo 可以确定,镜像为WinXPSP2x86或者WinXPSP3x86.(影响不大)
接下来使用命令 volatility -f data.vmem –profile=WinXPSP2x86 filescan 扫描内存中的文件
可以看到有一堆文件。由于是ctf比赛,尝试过滤文件:比赛名称xctf或者flag 即
volatility -f data.vmem –profile=WinXPSP2x86 filescan |grep flag
volatility -f data.vmem –profile=WinXPSP2x86 filescan |grep xctf]
通过过滤flag 我们找到了flag.img文件。

DUMP IT!

接下来需要做的事将flag.img 导出。
使用命令 volatility -f data.vmem –profile=WinXPSP2x86 dumpfiles -Q 0x0000000001155f90 -D ./
将文件导出至当前目录。
导出文件为二进制格式。
接下来继续binwalk分析。
可以得到一个压缩包,压缩包里包含了加密的usb.txt文件。下一步就是获取加密的密码。
在尝试爆破的同时,继续进行内存取证分析。
通过volatility工具的子命令 hivelist 可以获得内存中的注册表信息,cmdscan查看cmd操作,connscan查看网络连接,pslist查看进程。
通过cmscan我们可以发现提示了密码:
尝试将该密码作为文件的解压密码(使用360解压,可以自动修复文件)—-成功!
现在获得了敲击码,接下来就是将敲击码转换为字符。
使用脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import sys
import os


usb_codes = {
0x04:"aA", 0x05:"bB", 0x06:"cC", 0x07:"dD", 0x08:"eE", 0x09:"fF",
0x0A:"gG", 0x0B:"hH", 0x0C:"iI", 0x0D:"jJ", 0x0E:"kK", 0x0F:"lL",
0x10:"mM", 0x11:"nN", 0x12:"oO", 0x13:"pP", 0x14:"qQ", 0x15:"rR",
0x16:"sS", 0x17:"tT", 0x18:"uU", 0x19:"vV", 0x1A:"wW", 0x1B:"xX",
0x1C:"yY", 0x1D:"zZ", 0x1E:"1!", 0x1F:"2@", 0x20:"3#", 0x21:"4$",
0x22:"5%", 0x23:"6^", 0x24:"7&", 0x25:"8*", 0x26:"9(", 0x27:"0)",
0x2C:" ", 0x2D:"-_", 0x2E:"=+", 0x2F:"[{", 0x30:"]}", 0x32:"#~",
0x33:";:", 0x34:"'\"", 0x36:",<", 0x37:".>", 0x4f:">", 0x50:"<"
}

def code2chr(filepath):
lines = []
pos = 0
for x in open(filepath,"r").readlines():
code = int(x[6:8],16) # 即第三个字节
if code == 0:
continue
# newline or down arrow - move down
if code == 0x51 or code == 0x28:
pos += 1
continue
# up arrow - move up
if code == 0x52:
pos -= 1
continue

# select the character based on the Shift key
while len(lines) <= pos:
lines.append("")
if code in range(4,81):
if int(x[0:2],16) == 2:
lines[pos] += usb_codes[code][1]
else:
lines[pos] += usb_codes[code][0]

for x in lines:
print(x)


if __name__ == "__main__":
# check argv
if len(sys.argv) != 2:
print("Usage:\n\tpython keyboardScanCode.py datafile.txt\nhow to get datafile:\t tshark -r file.usb.pcapng -T fields -e usb.capdata > datafile.txt")
exit(1)
else:
filepath = sys.argv[1]
code2chr(filepath)

读取usbdata.txt即可获取flag.

注意将括号[]转为{}

题目总结