CTF 压轴题解题思路和过程
前言
压轴题难度极大。我在这里详细的记录一下解题思路和过程
题目初探
拿到题目,为三个文件,其中 mem_secret-963a4663.vmem 为常见内存镜像文件,另外两个文件格式未知。
使用 volatility 进行分析无法识别 profile。
接着分析分析 Encryption.bin01 和 Encryption.bin02 文件,初步分析 Encryption.bin01 文件,无法发现任何端倪。
Encryption.bin02 内可见字符较多,通过 strings 命令可以判断出 Encryption.bin02 是使用 Vmware 加密后的 vmx 虚拟机配置文件
这里介绍一下虚拟机的配置文件 vmx,改文件位于虚拟机实例的主目录下,用于记录虚拟机的配置——如虚拟机的内存、硬盘型号等,可以通过打开这个虚拟机文件以启动虚拟机的操作系统,我们也通过编辑该文件实现某种对虚拟机的配置需求。
2021最新整理网络安全/渗透测试/安全学习/100份src技术文档(全套视频、CTF、大厂面经、精品手册、必备工具包、路线)一>获取<一
对于同一虚拟机,在使用虚拟机加密操作前的 vmx 文件与加密后 vmx 文件是有所不同的:
未加密的 vmx 文件是明文显示的,显示了这个虚拟机的显示名称,cpu 配置,内存配置等等。下图是为未加密的 vmx 文件。
在虚拟机——设置——选项——访问控制处可以配置虚拟机加密,加密后的 vmx 内容如下图所示,可以看到:之前以明文形式呈现的配置内容全部加密显示,无法获取这个虚拟机的配置详细信息了,并且多了 keySafe 内容,就存在这里。如下图:
加密后的配置只需要.encoding、displayName、encryption.keySafe 和 encryption.data 字段的内容,.encoding 为虚拟机配置文件的编码,displayName 为虚拟机的名称,encryption.keySafe 字段存储了虚拟机密码,格式为 vmware:key/list/xxxxxxxxx ,encryption.data 是原来明文数据加密过后的结果。
但是对 Encryption.bin02 和加密的 vmx 进行对比,在 Encryption.bin02 的结尾还有一段冗余数据:
分析这段数据,对比加密的虚拟机,通过 lsiogic 关键词以及内容的偏移占用空间可以确定该内容为加密虚拟机的 vmdk 部分
此处题目中是 lsilogic,但对照虚拟机我用的是 winxp,不支持 lsilogic,所以是 ide,而且 vmx 和 vmdk 两端数据直接有一段空行 NUL 数据
现已分析出 Encryption.bin02 为 VMware 虚拟机执行加密过后的配置文件,那么 mem_secret-963a4663.vmem 应该为运行状态虚拟机的内存页面文件,而结合常见虚拟机相关文件和文件大小可以大胆猜测 Encryption.bin01 为 vmss 文件
vmss 文件用于储存虚拟机在挂起状态时的信息,为执行挂起操作后产生的文件(相当一个快照图片)
进一步对 Encryption.bin01 文件进行格式分析,可以发现该文件与 vmware 加密状态挂起的虚拟机 vmss 文件高度相似,遂判断该赛题给出的文件为 vmware 加密文件组
根据上述分析,题目中所给的文件全部为使用虚拟机加密过后的文件,因此后续的思路就是:找到虚拟机的密码,然后利用 VMware 加载虚拟机,将虚拟机加密功能关闭,就可以将所有文件还原成明文状态,此时就可以得到未加密状态的内存镜像,再使用 volatility 进行分析即可。
恢复文件
在思路梳理完成之后就需要对题目的文件进行分离和修复,经过反复操作和对照发现,题目中出题人分别删除了 vmx 和 vmss 中的部分通用关键信息,分别对 vmx、vmdk 和 vmss 文件进行还原操作:
分离和修复 vmx 文件修复前:
修复后:
还原 vmss 文件将 Encryption.bin01 文件重命名为 mem_secret-963a4663.vmss,注意 vmss 文件的文件名一定要和 vmem 文件名对应,否则无法读取挂起的状态。
全部还原后的文件目录结构如下:
打开虚拟机
要打开虚拟机,需要获取打开的密码,此题无任何提示信息,猜测密码需要通过暴力破解的方式拿到,使用加密的 vmx 文件,利用 pyvmx-cracker 工具爆破虚拟机的密码。
得到密码为 1q2w3e4r
成功打开挂起状态的虚拟机
开机后发现无法打开,根据报错提示判断缺少 vmdk 虚拟磁盘文件,但是虚拟磁盘文件中包含一定的加密信息,此时我们已经获得了加密虚拟机的密码,因此可以自己创建一个新的虚拟机。
但是直接将这个 vmdk 加载到虚拟机是不行的,因为待加载的虚拟机使用了 VMware 加密,vmdk 也会一起加密,在打开的时候会先对 vmdk 进行解密操作,分析未加密虚拟机的 vmdk 和已加密虚拟机 vmdk 作比较,发现使用 Encryption.bin02 的结尾还有一段冗余数据直接替换自己生成的 vmdk 加密磁盘头部即可,后经过操作发现这段数据是 VMware 打开虚拟机时,对 vmdk 进行解密的密钥串,关系到加密虚拟机的 vmdk 能否正常解密,这时候就是磁盘数据。
那么只要执行如下操作即可:创建一个新的虚拟机,创建的时候参数配置通过在 Encryption.bin02 的数据里捕风捉影(可以看出,出题人使用的都是默认配置),使用 1q2w3e4r 这个密码对虚拟机进行加密,然后将加密过后的虚拟机的 vmdk 文件拿出来给原来题目中提取的虚拟机使用,但是使用前需要替换掉头部的加密串信息。
分离和修复 vmdk 文件修复前:
修复后:
此时虚拟机修复完成,已经可以成功将虚拟机移除解密,注意:虚拟机不能点开机,否则内存镜像文件 vmem 将被删除
解密移除完成后,当前目录下的 vmem 文件即为未使用 VMware 加密的虚拟机内存镜像文件,此时理论上讲,已经可以使用 volatility 正常分析,尝试使用 volatility2 分析发现仍然搜索不到 profile,推测题目为 Windows10 的内存镜像文件,遂使用 Volatility3 进行分析。
Volatility3 是对 Volatility2 的重写,它基于 Python3 编写,对 Windows 10 的内存取证很友好,且速度比 Volatility2 快很多。对于用户而言,新功能的重点包括:大幅提升性能,消除了对--profile 的依赖,以便框架确定需要哪个符号表(配置文件)来匹配内存示例中的操作系统版本,在 64 位系统(例如 Window 的 wow64)上正确评估 32 位代码,自动评估内存中的代码,以避免对分析人员进行尽可能多的手动逆向工程等。
python3 vol.py -f mem_secret-963a4663.vmem windows.info
使用 Volatility3 可以看到操作系统版本是 Windows10,且根据 Major/Minor 15.18362 可以确定具体的操作系统 profile 配置文件。在 Volatility2 中使用--info 看到具体对应的 profile 为 Win10x86_18362,此后即可回归到 volatility2,手动指定 profile 即可解题。
题目解答
(1)取证人员首先对容器的基本信息进行核实,经过确定该容器的基本信息为*__*。(答案为 32 位小写 md5(容器操作系统系统的版本号+容器主机名+系统用户名),例如:操作系统的版本号为10.0.22449
,容器主机名为DESKTOP-0521
,系统登录用户名为 admin,则该题答案为 32 位小写md5(10.0.22449DESKTOP-0521admin)
的值ae278d9bc4aa5ee84a4aed858d17d52a
)
使用 dumpregistry、WRR.exe 对内存镜像进行注册表分析,发现主机名为 DESKTOP-4N21ET2,系统的版本号为 6.3.18363,系统登录用户名为 Ado,则计算小写 32 位 md5(6.3.18363DESKTOP-4N21ET2Ado)值为 38c9307280315a1888681d133658e6ce。
使用 dumpregistry 导出注册表相关文件:
python2 vol.py -f mem_secret-963a4663.vmem --profile=Win10x64_18362 dumpregistry -D ./
使用 WRR 解析 SYSTEM.reg 文件获取到主机名为 DESKTOP-4N21ET2
解析 SOFTWARE.reg 获得系统的版本号为 6.3.18363
使用 windows.filescan,导出结果搜索 Desktop 发现用户名为 Ado
(2)黑客入侵容器后曾通过木马控制端使用 Messagebox 发送过一段信息,该信息的内容是***__***。(答案为 Messagebox 信息框内内容)第二题的答案即为上面挂起状态虚拟机中看到的界面 Messagebox 内容:Best_hacker
(3)经过入侵分析发现该容器受到入侵的原因为容器使用人的违规进行游戏的行为,该使用人进行游戏程序的信息是**__****。(答案为“32 位小写 md5(游戏程序注册邮箱+游戏程序登录用户名+游戏程序登录密码),例如:注册邮箱为adol@163.com
,登录用户名为 user,密码为 user1234,则该题答案为” adol@163.comuseruser1234”
的小写 md5 值5f4505b7734467bfed3b16d5d6e75c16
)**
根据题目要求,分析游戏程序,使用 pslist 查看进程信息可发现存在大量 steam 进程,对 steam 进程块使用 winhex 进行邮箱正则匹配,匹配到 steam 注册邮箱为john@uuf.me
:
根据 steam 的登录特征,在 steam 进程块以及注册邮箱偏移地址附近,搜索关键词steamusername、password
可以发现 steam 平台的登录信息,即用户名为jock_you1
,密码为,jock.2021
:
合并邮箱和用户名密码为john@uuf.mejock_you1jock.2021
,计算 md5 小写 32 为值为:39a9ac5a37f4a4ce27b1227cf83700a6
(4)经过入侵分析发现该容器曾被黑客植入木马控制的信息是**_****。(答案为“32 位小写 md5(木马程序进程名+木马回连 ip 地址+木马回连 ip 端口)”,例如:木马程序进程名为svhost.exe
,木马回连 ip 为 1.1.1.1,木马回连端口为 1234,则该题答案为“svhost.exe1.1.1.11234”
的 32 位小写 md5 值f02da74a0d78a13e7944277c3531bbea
)**
使用 pstree、netscan 进行恶意程序分析,在使用 pstree 时发现伪装为 steam 的木马程序 steam.exe,该程序并非 steam 自身程序且 Wow64 标识为 True,并进行进程导出扫描,杀毒软件确切报毒。
python3 vol.py -f mem_secret-963a4663.vmem windows.pstree
使用 netscan 扫描容器的网络连接情况,并对导出的 steam.exe 木马程序进行动态测试,发现木马程序回连 ip 为 192.168.241.147,端口号为 8808,与 netscan 中一致:
(5)经过入侵分析,发现黑客曾经运行过痕迹清除工具,该工具运行的基本信息是*__*。(答案为“32 为小写 md5”(痕迹清除工具执行程序名+最后一次运行时间),例如:黑客运行工具执行程序名为 run.exe,运行时间为2021-07-10 10:10:13
,则本题的答案为小写的 32 位md5(run.exe2021-07-10 10:10:13)
值为82d7aa7a3f1467b973505702beb35769
,注意:本题中运行时间的格式为 yy-mm-dd hh:mm:ss,时间时区为 UTC+8)
需要分析程序最后运行时间,使用 userassist 注册表分析程序的运行情况,并结合 filescan 扫描容器内文件情况,二者结合可以发现存储在容器桌面的无影无踪痕迹清理软件,该软件的程序执行名为:Wywz.exe,程序的运行时间结合 userassist 可以发现为2021-09-10 21:10:13 UTC+8
(注意时区的转换),则该题答案为小写 32 位 md5(Wywz.exe2021-09-1021:10:13) d46586ca847e6be1004037bc288bf60c
python2 vol.py -f mem_secret-963a4663.vmem --profile=Win10x64_18362 userassist
评论