内存取证是指通过分析计算机系统的内存(RAM)来获取有关系统运行状态、用户活动和执行过程的信息。内存取证通常用于数字取证领域,旨在收集关键的计算机数据,以便分析和研究可能发生的安全事件、恶意软件活动或其他计算机相关事件。
内存取证的步骤和技术:
-
收集内存镜像:
- 使用专门的工具或技术获取计算机系统的内存镜像。这可以通过物理访问计算机或通过网络进行远程获取。
-
分析内存镜像:
- 将获取的内存镜像载入分析工具中,例如专门用于内存分析的软件或框架。常用的工具包括Volatility、Rekall、Mandiant Redline等。
- 分析师通常会检查内存中的进程、线程、网络连接、打开的文件和注册表等信息,以理解系统在事件发生时的状态。
-
提取关键信息:
- 从内存镜像中提取关键数据,如正在运行的进程、登录会话、注册表项、网络活动、内核模块等。这些信息可以帮助分析师还原事件的发生过程。
-
分析和报告:
- 对提取的数据进行深入分析,以识别任何异常活动、安全漏洞或其他问题。
- 生成详细的报告,描述发现的问题、建议的修复措施和其他相关信息。
应用领域:
- 安全事件响应:用于检测和分析系统中的安全威胁和攻击活动。
- 法律取证:作为调查和法律程序的一部分,收集证据以支持法庭案件。
- 恶意软件分析:帮助分析师理解恶意软件的行为和功能。
- 系统故障分析:用于诊断系统崩溃或异常的原因。
1.1 基本概念
在CTF中,内存取证一般指对计算机及相关智能设备运行时的物理内存中存储的临时数据进行获取与分析,提取flag或者与flag相关重要信息。
1.2 内存取证基本三步
- 解析Windows/Linux/Mac OS/Android的内存结构;
- 分析进程等内存数据;
- 根据题目提示寻找线索和思路,提取分析指定进程的特定内存数据;
1.3内存结构
常见的内存结构存在于以下操作系统:
- Windows操作系统
- Linux操作系统
- Mac OS操作系统
- Android系统
常见的内存文件格式有img、dmp、raw、vmem等,无需过于深度学习几种内存结构, 因为在内存分析领域可使用内存取证框架----Volatility进行分析。
1.4 实验环境介绍
所用系统:kali-linux-2019-2-amd64,此系统中预置Volatility(位于“应用程序”-“11 Forensics”)(“Forensics”译为“取证”)
点击该应用可进入终端命令行并显示当前Volatility支持的命令行及命令行含义(注: Volatility为命令行工具,自行开启系统“终端命令行”后键入volatility -h可获得以上操作相同的命令行展示信息)
1.5 内存取证 - vmem说明
1.5.1 vmem文件介绍
VMEM 文件是VMware Workstation 文件,当使用虚拟机的“暂停”或“快照”功能时,在虚拟机保存的路径下会生成后缀名为“.vmem”的文件。 虚拟机暂停及快照时所需保存的所有虚拟机客户操作系统的内存相关数据都保存到了该文件中。
VMEM文件大小与虚拟机配置文件(.vmx) 中设定的虚拟物理内存大小相同(memsize),其内容为虚拟机客户操作系统所管理的内存数据。
1.5.2 volatility分析vmem文件两步曲
1.调用imageinfo参数获得目标内存镜像的摘要信息;(可理解为分析该vmem文件是何系统/版本对应内存快照,例如:Win7SP1x64、Win7SP1x86_23418、WinXPSP2x86等等)
volatility -f test.vmem imageinfo
命令行响应:
由以上Suggested Profiles(s)一般可获得多个profile信息,通常情况下选择首个即可,如图中示例,当前vmem对应的profile为:Win7SP1x64
调用相应插件命令用于提取所希望的数据内容;(如:< 提取系统登陆密码,插件命令为:lsadump;<2>提取网络连接情况数据,插件命令为:netscan;等等插件命令)
命令行格式:
volatility -f “待分析的vmem文件” --profile=imageinfo命令行获取的profile 插件命令
命令实例:
volatility -f test.vmem --profile=Win7SP1x64 lsadump
(注:Win7SP1x64为第一步获得的profile信息;lsadump为插件命令,根据-h命令行解释可找到如下解释:Dump (decrypted) LSA secrets from the registry,译为:从注册表中转储出解密后的LSA secrets,LSA是Windows系统本地安全认证的模块。它会存储用户登录密码等信息)
* 特别注意,--profile参数前为两个 - 符号。
1.6 内存取证实战模拟
1.6.1 内存中获取到当前用户的密码
命令行:
volatility -f test.vmem --profile=Win7SP1x64 lsadump
// (注:使用lsadump插件命令)
命令行响应:
分析结果:当前用户登陆密码为: flag{406990ff88f13dac3c9debbc0769588c}
1.6.2 获得ip地址和主机名
1.6.2.1 获得本机ip地址
命令行:
volatility -f test.vmem --profile=Win7SP1x64 netscan
// (注:使用netscan插件命令查看网络连接情况)
本机IP地址仅需查看Local Address即可,其中Local Address地址可能出现三类ip地址:
1、0. 0. 0. 0 电脑可能会有一或多张网卡,故会获得多个ip地址,本地址表示监听本地所有网卡获得的ip地址(包含回环地址127.0.0.1);
2、127.0.0.1 表示只监听本机回环地址,只能本机访问;
3、x. x. x. x 表示监听本机特定网卡获得的ip地址;
如上命令行响应信息,根据local address类型,分析得到本机local address x. x. x. x类型仅出现192.168.85.129
分析结果:当前本机ip地址为192.168.85.129
1.6.2.2 获得主机名
主机名的获取是通过读取注册表 \REGISTRY\MACHINE\SYSTEM 下的 ControlSet001\Control\ComputerName\ComputerName 键值内容来获得,具体读取主机名分两步:
1、获取内存信息中注册表文件的偏移地址:
命令行:
volatility -f test.vmem --profile=Win7SP1x64 hivelist
// (注:使用hivelist插件命令在内存中查找注册表配置单元的地址)
由命令行响应可知,\REGISTRY\MACHINE\SYSTEM 在内存中的虚拟地址为0xfffff8a000024010
2、调用printkey插件命令打印指定注册表中包含的子项、值、数据和数据类型
命令行:volatility -f test.vmem --profile=Win7SP1x64 -o 0xfffff8a000024010 printkey -K
"ControlSet001\Control\ComputerName\ComputerName"
注:
-o参数后的地址为步骤一中获取到的\REGISTRY\MACHINE\SYSTEM虚拟地址;
-K 参数指定要打印的主机名对应键ControlSet001\Control\ComputerName\ComputerName
如图:主机名为 WIN-9FBAEH4UV8C
特别注意:
实验中,通常题目会要求分析结果以某种格式提交,如参照
1.6.3 获取桌面上的 test.txt中的文件内容
获取文件内容分两步:
- 根据题目描述获取对应路径下、对应文件的偏移地址;
- 将文件内容信息自内存信息中导出;
- 编辑器查看文件内容
1.6.3.1 获取对应路径下、对应文件的偏移地址
命令行:
volatility -f test.vmem --profile=Win7SP1x64 filescan
// (注:使用filescan 插件命令在内存中查找FILE_OBJECT(文件对象),出于不法意图的隐藏文件也可被扫描到)
特别注意:
由于内存加载的文件数量过多,filescan插件命令扫描到的文件列表会由于篇幅过大不方便查找特定文件名称,遇到此类情况时,可采用以下两种方法均可:
1、grep命令搜索过滤:
volatility -f test.vmem --profile=Win7SP1x64 filescan | grep "test.txt"
命令执行结果如下:
2、filescan扫描到的文件清单重定向输出到磁盘文件,文本编辑器打开查找;(进阶搜索时,若对grep正则表达式不熟悉可采用本示例方法)
volatility -f test.vmem --profile=Win7SP1x64 filescan > out.txt
命令执行结果如下:
查找out.txt文件并获得桌面test.txt对应偏移地址:
Windows桌面路径标识为:\Device\HarddiskVolumel\Users\xxx[xxx为登陆用户名]\Desktop\
因此,桌面test.txt对应文件地址找到,为0x000000003e06bdd8
1.6.3.2 将文件内容信息自内存信息中导出
命令行:volatility -f test.vmem --profile=Win7SP1x64 dumpfiles -Q 0x000000003e06bdd8 -D ./ (注:使用dumpfiles 插件命令将test.txt文件内容转储至电脑磁盘,如图红色标记文件)
其中命令行参数:
-Q 0x000000003e06bdd8 :-Q指定文件物理位置的开始,后接filescan扫描的偏移地址;
-D ./ : -D 指定转储的文件存放目录,如图演示时./为转储在当前工作目录
1.6.3.3 编辑器查看文件内容
命令行 xxd file.None.0x88683180.dat
命令行说明:
Xxd : Linux自带十六进制编辑器(Linux附带较多编辑器,如vi,等等)
file.None.0x88683180.dat :1.6.3.2章节dumpfiles转储的对应文件
因此,test.txt 文件内容为:flag{0123456789}
(注:TXT文件为文本文件,dump出的文件内容仅flag{0123456789}为文本内容,其余0000均为填充比特)
1.6.4 你的电脑已经被植入挖矿木马并沦为“肉鸡”,尝试找出这个矿池地址,并以flag{ip+端口}形式提交
1.6.4.1 实验题目分析
根据题目说明可知,待分析目标已经被植入木马,故首先应查看当前网络连接情况
1.6.4.2 网络连接情况查看
命令行:
volatility -f test.vmem --profile=Win7SP1x64 netscan
// (注:使用netscan插件命令可打印出当前目标机器网络tcp/udp连接状态、远端主机地址、网络对应进程ID等信息)
由上图网络连接情况信息来看,目前仅存在一条打开状态的网络链路 54.36.109.161:2222,其中端口2222也很可疑,当前svchost.exe进程原为windows进程,是否svchost.exe(2588)进程存在问题
查看进程列表进一步分析判断:
命令行:
volatility -f test.vmem --profile=Win7SP1x64 pslist
// (注:使用pslist插件命令可打印出系统进程名、父进程、子进程关系等信息)
通过进程列表查看,子进程svchost.exe (2588) 由其父进程 loader.exe(3036)创建,而loader.exe明显异常(不属于系统进程、且不属于常用三方进程),从而也印证了svchost.exe (2588) 进程已被注入修改,而对应网络连接 54.36.109.161:2222 确实为异常。
分析结果:54.36.109.161:2222为挖矿进程。
根据题目提交格式最终结果为:flag{54.36.109.161:2222}
1.6.5 恶意程序在系统中注册了服务,请问服务名是什么
1.6.5.1 题目分析
根据题目说明可知,恶意程序注册了服务,故首先应查看系统服务列表
1.6.5.2 系统服务查看
命令行:
volatility -f test.vmem --profile=Win7SP1x64 svcscan
// (注:使用svcscan插件命令可打印出当前目标机器注册服务信息)
1.6.5.3 系统服务排查结果
查看到的目标机器注册服务列表中,可以清晰看到loader.exe(3036进程)注册了自启动服务,Service Name(服务名):VMnetDHCP
因此,恶意程序在系统中注册的服务名称为:VMnetDHCP
1.6.6 获取恶意代码的进程名pid, 以 flag{恶意进程1+pid(PID小);恶意进程2(PID)恶意进程3(PID大))形式提交
1.6.6.1 题目分析
根据题目说明可知,获得恶意进程名称及PID即问题解决,需要使用volatility工具集中的pslist插件命令
1.6.6.2 进程列表查看方法
命令行:
volatility -f test.vmem --profile=Win7SP1x64 pslist
1.6.6.3 进程列表排查结果
进程loader.exe(3036)明显异常(不属于系统进程、且不属于常用三方进程、命名规则也存在异常性),子进程svchost.exe (2588) 由其父进程 loader.exe(3036)创建。
根据题目提交格式最终结果为:flag{svchost.exe+2588; loader.exe+3036}
1.6.7 病毒在自我删除时,一般执行的命令是什么?(提示:路径信息用*代替 不带cmd.exe)
标准命令行:cmd.exe /C @ping -n 15 127.0.0.1&del path/file > nul
参数详解:
cmd.exe: windows 命令行程序
/C:cmd.exe 参数,达到执行字符串指定的命令然后终止的目的
@ping -n 15 127.0.0.1:ping 本机回环地址,且ping次数由-n参数指定,本命令中为15次,因回环地址一定可以ping通,本命令可作为延时/计时后执行其他命令使用,时间约计时/延时时间约等于次数(n-1)秒
&:连接cmd命令行内容,即&连接符前命令先执行完毕,进而执行&连接符后面命令
del path/file:删除特定位置目录/文件,本命令中*应指向为当前运行的进程文件
> nul:表示不显示>之前的命令行执行结果
根据题目提示相关要求,最终命令行中: 路径信息用*代替, 不带cmd.exe,
故题目最终结果应为:/c @ping -n 15 127.0.0.1&del * > nul
关于本题演练,通过python调用win32api的ShellExecute进程启动函数,附加以上描述的自删除命令行,可达到程序自删除目的,演练步骤如下:
1、自删除程序源码:
#test.py
import win32api
win32api.ShellExecute(0, 'open', 'cmd.exe', '/C ping -n 15 127.0.0.1&del test.exe','',0)
2、将以上脚本保存为test.py文件;
3、安装Pyinstaller并调用编译命令 pyinstaller -F test.py ,命令执行完毕,会在test.py目录下的dist目录内生成test.exe可执行文件;
4、test.exe 即为自删除模拟程序,双击test.exe后,约14秒后,test.exe 文件自动删除。