从零开始的取证之旅(一)——NewstarCTF2025 Week3:内存取证:Windows 篇

发布于 18 天前  46 次阅读


原题如下:本关考验你内存取证本领,请考生携带好文具(kali 虚拟机和 Volatility2),做好准备,迎接挑战。

本题的 FLAG 由多个问题的答案组成,使用下划线 _ 将答案各部分连接,就能得到 FLAG:

恶意进程的外联 ip:port
恶意进程所在的文件夹名称
用户的主机登录密码
电脑主机的名称
涉及字母的部分统一小写,题目附件包含 FLAG 的举例。

题目附件已上传至本站,提取密码: 1145,可供大伙自行复现题目。

关于VMware虚拟机和kali Linux的安装在此不作赘述,网上有足够多的教程,此处仅记录一下最基本的内存取证思路。

一、初识内存取证与工具

内存取证,简单来说就是分析电脑关机前的内存镜像文件,把当时电脑运行的进程、网络连接、用户账号密码、计算机名称等隐藏线索全部挖出来。

本次做题只用两个核心条件:

  1. 取证工具:Volatility 2.6
  2. 题目附件:hellohacker.raw 内存镜像文件

题目的要求很明确:FLAG 由四个部分用下划线拼接而成,分别是恶意进程外联 IP 端口、恶意进程所在文件夹名、主机登录密码、电脑主机名,且字母统一小写。

二、新手完整取证流程复盘

第一步:识别内存镜像系统版本

拿到 raw 镜像第一件事,必须先确定系统版本,后续所有分析命令都要依赖对应profile配置。

使用命令:

volatility -f hellohacker.raw imageinfo

得到

INFO    : volatility.debug    : Determining profile based on KDBG search...
          Suggested Profile(s) : Win7SP1x64, Win7SP0x64, Win2008R2SP0x64, Win2008R2SP1x64_23418, Win2008R2SP1x64, Win7SP1x64_23418
                     AS Layer1 : WindowsAMD64PagedMemory (Kernel AS)
                     AS Layer2 : FileAddressSpace (/home/kali/Desktop/hellohacker.raw)
                      PAE type : No PAE
                           DTB : 0x187000L
                          KDBG : 0xf8000403e120L
          Number of Processors : 2
     Image Type (Service Pack) : 1
                KPCR for CPU 0 : 0xfffff80004040000L
                KPCR for CPU 1 : 0xfffff88004500000L
             KUSER_SHARED_DATA : 0xfffff78000000000L
           Image date and time : 2025-09-30 11:32:54 UTC+0000
     Image local date and time : 2025-09-30 19:32:54 +0800

工具自动识别出推荐配置 Win7SP1x64,后续所有命令都带上这个配置参数,这是所有取证操作的基础,新手切记不能跳过这一步。

第二步:查找恶意进程外联 IP:PORT

想要找恶意木马的外联地址,用netscan扫描内存中所有网络连接:

volatility -f hellohacker.raw --profile=Win7SP1x64 netscan

着重看Foreign Address列,发现一个特殊的ip:

0x7fe07560         UDPv4    0.0.0.0:3702                   *:*                                   1304     svchost.exe    2025-09-30 11:28:21 UTC+0000
0x7fd69ac0         TCPv4    192.168.20.131:49158           125.216.248.74:11451 ESTABLISHED      2864     svchost.exe    

恶意外联:125.216.248.74:11451,对应的进程PID为2864.

第三步:定位恶意进程所在文件夹

记下恶意进程 PID=2864,用cmdline插件查看进程完整启动路径:

volatility -f hellohacker.raw --profile=Win7SP1x64 cmdline -p 2864

得到:

svchost.exe pid:   2864
Command line : "C:\Windows\Temp\svchost.exe" 

所以文件夹:Temp。

第四步:提取系统用户登录密码

hashdump抓取系统所有用户的 NTLM 密码哈希:

volatility -f hellohacker.raw --profile=Win7SP1x64 hashdump

得到

Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
JustAGuestAwA:1000:aad3b435b51404eeaad3b435b51404ee:3008c87294511142799dca1191e69a0f:::

输出格式为用户名:RID:LM哈希:NTLM哈希:::。RID是系统分配的身份编号,一般500指的是系统默认管理员,501指的是来宾账号,其余为自建。而LM 哈希是Windows 很早的老旧加密算法,安全性极差。从 Win7 开始默认直接禁用,所以你看到所有人的 LM 哈希都是同一个固定值。只有NTLM哈希是密码的加密值。截取NTLM哈希并在互联网(cmd5.com等网站)上找碰撞。Administrator和Guest均无密码,JustAGuestAwA为admin123。

所以密码:admin123

第五步:读取注册表获取主机名

计算机名称存放在系统注册表中,分两步读取:

先用hivelist找到 SYSTEM 注册表虚拟地址:

volatility -f hellohacker.raw --profile=Win7SP1x64 hivelist | grep SYSTEM

得到:

0xfffff8a000024010 0x000000002c5cc010 \REGISTRY\MACHINE\SYSTEM

分别为虚拟地址,物理地址和注册表路径。带入地址使用下一步:

volatility -f hellohacker.raw --profile=Win7SP1x64 printkey -o 地址 -K "ControlSet001\Control\ComputerName\ComputerName"

返回:

Legend: (S) = Stable   (V) = Volatile

----------------------------
Registry: \REGISTRY\MACHINE\SYSTEM
Key name: ComputerName (S)
Last updated: 2025-09-30 09:17:16 UTC+0000

Subkeys:

Values:
REG_SZ                        : (S) mnmsrvc
REG_SZ        ComputerName    : (S) ARISAMIK

输出有两个注册表值,无名称默认值为系统无关参数,带ComputerName标识的才是真实主机名ARISAMIK

最终flag{125.216.248.74:11451_temp_admin123_arisamik}

借用AI做个总结:内存取证并不是靠高深知识死磕,而是固定工具 + 固定流程的套路化解题。从识别镜像、扫描网络、查进程路径,到抓取密码哈希、读取注册表,每一步都有对应的 Volatility 插件。对于 CTF 新手来说,不用害怕内存取证,从这类基础 MISC 题目入手,熟记常用命令、理清排查逻辑,就能轻松入门,慢慢解锁更多进阶取证题型。

要是真有这么轻松就好了

附个依旧是AI总结出来的Volatility命令集:

通用格式:volatility -f 内存镜像 --profile=系统配置 插件名

你这道题的固定配置:--profile=Win7SP1x64

一、基础必用(第一步必执行)

命令 核心作用 新手备注
volatility -f xxx.raw imageinfo 识别内存镜像的系统版本 所有操作的前提,获取profile
volatility -f xxx.raw kdbgscan 辅助识别系统配置 imageinfo 识别失败时用

二、进程分析(找恶意程序 / 木马)

命令 核心作用 新手备注
pslist 列出所有运行的进程 查看 PID、进程名、父进程
psscan 扫描隐藏进程 排查被木马隐藏的恶意进程
cmdline -p PID 查看进程完整路径 / 启动命令 本题用它找到恶意程序在Temp文件夹
dlllist -p PID 查看进程加载的动态库 排查恶意 DLL 注入

三、网络分析(找外联 IP / 端口,本题核心)

命令 核心作用 新手备注
netscan 扫描所有网络连接 本题用它找到125.216.248.74:11451
connections 查看 TCP 活跃连接 仅支持旧版 Windows
connscan 扫描已断开的网络连接 补全 netscan 遗漏的连接

四、文件扫描(找隐藏文件)

命令 核心作用 新手备注
filescan 扫描内存中所有文件 CTF 高频,过滤 flag/txt/exe 文件
dumpfiles -Q 地址 -D ./ 提取内存中的文件 把扫描到的文件导出到本地

五、注册表分析(找主机名 / 系统配置)

命令 核心作用 新手备注
hivelist 列出所有注册表配置单元 本题用它找 SYSTEM 注册表地址
printkey -o 地址 -K 注册表路径 读取注册表键值 本题用它获取主机名ARISAMIK

六、密码取证(本题核心考点)

命令 核心作用 新手备注
hashdump 提取系统用户密码哈希 本题用它拿到管理员密码哈希
lsadump 提取 LSA 存储的密码 查看系统明文密码 / 密钥
cachedump 提取域缓存密码 域环境取证常用

七、命令行历史(找 flag 高频)

命令 核心作用 新手备注
consoles 提取 CMD 命令行完整记录 很多题 flag 直接藏在这里
cmdscan 扫描命令行操作历史 补充 consoles 的内容

八、内存 / 进程提取(进阶)

命令 核心作用 新手备注
memdump -p PID -D ./ 导出指定进程的内存 strings搜索关键词
procdump -p PID -D ./ 导出进程的可执行程序 把木马程序导出分析

"Hasta Ia Victoria Siempre"