misc总结(取证篇)

内存取证工具

Volatility2

Volatility2是一款开源的,基于Python开发的内存取证工具集,可以分析内存中的各种数据。Volatility支持对32位或64位Windows、Linux、Mac、Android操作系统的RAM数据进行提取与分析。

基础使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# 查看imagerinfo获取操作系统类型
volatility -f <filename> imageinfo

# 指定操作系统类型进行其他操作
volatility -f <filename> --profile <ostype>

# 查看进程
volatility -f <filename> --profile <ostype> pslist

# 查看文件
volatility -f <filename> --profile <ostype> filescan | grep -E "txt|xml|png|jpg|gif|zip|rar|7z|pdf|doc|docx|php|py|flag"

# 桌面
volatility -f <filename> --profile <ostype> filescan | grep -E "Desktop"

# 导出文件
volatility -f <filename> --profile <ostype> dumpfiles -Q <virtual address> -D <savedir>

# 获取系统用户名
volatility -f <filename> --profile <ostype> printkey -K "SAM\Domains\Account\Users\Names"

# 查看注册表
volatility -f <filename> --profile <ostype> hivelist

# 提取用户密码
volatility -f <filename> --profile <ostype> hashdump -y <注册表 system 的 virtual 地址> -s <SAM 的 virtual 地址>

# 获取IE浏览器历史记录
volatility -f <filename> --profile <ostype> iehistory

# 查看网络连接
volatility -f <filename> --profile <ostype> netscan
volatility -f <filename> --profile <ostype> connscan

# 将内存中的某个进程数据以 dmp 的格式保存出来
volatility -f <filename> --profile <ostype> memdump -p <pid> -D <savedir>

# 提取进程的可执行文件
volatility -f <filename> --profile <ostype> procdump -p <pid> -D <savedir>

# 查看命令行历史记录
volatility -f <filename> --profile <ostype> cmdscan

# 查看进程命令行参数
volatility -f <filename> --profile <ostype> cmdline

支持的插件列表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
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 # 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 签名扫描进程或内核内存

Linux 内存取证插件参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# 获取系统进程信息相关命令
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 的内容。

Profile

Volatility自带一些windows系统的profileLinux系统的Profile需要自己制作,也可以使用第三方的profile文件:https://github.com/KDPryor/LinuxVolProfiles

自己制作profile的方法如下:将module.dwarfsystem.map打包成一个zip文件,移动到volatility/volatility/plugins/overlays/linux目录中

centos7为例

先安装dwarfdump(创建module.dwarf文件的依赖)

1
2
3
4
5
6
7
8
9
yum install -y gcc make gcc-c++ git zip elfutils-devel kernel-devel
yum upgrade && reboot //解决kernel-devel版本与系统版本不一致的问题
wget https://www.prevanders.net/libdwarf-20201201.tar.gz --no-check-certificate
tar -zxvf libdwarf-20201201.tar.gz
cd libdwarf-20201201
./configure
make
make install
cd ../

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

1
2
3
4
git clone https://github.com/volatilityfoundation/volatility.git
cd volatility/tools/linux
make
ls -l

打包,将module.dwarfsystem.map打包成centos7.zip,移动到分析机的volatility/volatility/plugins/overlays/linux

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

ubuntu制作profile:

1
2
3
4
5
6
7
8
apt-get install -y dwarfdump build-essential
apt-get install -y linux-kernel-headers kernel-package
apt -y upgrade && reboot //解决kernel-devel版本与系统版本不一致的问题

cd volatility/tools/linux
make -C /lib/modules/$(uname -r)/build CONFIG_DEBUG_INFO=y M=$PWD modules
dwarfdump -di ./module.o > module.dwarf
zip ubuntu_5.15.0-69.zip module.dwarf /boot/System.map-$(uname -r)

Volatility3

Volatility3是对Volatility2的重写,基于Python3编写,消除了对profile的依赖,使用符号表(配置文件)来匹配内存示例中的操作系统版本。

符号表

用于分析相关操作系统数据的内核符号表压缩包。注意:由于Linux内核易于编译且无法唯一区分它们,因此无法轻松提供详尽的Linux符号表集。官方下载地址:

1
2
3
wget downloads.volatilityfoundation.org/volatility3/symbols/windows.zip
wget downloads.volatilityfoundation.org/volatility3/symbols/mac.zip
wget downloads.volatilityfoundation.org/volatility3/symbols/linux.zip

解压后移动到volatility3/volatility/symbols/

常用插件

linux命令手册

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
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).

Symbol Tables

文件以JSON数据的形式存储,它们可以是.json的纯JSON文件,也可以是.json.gz.json.xz 的压缩文件。Volatility会在使用时自动解压它们

Volatility3找不到windows的符号表时,会从MicrosoftSymbol Server下载关联的PDB文件,并将其转换为适当的JSON格式,并将其保存在正确的位置。而linux的符号表需要自己构造,可以通过dwarf2jsonDWARF文件的内核转换为适当的JSON文件

MacOS Processing

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

Linux Processing

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

安装vmlinux

linux系统默认有vmlinuz,但vmlinuxvmlinuz不同,需要手动安装

方法一:apt安装(推荐)

导入GPG key
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys C8CAB6595FDFF622

添加ddebs存储库

1
2
3
4
5
6
7
codename=$(lsb_release -c | awk  '{print $2}')
sudo tee /etc/apt/sources.list.d/ddebs.list << EOF
deb http://ddebs.ubuntu.com/ ${codename} main restricted universe multiverse
deb http://ddebs.ubuntu.com/ ${codename}-security main restricted universe multiverse
deb http://ddebs.ubuntu.com/ ${codename}-updates main restricted universe multiverse
deb http://ddebs.ubuntu.com/ ${codename}-proposed main restricted universe multiverse
EOF

更新软件包
apt-get update

安装kernel debug symbols
apt-get install linux-image-$(uname -r)-dbgsym

包含调试信息的文件称为vmlinuxXXXdebug,其中XXX是内核版本。该文件存储在/usr/lib/debug/boot

方法二:手动下载安装(不推荐)

http://ddebs.ubuntu.com/pool/main/l/linux/找到合适的版本后下载到本地

dpkg -i安装,安装完成同样在/usr/lib/debug/boot目录下

例如:

dpkg -i linux-image-unsigned-5.15.0-60-generic-dbgsym_5.15.0-60.66_amd64.ddeb

以上两种方法都是基于ubuntu,而在centos中安装的方法如下:

1
2
yum install -y yum-utils
debuginfo-install kernel

查找vmlinux文件

ubuntu

1
./dwarf2json linux --elf /usr/lib/debug/boot/vmlinux-5.15.0-60-generic > Ubuntu2004.json

这里要注意内存尽量大于8G,不然会报已杀死的错误

移动json文件到分析机的volatility3/volatility3/framework/symbols/linux/

python3 vol.py -vvvv isfinfo

centos

同样注意内存不要太小

取证大师

在美亚柏科微信公众号申请,会给一个压缩包

解压密码:my#pico4008886688或者pico@4008886688

内存提取

完整的内存数据包括两部分: 物理内存数据和页面交换文件数据。

物理内存通常是一个特殊的内核对象, 比如, 在Windows系统中, 物理内存是内核内存区对象, 即 \\Device\\PhysicalMemory; 在Unix/Linux系统中, 物理内存为/dev/mem/dev/kmem。 只要能读取该内核对象, 就能获取物理内存数据.

物理机上使用工具比如Win32dd/Win64dd,Memoryze,DumpIt,FastDump。在虚拟机上,获取内存是很容易的,你可以暂停VM并取出.vmem文件。

这里采用lime制作内存镜像

以centos7为例子

安装基本软件
yum install -y gcc make gcc-c++ git kernel-devel

下载lime
git clone https://github.com/504ensicsLabs/LiME.git

编译
cd LiME/src && make

如果出现以下报错

1
2
3
make -C /lib/modules/3.10.0-1127.el7.x86_64/build M="/root/LiME/src" modules
make: *** /lib/modules/3.10.0-1127.el7.x86_64/build: 没有那个文件或目录。 停止。
make: *** [default] 错误 2

说明系统自身的内核版本和kernel-devel安装的内核不匹配

使用uname -r查询内核版本:3.10.0-1127.el7.x86_64

使用rpm -qa kernel-devel 查看安装的版本:kernel-devel-3.10.0-1160.88.1.el7.x86_64

解决方法:yum upgrade

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

使用lime工具导出内存文件

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

参考文章:
内存取证(总结篇)
最近遇到的Linux内核内存取证小分析


misc总结(取证篇)
https://www.dr0n.top/posts/92f52d5d/
作者
dr0n
发布于
2022年7月4日
更新于
2024年3月21日
许可协议