主机内存提取分析技术的研究与应用
2020-03-15丁兆锟林思成
丁兆锟 林思成
(南京拓界信息技术有限公司 江苏省南京市 210014)
1 内存提取
1.1 硬件提取方法
在利用硬件提取内存数据的方法中,最主要的方式就是采用硬件卡结合DMA(Direct Memory Access,直接访问内存)指令来提取内存数据。主要有以下几种方式:
(1)基于PCI 扩展卡获取物理内存;
(2)基于IEEE 1394 火线接口获取物理内存;
(3)基于固件、网卡或雷电接口获取物理内存。
利用硬件提取内存的方法可以应用在Intel 架构的操作系统中,如Windows,Linux,Mac OS 等,由于使用的是DMA 方式,所以无需CPU 参与,就能够读取内存,同时还能够避免运行程序导致的内存数据变化。但这种方式需要硬件的支持,部分早期的PCI 硬件卡还需要在提取数据前就插入主板中,这对于现场取证来说适用性不高,而且部分新版BIOS 限制了利用固件接口获取物理内存。
1.2 软件提取方法
软件提取主要利用软件工具来获取内核内存区域的数据,并借助于操作系统的内核数据结构和相关机制去解析重构内存数据。主要有以下几种方法:
1.2.1 系统崩溃转储
当操作系统崩溃时,系统会记录当前状态下的系统信息,方便用来分析崩溃的原因。因此,可以利用操作系统的崩溃转储机制,来获取系统崩溃时的内存状态记录数据。对于Windows 系统来说,系统崩溃后会在“C:WindowsMinidump”目录中生成一个内存转储文件,或利用Windows 系统内置的CrashOnCtrlScroll 功能(默认关闭,需手动开启),获取崩溃转储数据。但由于该方法需在系统崩溃之后获取文件,所以可能会对目标系统的环境状态造成严重破坏,从而不利于开展后续相关的取证工作。
1.2.2 系统休眠文件
当系统进入休眠状态时,会先将内存中的数据全部写入到硬盘的休眠文件中,然后停止对整机的供电,在下次开机时,系统会直接读取生成的休眠文件,并加载到内存中,从而使得系统能够快速恢复到休眠之前的状态。因此,休眠文件也成了获取内存数据的一种方式,Windows 系统进入休眠模式后,会在C 盘根目录下生成休眠文件hiberfil.sys,该方法就是通过hiberfil.sys 文件来获取内存数据。
1.2.3 内存取证工具
当系统处于运行中时,可以通过运行内存取证程序来获取内存镜像,不同的操作系统平台中都有对应的软件工具,例如Windows系统中的DumpIt、FTK Imager,Linux 系统中的DD 工具、LiME 等,利用对应工具就可以提取到正在运行状态下的程序所产生的内存数据,但由于运行软件的操作也会将程序放入内存中,所以就会破坏部分原始内存数据。
图1:内存进程列表
图2:密钥位置
图3:Windows 7 系统休眠功能
2 内存分析
2.1 进程分析
进程是程序运行的实例,在内存中有其特殊的结构和映射关系。进程取证分析主要通过定位内存中进程的相关内核数据结构来提取关键的信息。目前主要有以下3 种方法:
(1)基于进程块EPROCESS 结构和线程块ETHREAD 结构的取证分析;
(2)基于KPCR(Kernel Processor Control Region)内核处理器控制区的取证分析;
(3)基于VAD(Virtual Address Descriptor)虚拟地址描述符的取证分析。
以进程块EPROCESS 结构为例,Windows 系统中的进程运行后都会在内存中产生一个EPROCESS 结构对象,操作系统会将该进程的相关代码段序列化加载到对应的EPROCESS 结构体中,该结构体中包含了许多进程的重要属性与运行时属性,其中运行时属性仅在进程运行过程中才会产生,所以这部分数据也是内存提取与分析中的重点关注数据。以下是部分进程属性的说明:
(1)CreateTime:进程创建时间属性,其中存储了进程运行的开始时间;
(2)ExitTime:进程退出时间属性,其中存储了进程结束的时间;
(3)ProcessID:唯一标识符,其中包含了系统分配给每一个进程的具有唯一性的标示符。
2.2 密钥分析
操作系统在运行过程中,内存中往往会存在很多的密钥信息,比如系统登录密码、BitLocker 全盘加密的密钥信息、第三方加密工具的密钥信息,部分应用程序,如微信,QQ 等的数据库密钥信息。对于已加密的密钥,通常会在程序运行时在内存中进行解密。因此,要想解密相关的应用系统,首先就需要获取系统的动态内存,进而在内存中获取相关密钥信息。
内存取证密钥恢复分析主要通过解析相关密码算法的内存存储格式,从中还原出密钥信息,密钥提取技术较多运用了特征模式匹配的方法。例如针对AES 扩展密钥结构的内存镜像搜索方法,能够匹配到有效的密钥结构特征的内存块。对于加密算法在内存中的密钥结构特征识别与匹配的研究,也是近年来内存取证分析中的重点研究领域。
2.3 其他分析方法
内存分析中还有其他方法用来分析特定的数据,如基于注册表的取证分析能够找出用户使用系统相关的配置信息,交互过程等,基于网络连接的取证分析可以快速定位系统中网络访问行为痕迹与网络连接信息,如ip 地址、端口号等。
3 内存分析在密码突破中的应用
3.1 解密Windows端微信数据库
Windows 端的微信数据库是加密的, 默认存放于C:Users\%username%DocumentsWeChat Files微信账号Msg 文件夹中,不同于手机端的微信数据库7 位密钥的加密方式,Windows 端的微信密钥是32 字节,由于PC 端的微信数据库仅在登录状态时才会加载密钥进行解密,因此需要获取微信登录状态下的内存镜像,进而分析出解密密钥。
首先利用Volatility 工具分析内存镜像的特性,确定该内存的分析命令参数,可能存在多个建议的参数,可逐个尝试以获得最优结果。然后分析该内存镜像中的进程列表,并确定微信进程的PID 号,如图1 所示。
利用该PID 可以从内存镜像中提取出微信进程的内存空间及内存映射表。然后分析WechatWin.dll 在内存镜像中的加载基址,根据基址和该版本的偏移量,可计算出解密密钥在内存中的虚拟地址,依据虚拟地址在内存映射表中记录的位置,找到对应微信进程内存空间的密钥存储位置信息,再根据此位置信息查找内存映射表中密钥偏移量,最后在内存空间中找到对应偏移量下的32 个字节作为rawkey,如图2 所示。
该微信数据库的rawkey 即为:“E0954533030E4659AAD5E423 6995B71D9F81811C114241C3A61D50FCBEBDB797”,利用rawkey并结合所要解密数据库的头部字节,可计算出该数据库的解密密钥,使用该密钥即可解开加密数据库,读取明文字段。
3.2 提取休眠文件中的登录密码
上节中提到休眠文件也是内存的表现形式之一,对于系统为Windows 7 的主机,在锁屏界面点击切换用户后,右下角会出现电源选项,且点击该选项后默认会有休眠按钮,如图3 所示。
点击休眠按钮后,系统会先在硬盘中生成休眠文件(hiberfil.sys),然后进入休眠状态。Windows 的休眠功能其实就是将内存数据与会话保存至硬盘,以便计算机断电重新启动后可以快速读取休眠文件,恢复系统和用户会话。休眠过程中,部分系统进程也会以文件的方式保存下来。
在Windows 7 系统进程中,lsass.exe 进程负责验证用户登录系统时输入的用户名、密码是否正确,当成功登陆系统后,lsass.exe 进程会缓存用户名和密码,并将其加密存储在进程的内存中,同时存储在内存中的还有用来加密用户名和密码的密钥。因此当Windows 系统休眠时,这些在内存中数据就会保存到休眠文件中,通过分析休眠文件,就可以从中提取出加密的用户名、密码以及密钥,从而解密出系统的明文密码。
但由于休眠文件是以文件的形式存储在磁盘中,所以当目标系统启用了BitLocker 全盘加密或系统盘加密后,则无法直接分析休眠文件提取密码,此时的文件都是密文状态存储。
3.3 解决主机全盘加密问题
随着数据安全意识的提高,实际工作中碰到全盘加密的情况越来越多,对于Windows 和Linux 系统来说,最常使用全盘加密方式分别是Bitlocker 与LUKS(Linux Unified Key Setup),而开启全盘加密后,传统方法获取到的数据是无法明文查看的。因此,需要在内存分析技术的基础上,解决全盘加密问题。
通过对Linux 源码的分析,可以发现系统在登录过程中会调用相应函数进行密码校验,该函数为启用selinux 时的验证分支,此时系统会调用unix_chkpwd 模块进行验证。
因此,通过相应硬件接口访问内存后,结合内存分析技术,检索Linux 系统内存中的相关函数,找出登录过程中调用的校验函数,利用反汇编原理,修改校验用户名密码的代码,从而实现在登录界面中输入任意密码都可以通过校验,直接登录系统。
在Windows 系统中,存在着和Linux 类似的校验方法,其校验过程不再赘述。因此,对于Windows 的BitLocker 全盘加密来说,也能够利用同样的方式通过校验,实现无口令进入系统,获取明文数据。
4 总结
内存提取分析作为计算机取证领域的一个研究方向,在主机密码提取、数据解密等方面有着重要作用。本文通过分析内存镜像中不同密钥的结构特征,提出了解密微信数据库、提取系统登陆密码以及解决全盘加密问题的过程与方法,为主机取证中存在的密码难题提供了一定的思路。