去年,我和同事在各种会议上讨论了关于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出来:
根据目前所获取到的所有信息,我们可以进一步编写一个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,还可以关注我们的团队以获取最新的漏洞利用技术和安全补丁。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2019-2-1 18:28
被admin编辑
,原因: