前言
前几天有幸参加了本市的选拔赛,其中有内存取证的题,当时就愣住了,考完后赶紧找题目学习一下,学长介绍的这个OtterCTF靶场个人认为非常好,很适合像我这样的初学者。
一、工具说明
系统:kali,windows10
本文使用的工具有:volatility,ILSpy / IDE,HiddenTearDecrypter
二、题目解析
1.What the password?
you got a sample of rick's PC's memory. can you get his user password? format: CTF{...}
你得到了rick电脑内存的样本。你能得到他的用户密码吗?格式:CTF{…}
我们拿到了他的电脑样本OtterCTF.vmem,使用volatility查看此镜像的信息
vol.py -f /root/Desktop/OtterCTF.vmem imageinfo
我们可以发现此镜像版本为Win7SP1x64,题目要求我们得到他的用户密码,我们指定系统版本,使用hashdump命令即可
vol.py -f /root/Desktop/OtterCTF.vmem --profile=Win7SP1x64 hashdump
拿到密码,但是为哈希值,我使用kali自带解析hash的工具hash-identifier,没有成功放入chatgpt中告诉我这是MD4哈运算得到的哈希值,于是搜了一下volatility的命令,发现lsadump可以强制显示密码。
lsadump:从注册表中提取LSA密钥信息,显示加密以后的数据用户密码
vol.py -f /root/Desktop/OtterCTF.vmem --profile=Win7SP1x64 lsadump
flag:CTF{MortyIsReallyAnOtter}
2.General Info
Let's start easy - whats the PC's name and IP address? format: CTF{flag}
让我们简单地开始吧——电脑的名称和IP地址是什么?格式:CTF{flag}
如何寻找本机的ip地址,直接使用netscan命令查看网络连接情况不就可以了
vol.py -f /root/Desktop/OtterCTF.vmem --profile=Win7SP1x64 netscan
里面本地地址最多且有效的就只有192.168.202.131了,进行查询PC名称,用hivelist命令查询注册表。
vol.py -f /root/Desktop/OtterCTF.vmem --profile=Win7SP1x64 hivelist
windows下PC名通常储存在SYSTEM下,所以通过 -o ‘ ’+printkey 查看注册表键名
vol.py -f /root/Desktop/OtterCTF.vmem --profile=Win7SP1x64 -o 0xfffff8a000024010 printkey
PC名在ControlSet001和ControlSet002中都有我们这里选择查看001,通过-K ‘’ 查看键值
vol.py -f /root/Desktop/OtterCTF.vmem --profile=Win7SP1x64 -o 0xfffff8a000024010 -K "ControlSet001" printkey
vol.py -f /root/Desktop/OtterCTF.vmem --profile=Win7SP1x64 -o 0xfffff8a000024010 -K "ControlSet001\Control" printkey
vol.py -f /root/Desktop/OtterCTF.vmem --profile=Win7SP1x64 -o 0xfffff8a000024010 -K "ControlSet001\Control\ComputerName" printkey
vol.py -f /root/Desktop/OtterCTF.vmem --profile=Win7SP1x64 -o 0xfffff8a000024010 -K "ControlSet001\Control\ComputerName\ComputerName" printkey
flag:CTF{192.168.202.131} CTF{WIN-LO6FAF3DTFE}
3.Play Time
Rick just loves to play some good old videogames. can you tell which game is he playing? whats the IP address of the server? format: CTF{flag}
Rick只是喜欢玩一些好的老式电子游戏。你能说出他在玩什么游戏吗?服务器的IP地址是什么?格式:CTF{flag}
题目让我们找出游戏名称和服务器的ip地址,作为flag,名称可以使用pslist命令在系统进程中找到
vol.py -f /root/Desktop/OtterCTF.vmem --profile=Win7SP1x64 pslist
通过百度我们发现LunarMS.exe可能为游戏,打包成flag提交确定此就是游戏名,知道游戏名称了,查找此线索通过使用查询网络连接的netscan命令配合grep命令可查找到游戏的ip地址。
vol.py -f /root/Desktop/OtterCTF.vmem --profile=Win7SP1x64 netscan|grep LunarMS
查找出此游戏的ip地址为77.102.199.102
flag:CTF{LunarMS.exe},CFT{77.102.199.102}
4.Name Game
We know that the account was logged in to a channel called Lunar-3. what is the account name?format: CTF{flag}
我们知道该帐户已登录到一个名为Lunar-3的频道。账户名称是什么?格式:CTF{flag}
题目要求我们把LunarMS游戏中Lunar-3频道的账户名称搞出来。上题我们找到了LunarMS的进程,于是我们可以先把此游戏dump下来
volatility中-p指向进程号(PID),memdump是转储进程的可寻址内存
vol.py -f /root/Desktop/OtterCTF.vmem --profile=Win7SP1x64 memdump -p 708 -D /root/Desktop/dump
题目提示是Lunar-3频道,于是我们可以使用winhex或者kali自带的strings命令配合grep命令进行
搜索。
strings 708.dmp | grep Lunar-3 -C 10
最后找到的用户名为0tt3r8r33z3
flag:CTF{0tt3r8r33z3}
5.Name Game 2
From a little research we found that the username of the logged on character is always after this signature: 0x64 0x??{6-8} 0x40 0x06 0x??{18} 0x5a 0x0c 0x00{2} What's rick's character's name? format: CTF{...}
通过一点研究,我们发现登录字符的用户名总是在这个签名之后:0x64 0x??{6-8}0x40 0x06 0x??{18} 0x5a 0x0c 0x00{2}rick角色的名字是什么?格式:CTF{…}
这个题目非常有意思,让我们寻找rick角色的名字是什么?并给出了0x64 0x??{6-8}0x40 0x06 0x??{18} 0x5a 0x0c 0x00{2}的提示。此提示的意思是16进制64后6-8位是16进制40 16进制06,再18位后是十六进制5a 十六进制0c 十六进制00.。
根据这个提示,我们可以将第四题dump下来的文件内容用grep进行筛选有十六进制5a 十六进制0c 十六进制00的片段,并往前进行确认,但这里需要用到kali自带的16进制查看器hexhump。
hexdump -C 708.dmp |grep "5a 0c 00" -A 3 -B 3
最后找到此片段符合题目要求。
flag:CTF{M0rtyL0L}
6.Silly Rick
Silly rick always forgets his email's password, so he uses a Stored Password Services online to store his password. He always copy and paste the password so he will not get it wrong. whats rick's email password? format: CTF{flag}
Silly rick总是忘记电子邮件的密码,所以他使用在线存储密码服务来存储密码。他总是复制并粘贴密码,这样他就不会弄错了。rick的电子邮件密码是什么?格式:CTF{flag}
题目让我们查找电子邮箱的密码,并提示我们经常复制粘贴于是我们使用clipboard命令查看剪贴板
vol.py -f /root/Desktop/OtterCTF.vmem --profile=Win7SP1x64 clipboard
直接找到flag
flag:CTF{M@il_Pr0vid0rs}
7.Hide And Seek
The reason that we took rick's PC memory dump is because there was a malware infection. Please find the malware process name (including the extension) BEAWARE! There are only 3 attempts to get the right flag!format: CTF{flag}
我们拿走rick电脑内存转储的原因是因为有恶意软件感染。请查找恶意软件进程名称(包括扩展名)注意!只有3次尝试才能获得正确的旗帜!格式:CTF{flag}
此题让我们找出恶意进程名称,我们可以使用pslist命令查询进程但太多了,有层次地看看会更好一些,于是我们使用pstree命令查看进程树。
vol.py -f /root/Desktop/OtterCTF.vmem --profile=Win7SP1x64 pstree
上来我就感觉vmware-tray.exe很不对劲,因为在我的认知中vmware一直与虚拟机有关,这个则成为了Rick And Morty的子程序,于是我提交了他发现猜对了。
具体为什么他是恶意程序,我们进行深入挖掘一下
用dlllist命令打印每个进程加载的动态链接库列表,-p指向pid
vol.py -f /root/Desktop/OtterCTF.vmem --profile=Win7SP1x64 dlllist -p 3720
发现了他在Temp目录下运行,要知道Temp是windows下的临时文件夹,一般程序不会放在此文件夹中,放在此文件夹中的程序一般为恶意程序。
flag:CTF{vmware-tray.exe}
8.Path To Glory
How did the malware got to rick's PC? It must be one of rick old illegal habits... format: CTF{...}
恶意软件是如何进入rick的电脑的?这一定是一种古老的非法习惯。。。 格式:CTF{…}
这个题我看见是很懵的,因为不知道他想要表达的是什么。于是我看了看其他大佬的wp,从恶意程序的父程序Rick And Morty开始,用filescan命令配合grep找一找这个文件
filescan 提取文件对象(file objects)池信息
vol.py -f /root/桌面/OtterCTF.vmem --profile=Win7SP1x64 filescan|grep 'Rick And Morty'
发现了有6个文件,3个种子文件和3个exe文件,先将种子文件dump下来,进行分析 。
dumpfiles 提取内存中映射或缓存的文件
vol.py -f /root/Desktop/OtterCTF.vmem --profile=Win7SP1x64 dumpfiles -Q 0x000000007d8813c0 -D /root/Desktop/dump
vol.py -f /root/Desktop/OtterCTF.vmem --profile=Win7SP1x64 dumpfiles -Q 0x000000007dae9350 -D /root/Desktop/dump
vol.py -f /root/Desktop/OtterCTF.vmem --profile=Win7SP1x64 dumpfiles -Q 0x000000007dcbf6f0 -D /root/Desktop/dump
再通过strings命令进行查找分析。
strings file.None.0xfffffa801af10010.dat
strings file.None.0xfffffa801b42c9e0.dat
strings file.None.0xfffffa801b51ccf0.dat
最终发现了flag:M3an_T0rren7_4_R!cke 但是最后的e没有不知道什么原因。
flag:CTF{M3an_T0rren7_4_R!ck}
9.Path To Glory 2
Continue the search after the way that malware got in. format: CTF{...}
在恶意软件进入后继续搜索。格式:CTF{…}
这道题目依旧不知道干啥,没事接着翻大佬的wp。
大佬说先把所有的chrome浏览器进程转储下来,这里注意一定要建立一个目录,把chrome储存的内容都放在目录中,要不容易混乱。
查找进程,发现Rick And Morty上面是好几个chrome程序。
vol.py -f /root/Desktop/OtterCTF.vmem --profile=Win7SP1x64 pslist
把chrome.exe给dump下来具体分析。
memdump 转储进程的可寻址内存
vol.py -f /root/Desktop/OtterCTF.vmem --profile=Win7SP1x64 memdump -n chrome.exe -D /root/Desktop/dump/chrome
使用strings命令配合grep命令查找Rick And Morty相关数据,这里查找的是Rick And Morty下载中相关的数据。
strings ./chrome/* | grep 'Rick And Morty season 1 download.exe' -C 10
最终我们找到了flag:Hum@n_I5_Th3_Weak3s7_Link_In_Th3_Ch@in 没有Year咱也不知道为什么,在此过程中我们还发现了Flag.txt应该与后面的题目有关。
flag:CTF{Hum@n_I5_Th3_Weak3s7_Link_In_Th3_Ch@in}
10.Bit 4 Bit
We've found out that the malware is a ransomware. Find the attacker's bitcoin address.
format: CTF{...}
我们已经发现这个恶意软件是一个勒索软件。查找攻击者的比特币地址。
格式:CTF{…}
题目告诉我们这是个勒索软件,要我们查找比特币地址,其实就是说请逆向软件,并分析。
我们先把勒索软件程序dump下来,查找此勒索软件的进程。
vol.py -f /root/Desktop/OtterCTF.vmem --profile=Win7SP1x64 pstree
procdump 进程转储到一个可执行文件示例
vol.py -f /root/Desktop/OtterCTF.vmem --profile=Win7SP1x64 procdump -p 3720 -D /root/Desktop/dump
然后使用ILSpy或者IDE进行反编译,这里我是用ILSpy,直接搜索address,就可发现出flag.
发现大佬们直接根据题目中的提示“ransomware”,就直接找出flag。(不得不说太牛了)
strings -e l /root/Desktop/OtterCTF.vmem | grep -i -A 5 "ransomware"
flag:CTF{1MmpEmebJkqXG8nQv4cjJSmxZQFVmFo63M}
11.Graphic's For The Weak
There's something fishy in the malware's graphics. format: CTF{...}
恶意软件的图形中有可疑之处。格式:CTF{…}
做CTF杂项做的,看见照片,直接就上手formost分离照片,而且还真被分离出来了。
foremost executable.3720.exe -o odic
flag:CTF{S0_Just_M0v3_Socy}
12.Recovery
Rick got to have his files recovered! What is the random password used to encrypt the files?format: CTF{...}
里克必须找回他的文件!用于加密文件的随机密码是什么? 格式:CTF{…}
题目告知是随机密码,因为生成随机密码一定是软件内部代码,,于是我就回到逆向中查找Password,最终有所发现
string text=computerName+" - "+userName+" - " +password
通过之前的题目我们知道了:
userName有3个分别为:Administrator Guest Rick 此题目与Rick And Morty有关所以
userName:Rick
computerName:WIN-LO6FAF3DTFE
string text=WIN-LO6FAF3DTFE-Rick+password
根据上面的分析,密码已经呼之欲出了,只要把恶意程序dump下来,使用grep进行关键字查找就可以了。
先查找恶意程序进程的pid
vol.py -f /root/Desktop/OtterCTF.vmem --profile=Win7SP1x64 pslist
将此进程dump下来
memdump 转储进程的可寻址内存
vol.py -f /root/Desktop/OtterCTF.vmem --profile=Win7SP1x64 memdump -p 3720 -D /root/Desktop/dump/password
在通过老配方strings命令配合grep命令,查找password
strings -el 3720.dmp | grep 'WIN-LO6FAF3DTFE-Rick' -C 5
自此,我们就找到了password:aDOBofVYUNVnmp7
flag:CTF{aDOBofVYUNVnmp7}
13.Closure
Now that you extracted the password from the memory, could you decrypt rick's files?
既然你从内存中提取了密码,你能解密rick的文件吗?
题目让我们进行解密,所以一定要有需要解密的文件和解密软件。
需要解密的文件:让我想到了第9关发现的Flag.txt
解密软件:未知
解密密码:aDOBofVYUNVnmp7
我们先把Flag.txt给dump下来,
dumpfiles 提取内存中映射或缓存的文件
strings ./chrome/* | grep 'Rick And Morty season 1 download.exe' -C 10
vol.py -f /root/Desktop/OtterCTF.vmem --profile=Win7SP1x64 filescan|grep -i 'Flag'
vol.py -f /root/Desktop/OtterCTF.vmem --profile=Win7SP1x64 dumpfiles -Q 0x000000007e410890 -D /root/Desktop/dump
这里保存下来的文件为file.None.0xfffffa801b0532e0.dat,为了方便给他重命名为flag.dat。
接下来找破解软件,嗯。。。没有思路。
大佬,借鉴,谢谢
好了,根据大佬的思路,查看pdb,为什么查找pdb文件,他里面有啥,我粘贴了份介绍,供大家参考。
pdb文件主要存储了如下调试信息:
(1)public, private,和static函数地址。
(2)全局变量的名称和地址。
(3)参数和局部变量的名称及它们在栈中的偏移量。
(4)类型定义,包括class, structure,和 data definitions。
(5)源文件名称和行号。
————————————————
版权声明:本文为CSDN博主「吃素的施子」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/feikudai8460/article/details/116237433
查看恶意程序中关于pdb中的内容
strings executable.3720.exe| grep pdb
我们看到他在hidden-tear目录下,百度一下,发现这是个勒索软件为HiddenTear,直接在网上找到解密程序HiddenTearDecrypter
目前
需要解密文件:flag.bat
解密软件:HiddenTearDecrypter
解密密码:aDOBofVYUNVnmp7
提前查看flag.bat
hexdump -C flag.dat
看见此文件后面好多0,于是我们删去(方便解密),而且把flag.bat后缀改为flag.png.locked,只有这样才能让解密软件识别到,话不多说上命令。
tr < flag.dat -d '\000' > flag2.png.locked
打开解密软件,点击select Directory,选择flag.png.locked放置的目录
输入解密密码:aDOBofVYUNVnmp7 提示解密成功
此时会自动将目录下的flag.png.locked转换成flag.png
直接打开是打不开的,我们借助winhex工具打开,发现flag
flag:CTF{Im_Th@_B3S7_RicK_0f_Th3m_4ll}
至此OtterCTF内存取证的题就搞定了
总结
这个靶场的题目我觉得特别好,主要就是学习volatility工具和取证思维方式。
以下是volatility工具的使用方法,可供参考。
Volatility Foundation Volatility Framework 2.6
用法: Volatility - 内存取证分析平台
Options:
-h, --help 列出所有可用选项及其默认值
默认值可以在配置文件中设置
(/etc/volatilityrc)
--conf-file=/home/kali/.volatilityrc
基于用户的配置文件
-d, --debug 调试Volatility
--plugins=PLUGINS 要使用的其他插件目录(冒号分隔)
--info 打印所有注册对象的信息
--cache-directory=/home/kali/.cache/volatility
存放缓存文件的目录
--cache 使用缓存
--tz=TZ 设置 (Olson) 时区以使用 pytz(如果已安装)或 tzset 显示时间戳
-f FILENAME, --filename=FILENAME
打开图像时使用的文件名
--profile=WinXPSP2x86
要加载的配置文件的名称(使用 --info 查看支持的配置文件列表)
-l LOCATION, --location=LOCATION
从中加载地址空间的 URN 位置
-w, --write 启用写支持
--dtb=DTB DTB 地址
--shift=SHIFT Mac KASLR 移位地址
--output=text 以这种格式输出(支持特定于模块,请参阅下面的模块输出选项)
--output-file=OUTPUT_FILE
在此文件中写入输出
-v, --verbose 详细信息
-g KDBG, --kdbg=KDBG 指定一个 KDBG 虚拟地址(注意:对于 64 位 Windows 8 及更高版本,这是 KdCopyDataBlock 的地址)
--force 强制使用可疑配置文件
-k KPCR, --kpcr=KPCR 指定特定的 KPCR 地址
--cookie=COOKIE 指定 nt!ObHeaderCookie 的地址(仅适用于 Windows 10)
支持的插件命令:
amcache 查看AmCache应用程序痕迹信息
apihooks 检测内核及进程的内存空间中的API hook
atoms 列出会话及窗口站atom表
atomscan Atom表的池扫描(Pool scanner)
auditpol 列出注册表HKLMSECURITYPolicyPolAdtEv的审计策略信息
bigpools 使用BigPagePoolScanner转储大分页池(big page pools)
bioskbd 从实时模式内存中读取键盘缓冲数据(早期电脑可以读取出BIOS开机密码)
cachedump 获取内存中缓存的域帐号的密码哈希
callbacks 打印全系统通知例程
clipboard 提取Windows剪贴板中的内容
cmdline 显示进程命令行参数
cmdscan 提取执行的命令行历史记录(扫描_COMMAND_HISTORY信息)
connections 打印系统打开的网络连接(仅支持Windows XP 和2003)
connscan 打印TCP连接信息
consoles 提取执行的命令行历史记录(扫描_CONSOLE_INFORMATION信息)
crashinfo 提取崩溃转储信息
deskscan tagDESKTOP池扫描(Poolscaner)
devicetree 显示设备树信息
dlldump 从进程地址空间转储动态链接库
dlllist 打印每个进程加载的动态链接库列表
driverirp IRP hook驱动检测
drivermodule 关联驱动对象至内核模块
driverscan 驱动对象池扫描
dumpcerts 提取RAS私钥及SSL公钥
dumpfiles 提取内存中映射或缓存的文件
dumpregistry 转储内存中注册表信息至磁盘
editbox 查看Edit编辑控件信息 (Listbox正在实验中)
envars 显示进程的环境变量
eventhooks 打印Windows事件hook详细信息
evtlogs 提取Windows事件日志(仅支持XP/2003)
filescan 提取文件对象(file objects)池信息
gahti 转储用户句柄(handle)类型信息
gditimers 打印已安装的GDI计时器(timers)及回调(callbacks)
gdt 显示全局描述符表(Global Deor Table)
getservicesids 获取注册表中的服务名称并返回SID信息
getsids 打印每个进程的SID信息
handles 打印每个进程打开的句柄的列表
hashdump 转储内存中的Windows帐户密码哈希(LM/NTLM)
hibinfo 转储休眠文件信息
hivedump 打印注册表配置单元信息
hivelist 打印注册表配置单元列表
hivescan 注册表配置单元池扫描
hpakextract 从HPAK文件(Fast Dump格式)提取物理内存数据
hpakinfo 查看HPAK文件属性及相关信息
idt 显示中断描述符表(Interrupt Deor Table)
iehistory 重建IE缓存及访问历史记录
imagecopy 将物理地址空间导出原生DD镜像文件
imageinfo 查看/识别镜像信息
impscan 扫描对导入函数的调用
joblinks 打印进程任务链接信息
kdbgscan 搜索和转储潜在KDBG值
kpcrscan 搜索和转储潜在KPCR值
ldrmodules 检测未链接的动态链接DLL
lsadump 从注册表中提取LSA密钥信息(已解密)
machoinfo 转储Mach-O 文件格式信息
malfind 查找隐藏的和插入的代码
mbrparser 扫描并解析潜在的主引导记录(MBR)
memdump 转储进程的可寻址内存
memmap 打印内存映射
messagehooks 桌面和窗口消息钩子的线程列表
mftparser 扫描并解析潜在的MFT条目
moddump 转储内核驱动程序到可执行文件的示例
modscan 内核模块池扫描
modules 打印加载模块的列表
multiscan 批量扫描各种对象
mutantscan 对互斥对象池扫描
notepad 查看记事本当前显示的文本
objtypescan 扫描窗口对象类型对象
patcher 基于页面扫描的补丁程序内存
poolpeek 可配置的池扫描器插件
printkey 打印注册表项及其子项和值
privs 显示进程权限
procdump 进程转储到一个可执行文件示例
pslist 按照EPROCESS列表打印所有正在运行的进程
psscan 进程对象池扫描
pstree 以树型方式打印进程列表
psxview 查找带有隐藏进程的所有进程列表
qemuinfo 转储 Qemu 信息
raw2dmp 将物理内存原生数据转换为windbg崩溃转储格式
screenshot 基于GDI Windows的虚拟屏幕截图保存
servicediff Windows服务列表(ala Plugx)
sessions _MM_SESSION_SPACE的详细信息列表(用户登录会话)
shellbags 打印Shellbags信息
shimcache 解析应用程序兼容性Shim缓存注册表项
shutdowntime 从内存中的注册表信息获取机器关机时间
sockets 打印已打开套接字列表
sockscan TCP套接字对象池扫描
ssdt 显示SSDT条目
strings 物理到虚拟地址的偏移匹配(需要一些时间,带详细信息)
svcscan Windows服务列表扫描
symlinkscan 符号链接对象池扫描
thrdscan 线程对象池扫描
threads 调查_ETHREAD 和_KTHREADs
timeliner 创建内存中的各种痕迹信息的时间线
timers 打印内核计时器及关联模块的DPC
truecryptmaster Recover 恢复TrueCrypt 7.1a主密钥
truecryptpassphrase 查找并提取TrueCrypt密码
truecryptsummary TrueCrypt摘要信息
unloadedmodules 打印卸载的模块信息列表
userassist 打印注册表中UserAssist相关信息
userhandles 转储用户句柄表
vaddump 转储VAD数据为文件
vadinfo 转储VAD信息
vadtree 以树形方式显示VAD树信息
vadwalk 显示遍历VAD树
vboxinfo 转储Virtualbox信息(虚拟机)
verinfo 打印PE镜像中的版本信息
vmwareinfo 转储VMware VMSS/VMSN 信息
volshell 内存镜像中的shell
windows 打印桌面窗口(详细信息)
wintree Z顺序打印桌面窗口树
wndscan 池扫描窗口站
yarascan 以Yara签名扫描进程或内核内存
第一次记录长篇的做题思路,写的不是很好,请多多包涵。
版权归原作者 Ming__Yang 所有, 如有侵权,请联系我们删除。