上期给大家科普了下svchost进程的相关知识。这次正好赶上重保,想给大家讲讲号称取证黄金的内存Dump。
01 了解Dump
有亿丢丢计算机背景的同学,应该都知道,内存是程序运行的容器,任何代码想要被执行,都必须被加载到内存中,要使用的数据也必须被加载到内存中。
一方面硬盘上的程序可能被加壳,数据会被加密,但是在被 CPU 执行/使用之前,都会在内存中显出原形;另一方面内存属于 RAM(随机存储器),存储的东西我们是直接看不到的,且具有“易失性”,当电源断开后里面的内容也会消失。
由此可见内存分析的重要性,便有了“Dump”一词,Dump 翻译过来就是“转储”,它即是动词又是名词。
作为动词时,我们可以把他理解为“内存转储”或“内存快照”的一个过程,就是把内存中的内容保存到本地磁盘中的一个文件里面;作为名词时,我们可以理解它就是从内存转储到本地磁盘的那个文件。
中华文化博大精深,所以,本文各处出现的“Dump”、“转储”一词,大家自行理解其中的含义!
1. 为什么需要 Dump?
知道了 Dump 是什么,那 Dump 的作用也显而易见,本大侠将 Dump 的作用分类到四个角色中,在不同的角色眼中,有着各自的用途。
进程 Dump 可以把程序的执行状态从内存保存到 .dmp 文件中,Dump 文件包含进程的数据区、堆栈调用信息、模块信息、线程信息、异常信息等。
程序/驱动开发人员可以通过查看程序在内存中的状态来调试程序,可以快速分析程序崩溃、死循环、死锁等异常原因,这种文件必须用专用工具软件打开,比如 WinDbg。
内存分析在恶意代码分析中有着不可替代的地位,内存 Dump 可以帮助分析师们来对恶意程序进行脱壳处理,以及提取被注入文件、 shellcode 等操作。
除此之外,随着 Rootkit 隐藏恶意代码、进程注入、无文件后门等技术的出现,很多恶意软件都在 Ring 0(内核层)级别或者内存中运行,应急分析人员也很难从本地文件和进程信息中发现这些恶意代码。这个时候,内存分析便是分析人员的一道生门。
严格意义上讲,电子取证一般指司法取证领域,通过符合法律规范的方式对计算机入侵、破坏、欺诈、攻击等犯罪行为进行证据获取、保存和分析的过程,为了保存证据及充分分析,“内存取证”即内存 Dump 在司法取证过程中,对于保存“易失证据”自然有着不可替代的作用。
实际上,我们在日常的应急响应及处置计算机病毒过程中,也会使用“取证”一词,主要指代定位分析恶意程序及证明攻击者入侵行为,dump 的作用即和应急响应工程师视角下的作用相同,因此 Dump 也有“取证黄金”的美称。
内存同时也是攻击者眼中的香饽饽,因为内存中同样也存储着系统敏感信息。最常被利用的就是 lsass.exe 进程,该进程是一个系统进程,用于本地安全和登录策略,其进程内存中会保存用户的认证 hash,攻击者可以通过 Dump 该进程进行分析,从而获取用户认证 hash 甚至明文口令,这种攻击方式就是常说的 hashdump。
一种是对整个操作系统运行中的物理内存进行镜像 Dump,这种比较简单粗暴,获得的 Dump 文件也比较大,一般以“.raw”、“.vmem”后缀结尾,多用于电子取证领域,应急分析中偶尔也可以使用。
另一种是系统下的针对单个进程的内存进行 Dump,可以分为两大类:
(1)内核模式 Dump:操作系统创建的崩溃转储,如系统蓝屏时系统会自动创建内核模式 Dump;
(2)用户模式 Dump:用户模式下,对进程创建的内存转储,按 Dump 完整度又可以分为两类:
a. Full Dump:完整 Dump,包含进程的完整地址空间数据以及大量用于调试的信息;(一般 32 位系统下进程的虚拟空间是 4 G,如果完整 Dump 可能会很大)
b. MiniDump:只获取当前进程运行中的一些基本状态信息,包含模块、线程、栈等基本信息。
Windows 自带的任务管理器就包含内存转储功能,会创建比较完整的 MiniDump。
打开任务管理器,右键想要转储的进程,选择“创建转储文件”即可,dump 文件会存储在当前用户临时目录下。
2. 进程内存 Dump – procdump.exe
procdump.exe 是微软 SysinternalsSuite 套件程序之一,是一个轻量的命令行转储工具,主要用来监控应用程序异常并生成 dump 文件。
下载地址:ProcDump v10.11(https://learn.microsoft.com/zh-cn/sysinternals/downloads/procdump)
一般在应急场景下使用“-ma”参数即可创建完整的进程内存 dump(Full Dump),否则转储将不包含进程内存,dump 文件默认保存在当前目录下。
对于指定进程的内存 Dump,除了上面提到的两种方法,还有很多常用的应急响应分析工具,如:ProcessExplorer、ProcessHacker、火绒剑、PCHunter等也都支持进程的内存 Dump,大家可以自行研究下。
dumplt 是一款免安装的绿色软件。一般用于把 Windows 内存以镜像的形式保存下来,用于后续的取证工作。
dumplt 是内存取证常用的工具之一,使用简单,直接双击运行,命令行中输入“y”确认后即可 dump 操作系统内存镜像,会在当前文件夹下生成一个“.raw”格式的镜像文件。
本大侠在测试时,发现该工具在 Win 10 及以上系统会有些许的不稳定,容易导致系统蓝屏,因此在高版本系统取证时慎用。
WinPmem 是一款功能强大的跨平台内存采集工具,该工具可以更好的支持 Win xp 到 Win 10 的 32 位和 64 位系统:
(2)支持 32 和 64 位的 Windows XP 和Windows 10,可以使用 WDK7600 以支持 Windows XP。默认情况下,提供的 WinPmem 可执行程序将会结合 WDK10 编译以支持 Windows 7-10;
(3)使用了三种不同的独立方法来创建内存 Dump,总会有一种方法适用于内核模式rootkit;
(5)使用了一个读取设备接口,而不是像其他工具一样直接从内核写入镜像。这样可以允许我们使用复杂的用户空间镜像工具,并在系统上执行实时分析。
在 Windows 平台下使用,我们可以直接下载对应版本的可执行程序:winpmem_mini_x86.exe 或 winpmem_mini_x64.exe
项目地址:https://github.com/Velocidex/WinPmem
5. 内存镜像 Dump – 利用虚拟机获取
如果我们分析的目标系统运行在一台虚拟机中,只需挂起虚拟机或者对正在运行状态的虚拟机快照,就能获得一份完整的系统内存镜像。
以 VMware 为例,当挂起虚拟机时,其所在目录下就会生成一个“.vmem”文件,该文件中记录的就是没有经过任何处理的内存镜像。
03 常用 Dump 分析工具
windbg 是专门针对 windows 的一款调试器,支持各种 Windows API,不仅支持用户态/内核态程序调试,还能分析进程内存 Dump 文件。常见的 Windows 蓝屏问题分析,使用的就是该工具。
x86 位版本:http://download.microsoft.com/download/A/6/A/A6AC035D-DA3F-4F0C-ADA4-37C8E5D34E3D/setup/WinSDKDebuggingTools/dbg_x86.msi
x64 位版本:http://download.microsoft.com/download/A/6/A/A6AC035D-DA3F-4F0C-ADA4-37C8E5D34E3D/setup/WinSDKDebuggingTools_amd64/dbg_amd64.msi
调试符号对于调试器而言非常重要,相当于调试器的数据库,可以让使用者了解被调试模块的更多信息,如内部函数名、变量名、结构体定义等,如果没有调试符号,使用者就只能看到输出表中的函数名称。
目前使用最多的符号文件是 PDB 符号文件,VS 编译器编译时也能自动生成 .PDB 文件。
使用 Windbg 时最常用的符号设置方式是使用微软的符号服务器,在 Windbg 中通过 Ctrl+S 打开符号设置框,输入“SRV*C:Symbols*http://msdl.microsoft.com/download/symbols”,表示从微软符号服务器下载符号文件,并保存在 C:symbols 路径下(需提前创建该文件夹)。
配置完调试符号后,通过“File > Open Crash Dump”打开需要分析的进程 Dump 文件即可。
虽然 Windbg 提供了图形化界面,但它最强大的地方还是命令行,其命令分为三类:
标准命令:这类命令对于所有的调试目标都适用,比如常见的 k 命令;
元命令:这类主要针对特定的目标所做的扩展命令,比如常用的 .load 命令,这类命令前面都以“.”开头;
扩展命令:标准命令和元命令都是 Windbg 内建的命令,而扩展命令是实现在动态链接库 DLL 中,如 .Net 平台的 SOS.dll 扩展库,可以通过“.load”命令导入,这类命令都以“!”开头, 比如常用“!analyze -v”。
常用元命令:
常用扩展命令:
关于 Windbg 的使用,也需要对操作系统和内存有亿丢丢理解,篇幅有限,这里不做过多介绍,感兴趣的同学需可以深入研究下。
2. 内存镜像 Dump 分析 – Volatility Framework
Volatility Framework 是一款基于 Python 的内存取证分析框架,是常用的系统内存镜像分析工具之一,而且它是开源的,支持分析 Windows、Linux 以及 Mac OSX 等系统的内存镜像。
官方也提供了编译好的二进制文件,可针对不同操作系统选择下载。
官方下载地址:https://www.volatilityfoundation.org/releases
插件仓库:https://github.com/volatilityfoundation/community
这里以一个 Win7 系统为例,笔者提前通过 dumplt 工具 dump 了该系统的内存镜像,使用 volatility 工具进行简单分析。
(1)首先使用“imageinfo”命令查看内存镜像的系统版本信息,会列出当前镜像适用的配置文件,在后面的分析中可以通过“–profile”参数指定,这里适用 “Win7SP1x64”。
(2)指定 profile,查看进程信息:
此外,使用“psxview”命令还可以看到一些隐藏进程以及一些已经结束但内存中还未解链的进程。
(3)查看网络连接情况,这里细心点就会发现,Explorer.exe 存在可疑的网络行为。
(4)提取该进程内存 Dump,可以用于后续分析。
(5)获取系统账户认证哈希:
还有很多诸如查看服务、注册表、用户使用痕迹、代码注入等信息的方法,这里就不一一演示了,感兴趣的小伙伴都可以自己测试一下,毕竟亲口尝梨知酸甜嘛~
04 举个栗子
1. Powershell 无文件场景下的 Dump 分析
以 Powershell 无文件攻击为例,这应该是近两年挖矿木马常用的手段之一了,遇到这类木马时,我们可以通过 Process Explorer 等工具 Dump 可疑 Powershell 进程的内存数据。
最简单直观的方法,就是用 Notepad++ 或 “Strings”命令工具查看其字符串信息,寻找可疑 Powershell 命令,但这样很容易漏掉一些重要信息。
我们还可以用上面提到的 Windbg 调试工具查看其内存对象.
Powershell 是基于 .Net Framework 平台的脚本环境,需要使用到 Windbg 在 .Net 环境下的扩展库 sos.dll,在 Windbg 中输入“.loadby sos clr”,会加载当前系统 .Net 框架下的 sos.dll 调试扩展库。
使用扩展命令“!DumpHeap”查看 Powershell Dump 的“HistoryInfo”对象,可以看到有 2 条命令执行记录。
继续使用 “!DumpObj” 命令查看 HisttoryInfo 对象的详细的内容。
如果存在大量命令记录的情况,对于上面的操作,可以使用 Windbg 脚本语言进行批量查看所有命令记录:
这里只是对一个简单的 Powershell 挖矿木马为例,对于域环境下的 Powershell 渗透行为,利用上述方法,是不是也可以发现很多入侵者的蛛丝马迹呢?
2. CobaltStrike 后门进程分析
CobaltStrike 算是近几年圈里最火的远控工具了,它凭借稳定的架构和高度自定义配置的特点,以及活跃的社区环境,成为了红队兄弟和一众 APT 组织的香饽饽。由此,CobaltStrike 木马也成为我们应急工作中最常遇到的一类恶意软件。
在应急过程中,如果我们分析的目标主机中了 CobaltStrike 木马,我们可以通过 Dump 目标进程的内存,然后使用 Python 工具 1768.py 进行分析,进一步提取其 Beacon 配置信息。
Beacon 进程 Dump 分析工具:https://blog.didierstevens.com/2021/12/21/update-1768-py-version-0-0-11/
如下图所示,攻击者将 Beacon 注入到了系统进程 taskhost.exe 中,对其进行 Dump,分析发现其详细 Beacon 配置,包含公钥及 C2 配置信息等。
在日常处理某客户失陷服务器问题时,客户反馈服务器存在内网横向扫描的行为,且该主机无法远程。遂指导客户 Dump 了操作系统内存镜像进行本地分析。
网络分析:使用“timeliner”命令得到曾经的网络连接确定异常的 PID 为 1884:
进程分析:使用pslist查看进程,发现 PID 为1884的为 spoolsv.exe 进程:
可疑文件提取:使用 Dumpfiles 转储保存在内存中的文件,将 spoolsv.exe 提取出来。
tips:文件在访问和使用时,会缓存在内存中以提高系统性能。文件可能没有完全映射到内存中,所以提取出的文件并不一定是原文件。
可疑文件分析:将提取的 spoolsv.exe上传到沙箱,可以确认该文件就是我们要找的恶意样本。根据沙箱中命中的代码段的特征寻找同类木马文件,对应到 vt 上查看木马历史文件名或下载到本地进行进一步分析。
通过本文,小伙伴们应该多少了解了内存在应急响应中的重要性,在以后遇到应急案例时,不妨先对重要的目标系统或进程进行 Dump 操作,以免在应急过程中遇到断电或系统卡死等意外,导致分析难以进行。
关于内存分析技术,本大侠在这里也只是总结了 Winodws 系统下的冰山一角,还有 Linux 内存取证技术及更多的技术细节更值得大家去深入研究。
此外,攻防是一个人与人之间对抗的过程,有 Dump 技术,自然也有反 Dump 技术的产生,以脱壳技术为例,Dump 就是脱壳过程中的一个关键步骤,部分加密壳就会采用反 Dump 技术(Anti-Dump)来防止被脱壳。
更多的技术细节我也在不断学习和钻研中,读者朋友们如果更好的理解和想法,可以在后台留言提出,我们一起探讨~
EXTRACTING ACTIVITY HISTORY FROM POWERSHELL PROCESS DUMPS (https://www.leeholmes.com/extracting-activity-history-from-powershell-process-dumps/)
Using Dump Files (https://docs.microsoft.com/zh-cn/previous-versions/visualstudio/visual-studio-2015/debugger/using-dump-files?view=vs-2015#BKMK_What_is_a_dump_file_)
教你配置windows上的windbg,linux上的lldb,打入clr内部这一篇就够了
微步在线应急响应团队为企业客户提供应急响应服务。当企业遭遇突发重大安全事件(APT攻击、勒索加密、数据窃取、漏洞攻击、主机被控等),微步在线可提供快速事件定位取证、隔离清除、溯源分析、安全加固等专业安全服务,帮助企业信息系统在最短时间内恢复正常工作,将事件影响降到最低。
如果发生安全事件,可联系微步在线应急响应团队,联系方式:400-030-1051
2. 内容引用,请注明出处:以上内容引自公众号“微步在线应急响应团队”
原文始发于微信公众号(微步在线应急响应团队):取证黄金之内存 Dump