日期:2021.07.08
作者:nothing
介绍:学习如何通过
Volatility
提取和查看注册表内容。
0x00 前言
比赛碰到了一个题目,需要从内存中提取注册表内容的,正好趁此机会整理一下如何使用Volatility
进行取证。
0x01 关于工具
1.1 简单描述
Volatility
是一款开源内存取证框架,能够对导出的内存镜像进行分析,通过获取内核数据结构,使用插件获取内存的详细情况以及系统的运行状态。
特点:
开源:Python
编写,易于和基于python
的主机防御框架集成。
支持多平台:Windows
,Mac
,Linux
全支持
易于扩展:通过插件来扩展Volatility
的分析能力
1.2 项目地址
https://github.com/volatilityfoundation/volatility
1.3 常用模块
插件名称 | 功能 |
---|---|
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 | 恢复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签名扫描进程或内核内存 |
0x02 从CTF题目学习volatility使用
2.1 题目描述
Powershell scripts were executed by malicious programs. What is the registry key that contained the power shellscript content?
2.2 解题过程
首先拿到题目以后,查看内存镜像的系统版本
volatility -f memory.dmp imageinfo
一般选择第一个系统版本即可,然后使用的时候加上--profile=Win7SP1x64
即可继续使用其他常见插件
进程信息获取
volatility -f memory.dmp --profile Win7SP1x64 pslist
文件信息获取
volatility -f memory.dmp --profile Win7SP1x64 filescan > file.txt
查看命令行参数
volatility -f memory.dmp --profile Win7SP1x64 cmdline
查看注册表内容
volatility -f memory.dmp --profile Win7SP1x64 hivelist
查看具体的注册表项
#查看注册表software项,0xfffff8a0002d7010是software的内存虚拟地址
volatility -f memory.dmp --profile Win7SP1x64 printkey -o 0xfffff8a0002d7010
#根据名称查看具体子项的内容
volatility -f memory.dmp --profile Win7SP1x64 printkey -K "SAM\Domains\Account\Users\Names"
由于本题要在所有的注册表中查找新增的注册表,并且不知道具体的子项,所以上述方式不适用,只能将所有注册表转储
volatility -f memory.dmp --profile Win7SP1x64 dumpregistry --dump ./testtt
根据题目描述,新的注册表项,是由恶意软件进行注入的,所以大概率在software
项中,尝试使用windows
自带的工具打开,但有两个问题:
1、从内存中导出的内容,跟标准的注册表项文件有差别导致无法导入系统注册表。
2、若直接导入系统注册表,可能会跟原有的注册表项有冲突甚至覆盖原有注册表项,导致系统崩溃。
基于以上两个问题,需要寻找第三方工具去查看注册表,经过多次尝试,MiTeC Windows Registry Recovery
这款工具可以读,于是使用工具打开software
的注册表。
知道注入的是powershell
恶意代码,直接搜索关键词New-Object
:
一看关键词是code
,很明显的恶意代码注入,对比过系统的注册表项以后,发现系统本身中并不包含Communication
项,更加确定就是此项,最终的flag
为:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Communication
0x03 总结
volatility
是一款非常优秀的内存取证工具,灵活使用插件可获取内存中的详细信息,无论是应急响应还是CTF
中都会起到非常大的作用。
注:目前默认的volatility
仅支持windows
系统,若要对linux
或者mac
系统进行内存分析,需单独添加profile
文件及相关的插件脚本。
参考文献
[1]. 狼组安全团队公开知识库【 https://wiki.wgpsec.org/knowledge/ctf/Volatility.html 】
来源:freebuf.com 2021-07-08 14:38:30 by: 宸极实验室Sec
请登录后发表评论
注册