`提示:掌握基础很关键
记住走流程的关键命令:
volatility -f [内存文件名] imageinfo 特别关注Suggested Profile(s)的第镜像信息版本类型
volatility -f [内存文件名] --profile=(系统版本) filescan | grep “flag” 单个条件
volatility -f [内存文件名] --profile=(系统版本) filescan | grep -E “jpg|png|jpeg|bmp|gif” 多个条件
volatility -f [内存文件名] --profile=(系统版本) pslist 查看进程
volatility -f [内存文件名] --profile=(系统版本) pstree 查看进程列表(树形)
volatility -f [内存文件名] --profile=(系统版本) dumpfiles -Q 0xxxxxx --dump-dir=./
volatility -f [内存文件名] --profile=(系统版本) memdump -p 123 -D ./
volatility -f [内存文件名] --profile=(系统版本) procdump -p 1234 -D ./
volatility -f [内存文件名] --profile=(系统版本) printkey -K “SAM\Domains\Account\Users\Names”
volatility -f [内存文件名] --profile=(系统版本) printkey -K “SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon”
volatility -f [内存文件名] --profile=(系统版本) hivelist
获取密码哈希:
1.获取system 的 virtual 地址,SAM 的 virtual 地址:
volatility -f mem.raw --profile=WinXPSP2x86 hivelist
2.hashdump:
volatility -f mem.raw --profile=WinXPSP2x86 hashdump -y 0xe1018358 -s 0xe16acb60
volatility -f [内存文件名] --profile=(系统版本) cmdline
volatility -f [内存文件名] --profile=(系统版本) getsids
volatility -f (内存文件名) --profile=(系统版本) hashdump
其他命令介绍:
功能 | 命令行及参数 |
---|---|
进程列表(psx视图) | volatility -f (内存文件名) –profile=(系统版本) psxview |
网络通讯连接 | volatility -f (内存文件名) –profile=(系统版本) netscan |
加载的动态链接库 | volatility -f (内存文件名) –profile=(系统版本) dlllist |
屏幕截图 | volatility -f 1(内存文件名) --profile=(系统版本) screenshot --dump-dir=./ |
查看SSDT表 | volatility -f (内存文件名) –profile=(系统版本) ssdt |
查看UserAssist痕迹 | volatility -f (内存文件名) –profile=(系统版本) userassist |
notepad插件 | volatility -f [内存文件名] --profile=(系统版本) notepad 查看当前展示的 notepad 文本 |
解析MFT记录 | volatility -f (内存文件名) –profile=(系统版本) mftparser |
查看最后关机时间 | volatility -f (内存文件名) –profile=(系统版本) shutdowntime |
查看浏览器历史记录 | volatility -f (内存文件名) --profile=(系统版本) iehistory |
查看服务列表 | volatility -f (内存文件名) –profile=(系统版本) svcscan |
查看ShellBags | volatility -f (内存文件名) –profile=(系统版本) shellbags |
导出MFT记录,恢复文件 | volatility -f (内存文件名) –profile=(系统版本) mftparser –output-file=mftverbose.txt -D mftoutput |
提取注册表数据 | volatility -f (内存文件名) –profile=(系统版本) dumpregistry |
查看IE历史记录 | volatility -f (内存文件名) –profile=(系统版本) iehistory |
查看ShimCache痕迹 | volatility -f (内存文件名) –profile=(系统版本) shimcache |
查看Windows帐户hash | volatility -f (内存文件名) –profile=(系统版本) hashdump |
获取TrueCrypt密钥 | volatility -f (内存文件名) –profile=(系统版本) truecryptmaster |
获取TrueCrypt密码 | volatility -f (内存文件名) –profile=(系统版本) truecryptpassphras |
详细的中文版用户手册 :https://www.wangan.com/docs/1658
外网视频指导:https://www.youtube.com/watch?v=fEqx0MeCCHg
也是图形化界面,但是个人感觉功能稍逊于‘MAGNET AXIOM’
首先创建New Case,填写好项目的名称与保存地址,然后next的设置任意填写即可,点击finish完成创建
跳转出新项目的设置,第一步便对新项目命名,然后关键的一步选中调查文件的类型,有磁盘镜像,VM虚拟机文件、本地磁盘,以及各类文件或已调查的结果。
这里以攻防世界里的一道题为例,选择了第一个镜像文件的选项。
选择好镜像文件的路径其余的默认即可,点击Next后也是默认扫描选项即可,默认勾选点击Next,等待最后的扫描完成即可进行取证
这个应用全程图形化界面,取证流程相对于Volatility简单的多,这里拿一个内存文件举例。首先打开Magnet AXIOM新建案件然后填写好案件编号类型设置路径便可以点击下一步了,选中证据来源然后选中系统,进行加载证据,选择取证的种类,大多数是内存也有可能是镜像,我们这里对内存文件进行取证,点击内存后选择内存文件即可等待进行下一步。
选择推荐的镜像配置文件然后点击下一页,后面的便是按着默认的来(如果没有特殊扫描要求,一般是按着默认的全局扫描)在等待扫描的过程中会弹出另外一个分析窗口,
在此可点击右上角的蓝色字体”查看所有使用痕迹类别" 进行进一步的详细分析,大致的基础使用方法便是这样
该软件在kali中默认装好的,没装的也可以直接apt-get install extundelete安装
命令 | 功能 |
---|---|
–inode ino | 显示节点“ino”的信息。通常查看 --inode 2 |
–block blk | 显示数据块“blk”的信息。 |
-restore-inode ino[,ino,…] | 恢复命令参数,表示恢复节点“ino”的文件,恢复的文件会自动放在当前目录下的RESTORED_FILES文件夹中,使用节点编号作为扩展名。 |
–restore-file ‘path’ | 恢复命令参数,表示将恢复指定路径的文件,并把恢复的文件放在当前目录下的RECOVERED_FILES目录中。 |
–restore-files ‘path’ | 将恢复文件“路径”中列出的文件。每个文件名的格式应该与选项相同 -restore-file,每行应该有一个。 |
–restore-directory ‘path’ | 将恢复目录’path’。 'path’是相对于文件系统的根目录的恢复目录在输出目录中创建为“path”。 |
–restore-all | 恢复命令参数,表示将尝试恢复所有目录和文件。 |
–log filename | 将所有消息记录到文件夹中。 |
-b blocknumber | 表示使用之前备份的超级块来打开文件系统,一般用于查看现有超级块是不是当前所要的文件。 |
-o directory | 将恢复的文件放置到指定的目录中.恢复后的文件创建在一个目录中默认为’RECOVERED_FILES/'。 |
tshark -r usb.pcapng -T fields -e usb.capdata > out.txt
其中-T是指设置解码结果输出的格式,-T fields选项已经指定,所以需要用-e用来指定输出哪些字段;
tshark -r test.pcap -V
如要将解析结果输出到文本文件中则为:tshark -r udp.pcap -V -T pdml,输出格式有多种,具体参见tshark.html对参数 -T的说明
tshark -r test.pcap -V -o tcp.check_checksum:TRUE
为TRUE即checksum对错要作判断,为FALSE为不判断同理,对UDP checksum的判断则为:tshark -r udp.pcap -V -o udp.check_checksum:TRUE
tshark -r test.pcap -V -o ip.decode_tos_as_diffserv:TRUE
——————————————————————————————————
捕获接口:
-i: -i 指定捕获接口,默认是第一个非本地循环接口;
-f: -f 设置抓包过滤表达式,遵循libpcap过滤语法,这个实在抓包的过程中过滤,如果是分析本地文件则用不到。
-s: -s 设置快照长度,用来读取完整的数据包,因为网络中传输有65535的限制,值0代表快照长度65535,默认也是这个值;
-p: 以非混合模式工作,即只关心和本机有关的流量。
-B: -B 设置缓冲区的大小,只对windows生效,默认是2M;
-y: -y 设置抓包的数据链路层协议,不设置则默认为-L找到的第一个协议,局域网一般是EN10MB等;
-D: 打印接口的列表并退出;
-L 列出本机支持的数据链路层协议,供-y参数使用。
捕获停止选项:
-c: -c 捕获n个包之后结束,默认捕获无限个;
-a: -a ... duration:NUM,在num秒之后停止捕获;
filesize:NUM,在numKB之后停止捕获;
files:NUM,在捕获num个文件之后停止捕获;
捕获输出选项:
-b ... ring buffer的文件名由-w参数决定,-b参数采用test:value的形式书写;
duration:NUM - 在NUM秒之后切换到下一个文件;
filesize:NUM - 在NUM KB之后切换到下一个文件;
files:NUM - 形成环形缓冲,在NUM文件达到之后;
RPCAP选项:
remote packet capture protocol,远程抓包协议进行抓包;
-A: -A :,使用RPCAP密码进行认证;
输入文件:
-r: -r 设置读取本地文件
处理选项:
-2: 执行两次分析
-R: -R ,包的读取过滤器,可以在wireshark的filter语法上查看;在wireshark的视图->过滤器视图,在这一栏点击表达式,就会列出来对所有协议的支持。
-Y: -Y ,使用读取过滤器的语法,在单次分析中可以代替-R选项;
-n: 禁止所有地址名字解析(默认为允许所有)
-N: 启用某一层的地址名字解析。“m”代表MAC层,“n”代表网络层,“t”代表传输层,“C”代表当前异步DNS查找。如果-n和-N参数同时存在,-n将被忽略。如果-n和-N参数都不写,则默认打开所有地址名字解析。
-d: 将指定的数据按有关协议解包输出,如要将tcp 8888端口的流量按http解包,应该写为“-d tcp.port==8888,http”;tshark -d. 可以列出所有支持的有效选择器。
输出选项:
-w: -w 设置raw数据的输出文件。这个参数不设置,tshark将会把解码结果输出到stdout,“-w -”表示把raw输出到stdout。如果要把解码结果输出到文件,使用重定向“>”而不要-w参数。
-F: -F
学习视频指南:
https://www.youtube.com/watch?v=AZirvtZNIEw&t=11s
项目地址:
https://github.com/gentilkiwi/mimikatz/
Mimikatz最新版打包下载地址:
https://github.com/gentilkiwi/mimikatz/releases/tag/2.2.0-20210810
运行mimikatz时可以cd到某文件夹下,一般进入配置文件config文件中
初始步骤(不管后面怎么操作必须先给予权限):
privilege::debug
lsadump::sam
图中出现了administrator的syskey哈希值,我们将其放到cmd5中或其他平台破解即可,因为这个密码是本人在虚拟机中设置的较为复杂所以破解不出来
lsadump::sam /sam:SAM /system:SYSTEM 查看这个文件夹里面所有的用户名和密码
lsadump::sam /sam:SAM /system:SYSTEM
鼠标点击流量复原脚本(根据实际情况更改):
nums = []
keys = open("F:/Python3/out.txt",'r')
f = open("F:/Python3/keykey.txt",'w')
posx = 0
posy = 0
for line in keys:
# print(len(line))
if len(line) != 24:
continue
x=int(line[12:14],16)
y=int(line[15:17],16)
if x > 127 :
x -= 256
if y > 127 :
y -= 256
posx += x
posy += y
btn_flag = int(line[0:2],16) # 1 for left , 2 for right , 0 for nothing
if btn_flag == 0 : # 1 代表左键
f.write(str(posx))
f.write(' ')
f.write(str(posy))
f.write('\n')
f.close()
键盘流量复原脚本:
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('F:/Python3.0Work/CTF/键盘流量/out.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]
print ('output :\n' + output)
考察知识点:volatilty的使用
使⽤volatilty进⾏分析(我这使用的是windows版本的,如果使用的是kali2018会默认安装的,直接volatility接参数就可以
.\volatility_2.6_win64_standalone.exe -f easy_dump.img imageinfo
在Syggested Profile后方第一个Win7SP1x64大概率的版本号,指定并用pslist命令方法查看进程
.\volatility_2.6_win64_standalone.exe -f easy_dump.img --profile=Win7SP1x64 pslist
其中一个名为DumpIt.exe的程序我们使⽤memdump命令方法将其dump出来。
.\volatility_2.6_win64_standalone.exe -f easy_dump.img --profile=Win7SP1x64 memdump -p 1724 -D ./
使⽤foremost进⾏分析,发现有个压缩包,解压后获得⼀个message.img
使⽤DiskGenius打开message.img。在磁盘⽬录中找到⼀个hint.txt,并且在files目录中找到⼀个vim的swp⽂件,
保存.message.swp文件在linux中使⽤ vim -r 命令恢复,得到⼀段字符串
yispyweise!dmsx_tthv_arr_didvi
保存并打开hite.txt发现很像坐标点,利用python代码的PIL库将其构造出来
from PIL import Image
file = open('F:/Python3.0Work/CTF/坐标代码/hint.txt','r')
data = file.read()
pic = Image.new('RGB',(300,300))
data = data.split('\n')
#print(data)
for i in data[0:-1]:
#print(i)
a = i.split(' ')
print(a[0])
x = int(a[0])
y = int(a[1])
pic.putpixel([x,y],(255, 255, 255))
pic.show()
pic.save('result.png')
扫描得到的结果是:
Here is the vigenere key: aeolus, but i deleted the encrypted message。
维吉尼亚密码,前面恢复的是密文"yispyweise!dmsx_tthv_arr_didvi"而现在得到了密钥"aeolus"解码即可
得到结果:yeeeeeeeet!just_find_and_solve
考察知识点:extundelete的使用
2.2.1 首先我们获取到一个文件名为HZ,利用file对其分析发现是一个ext3文件,我们可以将这个文件挂载到本系统中利用extundelete进行恢复
2.2.2 先创建一个文件夹,然后使用挂载命令,查看挂载情况
mkdir 1998
mount HZ /1998
df
2.2.3 使用extundelete中的查询模块,查询根路径下的文件
extundelete /dev/loop0 --inode 2
2.2.4 我们在下方发现重要的文件“[email protected]" ,后方发现他被删除了,那我们恢复他
extundelete /dev/loop0 --restore-file [email protected]
2.2.5 恢复后会在该目录自动生成一个名为RECOVERED_FILES的文件夹,我们切换到该目录中,因为文件隐藏,利用ls -a打开,如果直接去cat会发现有乱码,这里因为文件是swp结尾的,是一个非常规退出时产生的文件,我们可以通过
vim -r [email protected]
然后回车查看即可
考察知识点:Mimikatz的使用
运行mimikatz.exe并给予权限
.\mimikatz.exe
privilege::debug
切换到目标文件夹下,获取所有用户的hash值,找到对应用户对其进行破解
cd C:\Users\Administrator1\Desktop\config
lsadump::sam /sam:SAM /system:SYSTEM
通过对数据用户的逐一破解,发现administrator-QQAAzz这个用户的hash值经过md5解码后是密码
最后的结果便是:administrator-QQAAzz_forensics
考察知识点:extundelete的使用,及挂载硬盘命令
首先我们拿到这个无后缀的文件先可以放在kali中利用file命令查看其格式
该题文件为ext3扩展文件系统,可挂载的一种文件
接着我们创建一个文件夹,将其挂载到文件夹,然后再利用extundelete对其根目录查看情况
mkdir 1998
mount badimages /1998
df
发现Flag.txt文件,接着我们将其恢复,输入以下命令,成功后便会在该目录下生成RECOVERED_FILES文件夹其中包含Flag.txt,打开便有
extundelete /dev/loop0 --restore-file /Flag.txt
考察知识点:volatility的使用、GIMP的使用
⾸先使⽤⼯具volatility分析
.\volatility_2.6_win64_standalone.exe imageinfo -f AM.raw
查询中得到系统大概率为WinXPSP2x86
查询其进程情况
.\volatility_2.6_win64_standalone.exe -f AM.raw --profile=WinXPSP2x86 psscan
发现有⼀个画图进程,提取⼀下,因为他肯定是一张图片,但是宽高不敢确定,最花时间的步骤就在这里了
.\volatility_2.6_win64_standalone.exe -f AM.raw --profile=WinXPSP2x86 memdump -p 332 -D ./
将332.dmp文件后缀更改成data这样GIMP才能打开图像,使⽤GIMP打开,各种调整⾼度 发现575 640 635,拉取到下方,得到⼀个图,有四个字母PJCX但是感觉图片被颠倒了
将图片竖直翻转后发现图片中的字符串为b1cx,不知道这有什么用再去进程中看看还有没有什么线索
发现notepad进程,将notepad提取查看
.\volatility_2.6_win64_standalone.exe -f AM.raw --profile=WinXPSP2x86 notepad
看见下方有个提示:hint:???needmoneyandgirlfirend,大胆猜测之前那四位便是这里的前四位,有概率是上面的PJCX转换成小写pjcxneedmoneyandgirlfirend,但也有可能是b1cxneedmoneyandgirlfirend
到此为止也就发现了一串密钥,现在再去看看磁盘中是否存在其他线索,针对性的查寻图片、text文档、doc等,这边使用window的volatility会出现一些报错现象也不是很好解决,这边就转到kali2018自带的volatility工具中,使用grep命令进行过滤查询
volatility -f AM.raw filescan
–profile=WinXPSP2x86 | grep -E “jpg|png|bmp”
发现在⼀个名为vegetable.png的图片,将其提取
volatility -f AM.raw --profile=WinXPSP2x86 dumpfiles -
Q 0x000000000249ae78 -n --dump-dir=./
提取后利用foremost对其分离,但是图片是损坏的打不开,这时候需要使⽤crc32校验爆破的脚本查询该图片正确的长宽
import zlib
import struct
# 同时爆破宽度和高度
filename = 'C:/Users/1998/Desktop/122.png'
with open(filename, 'rb') as f:
all_b = f.read()
crc32key = int(all_b[29:33].hex(), 16)
data = bytearray(all_b[12:29])
n = 4095
for w in range(n):
width = bytearray(struct.pack('>i', w))
for h in range(n):
height = bytearray(struct.pack('>i', h))
for x in range(4):
data[x+4] = width[x]
data[x+8] = height[x]
crc32result = zlib.crc32(data)
if crc32result == crc32key:
print("宽为:", end = '')
print(width, end = ' ')
print(int.from_bytes(width, byteorder='big'))
print("高为:", end = '')
print(height, end = ' ')
print(int.from_bytes(height, byteorder='big'))
#后面用十进制转十六进制
正确宽为:00 00 01 1F 正确高为:00 00 00 D3
发现完整的图片:
stegsolve查看猜测其低通道是存在LSB隐写的,
使用LSB解密脚本:lsb脚本项目地址:https://github.com/livz/cloacked-pixel
(注意:这边脚本使用的是python2,安装了crypto库,需要将python2文件夹中lib中的crypto的首位改成大写变成Crypto)
这边的密钥尝试上方猜测的两个,发现b1cxneedmoneyandgirlfirend是真实密钥,得到文件2.txt
python lsb.py extract 1.png 2.txt b1cxneedmoneyandgirlfirend
VmlyZ2luaWEgY2lwaGVydGV4dDpnbnh0bXdnN3IxNDE3cHNlZGJzNjI1ODdoMA==
Virginia ciphertext:gnxtmwg7r1417psedbs62587h0
维吉尼亚密码解密,
密文:gnxtmwg7r1417psedbs62587h0
密钥:bcxneedmoneyandgirlfirend
(因为密钥只能是由字母组成,而不是b1cxneedmoneyandgirlfirend )
得到结果:
flagisd7f1417bfafbf62587e0
提示:练习题目最重要