电子取证-Windows取证基础

发布 : 2020-11-17

本文首发i春秋,未经允许禁止转载

前言

取证通常作为一个公司的事件响应调查人员或者司法调查的取证人员,通过调查被入侵的机器,将被入侵者的行为轨迹梳理出来,还原整个入侵的过程。对于入侵者而言,了解电子取证,可以更全面的了解到自己能够在系统中留下的痕迹,从而具有针对性的消除痕迹,而对于取证人员来说,电子取证无疑是了解整个入侵过程的关键。电子取证近年来也发展为了一个独立的学科,其中在安全竞赛中,电子取证也作为一部分考察内容,被纳入到杂项的大类中,也有只考察取证的竞赛。下面从技术层面介绍Windows取证的相关知识。

取证的分类

活取证

  • 抓取文件的metadata、创建是时间线、命令历史、分析日志文件、哈希摘要、转存内存信息
  • 使用未受感染的干净程序进行取证
  • U盘、网络、存储设备收集到的数据

死取证

  • 系统关机后制作硬盘镜像、分析镜像

获取内存工具

在活取证中,可以使用内存dump工具,将被入侵的机器的内存保存下来,其中在Windows中经常使用的工具是Dumpit

DumpIt 是一款绿色免安装的 windows 内存镜像取证工具。利用它我们可以轻松地将一个系统的完整内存镜像下来,并用于后续的调查取证工作

在dump内存后,获取到的文件大小约等于主机内存的大小,所以在自己进行测试的时候,可以尽量把测试机的内存调小一点。

Dump内存

这里使用上面说的Dumpit工具,下载之后放到虚拟机中,双击之后输入y,即可获取当前的状态的内存文件,保存后是一个raw格式的文件,这里我在测试机上dump了一下内存,获取到了一个文件,用于下面的示例讲解,大家可以根据下面的讲解自己创建镜像进行测试。

取证工具

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

安装方法

在windows中可以直接下载exe的程序,放入环境变量中使用,而linux下需要进行安装,这里介绍linux下的安装方法

首先下载文件

1
git clone https://github.com/volatilityfoundation/volatility.git

Volatility需要使用python2环境,所以需要保证使用的是python2

1
2
3
cd volatility
python setup.py build
python setup.py install

安装完成后可以在volatility目录下执行 python vol.py --info 来测试是否安装成功可以将Volatilty的目录放入环境变量中,这样就可以在任意目录下执行 vol.py

image.png

如果在运行中报错或者提示错误信息,可以根据提示下载相应的模块,例如下面几个

Distorm3:反编译库

1
pip install distorm3

Yara:恶意软件分类工具

1
pip install yara

PyCrypto:加密工具集

1
pip install pycrypto

PIL:图片处理库

1
pip install pil

OpenPyxl:读写excel文件

1
pip install openpyxl

ujson:JSON解析

1
pip install ujson

在进行安装时,部分模块可能会报错,这就需要到https://pypi.org/project/搜索相应版本的模块的源码,进行手动安装

基本使用

Volatility命令的基本格式如下

1
python vol.py -f [image] ‐-profile=[profile][plugin]

其中 -f 后面加的是要取证的文件, --profile 后加的是工具识别出的系统版本, [plugin] 是指使用的插件,其中默认存在一些插件,另外还可以自己下载一些插件扩充。

可以使用 -h 参数获取使用方法和插件介绍,这里只列举几个常用到的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
imageinfo:显示目标镜像的摘要信息,这常常是第一步---获取内存的操作系统类型及版本,之后可以在 –profile 中带上对应的操作系统,后续操作都要带上这一参数
pslist:该插件列举出系统进程,但它不能检测到隐藏或者解链的进程,psscan可以
notepad:查看当前展示的 notepad 文本
editbox:显示有关编辑控件的信息
screenshot:保存基于GDI窗口的伪截屏
psscan:可以找到先前已终止(不活动)的进程以及被rootkit隐藏或解链的进程
pstree:以树的形式查看进程列表,和pslist一样,也无法检测隐藏或解链的进程
memdump:提取出指定进程,常用foremost 来分离里面的文件(历年美亚杯有此题)
filescan:扫描所有的文件列表
hashdump:查看当前操作系统中的 password hash,例如 Windows 的 SAM 文件内容(实际中没有mimikatz效果好)
svcscan:扫描 Windows 的服务
connscan:查看网络连接
cmdscan:可用于查看终端记录
dlllist: 列出某一进程加载的所有dll文件
dumpfiles:导出某一文件(指定虚拟地址)
hivelist: 列出所有的注册表项及其虚拟地址和物理地址
timeliner: 将所有操作系统事件以时间线的方式展开

示例讲解

下面使用Volatility对前面获取的内存镜像进行分析

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

1
python vol.py -f TEST-PC.raw imageinfo

image.png

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

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

1
python vol.py -f TEST-PC.raw --profile=Win7SP1x64 pslist

image.png

图中标红的是几个需要注意的点,其中前两个说明系统运行着 httpmysql 服务,后面的 notepad.exe 是指正在运行一个记事本程序,而 mspaint.exe 是指是微软画图程序, cmd.exe 指正在运行命令行程序, DumpIt.exe 是之前说的用于获取内存镜像的工具。下面针对说到的几个进行进行分析。

获取记事本数据

在上面介绍插件的时候,其中有两个关于记事本的插件 notepadeditbox

1
python vol.py -f TEST-PC.raw --profile=Win7SP1x64 notepad

image.png

显示该这个插件不支持这个系统,这时可以使用 editbox 查看

1
python vol.py -f TEST-PC.raw --profile=Win7SP1x64 editbox

image.png

可以看到这样就能查看到当前打开的记事本中的内容了

查看当前桌面截图

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

1
python vol.py -f TEST-PC.raw --profile=Win7SP1x64 screenshot -D ./tmp

其中 -D 参数是导出的地址

image.png

在保存下来的图片中可以看到有一张显示了当时桌面的状态

session_1.WinSta0.Default.png

可以看到有一个DumpIt.exe 的窗口,还有另外两个窗口

查看画图图像

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

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

1
python vol.py -f TEST-PC.raw --profile=Win7SP1x64 memdump -p 1616 -D ./

image.png

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

image.png

调节技巧

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

image.png

当调节到一定程度后,可以看到大致恢复出了画图程序当时的图像,但是有点倾斜,如果更加细致的调节,是可以调正的,同样也可以找到彩色界面图片。

image.png

当参数调节为以下时,可以看到当时图片的彩色图片,这时仅仅是图片,没有画图程序的界面。

image.png

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

image.png

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

Hash,一般翻译为”散列”,也有直接音译为”哈希”的,就是把任意长度的输入(又叫做预映射,pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。

使用hashdump插件可以获取计算机内存中的用户hash

1
python vol.py -f TEST-PC.raw --profile=Win7SP1x64 hashdump

image.png

可以看到系统中存在六个账户,后面三个是隐藏账户,可能是入侵者创建的,下面介绍一下Windows下的Hash密码值的格式

Windows系统下的hash密码格式为:用户名称:RID:LM-HASH值:NT-HASH值,例如:

Administrator:500:C8825DB10F2590EAAAD3B435B51404EE:683020925C5D8569C23AA724774CE6CC:::表示

用户名称为:Administrator

RID为:500

LM-HASH值为:C8825DB10F2590EAAAD3B435B51404EE

NT-HASH值为:683020925C5D8569C23AA724774CE6CC

所以可以将获取的hash值拿到破解网站获得明文,类型选择NTLM

image.png

另外还可以从注册表中,获取系统中的用户,

1
python vol.py -f TEST-PC.raw --profile=Win7SP1x64 printkey -K "SAM\Domains\Account\Users\Names"

image.png

可以看到这里获取到的结果与使用hashdump获取的不同,通过hashdump可以看到系统中共存在三个隐藏账户,其中的W4$仅仅是通过添加了$来进行了隐藏,这时,通过net user命令是看不到此用户的,如下图所示

image.png

但是在注册表中,还存在该用户的信息,所以可以通过查看注册表的方式来找出该用户。

而HomeGroupUser和hacker两个用户在添加了$符号的同时,还在注册表中删除了信息,所以通过注册表是无法获取到这两个用户的

image.png

在NT/2000/XP下有一个叫HideAdmin的工具,可以自动创建隐藏的具有管理员权限的用户,创建后,通过net user命令和注册表都无法看到用户,甚至在计算机管理中,也无法看到隐藏用户,如下图

image.png

获取运行过的命令

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

1
python vol.py -f TEST-PC.raw --profile=Win7SP1x64 cmdscan

image.png

可以看到执行了whoamiifconfigipconfig这三个命令

查看系统中的文件

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

1
python vol.py -f TEST-PC.raw --profile=Win7SP1x64 filescan | grep -E "zip|txt|doc|pdf"

image.png查看桌面的文件

1
vol.py -f TEST-PC.raw --profile=Win7SP1x64 filescan | grep  "Desktop"

image.png

这里可以看到桌面有一个yep.txt的文件,下一步把他dump出来

dump扫描到的文件

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

1
python vol.py -f TEST-PC.raw --profile=Win7SP1x64 dumpfiles -Q 0x000000003d87bf20 -D ./

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

image.png

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

image.png

修改后可以看到文件的内容

总结

本篇文章仅是简单介绍了一下电子取证以及Volatility的简单用法,实际电子取证还有很多内容,Volatility也有很多其他功能,想要详细了解还需要继续深入学习,并且多找机会练习,多积累经验,这样在拿到一个镜像后,才有分析的方向。在上面的示例讲解中,对使用Volatility取证的步骤做了简单的介绍,并对notepad、editbox、memdump、hashdump、printkey、filescan、dumpfiles、cmdscan插件的使用做了相关示例的讲解,另外介绍了gime的一个功能,在后面的文章中将会更深入介绍取证工具的使用和针对不同环境的取证方法。

参考

https://www.jianshu.com/p/5f13ee20f5b0

https://www.w3xue.com/exp/article/20192/22237.html

https://blog.51cto.com/13352079/2434792

https://github.com/volatilityfoundation/volatility/wiki/Command-Reference

本文作者 : W4rnIn9
原文链接 : http://joner11234.github.io/article/d2718b8.html
版权声明 : 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!