内存取证-金砖技能大赛

环境

金砖技能大赛-应急响应-内存镜像分析、46届世界技能大赛湖北省选拔赛-数字取证

你作为 A 公司的应急响应人员,请分析提供的内存文件按照下面的要求找到 相关关键信息,完成应急响应事件。
1、从内存中获取到用户admin的密码并且破解密码,以Flag{admin,password} 形式提交(密码为 6 位);
2、获取当前系统 ip 地址及主机名,以 Flag{ip:主机名}形式提交;
3、获取当前系统浏览器搜索过的关键词,作为 Flag 提交;
4、当前系统中存在挖矿进程,请获取指向的矿池地址,以 Flag{ip:端口}形式 提交;
5、恶意进程在系统中注册了服务,请将服务名以 Flag{服务名}形式提交。

1、从内存中获取到用户admin的密码并且破解密码,以Flag{admin,password} 形式提交(密码为 6 位);

拉取镜像,获取操作系统信息

python2 vol.py -f worldskills3.vmem imageinfo

image-20251230155417854

接下来就是–profile=Win7SP1x64

查看密码

python2 vol.py -f worldskills3.vmem --profile=Win7SP1x64 hashdunp

image-20251230155806866

此时的密码是hash加密的

解密admin密码发现为空密码

第一个空密码,第二个NTML解不出来

lsadump                从注册表中提取LSA密钥信息(已解密)

使用lsadump查看LSA密钥

image-20251230171206693

hashdump抓取系统SAM中用户信息

lsadump抓取系统中LSA Secret信息,而LSA Secret存储的是系统中自动登录的用户的明文密码,而该系统中自动登录用户仅有admin,则抓取结果就为admin用户明文密码

lsadump抓取的为admin用户的明文密码,flag{406990ff88f13dac3c9debbc0769588c}进行NTML加密后即为heapdump的admin的密码

image-20251230174342849

image-20251230174420228

2、获取当前系统 ip 地址及主机名,以 Flag{ip:主机名}形式提交

查看ip

python2 vol.py -f worldskills3.vmem --profile=Win7SP1x64 netscan

image-20251231102946654

查看主机名

python2 vol.py -f worldskills3.vmem --profile=Win7SP1x64 printkey -K "ControlSet001\Control\ComputerName\ComputerName"

image-20251231103308094

3、获取当前系统浏览器搜索过的关键词,作为 Flag 提交;

python2 vol.py -f worldskills3.vmem --profile=Win7SP1x64 iehistory

image-20251231104010770

4、当前系统中存在挖矿进程,请获取指向的矿池地址,以 Flag{ip:端口}形式 提交;

netscan 关注正在外链的进程

这为一种判断思路

image-20251231105039022

54.36.109.161:2222 为外链的矿池地址

psscan 有,但 pslist 没有 → 高危可疑进程

python2 vol.py -f worldskills3.vmem --profile=Win7SP1x64 pstree
重点看:
explorer.exe 下有没有奇怪程序
services.exe 下出现非服务类程序
svchost.exe 启动了 GUI 程序 ❌

拼写相似:

  • svch0st.exe
  • expl0rer.exe

不合理位置:

  • svchost.exe 不在 System32
  • iexplore.exeTemp
python2 vol.py ... dlllist -p PID 查看进程路径(先通过pslist确定可疑进程pid)
主要关注非system32目录中的

5、恶意进程在系统中注册了服务,请将服务名以 Flag{服务名}形式提交。

已经确定了恶意进程,pid为2588,查看该进程的服务

该进程无服务

image-20251231112902497

查看该进程的父进程

pslist -p 2588

image-20251231112820092

查找父进程的服务

svcscan | grep "3036" -A 10

image-20251231110340773

grep "3036" -A 10

-A = After(后面)
表示:
匹配到关键字后,再额外显示后面的 N 行内容

PID 3036(父进程)是真正“运行服务”的进程

PID 2588(子进程)不是服务进程

3036 (父,有 ServiceName)
└── 2588 (子,无 ServiceName)

答案

题目 答案
1、从内存中获取到用户admin的密码并且破解密码,以Flag{admin,password} 形式提交(密码为 6 位); Flag{admin,dfsddew}
2、获取当前系统 ip 地址及主机名,以 Flag{ip:主机名}形式提交; Flag{192.168.85.129:WIN-9FBAEH4UV8C}
3、获取当前系统浏览器搜索过的关键词,作为 Flag 提交; Flag{admin@file:///C:/Users/admin/Desktop/flag.txt}
4、当前系统中存在挖矿进程,请获取指向的矿池地址,以 Flag{ip:端口}形式 提交; Flag{54.36.109.161:2222}
5、恶意进程在系统中注册了服务,请将服务名以 Flag{服务名}形式提交。 Flag{VMnetDHCP}

Q&A

为什么第五题查找服务时,查找的是父进程的服务,而非当前子进程的服务,如果有多个子进程,会不会在其他子进程中运行了服务

我们查找当前子进程服务,发现子进程并没有服务,是因为子进程只是执行恶意逻辑

角色 作用
3036(父进程) ✔ 注册服务 ✔ 被 SCM 识别 ✔ 有 ServiceName
2588(子进程) ✔ 执行恶意逻辑 ✘ 没有服务身份

SCM 只关心 3036,完全不关心 2588

而svcscan是查看服务信息,因为2588子进程没有服务身份,所以他的结果为空

如果“父进程有多个子进程”怎么办?

不会“跑到别的子进程里当服务”。
真正运行服务的进程,永远只有 svcscan 中那一个 PID。

服务 ≠ 任意子进程

  • SCM 不会:
    • 把服务名绑定到多个 PID
    • 在子进程之间来回切换

所以:

  • 不管父进程拉起多少子进程
  • 只有一个进程是“服务进程”

子进程通常是:

子进程类型 作用
Worker 执行恶意任务
Loader 注入、反射 DLL
Payload 实际木马

但它们 没有 ServiceName

模型一:独立服务进程(子是服务)

dropper.exe
└── service.exe ← 服务

模型二:svchost 托管

恶意 DLL
└── svchost.exe ← 服务

模型三:服务壳 + 子进程(你这题)

service.exe ← 服务(父)
└── worker.exe ← 恶意子进程