0x00 前言
总结完内存取证相关的一些知识后
0x01 内存取证简介
1、内存取证的定义
通常指对计算机及相关智能设备运行时的物理内存中存储的临时数据进行获取与分析,提取有价值的数据。 内存是操作系统及各种软件交换数据的区域,数据易丢失(Volatile),通常在关机后数据很快就消失。(是指利用将内存进程写入镜像文件,通过镜像文件查看之前内存进程的一些信息。)
2、内存取证发展的原因
网络攻击内存化和网络犯罪隐遁化,使部分关键数字证据只存在于物理内存或暂存于页面交换文件中,这使得传统的基于文件系统的计算机取证不能有效应对。
0x02 内存取证的分类
1、活取证
在主机存活时发现系统被入侵,然后直接把机器的运行内存dump下来,对运行内存进行分析,还原一些进程的中的信息。
主要抓取:
文件metadata
创建时间线
命令历史
分析日志文件
哈希摘要
转存内存信息等数据
2、死取证
是对机器的磁盘做镜像之后分析的取证方法。用于在关机后制作硬盘镜像,分析镜像(MBR硬盘分区,GPT全局分区表,LVM逻辑卷)是否存在病毒,木马等恶意程序。
相比于死取证,活取证是更加的重要,能够获取到当前系统第一手资料,对于分析入侵过程起到了至关重要的作用。
0x03 常见有价值的数据
1、Windows系统活取证常见有价值的数据:
1.进程列表
2.动态链接库
3.打开文件列表
4.网络连接
5.注册表信息
6.Windows账户密码Hash
7.$MFT记录
8.加密密钥或密码
9.聊天记录
10.互联网访问(上网记录、网页缓存等)
11.电子邮件
12.图片
13.文档
然后扩充一下知识:
2、Linux系统活取证常见有价值的数据:
1.所有正在内存中运行的进程
2.所有的载入模块和DLL(动态链接库),包括被植入的各种恶意程序
3.所有正在运行的设备驱动程序,包括隐藏的rootkits
4.每个进程打开的所有文件
5.每个进程打开的所有注册表的键值
6.每个进程打开的所有网络套接字(sockets),包括IP地址和端口信息
7.用户名和口令
8.正在使用的电子邮件和网页链接
9.正在编辑的文件内容
0x04 内存取证常用工具
1、Windows内存获取工具
- 1.Dumplt
- 2.WinEn
- 3.Winpmem
- 4.EnCase Imager
- 5.FTK Imager
- 6.取证大师
2、内存分析工具
1.开源内存分析工具
- Volatility
- Rekall
2.商业软件
- FTK (Windows)
- 取证大师(Windows)
- Passware
- SmartMFT (Windows)
等等……
0x05 内存分析
1、内存获取
1.使用DumpIt
这里使用Windows内存获取工具为DumpIt。工具是绿色免安装,适合在应急中实际应用。
运行程序选择y则会dump出来内存镜像raw文件
2.使用VMWare
如果使用的是Vmware来做试验的话,只需要将虚拟机暂停,或者创建快照,就可以在对应目录下找到vmem文件了(虚拟内存文件)。
3.使用FTK Imager
打开FTK,File选项中有抓取内存的功能
2、内存分析
1.内存分析工具Volatility安装
Volatility是一款开源的,基于Python开发的内存取证工具集,可以分析内存中的各种数据。Volatility支持对32位或64位Wnidows、Linux、Mac、Android操作系统的RAM数据进行提取与分析。
(1)Kali 下面默认已经安装Volatility工具
如果发现没有安装,使用下面的方法安装
apt-get install volatility
1.如果无法定位包,执行命令apt update
,然后再安装。
2.如果还是无法定位包,更换kali的apt源为debian的(为什么要尝试,因为暂且没有找到网上的解决方法。)
kali linux中修改yum源、更新国内源教程(附中科大、浙大、清华等源)
vim /etc/apt/sources.list
然后,更新源列表apt-get update
最后,再执行安装Volatility命令:
apt-get install volatility
安装好后,尝试执行一下,发现确实安装成功了。
(2)其他系统安装参考如下链接:
windows版可执行程序:
https://codeload.github.com/volatilityfoundation/volatility/zip/2.6.1
linux版可执行程序:
https://codeload.github.com/volatilityfoundation/volatility/tar.gz/2.6.1
Max OS X版可执行程序:
http://downloads.volatilityfoundation.org/releases/2.6/volatility_2.6_mac64_standalone.zip
源代码:
https://github.com/volatilityfoundation/volatility
具体安装步骤,参考:利用Volatility进行Windows内存取证分析(一):初体验
(3)如果系统是ubuntu的Linux系统
当然,如果使用的是ubuntu的linux系统,还可采用下面方法安装Volatility:
apt-get install volatility
pip nstall distorm3 yara pycrypto pil openpyxl ujson
若出现找不到这个so文件的报错,直接运行下面这行命令:
find / -name libyara.so #获得路径
ln -s '你的路径' /usr/lib/libyara.so
然后就能成功安装了。
2.常见内存镜像文件
raw文件:raw文件是内存取证工具Dumpit提取内存生成的内存转储文件。
vmem文件:表示虚拟内存文件,与pagefile.sys相同。
img文件:img文件是一个Macintosh磁盘映像文件在Mac文件系统的镜像副本。
dmp文件:dmp文件是系统错误的内存转储文件。当电脑蓝屏或系统崩溃时,Windows会将错误报告存储在“.DMP”的文件里。
data文件:data文件是数据保存的备份类文件
等等……内存镜像文件。
上面谈到pagefile.sys
,简单介绍一下:
profile配置文件是特定操作系统版本以及硬件体系结构(x86,x64,ARM)中VTypes,共用体,对象类型的集合.除了这些组件以外,profile还包括:元数据:操作系统的名称,内核版本,以及编译号. 系统调用信息:索引以及系统调用的名称 常量值:全局变量-在某些操作系统中能够在硬编码的地址处找到的全局变量 系统映射:关键全局变量和函数的地址(仅限Linux和Mac)
每个profile(配置文件)都有一个唯一的名称,通常是由操作系统的名称
,版本
,服务包
,系统结构
等信息组成
如:Win7SP1x64是64位的Windows 7 SP1系统配置文件的名称
3.Volatility常用命令
常用的插件:
imageinfo:显示内存镜像的摘要信息,这常常是第一步---获取内存的操作系统类型及版本,之后可以在--profile中带上对应的操作系统,后续操作都要带上这一参数
pslist:该插件列举出系统进程,但它不能检测到隐藏或者解链的进程,psscan可以
psscan:可以找到先前已终止(不活动)的进程以及被rootkit隐藏或解链的进程
pstree:以树的形式查看进程列表,和pslist一样,也无法检测隐藏或解链的进程
memdump:提取出指定进程,常用foremost 来分离里面的文件(历年美亚杯有此题)
filescan:扫描所有的文件列表
hashdump:查看当前操作系统中的 password hash,例如 Windows 的 SAM 文件内容(实际中没有mimikatz效果好)
svcscan:扫描 Windows 的服务
connscan:查看网络连接
cmdscan:可用于查看终端记录
dlllist: 列出某一进程加载的所有dll文件
dumpfiles:导出某一文件(指定虚拟地址)
hivelist: 列出所有的注册表项及其虚拟地址和物理地址
timeliner: 将所有操作系统事件以时间线的方式展开
为了使镜像文件名称简单,将上面生成的
WIN-KJC0MVBI2QF-20210130-182059.raw
重命名为qwzf.raw
(1) 获取镜像信息
imageinfo
:显示内存镜像的摘要信息,获取内存的操作系统类型及版本。
volatility -f 镜像文件 imageinfo
#-f就是引入file文件,使用imageinfo查看当前镜像系统相关信息。
在下面调用命令时,加上--profile=系统信息
。
这里根据图片显示的实际情况,之后调用命令,加上--profile=Win7SP1x64
(2) 调出shell窗口
volshell
:用于进入Volatility专属的shell。
volatility -f 镜像文件 --profile=Win7SP1x64 volshell
shell的命令:dt("内核关键数据结构名称")
,可查看操作系统内核关键数据结构的定义。
如:dt("_PEB")
(3) 列举进程和将内存中的某个进程保存出来
1)列举进程pslist
:用于列出镜像中的进程
volatility -f 镜像文件 --profile=Win7SP1x64 pslist
#还可以使用pstree、psscan
- 列出转储时运行的进程的详细信息。它示出了偏移量,过程名,过程ID(PID),该父进程ID(PPID),线程的数目,把手的数目,和日期/时间时,过程开始和退出。
- pslist无法显示隐藏/终止进程。解决这个问题的插件是psscan,psscan命令可以显示出被隐藏的进程。
- pstree同样也是扫描进程的,可以识别子进程以及父进程,是以进程树的形式出现的。
- dlllist可以看到每个进程(程序)运行所需要的所有动态链接库
Dumpit.exe 一款内存镜像提取工具
TrueCrypt.exe 一款磁盘加密工具
Notepad.exe windows自带的记事本
Mspaint.exe windows自带画图工具
2)将内存中所有的驻留页面转储到单个文件中memdump
:将内存中所有的驻留页面转储到单个文件中,以dmp格式保存。常用foremost来分离里面的文件
volatility -f 镜像文件 --profile=Win7SP1x64 memdump -p [PID] -D [dump出的文件保存的目录]
或
volatility -f 镜像文件 --profile=Win7SP0x64 memdump -p [PID] --dump-dir=[dump出的文件保存的目录]
#-p的参数为PID,即进程ID
# ./代表当前文件夹
把谷歌的相关内存dump出来,将chrome.exe进程(PID 2584)dump出来,结果文件为2584.dmp
foremost分离2584.dmp文件,输出了很多文件
3)转储进程的可执行文件
其中memdump可以换成procdump,就可以转储进程的可执行文件
同时支持输入 --offset 地址
的方式来提取一些无法从pid提取的进程
volatility -f 镜像文件 --profile=Win7SP1x64 procdump --offset 地址 -D [文件保存的目录]
4)查看保存出来的可疑的进程
假设进程里面可能会隐藏flag等关键信息,可以使用以下命令查看dump出的dmp文件
strings -e l 2584.dmp | grep flag
#-e的参数为编码方式,其中l为16-bit编码
#使用strings将dmp文件的字符串打印出来:
strings 2584.dmp > 2584.txt
strings 2584.dmp > 2584.txt | grep shellcode
(4) 扫描文件和导出文件
1)扫描文件filescan
:扫描所有的文件列表
#扫描内存中所有文件
volatility -f 镜像文件 --profile=Win7SP1x64 filescan
#扫描含有某关键字的文件,如扫描桌面为Desktop,扫描flag关键字为flag
volatility -f 镜像文件 --profile=Win7SP1x64 filescan | grep flag
#扫描指定后缀文件,文档常见doc|docx|rtf
volatility -f 镜像文件 --profile=Win7SP1x64 filescan | grep -E 'png|jpg|gif|zip|rar|7z|pdf|txt|doc'
2)导出扫描的文件dumpfiles
:导出某一文件(指定虚拟地址)
volatility -f 镜像文件 --profile=Win7SP1x86 dumpfiles -Q 内存地址 -D [文件保存的目录]
#-Q的参数为 内存地址。即-Q后接[filescan]命令扫描得到的 Offset(P)
(5) 列举缓存在内存的注册表和导出注册表
1)列举缓存在内存的注册表hivelist
: 列出所有的注册表项及其虚拟地址和物理地址
volatility -f 镜像文件 --profile=Win7SP0x64 hivelist
2)导出注册表hivedump
:打印出注册表中的数据
volatility -f 镜像文件 --profile=Win7SP0x64 hivedump -o 注册表的virtual地址
(6) 提取 cmd 命令使用情况
cmdscan
:可用于查看终端记录
volatility -f 镜像文件 --profile=Win7SP1x64 cmdscan
#如果需要看详细情况:
volatility -f 镜像文件 --profile=Win7SP1x64 cmdline
(7) 查看屏幕截图
screenshot
:从系统上的每个桌面获取屏幕截图
volatility -f 镜像文件 --profile=Win7SP1x64 screenshot --dump-dir=./
(8) 查看剪切板数据和导出剪切板数据
clipboard
:查看剪切板数据
volatility -f 镜像文件 --profile=Win7SP1x64 clipboard
加参数-v
可以导出剪切板数据
volatility -f 镜像文件 --profile=Win7SP1x64 clipboard -v > out.txt
(9) 获取到当时的网络连接情况
netscan
:获取到当时的网络连接情况。在内存转储中扫描网络,它将查找TCP端点、TCP侦听器、UDP端点和UDP侦听器
volatility -f 镜像文件 --profile=Win7SP1x64 netscan
#xp系统不支持netscan
connscan
:查看网络连接。使用池标签扫描查找_TCPT_OBJECT
结构,可以找到除了活动连接以外,已经终止的链接
volatility -f 镜像文件 --profile=Win7SP1x64 connscan
(10) 获取浏览器的使用情况
iehistory
:恢复ie历史记录index.dat
缓存的文件。
可以找到基本的访问链接(通过FTP和HTTP),重定向链接和已经删除的条目。
适用于任何加载和使用wininet.dll库的任何进程,不仅仅限于Internet Explore
volatility -f 镜像文件 –profile=Win7SP1x64 iehistory
如果没有显示,则说明没有记录
(11) 列出SAM表中的用户和获取最后登录系统的用户
printkey
:显示指定注册表中包含的子项、值、数据和数据类型,它默认情况下会打印指定注册表项的信息
1)列出SAM表中的用户
volatility -f 镜像文件 --profile=Win7SP1x64 printkey -K "SAM\Domains\Account\Users\Names"
可以看到有三个用户
2)获取最后登录系统的用户
volatility -f 镜像文件 --profile=Win7SP1x64 printkey -K "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"
(12) 从内存中获取密码哈希
第一步,获取到注册表中的system的virtual 地址,SAM的virtual地址
system表的注册表路径:\REGISTRY\MACHINE\SYSTEM
SAM表的注册表路径:\SystemRoot\System32\Config\SAM
volatility -f 镜像文件 --profile=Win7SP1x64 hivelist
获取SYSTEM SAM的virtual地址 分别为0xfffff8a000024010
、0xfffff8a000832010
第二步,获取密码哈希hashdump
:查看当前操作系统中的password hash
volatility -f 镜像文件 --profile=Win7SP1x64 hashdump -y (注册表system的virtual地址) -s (SAM 的virtual地址)
#这里是:volatility -f qwzf.raw --profile=Win7SP1x64 hashdump -y 0xfffff8a000024010 -s 0xfffff8a000832010
#或执行:volatility -f 镜像文件 --profile=Win7SP1x64 hashdump
第三步,解密Windows密码哈希,得到密码
Windows 系统下的 hash 密码格式为:用户名称:RID:LM-HASH 值:NTLM-HASH 值
如:
qwzf:1000:aad3b435b51404eeaad3b435b51404ee:a168ed2b284b17468a86f4566125a06f:::
#用户名称为:qwzf
#RID 为:1000
#LM-HASH 值为:aad3b435b51404eeaad3b435b51404ee
#NTLM-HASH 值为:a168ed2b284b17468a86f4566125a06f
2)解密工具
ophcrack.exe破解NTLM Hash
ophcrack的简单用法
菜单栏有一个load里面有五个选项:
第一个是单个密码解密直接复制
第二个是文本加载适用多个加密
第三个是对加密的Sam文件破解
第四个和第五个主要用来审计或者破解本地和远程Hash密码
本次选择第一个,然后再点击crack,等一会就可以得出明文密码。
Hashcat破解NTLM Hash
hashcat -a 0 -m 1000 --force 'a168ed2b284b17468a86f4566125a06f' password.txt
#hashcat -m 1000 -a 3 hash.txt
john破解NTLM Hash
john -format=NT hash.txt #破解,使用john自带的密码字典
john --show -format=NT hash.txt #查看破解结果
2)在线Hash破解
Objectif Sécurité - Ophcrack
一个国外的老牌Hash破解网站,填入NTLM Hash值即可:
CrackPot
CMD5.com
国内的CMD5.com 也支持NTLM类型的Hash破解,直接粘贴进去系统会自动解密(不过这个工具要付费)
任选其一即可。
参考:Windows用户密码的加密方法与破解
(13) 显示编辑控件的信息
editbox
:可以显示有关编辑控件的信息
volatility -f 镜像文件 --profile=Win7SP1x64 editbox
(14) 获取内存中正运行的程序
userassist
:获取UserAssist键。Windows在系统注册表数据库中维护UserAssit键来跟踪执行的程序,这些键中存储了执行次数和上次执行的时间。
volatility -f 镜像文件 --profile=Win7SP1x64 userassist
(15) 列举时间线
timeliner
: 将所有操作系统事件以时间线的方式展开
volatility -f 镜像文件 --profile=Win7SP1x64 timeliner
其他常用
(1) 查看开启的windows服务svcscan
:扫描 Windows 的服务
volatility -f 镜像文件 --profile=Win7SP1x64 svcscan
(2) 查看系统里的窗口列表windows
:枚举系统所有桌面中的所有窗口(不论可见或不可见),它以桌面的spwnd值(前景窗口)开始以Z-
顺序(即前后焦点)遍历窗口
volatility -f 镜像文件 –profile=Win7SP1x64 windows
可以得到某文件,是由某个程序打开或运行的。
(3) 查看内核驱动modules
:查看系统上加载的内核驱动程序列表
volatility -f 镜像文件 --profile=Win7SP1x64 modules
#隐藏的用modscan或者driverscan:
volatility -f 镜像文件 --profile=Win7SP1x64 modscan
volatility -f 镜像文件 --profile=Win7SP1x64 driverscan
4.Volatility安装插件(以mimikatz为例)
Volatility默认安装路径:
/usr/lib/python2.7/dist-packages/volatility/plugins/
mimikatz下载地址
将下载好的 mimikatz.py 放到 plugins 目录下即可
此时运行Volatility会报错 没有construct
模块或construct
模块有问题,安装一下:
pip uninstall construct
pip install construct
#指定版本:pip install construct==2.5.5-reupload
5.配置支持Linux活取证的Volatility环境
如果想要使用Volatility进行Linux系统活取证,需要配置Volatility环境
参考:内存取证学习-Linux
0x06 后记
本篇博客,主要总结了Windows内存取证之活取证和内存取证工具,工具包括:内存获取工具和内存分析工具Volatility,以及Volatility工具的常见使用。暂且没有总结Linux内存取证的相关知识。
Windows内存取证相关练习在另一篇博客:Windows内存取证之活取证–实战练习(一)
参考:
内存取证起手式
内存取证学习
内存取证艺术
内存取证原理学习及Volatility - 篇一
内存取证工具——volatility 常用命令
内存取证工具-volatility、foremost
内存取证工具 volatility 使用说明
对活取证和死取证的学习笔记
volatility的实战操作
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 qwzf1024@qq.com