查看原文
其他

编写 PyKD 调试脚本,自动化地 Sniffer VMware 的 RPC 请求

2018-03-07 fyb波 看雪学院

去年,我和同事在各种会议上讨论了关于VMware的不同话题。因为我们曾经详细编写了与RPC接口交互的工具,所以谈到了关于RPC工具的话题。其间,还简要讨论了如何嗅探RPC请求以帮助开发漏洞,调试RPC请求,甚至模糊测试。由于我们仅仅在以前的演示文稿中简要介绍过RPC,因此我决定在本篇文章中详细介绍一下。

 

由于对VMware的相关方面的工具比较失望,从而促使我开始进行这方面的研究。当时,我正在学习如何利用VMware漏洞,并且需要了解我的RPC请求是如何发送给主机的。由于没有找到好用的工具,所以决定自己写一个。

 

在本篇博客中,我将讨论如何编写PyKD脚本来嗅探RPC请求,弄清这个问题有助于利用VMware RPC的漏洞攻击。



细节


RPC请求可以通过不同的方式从客户端发送到主机:后门通道,vsockets等等。这篇博客介绍了通过后门通道方式发送的GuestRPC请求,我并不打算深入了解后门通道的工作方式。目前需要知道的重点是backdoor 函数中负责发送GuestRPC消息的是BDOOR_CMD_MESSAGE,其操作码为0x1E。后门通道函数的完整列表可以在open-vm-tools git repo的backdoor_def.h中找到。

 

我的主要目标之一是找到正在解析RPC请求的位置。一种有效的方法是定位其中一个RPC函数的位置,然后通过发送RPC请求调试该函数被调用的位置。通过使用VMware工具附带的rpctool.exe,就可以发送测试RPC请求。

 

 

在IDA中,如果我们搜索字符串“vmx.capability.copypaste_version”,将在rdata段发现它:

 

 

如果通过xref交叉引用查找调用位置,会发现下面的代码:

 

 

如果仔细查看sub_140084230,我们就会注意到这就是vmx.capability.copypaste_version函数的实现:

 

 

下一步是在该函数中设置一个断点来找出其调用位置,以确定最初解析请求的位置。

 

在这种情况下,应将断点设置为vmware_vmx + 0x84230(适用于VMware Workstation 12.5.8)。

 

 

如果我们仔细观察vmware_vmx + 0x69486处的函数,我们发现它实际上是在将请求分派到匹配的RPC函数之前解析请求的函数。在这种情况下,也就是vmx.capability.copypaste_version。

 

这个函数的逻辑非常简单,简而言之,RPC请求作为参数传递。该函数首先检查RPC请求是否包含要调用的有效RPC函数。这是通过循环内置函数并strncmp(比较)请求中的函数来实现的。如果找到该函数,它会检查是否有足够的权限执行。如果有足够的权限,它将执行RPC功能。

 

我们可以使用下面的断点将RPC请求从Windbg中dump出来:

bp vmware_vmx + OFFSET“.echo; db r8 r8 + r9; g;”




工具


根据目前所获取到的所有信息,我们可以进一步编写一个PyKD脚本来为我们自动完成所有的工作,脚本的逻辑非常简单:

 

1.附加到vmware_vmx.exe
2.在解析RPC请求的函数中设置一个断点
3.断点回调函数应该从r8转储r9个字节,因为r8保存了请求,而r9是请求的大小
4.继续

 

首先,我们必须初始化,然后使用initialize和attachProcess API来附加到进程:

 

 

使用setBp函数设置断点,该函数采用应设置断点的函数地址和回调函数:

 


回调函数使用loadBytes来读取r8中的字节:

 



结论


既然我们能够实时到嗅探这些流量,我们就可以了解如何发送某些请求以缓解exploit开发甚至模糊攻击。


VMware以及其他虚拟化软件中的bugs仍是一个有趣的研究领域,这些bug的影响可能非常深远,因为这些程序通常被认为是信息安全从业人员需要的工具。我们希望有更多的人可以发现这些产品中的漏洞,减少相关方面的攻击,能够嗅探这些通信就是一个好的开始。如果你还没有开始,请查看其他近期发布的有关VMware bug的文章,希望可以获得灵感。

 

我的推特地址为AdbHariri,还可以关注我们的团队以获取最新的漏洞利用技术和安全补丁。






本文由看雪翻译小组 fyb波 编译,来源@zerodayinitiative

转载请注明来自看雪社区


热门阅读


点击阅读原文/read,

更多干货等着你~

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存