学习笔记-Volatility

Volatility

文章作者 r0fus0d & Lorna Dane


免责声明

本文档仅供学习和研究使用,请勿使用文中的技术源码用于非法用途,任何人造成的任何负面影响,与本人无关.


简介

Volatility 是一个用于事件响应和恶意软件分析的开源内存取证框架。它是用 Python 编写的,支持 Microsoft Windows,macOS 和 Linux,volatility 框架是一个完全开放的工具集合,在 GNU 通用许可证下用 Python 实现,用于从易失性存储器(RAM)样本中提取数字镜像。提取技术完全独立于被取证的系统而执行,但可以查看到系统运行时的状态信息。该框架旨在向人们介绍从内存样本中提取的数字镜像相关的技术,并为进一步研究该领域提供一个平台,它可以分析 .raw、.vmem、.img 后缀的文件。

支持原始数据转储(Raw Dump)、崩溃转储(Crash Dump)、休眠文件及各种其它格式,甚至可以支持多个格式之间的转换。

官网

项目地址

相关文章

视频教程

Profile 资源


安装及维护

利用 f8x 进行安装

wget -O f8x https://f8x.io/
bash f8x -vol

Ubuntu 下安装

apt-get install -y volatility
apt-get install -y python-dev
apt-get install -y python3-dev
python2 -m pip install distorm3 yara pycrypto openpyxl ujson pil
python2 -m pip install Crypto
python2 -m pip install pycryptodome
python2 -m pip install pytz
python2 -m pip install Pillow
python2 -m pip install yara-python

cd /tmp
git clone https://github.com/gdabah/distorm
cd distorm
python2 -m pip install distorm3

volatility --info

kali 下安装

cd /tmp
wget https://bootstrap.pypa.io/get-pip.py
python2 get-pip.py
python2 -m pip install --upgrade pip
apt-get install -y python-dev
apt-get install -y python3-dev
python2 -m pip install distorm3 yara pycrypto openpyxl ujson pil
python2 -m pip install Crypto
python2 -m pip install pycryptodome
python2 -m pip install pytz
python2 -m pip install Pillow
python2 -m pip install yara-python

cd /tmp
git clone https://github.com/gdabah/distorm
cd distorm
python2 -m pip install distorm3

cd
git clone https://github.com/volatilityfoundation/volatility.git
cd volatility
python setup.py build
python setup.py install

python vol.py --info

centos 下安装

yum install -y kernel-devel
yum install -y make gcc gcc-c++
yum groupinstall -y "Development Tools"
yum install -y yum-utils
yum install -y pcre-devel libpcre++-devel python-devel pycrypto

pip install --upgrade pip
python2 -m pip install distorm3==3.4.4
python2 -m pip install yara pycrypto openpyxl ujson pil
python2 -m pip install Crypto
python2 -m pip install pycryptodome
python2 -m pip install pytz
python2 -m pip install Pillow
python2 -m pip install yara-python

cd
git clone https://github.com/volatilityfoundation/volatility.git
cd volatility
python setup.py build
python setup.py install

python vol.py --info

windows 下安装

直接访问官网下载二进制文件 https://www.volatilityfoundation.org/releases


使用

基本用法

volatility -f [image] --profile=[profile] [plugin]
    eg:volatility -f /opt/test.vmem -profile=Win7SP1x86 pslist

    -h      # 查看相关参数及帮助说明
    -info   # 查看相关模块名称及支持的 Windows 版本
    -f      # 指定要打开的内存镜像文件及路径
    -d      # 开启调试模式
    -v      # 开启显示详细信息模式 (verbose)

# 如果是从 github 下载的
python vol.py -f [image] ‐-profile=[profile] [plugin]

Volatility 支持的插件列表

amcache             # 查看 AmCache 应用程序痕迹信息
apihooks            # 检测内核及进程的内存空间中的 API hook
atoms               # 列出会话及窗口站 atom 表
atomscan            # Atom 表的池扫描(Pool scanner)
auditpol            # 列出注册表 HKLM\SECURITY\Policy\PolAdtEv 的审计策略信息
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 Descriptor Table)
getservicesids      # 获取注册表中的服务名称并返回 SID 信息
getsids             # 打印每个进程的 SID 信息
handles             # 打印每个进程打开的句柄的列表
hashdump            # 转储内存中的 Windows 帐户密码哈希(LM/NTLM)
hibinfo             # 转储休眠文件信息
hivedump            # 打印注册表配置单元信息
hivelist            # 打印注册表配置单元列表
hivescan            # 注册表配置单元池扫描
hpakextract         # 从 HPAK 文件(Fast Dump 格式)提取物理内存数据
hpakinfo            # 查看 HPAK 文件属性及相关信息
idt                 # 显示中断描述符表(Interrupt Descriptor 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             # indows 服务列表扫描
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 签名扫描进程或内核内存

Linux 内存取证插件参数

# 获取系统进程信息相关命令
linux_pstree        # 进程树列表
linux_pslist_cache  # 来自的 kmem_cache 活动进程
linux_psxview       # 比较进程列表
linux_lsof          # 打开文件描述符的每个活动进程
linux_pslist        # 活动的进程列表
linux_psaux         # 活动的进程列表(输出内容包括更多的细节)

# 获取系统内存信息的相关命令
linux_memmap        # 内存映射文件
linux_pidhashtable  # Linux 内核中的 PID 散列表
linux_proc_maps     # 转储由-s/-vma 参数到磁盘上指定的内存范围。
linux_dump_map      # 进程内存的详细信息,包括堆和共享库。
linux_bash          # bash 历史文件

# 获取网络接口信息的相关命令
linux_arp           # 显示 arp 列表
linux_ifconfig      # 显示网络接口详细情况
linux_route_cache   # 显示网络路由表
linux_netstat       # 查看网络链接情况

# 获取系统硬件信息的相关命令
linux_cpuinfo       # 显示 cpu 的相关命令信息。
linux_dmesg         # 显示内核缓存信息。
linux_iomem         # 显示 io 设备信息。
linux_mount         # 显示/proc/mouns 的相关命令信息,主要是挂载的磁盘设备。
linux_mount_cache   # 显示 kmem_cache 的相关命令信息。
linux_slabinfo      # 显示/proc/slabinfo 的相关命令信息。

# rootkit 检测的相关命令
linux_check_afinfo  # 检查篡改网络协议结构。
linux_check_creds   # 检查进程共享结构。
linux_check_fop     # 检查文件操作数据结构篡改情况。
linux_check_idt     # 检查中断描述符表(IDT)的篡改情况。
linux_check_syscall # 在系统调用表检查功能情况。
linux_check_modules # 检查用于从内核模块列表中缺少在 sysfs 中的项目。

# 获取内核模块信息的相关命令
linux_lsmod         # 加载内核模块。
linux_tmpfs         # tmpfs 的内容。

获取镜像信息

首先获取镜像的摘要信息,一般这是进行镜像分析的第一步

volatility -f [image] imageinfo

这其中比较有用的信息就是 Suggested Profile(s) ,这个是工具识别的系统版本,存在多个的原因是这是根据一些特征识别的,所以可能有误报,就把各种结果按照可能性排列出来了,一般直接选择第一个,如果加载插件报错的话,可以尝试后面的。

这里根据给出的结果选择第一个,然后使用 pslist 插件,看一下系统中运行的进程。

进程

按照 EPROCESS 列表列出所有正在运行的进程

volatility -f [image] --profile=[profile] pslist

如图中 lsass.exe、winlogon.exe ,在 windows 本地登录时,用户的密码存储在 %SystemRoot%\system32\config\SAM 这个文件里。当用户输入密码进行本地认证的过程中,所有的操作都是在本地进行的。他其实就是将用户输入的密码转换为 NTLM Hash,然后与 SAM 中的 NTLM Hash 进行比较。当用户注销、重启、锁屏后,操作系统会让 winlogon 显示登录界面,也就是输入框。当 winlogon.exe 接收输入后,将密码交给 lsass 进程,这个进程中会存一份明文密码,将明文密码加密成 NTLM Hash,对 SAM 数据库比较认证。

notepad.exe 是指正在运行一个记事本程序,而 mspaint.exe 是指是微软画图程序, cmd.exe 指正在运行命令行程序

显示隐藏/终止的进程

volatility -f [image] --profile=[profile] psscan

以 dot 图的形式导出

python vol.py -f [image] --profile=[profile] psscan --output=dot --output-file=out.dot

apt install -y xdot

把进程以树的形式显示

volatility -f [image] --profile=[profile] pstree

查看 DLL 文件

当我们发现可疑进程后,可通过此命令进行深度查看

volatility -f [image] --profile=[profile] dlllist -p [pid]

转储出可寻址的内存数据

在上面的进程中可以看到,存在一个 mspaint.exe 的进程,它是微软的画图软件,对于这样的情况,可以使用工具还原内存中的图片, 来当时查看的图片或者当时状态的图片,使用的工具是 gimp,可以在 linux 上安装使用。

这里首先将 mspaint.exe 的进程内存 dump 出来,使用 memdump 插件,在之前列举进程的截图中,进程名字后面一行就是该进程的 PID。

volatility -f [image] --profile=[profile] memdump -p [pid] --dump-dir ./

将获取到的 2276.dmp 文件改名为 2276.data,然后在 gime 中点击显示全部文件,选择 2276.data 打开

add-apt-repository ppa:otto-kesselgulasch/gimp
apt-get update
apt-get install -y gimp     # 安装 gimp
gimp                        # 启动 gimp
mv 2276.dmp 2276.data

首先选择一个固定的宽度,这里选择 1000,然后调节高度把屏幕铺满,然后再大幅度拖动 Image 下的 Offset 的滑块,当看到图片类似下图时停止,可以看到隐隐约约有一张图,但是有点重叠,这时,点击上下箭头缓慢调节 Width,其中 Heigth 在调节中作用是不大的,主要是 Width 和 Offset 的调节决定是否能看到图片

微调位移为图像的左右方向平移,大幅调节位移则是图像的上下方向平移。而宽度不变时,始终显示的都是同一幅图像。

在调节时,不仅仅只能看到画图程序的图片,如下图,就调出了另一个状态的一个系统图片

获取运行过的命令

在上面查看进程时,可以看到存在一个 cmd 进程,那么可以使用 cmdscan 插件来查看运行过的命令,

volatility -f [image] --profile=[profile] cmdscan

可以看到执行了 whoami、ifconfig、ipconfig 这三个命令

查看进程命令行参数

volatility -f [image] --profile=[profile] cmdline


信息

获取记事本数据

volatility -f [image] --profile=[profile] notepad

# 当上面这个插件不支持这个系统,这时可以使用 editbox 查看

volatility -f [image] --profile=[profile] editbox

查看当前桌面截图

可以使用 screenshot 查看查看当前桌面的伪截图,其中会显示桌面上窗口的框,不会显示其中的内容

volatility -f [image] --profile=[profile] screenshot --dump-dir ./

获取系统中的用户以及密码

volatility -f [image] --profile=[profile] hashdump

dump 明文

volatility -f [image] --profile=[profile] lsadump

注册表 dump 明文

volatility -f [image] --profile=[profile] hivelist
volatility -f [image] --profile=[profile] hashdump -y [SYSTEM的地址] -s [SAM的地址]

查看剪切版中的信息

volatility -f [image] --profile=[profile] clipboard

扫一下 ie 浏览记录

volatility -f [image] --profile=[profile] yarascan

文件

查看系统中的文件

通过 filescan 命令,可以扫描当前状态下的一些文件,例如桌面的文件,或者特定类型的文件,这些都是结合 grep 命令来实现的

volatility -f [image] --profile=[profile] filescan | grep -E "zip|txt|doc|pdf"

查看桌面的文件

volatility -f [image] --profile=[profile] filescan | grep "Desktop"

dump 扫描到的文件

在上一步中,发现了桌面的一个 flag.txt,那么可以使用 dumpfiles 命令来将文件 dump 出来

volatility -f [image] --profile=[profile] dumpfiles -Q 0x000000007de00130 --dump-dir ./

# 这里的 -Q 参数是前面扫描时候的第一个参数,标记了文件的转储的物理地址

dump 出的文件默认是 dat 后缀的,可以使用 linux 下的 file 命令来查看获取的文件类型,或者是根据之前扫描文件获取到的文件名来修改后缀

转储内存中的进程里 exe 文件

volatility -f [image] --profile=[profile] procdump -p [pid] --dump-dir ./


网络

查看系统开放端口以及连接情况

volatility -f [image] --profile=[profile] netscan


注册表信息

打印注册表项及其子项和对应的值

volatility -f [image] --profile=[profile] printkey -K "SAM\Domains\Account\Users\Names"

列出注册表配置文件中的注册表信息

volatility -f [image] --profile=[profile] hivelist

打印内存中指定的注册表信息

volatility -f [image] --profile=[profile] hivedump -o 0xfffff8a000bff010
# -o 跟虚拟地址


Linux Profile

Volatility 对 Linux 进行分析需要指定系统的 Profile

使用第三方 Profile

https://github.com/KDPryor/LinuxVolProfiles 处直接下载已经做好的 profile 文件(zip 文件)然后复制到目录后解压缩即可。

git clone https://github.com/KDPryor/LinuxVolProfiles.git
cd LinuxVolProfiles
mv Ubuntu-3.8.0-19.zip /volatility/volatility/plugins/overlays/linux/
cd /volatility/volatility/plugins/overlays/linux
unzip Ubuntu-3.8.0-19.zip

制作 Profile

Volatility 自带一些 windows 系统的 profile,Linux 系统的 Profile 需要自己制作,制作的方法如下:实际是将 module.dwarf 和 system.map 打包成一个 zip 文件,接着将 zip 文件移动到 volatility/plugins/overlays/linux/ 目录中。

这里以 centos7 为例,先安装 dwarfdump(必须安装,创建 module.dwarf 文件的依赖)

yum install -y gcc make gcc-c++
yum install -y elfutils-devel
yum install -y kernel-devel
wget https://www.prevanders.net/libdwarf-20201201.tar.gz
tar -zxvf libdwarf-20201201.tar.gz
cd libdwarf-20201201
./configure
make
make install
cd ../

在 volatility 目录中的 tool/Linux 运行 make 命令来创建 module.dwarf 文件

git clone https://github.com/volatilityfoundation/volatility.git
cd volatility/tools/linux

make
ls -l

打包,将 centos7.zip 移至分析机的 volatility/plugins/overlays/linux/ 目录中

zip centos7.zip /boot/System.map* module.dwarf

在分析机上将 centos7.zip 至 volatility/plugins/overlays/linux/ 目录中

mv centos7.zip /pentest/volatility/plugins/overlays/linux/
python vol.py --info | grep "centos7"

实战 linux 分析

住:这里 LiME 导出的无法成功解析,不知道原因

直接复制 centos7 的内存文件,放到分析机上,查看进程树列表

python vol.py -f tmp.vmem --profile=Linuxcentos7x64 linux_pstree

显示网络接口详细情况

python vol.py -f tmp.vmem --profile=Linuxcentos7x64 linux_pstree

查看某具体进程的情况

python vol.py -f tmp.vmem --profile=Linuxcentos7x64 linux_proc_maps

扩展

扩展插件

mimikatz


volatility3

Volatility3 是对 Volatility2 的重写,它基于 Python3 编写,对 Windows 10 的内存取证很友好,且速度比 Volatility2 快很多。对于用户而言,新功能的重点包括:大幅提升性能,消除了对 --profile 的依赖,以便框架确定需要哪个符号表(配置文件)来匹配内存示例中的操作系统版本,在 64 位系统(例如 Window 的 wow64)上正确评估 32 位代码,自动评估内存中的代码,以避免对分析人员进行尽可能多的手动逆向工程。对于开发人员:更加轻松地集成到用户的第三方接口和库中,广泛的 API 文档,插件可以直接调用其他插件的能力,插件版本控,直接集成自定义符号表和数据结构。

利用 f8x 进行安装

wget -O f8x https://f8x.io/
bash f8x -vol3

安装

git clone https://github.com/volatilityfoundation/volatility3.git
cd volatility3
python3 setup.py build
python3 setup.py install
python3 vol.py -h

符号表集

cd /tmp
wget downloads.volatilityfoundation.org/volatility3/symbols/windows.zip
wget downloads.volatilityfoundation.org/volatility3/symbols/mac.zip
wget downloads.volatilityfoundation.org/volatility3/symbols/linux.zip
mkdir -p /pentest/volatility3/symbols
mv /tmp/windows.zip /pentest/volatility3/symbols
mv /tmp/mac.zip /pentest/volatility3/symbols
mv /tmp/linux.zip /pentest/volatility3/symbols

常用插件

banners.Banners                                 Attempts to identify potential linux banners in an image
configwriter.ConfigWriter                       Runs the automagics and both prints and outputs configuration in the output directory.
frameworkinfo.FrameworkInfo                     Plugin to list the various modular components of Volatility
isfinfo.IsfInfo                                 Determines information about the currently available ISF files, or a specific one
layerwriter.LayerWriter                         Runs the automagics and writes out the primary layer produced by the stacker.
linux.bash.Bash                                 Recovers bash command history from memory.
linux.check_afinfo.Check_afinfo                 Verifies the operation function pointers of network protocols.
linux.check_creds.Check_creds                   Checks if any processes are sharing credential structures
linux.check_idt.Check_idt                       Checks if the IDT has been altered
linux.check_modules.Check_modules               Compares module list to sysfs info, if available
linux.check_syscall.Check_syscall               Check system call table for hooks.
linux.elfs.Elfs                                 Lists all memory mapped ELF files for all processes.
linux.keyboard_notifiers.Keyboard_notifiers     Parses the keyboard notifier call chain
linux.lsmod.Lsmod                               Lists loaded kernel modules.
linux.lsof.Lsof                                 Lists all memory maps for all processes.
linux.malfind.Malfind                           Lists process memory ranges that potentially contain injected code.
linux.proc.Maps                                 Lists all memory maps for all processes.
linux.pslist.PsList                             Lists the processes present in a particular linux memory image.
linux.pstree.PsTree                             Plugin for listing processes in a tree based on their parent process ID.
linux.tty_check.tty_check                       Checks tty devices for hooks
mac.bash.Bash                                   Recovers bash command history from memory.
mac.check_syscall.Check_syscall                 Check system call table for hooks.
mac.check_sysctl.Check_sysctl                   Check sysctl handlers for hooks.
mac.check_trap_table.Check_trap_table           Check mach trap table for hooks.
mac.ifconfig.Ifconfig                           Lists loaded kernel modules
mac.kauth_listeners.Kauth_listeners             Lists kauth listeners and their status
mac.kauth_scopes.Kauth_scopes                   Lists kauth scopes and their status
mac.kevents.Kevents                             Lists event handlers registered by processes
mac.list_files.List_Files                       Lists all open file descriptors for all processes.
mac.lsmod.Lsmod                                 Lists loaded kernel modules.
mac.lsof.Lsof                                   Lists all open file descriptors for all processes.
mac.malfind.Malfind                             Lists process memory ranges that potentially contain injected code.
mac.mount.Mount                                 A module containing a collection of plugins that produce data typically foundin Mac's mount command
mac.netstat.Netstat                             Lists all network connections for all processes.
mac.proc_maps.Maps                              Lists process memory ranges that potentially contain injected code.
mac.psaux.Psaux                                 Recovers program command line arguments.
mac.pslist.PsList                               Lists the processes present in a particular mac memory image.
mac.pstree.PsTree                               Plugin for listing processes in a tree based on their parent process ID.
mac.socket_filters.Socket_filters               Enumerates kernel socket filters.
mac.timers.Timers                               Check for malicious kernel timers.
mac.trustedbsd.Trustedbsd                       Checks for malicious trustedbsd modules
mac.vfsevents.VFSevents                         Lists processes that are filtering file system events
timeliner.Timeliner                             Runs all relevant plugins that provide time related information and orders the results by time.
windows.bigpools.BigPools                       List big page pools.
windows.cachedump.Cachedump                     Dumps lsa secrets from memory
windows.callbacks.Callbacks                     Lists kernel callbacks and notification routines.
windows.cmdline.CmdLine                         Lists process command line arguments.
windows.dlllist.DllList                         Lists the loaded modules in a particular windows memory image.
windows.driverirp.DriverIrp                     List IRPs for drivers in a particular windows memory image.
windows.driverscan.DriverScan                   Scans for drivers present in a particular windows memory image.
windows.dumpfiles.DumpFiles                     Dumps cached file contents from Windows memory samples.
windows.envars.Envars                           Display process environment variables
windows.filescan.FileScan                       Scans for file objects present in a particular windows memory image.
windows.getservicesids.GetServiceSIDs           Lists process token sids.
windows.getsids.GetSIDs                         Print the SIDs owning each process
windows.handles.Handles                         Lists process open handles.
windows.hashdump.Hashdump                       Dumps user hashes from memory
windows.info.Info                               Show OS & kernel details of the memory sample being analyzed.
windows.lsadump.Lsadump                         Dumps lsa secrets from memory
windows.malfind.Malfind                         Lists process memory ranges that potentially contain injected code.
windows.memmap.Memmap                           Prints the memory map
windows.modscan.ModScan                         Scans for modules present in a particular windows memory image.
windows.modules.Modules                         Lists the loaded kernel modules.
windows.mutantscan.MutantScan                   Scans for mutexes present in a particular windows memory image.
windows.netscan.NetScan                         Scans for network objects present in a particular windows memory image.
windows.netstat.NetStat                         Traverses network tracking structures present in a particular windows memory image.
windows.poolscanner.PoolScanner                 A generic pool scanner plugin.
windows.privileges.Privs                        Lists process token privileges
windows.pslist.PsList                           Lists the processes present in a particular windows memory image.
windows.psscan.PsScan                           Scans for processes present in a particular windows memory image.
windows.pstree.PsTree                           Plugin for listing processes in a tree based on their parent process ID.
windows.registry.certificates.Certificates      Lists the certificates in the registry's Certificate Store.
windows.registry.hivelist.HiveList              Lists the registry hives present in a particular memory image.
windows.registry.hivescan.HiveScan              Scans for registry hives present in a particular windows memory image.
windows.registry.printkey.PrintKey              Lists the registry keys under a hive or specific key value.
windows.registry.userassist.UserAssist          Print userassist registry keys and information.
windows.ssdt.SSDT                               Lists the system call table.
windows.statistics.Statistics
windows.strings.Strings                         Reads output from the strings command and indicates which process(es) each string belongs to.
windows.svcscan.SvcScan                         Scans for windows services.
windows.symlinkscan.SymlinkScan                 Scans for links present in a particular windows memory image.
windows.vadinfo.VadInfo                         Lists process memory ranges.
windows.vadyarascan.VadYaraScan                 Scans all the Virtual Address Descriptor memory maps using yara.
windows.verinfo.VerInfo                         Lists version information from PE files.
windows.virtmap.VirtMap                         Lists virtual mapped sections.
yarascan.YaraScan                               Scans kernel memory using yara rules (string or file).

使用

volatility3 运行时需要下载 PDB 符号表,国内机器需要挂代理

信息

layerwriter

python3 vol.py -f [image] layerwriter

windows.info

python3 vol.py -f [image] windows.info

windows.pslist

python3 vol.py -f [image] windows.pslist

windows.hashdump

python3 vol.py -f [image] windows.hashdump

windows.filescan

python3 vol.py -f [image] windows.filescan

Symbol Tables

所有文件都以 JSON 数据的形式存储,它们可以是. json 的纯 JSON 文件,也可以是. json.gz 或. json.xz 的压缩文件。Volatility 会在使用时自动解压它们。使用时也会将它们的内容(压缩后)缓存起来,位于用户主目录下的. cache/volatility3 中,以及其他有用的数据。缓存目录目前无法更改。

符号表 JSON 文件默认位于 volatility/symbols 下,在操作系统目录下(目前是 windows、mac 或 linux 中的一种)。符号目录是可以在框架内配置的,通常可以在用户界面上设置。

这些文件也可以被压缩成 ZIP 文件,Volatility 将处理 ZIP 文件以定位符号文件。ZIP 文件必须以相应的操作系统命名(如 linux.zip、mac.zip 或 windows.zip)。在 ZIP 文件中,目录结构应与未压缩的操作系统目录一致。

  • Windows 符号表

    对于 Windows 系统,Volatility 接受由 GUID 和所需 PDB 文件的 Age 组成的字符串。然后,它在 Windows 子目录下的已配置符号目录下搜索所有文件。与文件名模式 /-.json(或任何压缩变体)匹配的任何文件都会被使用。如果找不到这样的符号表,则将从 Microsoft 的 Symbol Server 下载关联的 PDB 文件,并将其转换为适当的 JSON 格式,并将其保存在正确的位置。

    Windows 符号表可以从适当的 PDB 文件手动构建。用于执行此操作的主要工具内置于 Volatility 3 中,称为 pdbconv.py。

  • Mac / Linux 符号表

    对于 Mac / Linux 系统,两者都使用相同的识别机制。JSON 文件位于符号目录下的 linux 或 mac 目录下。生成的文件包含一个标识字符串(操作系统横幅),Volatility 的 automagic 可以检测到该字符串。易失性会缓存字符串和它们来自的符号表之间的映射,这意味着精确的文件名无关紧要,并且可以在操作系统目录下的任何必要层次结构下进行组织。

    可以使用称为 dwarf2json 的工具从 DWARF 文件生成 Linux 和 Mac 符号表。当前,带有调试符号的内核是恢复大多数 Volatility 插件所需的所有信息的唯一合适方法。找到具有调试符号 / 适当的 DWARF 文件的内核之后,dwarf2json 会将其转换为适当的 JSON 文件。

相关工具

MacOS Processing

./dwarf2json mac --macho /path/kernel.dSYM/Contents/Resources/DWARF/kernel \
    --macho-symbols /path/kernel > output.json

Linux Processing

./dwarf2json linux --elf /usr/lib/debug/boot/vmlinux-4.4.0-137-generic > output.json
  • 安装 vmlinux

    这里我以 ubuntu18.04 为例,系统默认有 vmlinuz,但 vmlinux 与 vmlinuz 不同,需要手动安装 vmlinux

    # 添加ddebs存储库
    echo "deb http://ddebs.ubuntu.com $(lsb_release -cs)-updates main restricted universe multiverse
    deb http://ddebs.ubuntu.com $(lsb_release -cs)-security main restricted universe multiverse
    deb http://ddebs.ubuntu.com $(lsb_release -cs)-proposed main restricted universe multiverse" | \
    sudo tee -a /etc/apt/sources.list.d/ddebs.list
    
    sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 428D7C01
    
    # 安装 kernel debug symbols
    sudo apt-get update
    sudo apt-get install linux-image-$(uname -r)-dbgsym
    

    在 centos 中是

    sudo debuginfo-install kernel
    

以 ubuntu18.04 为例

chmod +x dwarf2json
./dwarf2json linux --elf /usr/lib/debug/boot/vmlinux-5.0.0-23-generic > Ubuntu1804.json

# 这里有个小坑,内存尽量大于8G,不然会报错
mv Ubuntu1804.json /pentest/volatility3/volatility3/framework/symbols/linux
cd /pentest/volatility3
python3 vol.py -vvvv isfinfo
python3 vol.py -vvvv -s volatility3/framework/symbols/linux/ isfinfo
python3 vol.py isfinfo --isf /pentest/volatility3/volatility3/framework/symbols/linux/Ubuntu1804.json

python3 vol.py -vvvv -f cyq.vmem banners

即使输出与 banner 匹配, 实际运行依旧失败, 此 issues https://github.com/volatilityfoundation/volatility3/issues/413 具有同样问题, 等待软件后续更新解决把

python3 vol.py -vvvv -f cyq.vmem linux.bash.Bash
python3 vol.py -vvvv -c /pentest/volatility3/volatility3/framework/symbols/linux/Ubuntu1804.json -f cyq.vmem linux.bash.Bash
python3 vol.py -vvvv -s volatility3/framework/symbols/linux/ -f cyq.vmem linux.bash.Bash

以 CentOS7 为例

  • 所使用的工具:
    • f8x
    • Lime
    • Vmware Workstation
    • volatility3

配置 centos7 系统并导出内存文件

内存:8G
CPU:2核
硬盘:40G

在 centos 虚机中安装 lime 工具

安装步骤比较简单,但是有几个坑点。

git clone https://github.com/504ensicsLabs/LiME.git
cd Lime/src
make

make 的时候可能会出现出现一点问题。

这个原因就是系统自身的内核版本和 kernel-devel 安装的内核不匹配,我这台安装的内核为 3.10.0-1160.15.2.el7.x86_64,但是使用 uname -r 查到的内核版本为 3.10.0-957.el7.x86_64,所以使用 yum upgrade 升级内核并重启即可解决。

重新编译会生成一个名字和内核版本相同的. ko 文件。

接下来使用 lime 工具导出内存文件.

insmod ./lime-3.10.0-1160.15.2.el7.x86_64.ko "path=/root/centos.lime format=lime"

“./” 后面输入刚刚生成的 .ko 文件

可以看到文件大小非常接近于8G。

制作 centos 符号表文件

制作 centos 的符号表文件需要用到一个使用 GO 语言编写的程序

根据项目说明,可以采用四种方式来生成符号表(json文件)。

这里我们就选用第一种。然而,使用第一种的话需要 vmlinux 文件,而这 centos 中原本是没有的,所以需要安装。

sudo debuginfo-install kernel

在安装完成之后可以查找 vmlinux 文件

然后使用 dwarf2json 工具即可导出符号表文件。

kali 分析机 vol3 安装以及使用

打开 kail,使用 f8x 一键安装 volatility3。

安装完毕后,在 /pentest/volatility3 可以找到它。

/pentest/volatility3/volatility3/symbols 中创建名为 “linux” 的文件夹,并把符号表放在里面。

把之前导出的 centos.lime 的内存文件也放入 kali 中。

使用 volatility 分析

python3 vol.py -f centos.lime linux.bash

点击关注,共同学习!
安全狗的自我修养

github haidragon

https://github.com/haidragon

posted @ 2022-11-03 09:28  syscallwww  阅读(478)  评论(0编辑  收藏  举报