点击这里:Metasploit:重现犯罪场景 - [监控取证]

版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://riusksk.blogbus.com/logs/50925372.html



作者:Peter Silberman, Steve Davis
译者:riusksk (泉哥:http://riusksk.blogbus.com)

原文出处:BlackHat USA 2009

前言

Metasploit:重现犯罪场景旨在演示如何结合现有工具资源进行内存分析和提取以恢复先前不易访问到数据此处现有资源主要是指如何利用 payload,特别是Meterpreter可用于检索和提取攻击者电脑中内存本文主要讨论如何利用Memoryze[1](款免费使用内存分析和提取工具)和Metasploit Forensic Framework去重现Meterpreter会话过程在理解重现现实中Meterpreter会话的前读者需要先理解以下 3点:
1.访问物理内存;
2.进程捕获;
3.Metasploit payload和Meterpreter

访问物理内存

Memoryze作为内存分析工具它访问物理内存主要出于两个目:内存提取和内存分析
1.        内存提取:Memoryze针对物理内存或特定进程当前状态创建完整内存映像
2.        内存分析:Memoryze通过访问物理内存以进行分析比如枚举所有进程及其句柄表
为了更为容易地访问物理内存Windows公布个名为\Device\PhysicalMemorysection object这个section object打开应用即有个指向物理内存句柄如果通过该句柄读取数据那么它就会从物理内存中读取重点要注意在Windows 2000和Windows2003 SP0上应用可以在ring 3上访问section object而在Windows 2003 SP1及的后版本则改变了对此section object访问权限现在要求必须运行在ring 0[2]

理解Windows进程地址空间

在访问物理内存的前Memoryze需要访问每进程虚拟地址空间地址空间大小随着如线程动态存储被加载可执行文件等内存需求而进行增减Windows Memory Manager (MM)管理着所有这些信息且是以 2叉树形式被管理在Executive Process (EPROCESS)结构当中个名为VadRoot (Virtual Address Descriptor Root)成员变量刚好指向该 2叉树进程均含有EPROCESS结构其包含有进程管理器需要用来管理进程信息 2叉树入口实际上是个名为Memory Manager Virtual Address Descriptors (MMVAD)结构该结构包含有和MM相关信息如被描述内存段虚拟内存基址和大小若想查看MMVAD结构及其成员可在windbg中输入 dt _MMVAD命令以显示此结构信息通过以上命令可以显示MMVAD结构及其成员偏移地址和大小显示如下(确保操作前符号文件已被加载):
lkd> dt _MMVAD
+0x000 StartingVpn                 : U4B
+0x004 EndingVpn                 : U4B
+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包含有各种成员变量Memoryze只关心下列结构:
●        StartingVpn -虚拟内存基址
●        EndingVpn -内存块大小
●        LeftChild,RinghtChild -指向树中子节点
●        Parent -父节点指针
如果MMVAD所描述虚拟内存块是通过LoadLibrary或Windows进程加载器创建那么该内存块将拥有个名称该名称实际是存储在 MMVAD所描述虚拟内存块上文件名为了获取名称或者检测文件是否存在Memoryze引用了MMVAD中指向CONTROL_AREA结构 ControlArea成员变量
lkd> dt _CONTROL_AREA
+0x000 Segment                         : Ptr32 _SEGMENT
+0x004 DereferenceList : _LIST_ENTRY
+0x00c NumberOfSectionReferences : U4B
+0x010 NumberOfPfnReferences : U4B
+0x014 NumberOfMappedViews : U4B
+0x018 NumberOfSubsections : U2B
+0x01a FlushInProgressCount : U2B
+0x01c NumberOfUserReferences : U4B
+0x020 u                                 : __unnamed
+0x024 FilePoer                 : Ptr32 _FILE_OBJECT
+0x028 WaitingForDeletion : Ptr32 _EVENT_COUNTER
+0x02c ModiedWriteCount : U2B
+0x02e NumberOfCacheViews : U2B

Figure 2: CONTROL_AREA Structure

在CONTROL_AREA结构中有名为FilePoer指针其指向FILE_OBJECT结构如果FILE_OBJECT结构有效在成员FileName中UNICODE_STRING buffer会指向实际文件路径
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

特别要注意些MMVAD是没有名称但它内容包含有个MZ/PE header可用来注入恶意代码
通过枚举MMVAD entry处 2叉树Memoryze可以访问进程可执行文件及DLL文件这是完全没有限制地浏览进程地址空间且并没有“篡改”或“触碰”进程也没有API为了介绍说明windows内存管理器是如何使用VAD树请参见Figure 3,这是OllyDbg上内存映像截图VAD树和此非常相似地址栏中虚拟地址在VAD tree上都有其自己entry.







Figure 3: OllyDbg Memory Map View

进程捕获

既然读者已经理解了进程虚拟地址空间是如何设计那么理解进程捕获就可容易了记住切都始于内存中进程识别通过查找EPROCESS结构然后检测EPROCESS结构是否和用户请求获取进程若相匹配则VadRoot指针被引用并遍历 2叉树每个MMVAD entry都以DD形式且格式未变情况下写入到磁盘DD是磁盘复制(disk duplicator)意思原本用于复制驱动器格式很简单:从缓冲区中读取数据然后写入到磁盘如果缓冲区无法读取(如内存页被分页到磁盘以及非分页文件)则缓冲区清零相当于将试图读取数据大小写入到磁盘以确保了输出文件在大小上和输入文件相等在这种情况下输出文件将作为个被获取VAD和输入文件将成为内存中虚拟内存块如果VAD在其CONTROL_AREA结构中有名称这将会获得该名称否则在其虚拟基址和大小区域的后被命名 Memoryze能够获得个特定进程地址空间它有个内置功能可以把虚拟地址映射到物理地址个虚拟地址遇到执行请求时就会被映射到其物理内存地址然后将物理内存读入缓冲区并写入到磁盘如果物理内存标记为分页则Memoryze将解析该分页文件 以判断该页是否映射到分页文件如果是在分页文件中它将被读取然后写入到磁盘在进程捕获过程中利用分页文件可以更好更全面地了解进程地址空间情况通过物理内存进行进程捕获可以有很多好处用户可以:
●        绕过进程中用来保护自己而使用反调试例程在未附加进程情况下读取进程虚拟内存受保护进程对于被“捕获”将无可奈何
●        绕过调试寄存器(DR)rootkit如果你无法读取虚拟地址以检测被钩住未知钩子那是DR rootkit通过在不被读取特定虚拟地址中设置陷阱比如某钩子(hook)虚拟地址但是Memoryze只采用物理内存因此可以完全绕过些 DR
●        捕获加密前后进程中通讯
●        克服大部分加壳捕获进程都是处于未脱壳状态
●        在未接触磁盘情况下获取被注入DLL文件

Metasploit

Metasploit是由HD Moore在2003[3]开发款开源安全漏洞检测工具, 用来进行网络安全中漏洞发现、渗透攻击IDS识别标签等开发方面开发工作该工具在用户群和开发者中已以成倍速度发展起来了Metasploit为渗透测试者和研究员提供binary exploitation, payloads和post-exploitation payloads[4]这样个高端平台由开发商和社区所开发Metasploit 为系列操作系统商业和开源软件Software提供exploit,份exploit可以提供多种形式但其最终目仍然是明确:控制执行流程
有许多种可以充分利用漏洞区别攻击方式不管是本地缓冲区溢出堆污染整数溢出还是格式串漏洞等等这些漏洞都可以采取在本地或远程执行攻击这主要是依靠软件Software漏洞及其功能在Metasploit宝库中个exploit都提供很多payload选项payload实际上是以机器码形式在受害者机器上运行Payload可以简单地添加用户到系统中或者将VNC服务注入到受害者电脑进程中Metasploit对于大众价值在于高级payload延续性Metasploit为用户提供简单接口以执行强大exploit甚至更为高级payload即使用户并不知道机器是如何被攻击也可以达到攻击目易用性文档和资源均为用户提供方便这也意味着些攻击者可以使用Mestasploit去攻击网络其中被攻击者广泛使用payload就是Meterpreter
        Meterpreter(Meta Interpreter简称)payload只存在攻击者主机内存中以免去攻击者读取磁盘数据Metasploit将上传份 DLL(Meterpreter)到远程主机上传DLL文件将存储在受害者主机进程堆中以传统方式上传DLL文件将被写入到磁盘中这是 LoadLibrary加载了模块而模块只从磁盘或者网络共享里面加载为了避开它Metasploit hook LoadLibrary所隐含API这些API如下:

●        NtMapViewOfSection
●        NtQueryAttributesFile
●        NtOpenFile
●        NtCreateSection
●        NtOpenSection

这些钩子允许Meterpreter从内存中而非磁盘上被加载加载后Meterpreter为攻击者提供了很多选项大家可以添加自定义脚本来扩展Meterpreter功能[5]

Meterpreter
旦Meterpreter设置shellcode被执行而且Meterpreter已经加载则便可以开始通讯 Meterpreter交互性和可扩展性对攻击者而言是最有价值东西本文是以攻击者为客户端而受害者为服务端角度来研究问题 Meterpreter协议已被HD Moore和Skape很好文档化了[6]本文最终将利用下文提到协议优势来重现攻击个通讯过程 Meterpreter使用协议称为Type Length Value (TLV) type和length是4字节,而value是N字节使用传统TLV协议Meterpreter中有附加介绍说明声称它已将TL调换为 length type value协议但是Meterpreter文档作者称他们将继续引用TLV作为其协议
        客户端先发送个请求到服务端以指定个type这将告诉服务端如何去处理该请求length和value所有这些将帮助服务端执行些请求使用TLV同种原则所构成个response:这个response拥有个length个type及个value这个value也可以是其它 TLV嵌套TLV允许动态响应和描述复杂数据结构
        理解客户端是如何向服务端发送请求最简单思路方法就是举例比如说客户端想要获得当前被攻击进程PID那么客户端将构造个type为 PACKET_TYPE_REQUESTvalue为stdapi_sys_process_getpid请求串代表是服务端揭露思路方法通过指定服务端处理请求思路方法服务端将此思路方法并返回结果这和远程过程(RPC)工作原理有些相似都是由客户端指定个操作码(功能号码) 由服务端并封送返回结果服务端接收到请求它将会寻找表中思路方法入口如下:

        { "stdapi_sys_process_getpid",
{ request_sys_process_getpid, { 0 }, 0 },
{ EMPTY_DISPATCH_HANDLER },
},
如果这样种思路方法被请求那么以上信息将描述思路方法名和被指针在这种情况下客户端希望 request_sys_process_getpid被服务端执行该并返回结果由此产生响应正是取证调查人员所感兴趣地方下面看下 stdapi_sys_process_getpid 请求回复内容返回结果是个复杂TLV Packet:


 




Table 1: TLV Packet from getpid request

读者可以看到实际上回复值是由 3个嵌套TLV构成这是个基本回复大部分response将会更加复杂在嵌套TLV中实际上是由堆结果嵌套而成利用Meterpreter协议及其易于理解结构是有可能通过分析残留在内存中结构而重现攻击者行为

Metasploit Forensic Framework

Metasploit Forensic Framework (MSFF)是个用于辅助进程攻击分析工具集在MSFF运行前分析师必须先获得他们怀疑被攻击进程这些可以结合Memoryze和批处理脚本来完成进程捕获也是很简单:
ProcessDD.bat –pid [process id]
进程被捕获MSFF即可运行和写入到磁盘文件进行比对并记录每文件所描述被加载到进程地址空间内存块

MSFF工作原理

MSFF工作原理主要是依据被释放内存并没有真正地丢失或消除而进行当内存被释放时它只是被标记为不可用而已但这些内存页所包含数据并没有被清除或清零这也就意味着名分析师可以追回和查看内存并找到释放内存页
Meterpreter packet在内部调度以指示正确地释放payloadMeterpreter将通过packet_transmit_response来响应 TLV它将packet_transmit这个实际上是用于发送TLV回复给客户端响应包发送Meterpreter就会 destroy_packet去释放”payload”在我们例子中它将会释放整个响应包但是释放内存并不意味着它会丢失和不可获取
        MSFF工程通过扫描每块获取内存块然后查找攻击者在攻击过程中Meterpreter所发回响应包中已知“思路方法”
-        priv_passwd_get_sam_hashes – 通知Meterpreter转存sam哈希值
-        stdapi_sys_process_getpid – 检索当前被攻击进程
-        core_channel_write – 写回数据给Metasploit 控制台当攻击者执行“execute –i” 命令时也会被使用
有很多是MSFF支持也有些是不受支持MSFF工程扫描每个VAD中这些已知如果找到则开始分析TLV结构由于TLV结构包含有type以指示如何分析它数据MSFF利用这些信息恢复响应包Meterpreter回复思路方法来响应这样 MSFF就可以知道攻击者请求后响应结果了所有这些信息都是从内存中获取可用于重现所发生攻击过程









Figure 4: Acquired VAD from exploited processes

最后步骤可参考上面Figure 4Figure 4是VAD部分用于捕获Meterpreter所攻击进程回顾MSFF扫描被思路方法 stdapi_sys_process_get_pid在这种情况下该思路方法被发现了继续分析这特定内存区域检索在Table 1中所看到值:来自getpid请求TLV Packet

警告和陷阱

个重要警告和陷阱就是内存是不稳定易被改变在任务繁忙系统中内存将被重复使用Meterpreter没有释放它数据包但在 windows内存管理器并没有立即重复使用被释放内存页这就意味着释放后内存可留在系统中较长时间有各种可变原因可以影响到被释放内存驻留在系统中时间般它在释放数小时的后仍可以查看
        在从某些被攻击进程环境中获取内存就存在着些问题Metasploit提供 3种区别类型退出例程:SHE进程和线程如果攻击者是使用SHE或进程退出例程那么针对个存在堆污染漏洞浏览器攻击时整个进程内存在和Meterpreter断开套接字连接的后就会被清除这就阻碍了浏览器进程内存提取它已经关闭了在测试MS09 - 002 IE 7化内存破坏漏洞时如果攻击者使用了EXITFUNC变量来设置线程 在Meterpreter套接字关闭的后Internet Explorer进程将不会被终止它仅是退出在攻击过程中所使用线程然而相对受害者主机上终端用户来说这将会使IE功能失效但并非所有 exploit都会终止当前被利用进程比如MS08-067,被攻击svchost.exe进程内存中拥有Meterpreter客户端和服务端断开连接数小时后数据

结论

这里所讨论技术和研究只是内存取证个开端特别是如何更好地利用发现人为产生内存数据进行内存取证技术事实上 Windows内存管理器功能在释放内存页后并没有马上清除这对于取证分析很有帮助这种行为也类似于传统文件系统取证个文件被删除后只是从链表中解链但开始并没有被覆写它允许分析人员在文件删除后数天的内进行数据恢复这只是迈出了第至少证明了在取证人员工具箱中内存取证仍占有席的地在以后研究当中还有更多工作要做以便更好地了解释放内存限制


资料

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


Tags:  非法取证 点击这里

延伸阅读

最新评论

发表评论