volatility2 使用笔记
volatility2 安装
在 GitHub 主页中可以直接获取源码:https://github.com/volatilityfoundation/volatility
直接使用源码运行即可,同时在官网也可以获取到可直接运行的版本:https://www.volatilityfoundation.org/releases
需要注意的是,volatility2 所需的运行环境为 Python2,且存在一些依赖库。
volatility2 使用
参数
使用 python2 vol.py -h 可获取到帮助信息:
Options: -h, --help list all available options and their default values. Default values may be set in the configuration file (/etc/volatilityrc) --conf-file=.volatilityrc User based configuration file -d, --debug Debug volatility --plugins=PLUGINS Additional plugin directories to use (semi-colon separated) --info Print information about all registered objects --cache-directory=C:\53124/.cache Directory where cache files are stored --cache Use caching --tz=TZ Sets the (Olson) timezone for displaying timestamps using pytz (if installed) or tzset -f FILENAME, --filename=FILENAME Filename to use when opening an image --profile=WinXPSP2x86 Name of the profile to load (use --info to see a list of supported profiles) -l LOCATION, --location=LOCATION A URN location from which to load an address space -w, --write Enable write support --dtb=DTB DTB Address --output=text Output in this format (support is module specific, see the Module Output Options below) --output-file=OUTPUT_FILE Write output in this file -v, --verbose Verbose information --shift=SHIFT Mac KASLR shift address --physical_shift=PHYSICAL_SHIFT Linux kernel physical shift address --virtual_shift=VIRTUAL_SHIFT Linux kernel virtual shift address -g KDBG, --kdbg=KDBG Specify a KDBG virtual address (Note: for 64-bit Windows 8 and above this is the address of KdCopyDataBlock) --force Force utilization of suspect profile -k KPCR, --kpcr=KPCR Specify a specific KPCR address --cookie=COOKIE Specify the address of nt!ObHeaderCookie (valid for Windows 10 only)
一般来说常用的参数格式为:
1 | python2 vol.py -f file.raw plugins [args] |
例如获取内存镜像的环境信息:
1 | python2 vol.py -f file.raw imageinfo |
或者是转储文件:
1 | python2 vol.py -f file.raw dumpfiles --dump-dir . |
插件明细
| 插件名 | 作用 |
|---|---|
| amcache | 打印 AmCache 信息 |
| apihooks | 检测进程和内核内存中的 API 钩子 (hooks) |
| atoms | 打印会话和窗口站原子表 |
| atomscan | 原子表池扫描器 |
| auditpol | 从 HKLM\SECURITY\Policy\PolAdtEv 打印审计策略 |
| bigpools | 使用 BigPagePoolScanner 转储大页面池 |
| bioskbd | 从 Real Mode 内存中读取键盘缓冲区 |
| cachedump | 从内存中转储缓存的域哈希值 |
| callbacks | 打印整个系统的回调和通知进程 |
| clipboard | 提取 Windows 剪贴板的内容 |
| cmdline | 显示进程的命令行参数 |
| cmdscan | 通过扫描 _COMMAND_HISTORY 提取命令历史记录 |
| connections | 打印开放的连接列表 [仅适用于Windows XP和2003] |
| connscan | 连接池中扫描 tcp 连接 |
| consoles | 通过扫描 _CONSOLE_INFORMATION 来提取命令历史记录 |
| crashinfo | 转储崩溃转储信息 |
| deskscan | 标签 DESKTOP(台式机)的池扫描器 |
| devicetree | 以树状图形式显示驱动 |
| dlldump | 从进程地址空间转储 DLL |
| dlllist | 打印每个进程的加载的 DLL 列表 |
| driverirp | 驱动程序 IRP 挂钩检测 |
| drivermodule | 将驱动程序对象关联到内核模块 |
| driverscan | 驱动程序对象的池扫描程序 |
| dumpcerts | 转储 RSA 的私有和公共 SSL 密钥 |
| dumpfiles | 提取内存映射和缓存文件 |
| dumpregistry | 将注册表文件转储到磁盘 |
| editbox | 显示有关编辑控件的信息 |
| envars | 显示进程环境变量 |
| eventhooks | 打印 Windows 事件挂钩的详细信息 |
| evtlogs | 提取 Windows 事件日志(仅限 XP/2003) |
| filescan | 输出所有文件对象 |
| gahti | 转储 USER 句柄类型信息 |
| gditimers | 打印已安装的 GDI 计时器和回调 |
| gdt | 显示全局描述符表 |
| getservicesids | 获取注册表中的服务名称并返回计算的SID |
| getsids | 打印属于每个进程的 SID |
| handles | 打印每个进程的打开的句柄列表 |
| hashdump | 从内存中转储密码哈希 (LM/NTLM) |
| hibinfo | 转储休眠文件信息 |
| hivedump | 转出注册表单元 |
| hivelist | 打印注册表配置单元列表。 |
| hivescan | 注册表配置单元的池扫描器 |
| hpakextract | 从 HPAK 文件中提取物理内存 |
| hpakinfo | 关于 HPAK 文件的信息 |
| idt | 显示中断描述符表 |
| iehistory | 重建 Internet Explorer 缓存/历史 |
| imagecopy | 将物理地址空间复制为原始 DD 映像 |
| imageinfo | 识别映像的信息 |
| impscan | 扫描对导入函数的调用 |
| joblinks | 打印进程作业链接信息 |
| kdbgscan | 搜索并转储潜在的 KDBG 值 |
| kpcrscan | 搜索并转储潜在的 KPCR 值 |
| ldrmodules | 检测未链接的 DLL |
| limeinfo | 转储 Lime 文件格式信息 |
| linux_apihooks | 检查用户区 apihooks 情况 |
| linux_arp | 打印 ARP 表 |
| linux_aslr_shift | 自动检测 Linux ASLR shift |
| linux_banner | 打印 Linux 横幅信息 |
| linux_bash | 从 bash 进程内存中恢复 bash 历史记录 |
| linux_bash_env | 恢复进程的动态环境变量 |
| linux_bash_hash | 从 bash 进程内存中恢复 bash 哈希表 |
| linux_check_afinfo | 验证网络协议的操作函数指针 |
| linux_check_creds | 检查是否有任何进程共享凭证结构 |
| linux_check_evt_arm | 检查异常向量表以查找系统调用表挂钩 |
| linux_check_fop | 检查文件操作结构以查找 rootkit 修改 |
| linux_check_idt | 检查 IDT 是否已被更改 |
| linux_check_inline_kernel | 检查内联内核挂钩 |
| linux_check_modules | 将模块列表与 sysfs 信息进行比较(如果可用) |
| linux_check_syscall | 检查系统调用表是否已更改 |
| linux_check_syscall_arm | 检查系统调用表是否已更改 |
| linux_check_tty | 检查 tty 设备的挂钩 |
| linux_cpuinfo | 打印有关每个活动处理器的信息 |
| linux_dentry_cache | 从 dentry 缓存中收集文件 |
| linux_dmesg | 收集 dmesg 缓冲区 |
| linux_dump_map | 将选定的内存映射写入磁盘 |
| linux_dynamic_env | 恢复进程的动态环境变量 |
| linux_elfs | 在进程映射中查找 ELF 二进制文件 |
| linux_enumerate_files | 列出文件系统缓存引用的文件 |
| linux_find_file | 列出并从内存中恢复文件 |
| linux_getcwd | 列出每个进程的当前工作目录 |
| linux_hidden_modules | 雕刻内存以查找隐藏的内核模块 |
| linux_ifconfig | 收集活动接口 |
| linux_info_regs | 就像 GDB 中的“信息寄存器”(它将打印出所有寄存器) |
| linux_iomem | 提供类似于 /proc/iomem 的输出 |
| linux_kernel_opened_files | 列出从内核中打开的文件 |
| linux_keyboard_notifiers | 解析键盘通知程序调用链 |
| linux_ldrmodules | 将 proc maps 的输出与 libdl 中的库列表进行比较 |
| linux_library_list | 列出加载到进程中的库 |
| linux_librarydump | 将进程内存中的共享库转储到磁盘 |
| linux_list_raw | 列出具有混杂套接字的应用程序 |
| linux_lsmod | 收集加载的内核模块 |
| linux_lsof | 列出文件描述符及其路径 |
| linux_malfind | 查找可疑进程映射 |
| linux_memmap | 转储 linux 任务的内存映射 |
| linux_moddump | 提取加载的内核模块 |
| linux_mount | 收集已安装的 fs/设备 |
| linux_mount_cache | 从 kmem_cache 收集已安装的 fs/驱动 |
| linux_netfilter | 列出 Netfilter 钩子 |
| linux_netscan | 列出网络连接结构 |
| linux_netstat | 列出打开的套接字 |
| linux_pidhashtable | 通过 PID 哈希表枚举进程 |
| linux_pkt_queues | 将每个进程的数据包队列写入磁盘 |
| linux_plthook | 扫描 ELF 二进制文件的 PLT 以查找非需要图像的挂钩 |
| linux_proc_maps | 收集进程内存映射 |
| linux_proc_maps_rb | 通过映射红黑树为 linux 收集 proc maps |
| linux_procdump | 将进程的可执行映像转储到磁盘 |
| linux_process_hollow | 检查进程空心的迹象 |
| linux_psaux | 收集进程以及完整的命令行和开始时间 |
| linux_psenv | 收集进程及其静态环境变量 |
| linux_pslist | 通过遍历 task_struct-> 任务列表来收集活动任务 |
| linux_pslist_cache | 从 kmem_cache 收集任务 |
| linux_psscan | 扫描进程的物理内存 |
| linux_pstree | 显示进程之间的父/子关系 |
| linux_psxview | 使用各种进程列表查找隐藏进程 |
| linux_recover_filesystem | 从内存中恢复整个缓存文件系统 |
| linux_route_cache | 从内存中恢复路由缓存 |
| linux_sk_buff_cache | 从 sk_buff kmem_cache 恢复数据包 |
| linux_slabinfo | 在运行的机器上模拟 /proc/slabinfo |
| linux_strings | 将物理偏移量与虚拟地址匹配(可能需要一段时间,非常冗长) |
| linux_threads | 打印进程的线程 |
| linux_tmpfs | 从内存中恢复 tmpfs 文件系统 |
| linux_truecrypt_passphrase | 恢复缓存的 Truecrypt 密码短语 |
| linux_vma_cache | 从 vm_area_struct 缓存中收集 VMA |
| linux_volshell | 内存镜像中的外壳 shell |
| linux_yarascan | Linux 内存映像中的 shell |
| lsadump | 从注册表中转储(解密)LSA 机密 |
| mac_adium | 列出 Adium 消息 |
| mac_apihooks | 检查进程中的 API 挂钩 |
| mac_apihooks_kernel | 检查系统调用和内核函数是否被挂钩 |
| mac_arp | 打印 arp 表 |
| mac_bash | 从 bash 进程内存中恢复 bash 历史记录 |
| mac_bash_env | 恢复 bash 的环境变量 |
| mac_bash_hash | 恢复来自 bash 进程内存的 bash 哈希表 |
| mac_calendar | 从 Calendar.app 获取日历事件 |
| mac_check_fop | 验证文件操作指针 |
| mac_check_mig_table | 列出内核 MIG 表中的全部内容 |
| mac_check_syscall_shadow | 查找影子系统调用表 |
| mac_check_syscalls | 检查系统调用表条目是否已挂钩 |
| mac_check_sysctl | 检查未知的 sysctl 处理程序 |
| mac_check_trap_table | 检查马赫陷阱表条目是否已挂钩 |
| mac_compressed_swap | 打印 Mac OS X VM 压缩器统计信息和转储所有压缩页面 |
| mac_contacts | 从 Contacts.app 获取联系人名称 |
| mac_dead_procs | 打印终止/取消分配的进程 |
| mac_dead_sockets | 打印终止/取消分配的网络套接字 |
| mac_dead_vnodes | 列出释放的 vnode 结构 |
| mac_devfs | 列出文件缓存中的文件 |
| mac_dmesg | 打印内核调试缓冲区 |
| mac_dump_file | 转储指定文件 |
| mac_dump_maps | 转储进程的内存范围,可选地包括压缩交换中的页面 |
| mac_dyld_maps | 从 dyld 数据结构获取进程的内存映射 |
| mac_find_aslr_shift | 查找 10.8 的 ASLR 移位值+ 图像 |
| mac_get_profile | 自动检测 Mac 配置文件 |
| mac_ifconfig | 列出所有设备的网络接口信息 |
| mac_interest_handlers | 列出 IOKit 兴趣处理程序 |
| mac_ip_filters | 报告任何挂钩的 IP 过滤器 |
| mac_kernel_classes | 列出内核中加载的 c++ 类 |
| mac_kevents | 显示进程的父/子关系 |
| mac_keychaindump | 恢复可能的钥匙串密钥。使用 chainbreaker 打开相关的钥匙串文件 |
| mac_ldrmodules | 将 proc 映射的输出与 libdl 中的库列表进行比较 |
| mac_librarydump | 转储进程的可执行文件 |
| mac_list_files | 列出文件缓存中的文件 |
| mac_list_kauth_listeners | 列出 Kauth 范围侦听器 |
| mac_list_kauth_scopes | 列出 Kauth 范围和他们的状态 |
| mac_list_raw | 列出具有混杂套接字的应用程序 |
| mac_list_sessions | 枚举会话 |
| mac_list_zones | 打印活动区域 |
| mac_lsmod | 列出加载的内核模块 |
| mac_lsmod_iokit | 列出通过 IOkit 加载的内核模块 |
| mac_lsmod_kext_map | 列出加载的内核模块 |
| mac_lsof | 列出每个进程打开的文件 |
| mac_machine_info | 打印有关示例的机器信息 |
| mac_malfind | 查找可疑进程映射 |
| mac_memdump | 将可寻址内存页转储到文件 |
| mac_moddump | 将指定的内核扩展写入磁盘 |
| mac_mount | 打印已安装的设备信息 |
| mac_netstat | 列出每个进程的活动网络连接 |
| mac_network_conns | 列出来自内核网络结构的网络连接 |
| mac_notesapp | 查找 Notes 消息的内容 |
| mac_notifiers | 检测向 I/O Kit(例如 LogKext)添加挂钩的 rootkit |
| mac_orphan_threads | 列出不映射回已知模块/进程的线程 |
| mac_pgrp_hash_table | 步行进程组哈希表 |
| mac_pid_hash_table | 遍历 pid 哈希表 |
| mac_print_boot_cmdline | 打印内核启动参数 |
| mac_proc_maps | 获取进程的内存映射 |
| mac_procdump | 转储进程的可执行文件 |
| mac_psaux | 打印带有用户空间参数的进程 (**argv) |
| mac_psenv | 打印用户区环境中的进程 (**envp) |
| mac_pslist | 列出正在运行的进程 |
| mac_pstree | 显示进程的父/子关系 |
| mac_psxview | 使用各种进程列表查找隐藏进程 |
| mac_recover_filesystem | 恢复缓存的文件系统 |
| mac_route | 打印路由表 |
| mac_socket_filters | 报告套接字过滤器 |
| mac_strings | 将物理偏移量与虚拟地址匹配(可能需要一段时间,非常冗长) |
| mac_tasks | 列出活动任务 |
| mac_threads | 列出进程线程 |
| mac_threads_simple | 列出线程及其开始时间和优先级 |
| mac_timers | 报告内核驱动程序设置的计时器 |
| mac_trustedbsd | 列出恶意的 trustedbsd 策略 |
| mac_version | 打印Mac版本 |
| mac_vfsevents | 列出过滤文件系统事件的进程 |
| mac_volshell | 内存映像中的 shell |
| mac_yarascan | 扫描内存对于 yara 签名 |
| machoinfo | 转储 Mach-O 文件格式信息 |
| malfind | 查找隐藏和注入的代码 |
| mbrparser | 扫描并解析潜在的主引导记录 (MBR) |
| memdump | 转储进程的可寻址内存 |
| memmap | 打印内存映射 |
| messagehooks | 列出桌面和线程窗口消息挂钩 |
| mftparser | 扫描并解析潜在的 MFT 条目 |
| moddump | 将内核驱动程序转储到可执行文件示例 |
| modscan | 内核池扫描程序modules |
| modules | 打印加载模块的列表 |
| multiscan | 一次性扫描各种对象 |
| mutantscan | 互斥对象的池扫描器 |
| netscan | 扫描 Vista(或更高版本)图像的连接和套接字 |
| notepad | 列出当前显示的记事本文本 |
| objtypescan | 扫描 Windows 对象类型对象 |
| patcher | 根据页面扫描修补内存 |
| poolpeek | 可配置池扫描器插件 |
| pooltracker | 显示池标记使用摘要 |
| printkey | 打印注册表项及其子项和值 |
| privs | 显示进程权限 |
| procdump | 将进程转储到可执行文件示例 |
| pslist | 按照 EPROCESS 列表打印所有正在运行的进程 |
| psscan | 进程对象的池扫描程序 |
| pstree | 将进程列表打印为树 |
| psxview | 使用各种进程列表查找隐藏进程 |
| qemuinfo | 转储 Qemu 信息 |
| raw2dmp | 将物理内存样本转换为 windbg 崩溃转储 |
| screenshot | 基于 GDI windows 保存伪屏幕截图 |
| servicediff | 列出 Windows 服务(类似于 Plugx) |
| sessions | 列出关于
_MM_SESSION_SPACE(用户登录会话)的详细信息 |
| shellbags | 打印 ShellBags 信息 |
| shimcache | 解析应用程序兼容性 Shim 缓存注册表项 |
| shutdowntime | 从注册表中打印机器的 ShutdownTime |
| sockets | 打印打开的套接字列表 |
| sockscan | 用于 tcp 套接字对象的池扫描器 |
| ssdt | 显示 SSDT 条目 |
| strings | 将物理偏移量与虚拟地址匹配(可能需要一段时间,非常冗长) |
| svcscan | 扫描 Windows 服务 |
| symlinkscan | 用于符号链接对象的池扫描器 |
| thrdscan | 线程对象的池扫描器 |
| threads | 调查 _ETHREAD 和 _KTHREAD |
| timeliner | 从内存计时器中的各种工件创建时间线 |
| timers | 打印内核计时器和相关的模块 DPC |
| truecryptmaster | 恢复 TrueCrypt 7.1a 主密钥 |
| truecryptpassphrase | TrueCrypt 缓存密码查找器 |
| truecryptsummary | TrueCrypt 摘要 |
| unloadedmodules | 打印未加载模块的列表 |
| userassist | 打印 USER 注册表键值和信息 |
| userhandles | 转出 USER 句柄表 |
| vaddump | 转储 VAD 信息到一个文件中 |
| vadinfo | 转储 VAD 信息 |
| vadtree | 遍历 VAD 树并以树格式显示 |
| vadwalk | 遍历 VAD 树 |
| vboxinfo | 转储 virtualbox 信息 |
| verinfo | 从 PE 映像中打印版本信息 |
| vmwareinfo | 转储 VMware VMSS/VMSN 信息 |
| volshell | 内存映像中的 Shell |
| win10cookie | 查找 Windows 10 窗口的 ObHeaderCookie 值 |
| windows | 打印桌面 Windows(详细详细信息) |
| wintree | 打印 Z-Order 桌面Windows 树 |
| wndscan | 用于窗口站的池扫描程序 |
| yarascan | 使用 Yara 签名扫描进程或内核内存 |
volatility2 插件
实际上所有 volatility2 的功能都是由插件实现的,我们可以自主安装他人所写的插件或者是自己写插件脚本。
无论是哪种,只需要将插件脚本拖入 plugins/
文件下即可(另一个可能的路径为
volatility/plugins/),且支持文件夹分类(实际上只要在该目录下的所有文件都会遍历加载)。
mimikatz
mimikatz 是一个可以从内存中提取明文密码、哈希、PIN 码和 kerberos 票证的软件,在 volatility2 中有专门的插件替代了繁琐的操作。
如果不使用插件,我们需要首先从内存镜像中转储 lsass.exe
的内存文件为 lsass.dmp 后,用 mimikatz 加载并读取数据。
我们可以在
https://github.com/RealityNet/hotoloti/tree/master/volatility 中获取
mimikatz.py,将其添加到 plugins/
文件夹下即可使用。
使用方式:
1 | python2 vol.py -f file.raw mimikatz |
一键提取出目标内存镜像中的用户名和密码。