版权声明:转载时请以超链接形式标明文章原始出处和作者信息及
本声明http://riusksk.blogbus.com/logs/50925372.html
作者:Peter Silberman, Steve Davis
译者:riusksk (泉哥:http://riusksk.blogbus.com)
原文出处:BlackHat USA 2009
前言
Metasploit:重现犯罪场景
![](/icons/17509dou.gif)
旨在演示如何结合现有工具资源进行内存分析和提取
![](/icons/17509dou.gif)
以恢复先前不易访问到
![](/icons/17509de.gif)
数据
![](/icons/17509dou2.gif)
此处现有
![](/icons/17509de.gif)
资源主要是指如何利用 payload,特别是Meterpreter
![](/icons/17509dou.gif)
可用于检索和提取攻击者电脑中
![](/icons/17509de.gif)
内存
![](/icons/17509dou2.gif)
本文主要讨论如何利用Memoryze[1](
![](/icons/17509yi.gif)
款免费使用
![](/icons/17509de.gif)
内存分析和提取工具)和Metasploit Forensic Framework去重现Meterpreter会话过程
![](/icons/17509dou2.gif)
在理解重现现实中
![](/icons/17509de.gif)
Meterpreter会话的前
![](/icons/17509dou.gif)
读者需要先理解以下 3点:
1.访问物理内存;
2.进程捕获;
3.Metasploit payload和Meterpreter
![](/icons/17509dou2.gif)
访问物理内存
Memoryze作为内存分析工具
![](/icons/17509dou.gif)
它访问物理内存主要出于两个目
![](/icons/17509de.gif)
:内存提取和内存分析
![](/icons/17509dou2.gif)
1. 内存提取:Memoryze针对物理内存或特定进程
![](/icons/17509de.gif)
当前状态创建完整内存映像
![](/icons/17509dou2.gif)
2. 内存分析:Memoryze通过访问物理内存以进行分析
![](/icons/17509dou.gif)
比如枚举所有进程及其句柄表
![](/icons/17509dou2.gif)
为了更为容易地访问物理内存
![](/icons/17509dou.gif)
Windows公布
![](/icons/17509yi.gif)
个名为\Device\PhysicalMemory
![](/icons/17509de.gif)
section object
![](/icons/17509dou2.gif)
这个section object
![](/icons/17509yi.gif)
打开
![](/icons/17509dou.gif)
应用
![](/icons/17509chengxu.gif)
即有
![](/icons/17509yi.gif)
个指向物理内存
![](/icons/17509de.gif)
句柄
![](/icons/17509dou2.gif)
如果
![](/icons/17509chengxu.gif)
通过该句柄读取数据
![](/icons/17509dou.gif)
那么它就会从物理内存中读取
![](/icons/17509dou2.gif)
重点要注意
![](/icons/17509de.gif)
是
![](/icons/17509dou.gif)
在Windows 2000和Windows2003 SP0上应用
![](/icons/17509chengxu.gif)
可以在ring 3上访问section object
![](/icons/17509dou.gif)
而在Windows 2003 SP1及的后
![](/icons/17509de.gif)
版本则改变了对此section object
![](/icons/17509de.gif)
访问权限
![](/icons/17509dou.gif)
现在要求
![](/icons/17509chengxu.gif)
必须运行在ring 0[2]
![](/icons/17509dou2.gif)
理解Windows进程地址空间
在访问物理内存的前
![](/icons/17509dou.gif)
Memoryze需要访问每
![](/icons/17509yi.gif)
进程
![](/icons/17509de.gif)
虚拟地址空间
![](/icons/17509dou2.gif)
地址空间大小随着如线程
![](/icons/17509dou.gif)
动态存储
![](/icons/17509dou.gif)
栈
![](/icons/17509dou.gif)
被加载
![](/icons/17509de.gif)
可执行文件等
![](/icons/17509de.gif)
内存需求而进行增减
![](/icons/17509dou2.gif)
Windows Memory Manager (MM)管理着所有
![](/icons/17509de.gif)
这些信息
![](/icons/17509dou.gif)
且是以 2叉树
![](/icons/17509de.gif)
形式被管理
![](/icons/17509de.gif)
![](/icons/17509dou2.gif)
在Executive Process (EPROCESS)结构当中
![](/icons/17509yi.gif)
个名为VadRoot (Virtual Address Descriptor Root)
![](/icons/17509de.gif)
成员变量刚好指向该 2叉树
![](/icons/17509de.gif)
根
![](/icons/17509dou2.gif)
每
![](/icons/17509yi.gif)
进程均含有EPROCESS结构
![](/icons/17509dou.gif)
其包含有进程管理器需要用来管理进程
![](/icons/17509de.gif)
信息
![](/icons/17509dou2.gif)
2叉树
![](/icons/17509de.gif)
入口实际上是
![](/icons/17509yi.gif)
个名为Memory Manager Virtual Address Descriptors (MMVAD)结构
![](/icons/17509dou2.gif)
该结构包含有和MM相关
![](/icons/17509de.gif)
信息
![](/icons/17509dou.gif)
如被描述
![](/icons/17509de.gif)
内存段
![](/icons/17509de.gif)
虚拟内存基址和大小
![](/icons/17509dou2.gif)
若想查看MMVAD结构及其成员
![](/icons/17509dou.gif)
可在windbg中输入 dt _MMVAD
![](/icons/17509de.gif)
命令以显示此结构信息
![](/icons/17509dou2.gif)
通过以上命令可以显示MMVAD结构及其成员
![](/icons/17509de.gif)
偏移地址和大小
![](/icons/17509dou.gif)
显示如下(确保操作前符号文件已被加载):
lkd> dt _MMVAD
+0x000 StartingVpn : U
![](/icons/17509int.gif)
4B
+0x004 EndingVpn : U
![](/icons/17509int.gif)
4B
+0x008 Parent : Ptr32 _MMVAD
+0x00c LeftChild : Ptr32 _MMVAD
+0x010 RightChild : Ptr32 _MMVAD
+0x014 u : __unnamed
+0x018 ControlArea : Ptr32 _CONTROL_AREA
+0x01c FirstPrototypePte : Ptr32 _MMPTE
+0x020 LastContiguousPte : Ptr32 _MMPTE
+0x024 u2 : __unnamed
Figure 1:_ MMVAD Structure
由上可知,在Figure 1中MMVAD包含有各种成员变量
![](/icons/17509dou2.gif)
Memoryze只关心下列结构:
● StartingVpn -虚拟内存基址
● EndingVpn -内存块
![](/icons/17509de.gif)
大小
● LeftChild,RinghtChild -指向树中
![](/icons/17509de.gif)
子节点
● Parent -父节点指针
如果MMVAD所描述
![](/icons/17509de.gif)
虚拟内存块是通过
![](/icons/17509diaoyong.gif)
LoadLibrary或Windows进程加载器创建
![](/icons/17509de.gif)
![](/icons/17509dou.gif)
那么该内存块将拥有
![](/icons/17509yi.gif)
个名称
![](/icons/17509dou2.gif)
该名称实际是存储在 MMVAD所描述
![](/icons/17509de.gif)
虚拟内存块上
![](/icons/17509de.gif)
文件名
![](/icons/17509dou2.gif)
为了获取名称或者检测文件是否存在
![](/icons/17509dou.gif)
Memoryze引用了MMVAD中指向
![](/icons/17509de.gif)
CONTROL_AREA结构
![](/icons/17509de.gif)
ControlArea成员变量
![](/icons/17509dou2.gif)
lkd> dt _CONTROL_AREA
+0x000 Segment : Ptr32 _SEGMENT
+0x004 DereferenceList : _LIST_ENTRY
+0x00c NumberOfSectionReferences : U
![](/icons/17509int.gif)
4B
+0x010 NumberOfPfnReferences : U
![](/icons/17509int.gif)
4B
+0x014 NumberOfMappedViews : U
![](/icons/17509int.gif)
4B
+0x018 NumberOfSubsections : U
![](/icons/17509int.gif)
2B
+0x01a FlushInProgressCount : U
![](/icons/17509int.gif)
2B
+0x01c NumberOfUserReferences : U
![](/icons/17509int.gif)
4B
+0x020 u : __unnamed
+0x024 FilePo
![](/icons/17509int.gif)
er : Ptr32 _FILE_OBJECT
+0x028 WaitingForDeletion : Ptr32 _EVENT_COUNTER
+0x02c Mod
![](/icons/17509if.gif)
iedWriteCount : U
![](/icons/17509int.gif)
2B
+0x02e NumberOf
![](/icons/17509System.gif)
CacheViews : U
![](/icons/17509int.gif)
2B
Figure 2: CONTROL_AREA Structure
在CONTROL_AREA结构中有
![](/icons/17509yi.gif)
名为FilePo
![](/icons/17509int.gif)
er
![](/icons/17509de.gif)
指针
![](/icons/17509dou.gif)
其指向FILE_OBJECT结构
![](/icons/17509dou2.gif)
如果FILE_OBJECT结构有效
![](/icons/17509dou.gif)
在成员FileName中
![](/icons/17509de.gif)
UNICODE_STRING buffer会指向实际
![](/icons/17509de.gif)
文件路径
![](/icons/17509dou2.gif)
lkd> dt _FILE_OBJECT
+0x000 Type : Int2B
+0x002 Size : Int2B
+0x004 DeviceObject : Ptr32 _DEVICE_OBJECT
+0x008 Vpb : Ptr32 _VPB
+0x00c FsContext : Ptr32 Void
+0x010 FsContext2 : Ptr32 Void
[…]
+0x030 FileName : _UNICODE_STRING
[…]
+0x06c CompletionContext : Ptr32 _IO_COMPLETION_CONTEXT
特别要注意
![](/icons/17509dou.gif)
![](/icons/17509yi.gif)
些MMVAD是没有名称
![](/icons/17509de.gif)
![](/icons/17509dou.gif)
但它
![](/icons/17509de.gif)
内容包含有
![](/icons/17509yi.gif)
个MZ/PE header
![](/icons/17509dou.gif)
可用来注入恶意代码
![](/icons/17509dou2.gif)
通过枚举MMVAD entry处
![](/icons/17509de.gif)
2叉树
![](/icons/17509dou.gif)
Memoryze可以访问进程
![](/icons/17509de.gif)
堆
![](/icons/17509dou.gif)
栈
![](/icons/17509dou.gif)
可执行文件及DLL文件
![](/icons/17509dou2.gif)
这是完全没有限制地浏览进程地址空间
![](/icons/17509dou.gif)
且并没有“篡改”或“触碰”进程
![](/icons/17509dou.gif)
也没有
![](/icons/17509diaoyong.gif)
API
![](/icons/17509hanshu.gif)
![](/icons/17509dou2.gif)
为了介绍说明windows内存管理器是如何使用VAD树
![](/icons/17509de.gif)
![](/icons/17509dou.gif)
请参见Figure 3,这是OllyDbg上
![](/icons/17509de.gif)
内存映像截图
![](/icons/17509dou.gif)
VAD树和此非常相似
![](/icons/17509dou2.gif)
地址栏中
![](/icons/17509de.gif)
每
![](/icons/17509yi.gif)
虚拟地址在VAD tree上都有其自己
![](/icons/17509de.gif)
entry.
![](http://CrazyCoder.cn/WebFiles/200911/f7af0463-5348-4891-b090-84d3a511214e.jpg)
Figure 3: OllyDbg Memory Map View
进程捕获
既然读者已经理解了进程虚拟地址空间是如何设计
![](/icons/17509de.gif)
![](/icons/17509dou.gif)
那么理解进程捕获就可容易了
![](/icons/17509dou2.gif)
记住
![](/icons/17509dou.gif)
这
![](/icons/17509yi.gif)
切都始于内存中
![](/icons/17509de.gif)
进程识别
![](/icons/17509dou2.gif)
通过查找EPROCESS结构
![](/icons/17509dou.gif)
然后检测EPROCESS结构是否和用户请求获取
![](/icons/17509de.gif)
进程
![](/icons/17509yi.gif)
致
![](/icons/17509dou2.gif)
若相匹配
![](/icons/17509dou.gif)
则VadRoot指针被引用
![](/icons/17509dou.gif)
并遍历 2叉树
![](/icons/17509dou2.gif)
每个MMVAD entry都以DD
![](/icons/17509de.gif)
形式
![](/icons/17509dou.gif)
且格式未变
![](/icons/17509de.gif)
情况下写入到磁盘
![](/icons/17509dou2.gif)
DD是磁盘复制(disk duplicator)
![](/icons/17509de.gif)
意思
![](/icons/17509dou.gif)
原本用于复制驱动器
![](/icons/17509dou2.gif)
格式很简单:从缓冲区中读取数据
![](/icons/17509dou.gif)
然后写入到磁盘
![](/icons/17509dou.gif)
如果缓冲区无法读取(如内存页被分页到磁盘
![](/icons/17509dou.gif)
以及非分页文件)
![](/icons/17509dou.gif)
则缓冲区清零
![](/icons/17509dou.gif)
相当于将试图读取
![](/icons/17509de.gif)
数据大小写入到磁盘
![](/icons/17509dou.gif)
以确保了输出文件在大小上和输入文件相等
![](/icons/17509dou2.gif)
在这种情况下
![](/icons/17509dou.gif)
输出文件将作为
![](/icons/17509yi.gif)
个被获取
![](/icons/17509de.gif)
VAD和输入文件将成为内存中
![](/icons/17509de.gif)
虚拟内存块
![](/icons/17509dou2.gif)
如果VAD在其CONTROL_AREA结构中有名称
![](/icons/17509dou.gif)
这将会获得该名称
![](/icons/17509dou2.gif)
否则
![](/icons/17509dou.gif)
在其虚拟基址和大小
![](/icons/17509de.gif)
区域的后被命名
![](/icons/17509dou2.gif)
Memoryze能够获得
![](/icons/17509yi.gif)
个特定进程
![](/icons/17509de.gif)
地址空间
![](/icons/17509dou.gif)
![](/icons/17509yinwei.gif)
它有
![](/icons/17509yi.gif)
个内置功能
![](/icons/17509dou.gif)
可以把虚拟地址映射到物理地址
![](/icons/17509dou2.gif)
每
![](/icons/17509yi.gif)
个虚拟地址遇到执行请求时就会被映射到其物理内存地址
![](/icons/17509dou2.gif)
然后将物理内存读入缓冲区
![](/icons/17509dou.gif)
并写入到磁盘
![](/icons/17509dou2.gif)
如果物理内存标记为分页
![](/icons/17509dou.gif)
则Memoryze将解析该分页文件
![](/icons/17509dou.gif)
以判断该页是否映射到分页文件
![](/icons/17509dou2.gif)
如果是在分页文件中
![](/icons/17509dou.gif)
它将被读取
![](/icons/17509dou.gif)
然后写入到磁盘
![](/icons/17509dou2.gif)
在进程捕获过程中利用分页文件可以更好
![](/icons/17509dou.gif)
更全面地了解进程地址空间
![](/icons/17509de.gif)
情况
![](/icons/17509dou2.gif)
通过物理内存进行进程捕获可以有很多好处
![](/icons/17509dou.gif)
用户可以:
● 绕过进程中用来保护自己而使用
![](/icons/17509de.gif)
反调试例程
![](/icons/17509dou2.gif)
在未附加进程
![](/icons/17509de.gif)
情况下读取进程
![](/icons/17509de.gif)
虚拟内存
![](/icons/17509dou.gif)
受保护
![](/icons/17509de.gif)
进程对于被“捕获”将无可奈何
![](/icons/17509dou2.gif)
● 绕过调试寄存器(DR)rootkit
![](/icons/17509dou2.gif)
如果你无法读取虚拟地址以检测被钩住
![](/icons/17509de.gif)
未知钩子
![](/icons/17509dou.gif)
那是
![](/icons/17509yinwei.gif)
DR rootkit通过在不被读取
![](/icons/17509de.gif)
特定虚拟地址中设置陷阱
![](/icons/17509dou.gif)
比如某钩子(hook)
![](/icons/17509de.gif)
虚拟地址
![](/icons/17509dou2.gif)
但是Memoryze只采用物理内存
![](/icons/17509dou.gif)
因此可以完全绕过
![](/icons/17509yi.gif)
些 DR
![](/icons/17509dou2.gif)
● 捕获加密前后进程中
![](/icons/17509de.gif)
通讯
![](/icons/17509zifu.gif)
串
![](/icons/17509dou2.gif)
● 克服大部分
![](/icons/17509de.gif)
加壳
![](/icons/17509chengxu.gif)
![](/icons/17509dou.gif)
![](/icons/17509yinwei.gif)
捕获
![](/icons/17509de.gif)
进程都是处于未脱壳状态
![](/icons/17509dou2.gif)
● 在未接触磁盘
![](/icons/17509de.gif)
情况下获取被注入
![](/icons/17509de.gif)
DLL文件
![](/icons/17509dou2.gif)
Metasploit
Metasploit是由HD Moore在2003[3]开发
![](/icons/17509de.gif)
![](/icons/17509yi.gif)
款开源
![](/icons/17509de.gif)
安全漏洞检测工具, 用来进行网络安全中
![](/icons/17509de.gif)
漏洞发现、渗透攻击
![](/icons/17509dou.gif)
IDS
![](/icons/17509de.gif)
识别标签等开发方面
![](/icons/17509de.gif)
开发工作
![](/icons/17509dou2.gif)
该工具在用户群和开发者中已以成倍
![](/icons/17509de.gif)
速度发展起来了
![](/icons/17509dou.gif)
Metasploit为渗透测试者和研究员提供binary exploitation, payloads和post-exploitation payloads[4]这样
![](/icons/17509de.gif)
![](/icons/17509yi.gif)
个高端平台
![](/icons/17509dou2.gif)
由开发商和社区所开发
![](/icons/17509de.gif)
Metasploit 为
![](/icons/17509yi.gif)
系列
![](/icons/17509de.gif)
操作系统
![](/icons/17509dou.gif)
商业和开源软件Software提供exploit,
![](/icons/17509yi.gif)
份exploit可以提供多种形式
![](/icons/17509dou.gif)
但其最终目
![](/icons/17509de.gif)
仍然是明确
![](/icons/17509de.gif)
:控制
![](/icons/17509chengxu.gif)
执行流程
![](/icons/17509dou2.gif)
有许多种可以充分利用漏洞
![](/icons/17509de.gif)
区别攻击方式
![](/icons/17509dou.gif)
![](/icons/17509dou.gif)
不管是本地缓冲区溢出
![](/icons/17509dou.gif)
堆污染
![](/icons/17509dou.gif)
整数溢出
![](/icons/17509dou.gif)
还是格式串漏洞
![](/icons/17509dou.gif)
等等这些漏洞都可以采取在本地或远程执行攻击
![](/icons/17509dou.gif)
这主要是依靠软件Software
![](/icons/17509de.gif)
漏洞及其功能
![](/icons/17509dou2.gif)
在Metasploit宝库中
![](/icons/17509de.gif)
每
![](/icons/17509yi.gif)
个exploit都提供很多
![](/icons/17509de.gif)
payload选项
![](/icons/17509dou.gif)
payload实际上是以机器码
![](/icons/17509de.gif)
形式在受害者
![](/icons/17509de.gif)
机器上运行
![](/icons/17509de.gif)
![](/icons/17509dou2.gif)
Payload可以简单地添加用户到系统中
![](/icons/17509dou.gif)
或者将VNC服务注入到受害者电脑
![](/icons/17509de.gif)
进程中
![](/icons/17509dou2.gif)
Metasploit对于大众
![](/icons/17509de.gif)
价值在于高级payload
![](/icons/17509de.gif)
延续性
![](/icons/17509dou2.gif)
Metasploit为用户提供简单接口以执行强大
![](/icons/17509de.gif)
exploit
![](/icons/17509dou.gif)
甚至更为高级
![](/icons/17509de.gif)
payload
![](/icons/17509dou.gif)
即使用户并不知道机器是如何被攻击
![](/icons/17509de.gif)
![](/icons/17509dou.gif)
也可以达到攻击目
![](/icons/17509de.gif)
![](/icons/17509dou2.gif)
易用性
![](/icons/17509dou.gif)
文档和资源均为用户提供方便
![](/icons/17509dou.gif)
这也意味着
![](/icons/17509yi.gif)
些攻击者可以使用Mestasploit去攻击网络
![](/icons/17509dou2.gif)
其中被攻击者广泛使用
![](/icons/17509de.gif)
payload就是Meterpreter
![](/icons/17509dou2.gif)
Meterpreter(Meta Interpreter
![](/icons/17509de.gif)
简称)payload只存在攻击者主机
![](/icons/17509de.gif)
内存中
![](/icons/17509dou.gif)
以免去攻击者读取磁盘数据
![](/icons/17509dou2.gif)
Metasploit将上传
![](/icons/17509yi.gif)
份 DLL(Meterpreter)到远程主机
![](/icons/17509dou.gif)
上传
![](/icons/17509de.gif)
DLL文件将存储在受害者主机
![](/icons/17509de.gif)
进程堆中
![](/icons/17509dou2.gif)
以传统方式上传
![](/icons/17509de.gif)
DLL文件将被写入到磁盘中
![](/icons/17509dou.gif)
这是
![](/icons/17509yinwei.gif)
LoadLibrary加载了模块
![](/icons/17509dou.gif)
而模块只从磁盘或者网络共享里面加载
![](/icons/17509dou2.gif)
为了避开它
![](/icons/17509dou.gif)
Metasploit hook
![](/icons/17509hanshu.gif)
LoadLibrary所
![](/icons/17509diaoyong.gif)
![](/icons/17509de.gif)
隐含API
![](/icons/17509dou.gif)
这些API如下:
● NtMapViewOfSection
● NtQueryAttributesFile
● NtOpenFile
● NtCreateSection
● NtOpenSection
这些钩子允许Meterpreter从内存中而非磁盘上被加载
![](/icons/17509dou2.gif)
加载后
![](/icons/17509de.gif)
Meterpreter为攻击者提供了很多选项
![](/icons/17509dou.gif)
大家可以添加自定义脚本来扩展Meterpreter
![](/icons/17509de.gif)
功能[5]
![](/icons/17509dou2.gif)
Meterpreter
![](/icons/17509yi.gif)
旦Meterpreter设置
![](/icons/17509de.gif)
shellcode被执行
![](/icons/17509dou.gif)
而且Meterpreter已经加载
![](/icons/17509dou.gif)
则便可以开始通讯
![](/icons/17509dou2.gif)
Meterpreter
![](/icons/17509de.gif)
交互性和可扩展性对攻击者而言是最有价值
![](/icons/17509de.gif)
东西
![](/icons/17509dou2.gif)
本文是以攻击者为客户端
![](/icons/17509dou.gif)
而受害者为服务端
![](/icons/17509de.gif)
角度来研究问题
![](/icons/17509de.gif)
![](/icons/17509dou2.gif)
Meterpreter
![](/icons/17509de.gif)
协议已被HD Moore和Skape很好
![](/icons/17509de.gif)
文档化了[6]
![](/icons/17509dou2.gif)
本文最终将利用下文提到
![](/icons/17509de.gif)
协议
![](/icons/17509de.gif)
优势来重现攻击
![](/icons/17509de.gif)
![](/icons/17509yi.gif)
个通讯过程
![](/icons/17509dou2.gif)
Meterpreter使用
![](/icons/17509de.gif)
协议称为Type Length Value (TLV)
![](/icons/17509dou2.gif)
type和length是4字节,而value是N字节
![](/icons/17509dou2.gif)
使用传统TLV协议
![](/icons/17509de.gif)
Meterpreter中有
![](/icons/17509yi.gif)
附加介绍说明
![](/icons/17509dou.gif)
声称它已将TL调换为 length type value协议
![](/icons/17509dou.gif)
但是Meterpreter文档
![](/icons/17509de.gif)
作者称他们将继续引用TLV作为其协议
![](/icons/17509dou2.gif)
客户端先发送
![](/icons/17509yi.gif)
个请求到服务端以指定
![](/icons/17509yi.gif)
个type
![](/icons/17509dou.gif)
这将告诉服务端如何去处理该请求
![](/icons/17509dou.gif)
length和value
![](/icons/17509dou.gif)
所有
![](/icons/17509de.gif)
这些将帮助服务端执行
![](/icons/17509yi.gif)
些请求
![](/icons/17509dou2.gif)
使用TLV同种原则所构成
![](/icons/17509de.gif)
![](/icons/17509yi.gif)
个response:这个response拥有
![](/icons/17509yi.gif)
个length
![](/icons/17509dou.gif)
![](/icons/17509yi.gif)
个type及
![](/icons/17509yi.gif)
个value
![](/icons/17509dou.gif)
这个value也可以是其它 TLV
![](/icons/17509dou2.gif)
嵌套
![](/icons/17509de.gif)
TLV允许动态响应和描述复杂
![](/icons/17509de.gif)
数据结构
![](/icons/17509dou2.gif)
理解客户端是如何向服务端发送请求最简单
![](/icons/17509de.gif)
思路方法就是举例
![](/icons/17509dou.gif)
比如说客户端想要获得当前被攻击
![](/icons/17509de.gif)
进程
![](/icons/17509de.gif)
PID
![](/icons/17509dou.gif)
那么客户端将构造
![](/icons/17509yi.gif)
个type为 PACKET_TYPE_REQUEST
![](/icons/17509dou.gif)
value为stdapi_sys_process_getpid
![](/icons/17509de.gif)
请求
![](/icons/17509dou.gif)
这
![](/icons/17509yi.gif)
![](/icons/17509zifu.gif)
串代表
![](/icons/17509de.gif)
是服务端揭露
![](/icons/17509de.gif)
思路方法
![](/icons/17509dou2.gif)
通过指定服务端处理请求
![](/icons/17509de.gif)
思路方法
![](/icons/17509dou.gif)
服务端将
![](/icons/17509diaoyong.gif)
此思路方法
![](/icons/17509dou.gif)
并返回结果
![](/icons/17509dou2.gif)
这和远程过程
![](/icons/17509diaoyong.gif)
(RPC)
![](/icons/17509de.gif)
工作原理有些相似
![](/icons/17509dou.gif)
都是由客户端指定
![](/icons/17509yi.gif)
个操作码(功能号码)
![](/icons/17509dou.gif)
由服务端
![](/icons/17509diaoyong.gif)
![](/icons/17509dou.gif)
并封送返回结果
![](/icons/17509dou2.gif)
服务端
![](/icons/17509yi.gif)
接收到请求
![](/icons/17509dou.gif)
它将会寻找表中
![](/icons/17509de.gif)
思路方法
![](/icons/17509dou2.gif)
![](/icons/17509hanshu.gif)
表
![](/icons/17509de.gif)
入口如下:
{ "stdapi_sys_process_getpid",
{ request_sys_process_getpid, { 0 }, 0 },
{ EMPTY_DISPATCH_HANDLER },
},
如果这样
![](/icons/17509yi.gif)
种思路方法被请求
![](/icons/17509dou.gif)
那么以上
![](/icons/17509shuzu.gif)
中
![](/icons/17509de.gif)
信息将描述思路方法名和被
![](/icons/17509diaoyong.gif)
![](/icons/17509de.gif)
![](/icons/17509hanshu.gif)
指针
![](/icons/17509dou2.gif)
在这种情况下
![](/icons/17509dou.gif)
客户端希望 request_sys_process_getpid被
![](/icons/17509diaoyong.gif)
![](/icons/17509dou.gif)
服务端执行该
![](/icons/17509hanshu.gif)
并返回结果
![](/icons/17509dou2.gif)
由此产生
![](/icons/17509de.gif)
响应正是取证调查人员所感兴趣
![](/icons/17509de.gif)
地方
![](/icons/17509dou2.gif)
下面看
![](/icons/17509yi.gif)
下 stdapi_sys_process_getpid 请求
![](/icons/17509de.gif)
回复内容
![](/icons/17509dou.gif)
返回
![](/icons/17509de.gif)
结果是
![](/icons/17509yi.gif)
个复杂
![](/icons/17509de.gif)
TLV Packet:
![](http://CrazyCoder.cn/WebFiles/200911/c3657027-ac49-4b7c-8448-b77400db10c7.jpg)
Table 1: TLV Packet from getpid request
读者可以看到
![](/icons/17509dou.gif)
实际上回复值是由 3个嵌套
![](/icons/17509de.gif)
TLV构成
![](/icons/17509de.gif)
![](/icons/17509dou2.gif)
这是
![](/icons/17509yi.gif)
个基本
![](/icons/17509de.gif)
回复
![](/icons/17509dou.gif)
大部分response将会更加复杂
![](/icons/17509dou.gif)
在嵌套
![](/icons/17509de.gif)
TLV中实际上是由
![](/icons/17509yi.gif)
堆结果嵌套而成
![](/icons/17509de.gif)
![](/icons/17509dou2.gif)
利用Meterpreter
![](/icons/17509de.gif)
协议及其易于理解
![](/icons/17509de.gif)
结构
![](/icons/17509dou.gif)
是有可能通过分析残留在内存中
![](/icons/17509de.gif)
结构而重现攻击者
![](/icons/17509de.gif)
行为
![](/icons/17509dou2.gif)
Metasploit Forensic Framework
Metasploit Forensic Framework (MSFF)是
![](/icons/17509yi.gif)
个用于辅助进程攻击分析
![](/icons/17509de.gif)
工具集
![](/icons/17509dou2.gif)
在MSFF运行前
![](/icons/17509dou.gif)
分析师必须先获得他们怀疑被攻击
![](/icons/17509de.gif)
进程
![](/icons/17509dou.gif)
这些可以结合Memoryze和批处理脚本来完成
![](/icons/17509dou2.gif)
进程捕获也是很简单
![](/icons/17509de.gif)
:
ProcessDD.bat –pid [process id]
进程
![](/icons/17509yi.gif)
被捕获
![](/icons/17509dou.gif)
MSFF即可运行
![](/icons/17509dou.gif)
和写入到磁盘
![](/icons/17509de.gif)
文件进行比对
![](/icons/17509dou.gif)
并记录每
![](/icons/17509yi.gif)
文件所描述
![](/icons/17509de.gif)
被加载到进程地址空间
![](/icons/17509de.gif)
内存块
![](/icons/17509dou2.gif)
MSFF工作原理
MSFF
![](/icons/17509de.gif)
工作原理主要是依据被释放
![](/icons/17509de.gif)
内存并没有真正地丢失或消除而进行
![](/icons/17509de.gif)
![](/icons/17509dou2.gif)
当内存被释放时
![](/icons/17509dou.gif)
它只是被标记为不可用而已
![](/icons/17509dou.gif)
但这些内存页所包含
![](/icons/17509de.gif)
数据并没有被清除或清零
![](/icons/17509dou2.gif)
这也就意味着
![](/icons/17509yi.gif)
名分析师可以追回和查看内存
![](/icons/17509dou.gif)
并找到释放
![](/icons/17509de.gif)
内存页
![](/icons/17509dou2.gif)
Meterpreter packet在内部调度
![](/icons/17509dou.gif)
以指示正确地释放payload
![](/icons/17509dou2.gif)
Meterpreter将通过
![](/icons/17509diaoyong.gif)
packet_transmit_response来响应 TLV
![](/icons/17509dou.gif)
它将
![](/icons/17509diaoyong.gif)
packet_transmit
![](/icons/17509dou2.gif)
这个
![](/icons/17509hanshu.gif)
实际上是用于发送TLV回复给客户端
![](/icons/17509dou2.gif)
响应包
![](/icons/17509yi.gif)
发送
![](/icons/17509dou.gif)
Meterpreter就会
![](/icons/17509diaoyong.gif)
destroy_packet去释放”payload”
![](/icons/17509dou2.gif)
在我们
![](/icons/17509de.gif)
例子中
![](/icons/17509dou.gif)
它将会释放整个响应包
![](/icons/17509dou2.gif)
但是
![](/icons/17509dou.gif)
释放内存并不意味着它会丢失和不可获取
![](/icons/17509dou2.gif)
MSFF工程通过扫描每
![](/icons/17509yi.gif)
块获取
![](/icons/17509de.gif)
内存块
![](/icons/17509dou.gif)
然后查找攻击者在攻击过程中Meterpreter所发回
![](/icons/17509de.gif)
响应包中已知
![](/icons/17509de.gif)
“思路方法”
![](/icons/17509zifu.gif)
串
![](/icons/17509dou2.gif)
- priv_passwd_get_sam_hashes – 通知Meterpreter转存sam哈希值
- stdapi_sys_process_getpid – 检索当前被攻击
![](/icons/17509de.gif)
进程
- core_channel_write – 写回数据给Metasploit 控制台
![](/icons/17509dou.gif)
当攻击者执行“execute –i” 命令时也会被使用
有很多是MSFF支持
![](/icons/17509de.gif)
![](/icons/17509dou.gif)
也有
![](/icons/17509yi.gif)
些是不受支持
![](/icons/17509de.gif)
![](/icons/17509dou2.gif)
MSFF工程扫描每个VAD中这些已知
![](/icons/17509de.gif)
![](/icons/17509zifu.gif)
串
![](/icons/17509dou.gif)
如果找到
![](/icons/17509dou.gif)
则开始分析TLV结构
![](/icons/17509dou2.gif)
由于TLV结构包含有type
![](/icons/17509dou.gif)
以指示如何分析它
![](/icons/17509de.gif)
数据
![](/icons/17509dou.gif)
MSFF利用这些信息恢复响应包
![](/icons/17509dou2.gif)
还
![](/icons/17509yinwei.gif)
Meterpreter
![](/icons/17509diaoyong.gif)
回复思路方法来响应
![](/icons/17509dou.gif)
这样 MSFF就可以知道攻击者请求后响应
![](/icons/17509de.gif)
结果了
![](/icons/17509dou2.gif)
所有
![](/icons/17509de.gif)
这些信息都是从内存中获取
![](/icons/17509de.gif)
![](/icons/17509dou.gif)
可用于重现所发生
![](/icons/17509de.gif)
攻击过程
Figure 4: Acquired VAD from exploited processes
最后
步骤可参考上面
Figure 4
Figure 4是VAD![](/icons/17509de.gif)
部分
用于捕获Meterpreter所攻击
进程
回顾
下
MSFF扫描被![](/icons/17509diaoyong.gif)
思路方法 stdapi_sys_process_get_pid
在这种情况下
该思路方法被发现了
继续分析这
特定内存区域
检索在Table 1中所看到
值:来自getpid请求
TLV Packet![](/icons/17509dou2.gif)
警告和陷阱
个重要
警告和陷阱就是内存是不稳定![](/icons/17509de.gif)
易被改变
在任务繁忙
系统中
内存将被重复使用
Meterpreter没有释放它
数据包
但在 windows内存管理器并没有立即重复使用被释放
内存页
这就意味着释放后
内存可留在系统中较长时间
有各种可变原因可以影响到被释放
内存驻留在系统中
时间
但
般它在释放数小时的后仍可以查看![](/icons/17509dou2.gif)
在从某些被攻击
进程环境中获取内存就存在着
些问题
Metasploit提供 3种区别类型
退出例程:SHE
进程和线程
如果攻击者是使用SHE或进程
退出例程
那么针对
个存在堆污染漏洞
浏览器
攻击时
它
整个进程内存在和Meterpreter断开套接字连接的后就会被清除
这就阻碍了浏览器进程内存
提取![](/icons/17509dou.gif)
它已经关闭了
在测试MS09 - 002 IE 7![](/icons/17509de.gif)
化内存破坏漏洞时
如果攻击者使用了EXITFUNC变量来设置线程
在Meterpreter套接字关闭的后
Internet Explorer进程将不会被终止
它仅是退出在攻击过程中所使用
线程
然而
相对受害者主机上
终端用户来说
这将会使IE
功能失效
但并非所有
exploit都会终止当前被利用
进程
比如MS08-067,被攻击
svchost.exe进程内存中拥有Meterpreter客户端和服务端断开连接数小时后
数据![](/icons/17509dou2.gif)
结论
这里所讨论
技术和研究只是内存取证![](/icons/17509de.gif)
个开端
特别是如何更好地利用发现
人为产生
内存数据进行内存取证
技术
事实上
Windows内存管理器功能在释放内存页后
并没有马上清除
这对于取证分析很有帮助
这种行为也类似于传统文件系统取证
当
个文件被删除后
只是从链表中解链
但开始并没有被覆写
它允许分析人员在文件删除后数天的内进行数据恢复
这只是迈出了第
步
至少证明了在取证人员
工具箱中内存取证仍占有
席的地
在以后
研究当中
还有更多
工作要做
以便更好地了解释放内存
限制![](/icons/17509dou2.gif)
资料
1.http://www.mandiant.com/software/memoryze.htm
2.http://technet.microsoft.com/en-us/library/cc787565.aspx
3.http://www.metasploit.com/
4.http://metasploit.com:55555/PAYLOADS
5.http://hick.org/code/skape/papers/remote-library-injection.pdf
6.http://www.nologin.org/Downloads/Papers/meterpreter.pdf
延伸阅读
最新评论