介绍
MS-RPC 是 Windows 操作系统的基石之一。早在 20 世纪 90 年代发布,它就已扎根于系统的大部分部分。服务管理器?RPC。Lsass?RPC。COM?RPC。甚至一些针对域控制器的域操作也使用 RPC。鉴于 MS-RPC 已经变得如此普遍,您可以预料到它已经受到严格的审查、记录和研究。
其实不然。尽管微软关于使用 RPC 的文档相当不错,但关于这个主题的文档并不多,研究人员研究 RPC 的文档就更少了——特别是关于其安全性的文档。这可能归因于 RPC(不仅仅是 MS-RPC,尽管微软肯定也参与其中)非常复杂,使得研究和理解成为一项艰巨的任务。
但我们始终乐于接受挑战,因此我们决定一头扎进 MS-RPC 的深海。这不仅是因为它是一个有趣的研究课题,还因为它具有安全隐患 — 即使是现在,常见的攻击技术也依赖于 RPC(T1021.003通过MS-COM发生,T1053.005是MS-TSCH,T1543.003是MS-SCMR,仅举几例)。MS-RPC 内置了安全机制,但如果存在漏洞,导致这些漏洞被绕过或滥用,或者导致暴露的 RPC 服务被滥用,从而以不良方式影响机器,该怎么办?
事实上,我们设法找到了一种通过缓存绕过安全机制的方法。通过它,我们发现了一些可以滥用的服务,可以在远程服务器上提升权限,而无需太多必要条件(我们将在后面的文章中深入探讨)。目前,我们可以分享两个实际潜在利用示例的信息,即WksSvc和SrvSvc。一旦披露过程完成,我们将发布有关我们发现的其他漏洞的更新。
在这篇博文中,我们将重点介绍 RPC 服务器的安全回调机制、如何通过缓存绕过它,以及我们如何自动化研究以将 Windows 服务标记为潜在易受攻击。我们的自动化工具及其原始输出也可以在我们的RPC 工具包中找到,该工具包在我们的 GitHub 存储库中共享。我们的存储库还包括我们依赖的其他有用参考资料和其他研究人员所做的工作的链接。
安全回调
在讨论漏洞本身之前,有必要先介绍一下 MS-RPC 实现的最基本的安全机制之一:安全回调。安全回调允许 RPC 服务器开发人员限制对 RPC 接口的访问。它允许他们应用自己的逻辑来允许特定用户的访问、强制执行身份验证或传输类型,或阻止对特定 opnums 的访问(服务器公开的函数使用 opnums 表示;即操作编号)。
每次客户端调用服务器上公开的函数时,RPC 运行时都会触发此回调。
在我们的研究中,我们专注于远程客户端-服务器交互。我们之所以提到这一点,是因为 ALPC 端点与远程端点(如命名管道)之间的 RPC 运行时服务器端代码实现有所不同。
缓存
RPC 运行时实现了安全回调结果的缓存,以提高性能和利用率。这基本上意味着运行时每次调用安全回调之前都会尝试使用缓存的条目。让我们深入了解一下实现。
在 RPC_INTERFACE::DoSyncSecurityCallback 调用安全回调之前