前言
故事背景是一个叫Rick瑞克的喜欢玩老式游戏的人,而且这人吧还总喜欢用比特彗星下载盗版电影种子,游戏种子,有一天他边玩游戏边下东西,突然电脑中了勒索病毒,文件被锁了,所有后缀变成了.locked,然后取证分析人员拷贝了内存镜像文件,来看看你能从被锁的文件中获取什么信息?
1 - What the password?
题目:你得到了瑞克电脑内存的样本,你能得到他的用户密码吗?
1 | vol.py -f OtterCTF.vmem imageinfo |
镜像版本为Win7SP1x64
1 | vol.py -f OtterCTF.vmem --profile="Win7SP1x64" lsadump |
这里发现我的kali在root模式运行这条指令会报错,用户模式就可以
lsadump可以强制显示密码
flag{MortyIsReallyAnOtter}
2-General Info
题目:电脑主机全称和IP地址是什么?
通过网络连接查看ip地址
1 | vol.py -f OtterCTF.vmem --profile="Win7SP1x64" netscan |
IP地址:192.168.202.131
1 | vol.py -f OtterCTF.vmem --profile="Win7SP1x64" printkey -K "ControlSet001\Control\ComputerName\ComputerName" |
主机名:WIN-LO6FAF3DTFE,这是最直接的方法,还有一种就是,首先我们知道所有用户信息都会存储到注册表上,所以我们去查看注册表,找到注册表下的SYSTEM系统信息。
1 | vol.py -f OtterCTF.vmem --profile=Win7SP1x64 hivelist |
hivelist: 列出所有的注册表项及其虚拟地址和物理地址(第一级)
第一级发现只是目录,而文件的位置使用偏移量来表示,0x开头,使用参数-o,printkey打印出来
1 | vol.py -f OtterCTF.vmem --profile=Win7SP1x64 -o 0xfffff8a000024010 printkey |
继续深入下一层路径,\REGISTRY\MACHINE\SYSTEM\ControlSet001,-K是大K代表指定路径的参数
1 | vol.py -f OtterCTF.vmem --profile=Win7SP1x64 -o 0xfffff8a000024010 printkey -K "ControlSet001" |
最后到”ControlSet001\Control\ComputerName\ComputerName”路径找到主机名
3-Play Time
题目:瑞克只喜欢玩一些老式的电子游戏。你能看出他在玩什么游戏吗?服务器的ip地址是什么?
查看进程,寻找那个游戏的身影
1 | vol.py -f OtterCTF.vmem --profile=Win7SP1x64 pslist |
发现进程LunarMS.exe,pid=708
flag{LunarMS-77.102.199.102}
4-Name Game1
题目:我们知道账号登录到一个频道叫Lunar-3,这个账号名是?
分析:听名字就知道和刚才那个lunar游戏有关,所以我们先提取一下LunarMS.exe这个进程,然后配合strings命令查找关键词Lunar-3,并匹配上下10行,寻找疑似账号.
将进程提取出来,可以创个文件夹保存
1 | vol.py -f OtterCTF.vmem --profile=Win7SP1x64 memdump -p 708 -D ./dump |
memdump:提取进程,需要指定进程-p 和输出目录 -D
1 | strings ./dump/708.dmp | grep -C 10 "Lunar-3" |
linux strings
命令:在对象文件或二进制文件中查找可打印的字符串
grep
[选项] [模式] [文件名]
这一个也可以strings 708.dmp > 708.dmp.strings
将708.dmp中的字符串输出到.strings文件中,然后grep -C 10 “Lunar-3” ./dump708.dmp.strings
但是没有必要
在线linux命令查询:https://www.lzltool.com/LinuxCommand
flag{0tt3r8r33z3}
5-Name Game2
题目:通过一些研究,我们发现登录角色的用户名总是在这个签名之后:0x64 0x??{6-8} 0x40 0x06 0x??{18} 0x5a 0x0c 0x00{2},Rick的角色名字是什么?
分析:题目意思是16进制64后6-8位是16进制40 16进制06,再18位后是十六进制5a 十六进制0c 十六进制00。根据这个提示,我们可以将第四题dump下来的文件内容用grep进行筛选有十六进制5a 十六进制0c 十六进制00的片段,并往前进行确认,但这里需要用到kali自带的16进制查看器hexhump
1 | hexdump -C ./dump/708.dmp | grep "5a 0c 00" -A 3 -B 3 |
flag{M0rtyL0L}
6-Silly Rick
题目:傻瑞克总是忘记电子邮件的密码,所以他使用在线存储密码服务来存储他的密码。他总是复制和粘贴密码,这样他就不会出错。瑞克的邮箱密码是什么?
1 | vol.py -f OtterCTF.vmem --profile=Win7SP1x64 clipboard |
flag{M@il_Pr0vid0rs}
7-Hide And Seek
题目:我们提取了瑞克电脑内存镜像的原因是有一个恶意软件感染,请找到恶意软件的进程名称,包括恶意扩展名,为下一步分析加密密钥做准备。
使用命令pstree查看进程树,最可疑的是PPID大于PID的进程。PID指进程号,操作系统里每打开一个程序都会创建一个进程ID,即PID。PID是各进程的代号,每个进程有唯一的PID编号,它是进程运行时系统分配的。PPID则代表当前进程的父进程ID。
1 | vol.py -f OtterCTF.vmem --profile=Win7SP1x64 pstree |
发现可疑进程vmware-tray.exe,而且发现Rick And Morty.exe就是它的父进程
具体为什么他是恶意程序,我们进行深入挖掘一下,用dlllist命令打印每个进程加载的动态链接库列表,-p指向pid
1 | vol.py -f OtterCTF.vmem --profile=Win7SP1x64 dlllist -p 3720 |
发现了他在Temp目录下运行,要知道Temp是windows下的临时文件夹,一般程序不会放在此文件夹中,放在此文件夹中的程序一般为恶意程序。
也可以查看进程调用的命令
1 | vol.py -f OtterCTF.vmem --profile=Win7SP1x64 cmdline -p 3820,3720 |
flag{vmware-tray.exe}
8-Path To Glory1
题目:恶意软件是怎么进入瑞克的电脑的?这一定是一种古老的违法习惯
根据上面的命令调用,恶意软件是被下载下来的
filescan:扫描所有文件列表,通过关键字Rick And Morty,查找可能与恶意软件进入电脑有关的文件,因为前言中说到rick用种子下载盗版电影、游戏。
1 | vol.py -f OtterCTF.vmem --profile=Win7SP1x64 filescan | grep 'Rick And Morty' |
有6个文件,3个种子文件和3个exe文件,先将种子文件分别dump下来,进行分析
1 | vol.py -f OtterCTF.vmem --profile=Win7SP1x64 dumpfiles -Q 0x000000007dae9350 -D ./dump |
1 | strings ./dump/file.None.0xfffffa801b42c9e0.dat |
查看第二个种子文件时,发现website,说明是通过网站下载的
种子文件就是记载下载文件的存放位置、大小、下载服务器的地址、发布者的地址等数据的一个索引文件
flag{M3an_T0rren7_4_R!cke}
9-Path To Glory2
题目:在恶意软件进入后继续搜索
其实单看题目根本不知道要干什么,其实这题就是承接上一题,发现是从网站上下载的,自然想到浏览器,所以我们转存所有chrome的进程,然后使用strings命令配合grep命令查找Rick And Morty下载的相关数据
1 | vol.py -f OtterCTF.vmem --profile=Win7SP1x64 memdump -n chrome -D ./dump |
1 | strings ./dump/* | grep 'Rick And Morty season 1 download.exe' -C 10 |
感觉题目就是提示flag的位置,但是flag好像和具体题目没什么关系
flag{Hum@n_I5_Th3_Weak3s7_Link_In_Th3_Ch@inYear}
10-Bit 4 Bit
题目:我们已经发现这个恶意软件是一个勒索软件。查找攻击者的比特币地址(其实就是说请逆向并分析)
1 | vol.py -f OtterCTF.vmem --profile=Win7SP1x64 procdump -p 3720 -D ./dump |
procdump:进程转储成可执行文件
直接搜索address,就可发现出flag
或者根据题目中的提示“ransomware”,就直接找出flag
1 | strings -e l OtterCTF.vmem | grep -i -A 5 "ransomware" |
flag{1MmpEmebJkqXG8nQv4cjJSmxZQFVmFo63M}
11-Graphic’s For The Weak
题目:恶意软件的图形中有一些可疑之处
foremost分离可执行文件,图片上就是flag
12-Recovery
题目:瑞克得把他的文件找回来!用来加密文件的随机密码是说明?