0


OtterCTF—内存取证wp


前言

前几天有幸参加了本市的选拔赛,其中有内存取证的题,当时就愣住了,考完后赶紧找题目学习一下,学长介绍的这个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签名扫描进程或内核内存

第一次记录长篇的做题思路,写的不是很好,请多多包涵。


本文转载自: https://blog.csdn.net/m0_66638011/article/details/130577116
版权归原作者 Ming__Yang 所有, 如有侵权,请联系我们删除。

“OtterCTF—内存取证wp”的评论:

还没有评论