The Art of Memory Forensics-Windows取证(Virut样本取证)
1、前言
The Art of Memory Forensics真是一本很棒的书籍,其中使用volatility对内存进行分析的描述可以辅助我们对更高级类的木马进行分析和取证,这里对书中的命令进行了笔记记录。
2、volatility-Windows命令
与分析Linux镜像相似,而Windows系统的profile都是volatility自带的,无需再制作。

- 选择元数据 imageinfo
查看正在分析的内存样本的摘要信息。显示主机所使用的操作系统版本、服务包以及硬件结构(32位或64位)、页目录表的起始地址和该获取该内存镜像的时间等信息。显示出当前所支持的元数据系统。

- 结束进程分析 psscan
使用PSSCAN命令。可以找到以前终止的进程(非活动)和被rootkit隐藏或未链接的进程。输出显示ping.exe、ipconfig.exe两个进程启动与退出时间。


- 进程列表 pslist
列出系统进程,显示偏移量、进程名称、进程ID、父进程ID、线程数、句柄的数量,以及进程启动和退出时的日期/时间。

- 进程树 pstree
查看以树形形式列出的进程,与pslist显示的技术一样,但不会显示隐藏或未链接的进程。子进程使用缩进和句点表示。

- 检测横向运动 getsids
查看与进程关联的SIDs(安全标识符),识别恶意升级特权的进程,以及哪些进程属于特定的用户。例子中以explorer.exe为示例,其中一个SID (S-1-5-21-[snip]-1115)没有显示帐户名称。
EXE是管理员的成员组。在这个特殊的场景,攻击者组合了一个毒葛(PI)远控。(RAT)使用一个Pass the Hash (PtH)攻击。


- 识别远程映射驱动器
许多攻击者都依赖于像net view和net use这样的命令来探索周围环境。通过远程驱动器功能获取对服务器的读访问权限后在内网进行横向运动。

- 识别远程映射驱动器-handles
在内存中找到远程映射驱动器的证据,可通过查找文件句柄实现。使用handles命令可查看文件、注册表键、互斥锁、命名管道、事件、窗口站、桌面、线程和所有其他类型的可保存执行对象。


- 识别远程映射驱动器
另一种检测远程映射共享的方法,可以结合使用。通过symlinkscan插件检查符号链接。

- 进程内存查看 memmap
memmap命令显示了哪些页面是内存驻留的,给定一个特定的进程DTB。可显示页面的虚拟地址、页面相应的物理偏移量以及页面的大小。这个命令生成的映射信息来自底层地址空间的get_available_address方法。

- 进程内存提取 memdump
要在一个进程中提取所有内存驻留页面,可使用memdump命令将系统进程的可寻址内存提取到单个文件之中。

- Yara规则扫描内存
Yara是Victor M. Alvarez (http://plusvic.github.io/yara)的一款匹配特征数据的工具。
在任意数据集内的模式匹配。Yarascan命令可以通过虚拟内存进行扫描,可以指定PID扫描,扫描规则除了使用字符也可以使用匹配规则文件。




- 环境变量 envars
使用envars命令可以显示进程的环境变量,将显示安装的cpu数量和硬件架构、进程的当前目录、临时目录、会话名称、计算机名称、用户名等相关信息。

- 网络套接字 netscan
扫描32位和64位Windows Vista、Windows 2008服务器和Windows 7内存转储中的网络构件,可以使用netscan命令。显示TCP端点、TCP监听器、UDP端点和UDP侦听器。区分IPv4和IPv6,打印本地和远程IP、本地和远程端口、套接字被绑定的时间或连接何时建立,以及当前状态(仅用于TCP连接)。

- 内存中的DLL列表 dlllist
使用dlllist命令可以显示进程加载的dll,通过遍历由PEB的InLoadOrderModuleList指向的_LDR_DATA_TABLE_ENTRY结构的doubly链接列表。当进程调用LoadLibrary(或诸如LdrLoadDll之类的一些衍生工具)时,DLL会添加到这个列表中,直到调用FreeLibrary,引用计数为0时才会被删除。

- 内存中的DLL导出 dlldump
要从进程的内存空间中提取DLL并将其转储到磁盘进行分析,可以使用dlldump命令。从一个特定的进程转储所有dll(使用pid= pid)

- 进程PE提取 procdump
使用procdump命令可以转储进程的可执行文件,通过--unsafe 或者 -u 标记来绕过解析PE头时使用的某些完整性检查。某些恶意软件会故意在PE报头中伪造大小字段,这样内存转储工具就会失败。

- 隐藏\注入代码检测 malfind
malfind命令基于VAD标记和页面权限等特性,帮助在用户模式内存中找到隐藏或注入的代码。


- 注册表列表 hivelist
使用hivelist扫描注册表,然后打印物理和虚拟偏移量、路径。通过这个命令查找某些恶意软件存在的注册表键。

- 注册表值打印 printkey
大部分恶意代码都会对注册表操作,可以通过printkey打印出某些注册表键值,以下命令为打印出自启动项。

- 转储密码哈希 hashdump
使用hashdump命令可以从内存样本中转储帐户密码哈希(LM/NTLM),查看密码是否已经受到篡改。

- 检测网络连接 connscan
使用connscan命令可以打印出正在建立连接的TCP和物理偏移地址


- 检测原始套接字 sockets
使用sockets可以打印出原始套接字的信息(TCP、UDP)

- 逆推netstat.exe结果 Netscan
使用netscan命令可以倒推出Windows系统中netstat.exe的结果。

- Internet History - iehistory
使用iehistory可恢复Internet Explorer缓存数据,查看受害主机访问过的历史记录。

- DNS缓存恢复 filescan\dumpfiles
当应用程序使用DnsQuery,恶意代码经常破坏hosts文件以防止访问某些安全网站或者劫持流量。可以通过filescan命令查找到的物理偏移量。再通过dumpfile命令将文件的内容提取到磁盘。

- 活动模块列表 modules
使用modules命令可以打印出系统中加载模块的列表,可借助于此命令查找某些具有特定名称的rootkit模块。

- 提取内核模块 moddump
要提取所有当前加载的模块,只需提供所需输出的路径。

- 检测可疑线程 threads
Threads命令可以识别试图隐藏在进程中的线程。通过枚举加载的模块查询双链表并记录它们的基础地址和大小。然后扫描系统线程检查线程启动地址值是否在模块的范围内。

3、示例分析-virut感染性病毒
virut是一款具有很强感染能力的一款病毒,通过感染正常进程空间,然后对注册表防火墙键值设定使受感染进程放行不拦截。
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\SharedAccess\Parameters\FirewallPolicy\StandardProfile\AuthorizedApplications\List]
"C:\\Windows\\system32\\wininit.exe"="C:\\Windows\\system32\\wininit.exe:*:enabled:@shell32.dll,-1"
"C:\\Windows\\system32\\winlogon.exe"="C:\\Windows\\system32\\winlogon.exe:*:enabled:@shell32.dll,-1"
使用dumpit.exe对受害主机的内存提取,受感染进程winlogon.exe进程PID为604。

使用volatility中的memdump命令对winlogon.exe进程空间数据进行提取,保存文件为604.dmp。

在已得知C&C域名为ilo.brenz[.]pl的情况下。通过字符串搜索可在进程内存数据中搜索到C&C域名,证明正常进程空间已经受到病毒的感染。

除了使用memdump外,还可以使用yarascan命令直接对字符串进行扫描。

Shellcode提取思路
这个病毒既然是感染性病毒,那么可以对受感染的病毒进行分析,然后提取特征字符串,dump的时候通过特征字符串+偏移定位的形式来提取。
The Art of Memory Forensics-Windows取证(Virut样本取证)的更多相关文章
- Virut样本取证特征
		1.网络特征 ant.trenz.pl ilo.brenz.pl 2.文件特征 通过对文件的定位,使用PEID查看文件区段,如果条件符合增加了7个随机字符区段的文件,则判定为受感染文件. 3.受感染特 ... 
- windows下的volatility取证分析与讲解
		volatility(win64) 1.下载 volatility 下载地址:(我下载的版本2.6,并把名字稍微改了一下) Release Downloads | Volatility Foundat ... 
- 详解Windows注册表分析取证
		大多数都知道windows系统中有个叫注册表的东西,但却很少有人会去深入的了解它的作用以及如何对它进行操作.然而对于计算机取证人员来说注册表无疑是块巨大的宝藏.通过注册表取证人员能分析出系统发生了什么 ... 
- windows系统安全日志取证工具
		0x01 关于日志 Windows安全事件日志中详细记录了是谁在什么时候通过什么手段登录到系统或者注销了登录,通过分析该日志可以详细了解服务器的安全情况以及必要时的取证工作. 0x02 查看日志 传统 ... 
- Wannacry样本取证特征与清除
		一.取证特征 1)网络域名特征 http://www.iuqerfsodp9ifjaposdfjhgosurijfaewrwergwea.com 2)文件特征 母体文件 mssecsvc.exe c: ... 
- [手机取证] Apple Watch取证初探
		转载文章请注明出处 1. 关于Apple Watch 苹果公司在2015年3月正式发布了智能手表Apple Watch,包括Apple Watch.Apple Watch Sport以及Apple W ... 
- Linux XOR.DDoS样本取证特征与清除
		一.取证特征 1)获取进程ID 使用top命令,查看占用内存率最高的十位随机名称进程名(示例:进程名pygdykcrqf) 2)获取进程对应路径 Linux 在启动一个进程时,系统会在/proc下创建 ... 
- 取证学习资料DVD
		http://www.infiniteskills.com/training/learning-computer-forensics.html https://www.youtube.com/watc ... 
- GitHub:Awesome-Hacking(黑客技能列表-恶意代码)
		0 初衷 GitHub这一份黑客技能列表很不错,包含了多个方向的安全.但目前我关注只有逆向工程与恶意代码,所以其他的被暂时略过. 虽然很感谢作者的辛勤付出,但并不打算复制粘贴全套转载.逐条整理是为了从 ... 
随机推荐
- UVA11027_Palindromic Permutation
			此题不错.给你一些字字符,要求你用这些字符构成一个回文串,求字典序第k大的回文串. 首先通过给定的字符,我们可以直接判断能否构成回文串(奇数的字符不超过一种),其次可以统计每个字符在回文串的左边应该出 ... 
- iOS BCD码、数据流、字节和MD5计算
			一.各个之间的相互转换 1.字符串转数据流NSData NSString *str = @"abc123"; NSData *dd = [str dataUsingEncoding ... 
- LDA-Latent Dirichlet Allocation 学习笔记
			以下内容主要基于<Latent Dirichlet Allocation>,JMLR-2003一文,另加入了一些自己的理解,刚开始了解,有不对的还请各位指正. LDA-Latent Dir ... 
- Vector源码解析
			概要 学完ArrayList和LinkedList之后,我们接着学习Vector.学习方式还是和之前一样,先对Vector有个整体认识,然后再学习它的源码:最后再通过实例来学会使用它.第1部分 Vec ... 
- 一步步创建第一个Docker App —— 3. 创建一个集群Swarm
			原文:https://docs.docker.com/engine/getstarted-voting-app/create-swarm/ 初始化集群 Swarm 1. 使用 ssh 命令登录 man ... 
- Redis学习 - 主从拷贝
			Redis主从拷贝的特点 同一个Master可以拥有多个Slaves. Master下的Slave还可以接受同一架构中其它slave的链接与同步请求,实现数据的级联复制,即Master->Sla ... 
- js中apply(thisArg, [argsArray])的参数与ArrayLike的关系
			你是否写过或见到过这样的代码 xx.apply(this,slice.call(arguments)) //slice.call转为数组是否多余 mdn地址 msdn地址 一.微软和mdn对参数的介绍 ... 
- bzoj4035【HAOI2015】数组游戏
			题目描述 有一个长度为N的数组,甲乙两人在上面进行这样一个游戏:首先,数组上有一些格子是白的,有一些是黑的.然 后两人轮流进行操作.每次操作选择一个白色的格子,假设它的下标为x.接着,选择一个大小在1 ... 
- fzyzojP3372 -- [校内训练20171124]博弈问题
			对于每个点都要答案 还是异或 trie树合并石锤了 朴素枚举是O(n^2*17)的 怎么办呢? 我们发现合并的时候,一些部分的trie的子树还是不变的 改变的部分也就是合并的复杂度可以接受 鉴于大部分 ... 
- jQuery读取KindEditor的值
			$(document.getElementsByTagName("iframe")[0].contentWindow.document.body).html(); 
