BlackEnergy恶意软件内存取证分析:Volatility实战指南

2 阅读4分钟

BlackEnergy恶意软件内存取证分析:Volatility实战指南

引言

本文将通过CyberDefenders平台举办的BlackEnergy CTF挑战赛,深入解析Windows内存分析的全过程。

出于道德考量,我不会直接给出答案原文,而是帮助您理解整个分析流程与方法论。

在开始之前,请确保已准备好以下环境与工具:

  • 配备必要分析工具的虚拟机(推荐使用REMnux——专为恶意软件分析与逆向工程设计的Linux工具集)
  • 已安装Volatility内存分析工具(REMnux预装了该工具)
  • 已下载并解压挑战文件

场景描述

某跨国公司遭受网络攻击,导致敏感数据被盗。攻击者使用了一种此前从未出现过的BlackEnergy v2恶意软件变种。公司安全团队已获取受感染主机的内存转储文件,现需您进行分析,以明确攻击范围与影响程度。

解决方案

Q1:该主机最适合的Volatility配置文件是什么?

使用imageinfokdbgscan模块,可以获取该主机的Volatility配置文件。

vol.py -f img.raw imageinfo
vol.py -f img.raw kdbgscan

Q2:获取内存镜像时有多少个进程正在运行?

我使用psxview模块来查看进程的退出时间。(也可使用pslistpsscan。)ExitTime属性对判断进程的运行状态至关重要:若该属性值为空(即空字符串),则表示该进程正在运行。

我将结果导出为SQLite3数据库文件,然后进行查询操作。

vol.py -f img.raw --profile <来自Q1的配置文件> psxview --output=sqlite --output-file=psxview.db
sqlite3 psxview.db

/* SQLite3 查询 */
.schema /* 获取表名、列名及数据类型 */
SELECT count(*) FROM PsXview; /* 获取镜像采集时的进程总数 */
SELECT count(*) FROM PsXview WHERE ExitTime IS ""; /* 获取正在运行的进程数 */

Q3:cmd.exe的进程ID(PID)是多少?

可使用pslistpsscanpsxview获取进程列表,然后通过grep过滤出cmd.exe的进程信息。

vol.py -f img.raw --profile <来自Q1的配置文件> pslist | grep 'cmd'

Q4:最可疑的进程名称是什么?

我将pslist的输出保存到文件中,并仔细审查进程列表,其中可疑进程非常显眼。

vol.py -f img.raw --profile <来自Q1的配置文件> pslist > pslist.txt
less pslist.txt

Q5:哪个进程最可能存在代码注入行为?

代码注入是攻击者或攻防安全人员常用的技术手段,用于实现防御规避或权限提升。我使用malfind模块来查找存在“注入”痕迹的进程。关键特征如下:

  • 存在MZ头(0x4D5A),表明该进程包含可移植可执行文件(PE)
  • 内存保护标志为PAGE_EXECUTE_READWRITE,这是攻击者注入PE文件时的常用权限组合(注意:此权限组合并不总是代表进程注入)
vol.py -f img.raw --profile <来自Q1的配置文件> malfind > malfind.txt
less malfind.txt

Q6:Q5中注入进程所引用的异常文件的完整路径是什么?

我使用handles模块获取进程线程所打开的文件。在此案例中,一个可疑的驱动程序被加载到内存中。所使用的进程ID(PID)属于被注入的进程。

vol.py -f img.raw --profile <来自Q1的配置文件> handles -p <PID> -t file > handles.txt
less handles.txt

Q7:与Q5中进程相关的注入DLL文件的名称是什么?

ldrmodules模块对于检测动态链接库(DLL)注入和进程镂空(Process Hollowing)非常有效。如果InLoadInInitInMem属性中存在任何值为False的情况(PE文件本身InInit = False除外),则很可能发生了反射式DLL注入。

vol.py -f img.raw --profile <来自Q1的配置文件> ldrmodules -p <PID> > ldrmodules.txt
less ldrmodules.txt

Q8:注入DLL的基地址是什么?

执行注入所使用的DLL与Q5中被注入的进程共享相同的基地址。我们可以使用Q5中malfind模块的输出结果来获取该基地址(地址以十六进制表示)。

结语

在我看来,该挑战难度适中,足以激发深入思考,同时也提供了贴近真实场景的内存取证分析思路。我使用Volatility 2(基于Python 2)完成了上述解决方案,您也可以使用Volatility 3。

如需进一步深入研究内存取证领域,推荐以下学习资源:

🔥 祝您调查顺利! CSD0tFqvECLokhw9aBeRql9xNYES+YinPrU2B/vxKeJ7H44lQx6Xsn5JHhXGTIRxf8+3rIz2c4CPyYH2OU1duWeavDPl0bY8VA0gF0lrHwxVv8JSSDlMBjM9RLg0Cjtl