文章总结: 研究者发现WindowsRPC协议中的严重漏洞,允许非特权用户冒充已知RPC服务器。通过竞速注册技术,成功让高完整性进程信任自己并开发了RPC-Racer工具,可强制计算机账户向任意服务器认证。漏洞已被微软修复(CVE-2025-49760),但仍有其他接口可能受影响。建议监控RpcEpRegister调用和使用ETW检测此类攻击。
综合评分: 98
文章分类: 漏洞分析,渗透测试,内网渗透,红队,安全工具
兵贵神速:利用 RPC-Racer 劫持 Windows RPC 核心服务
Ron Ben Yizhak
securitainment
2025年8月11日 22:17
新加坡
翻译自 You Snooze You Lose: RPC-Racer Winning RPC Endpoints Against Services
免责声明:本博客文章仅用于教育和研究目的。提供的所有技术和代码示例旨在帮助防御者理解攻击手法并提高安全态势。请勿使用此信息访问或干扰您不拥有或没有明确测试权限的系统。未经授权的使用可能违反法律和道德准则。作者对因应用所讨论概念而导致的任何误用或损害不承担任何责任。
了解 SafeBreach Labs 的研究员如何发现 Windows RPC 协议中的一个漏洞,并利用该漏洞伪装成合法的内置服务,迫使受保护进程向其选择的服务器进行身份验证。
远程过程调用 (RPC) 协议是微软 Windows 的基石之一,广泛应用于客户端和服务器之间的进程间通信。当 RPC 客户端仅根据接口的通用唯一标识符 (UUID) 寻找服务器——而未指定端点时——它们会通过端点映射器 (EPM) 进行查询。EPM 会将它们连接到服务器注册的、暴露了客户端所需接口的端点。
在这种方式下,EPM 的行为与 DNS 服务器非常相似,它负责将 UUID 解析为端点。基于我对 RPC 协议和 EPM 的理解,我开始探索是否能将类似 DNS 投毒(通过操纵 DNS 数据将用户重定向到恶意网站)的攻击手法应用于 EPM。在此过程中,我发现了一个严重漏洞,使我能够操纵 RPC 协议的核心组件,从而让我新的“EPM 投毒”技术成为现实。此漏洞——以及我为利用它而开发的技术——一旦被恶意行为者利用,可能会造成毁灭性的后果。
在接下来的文章中,我将首先对本次研究的关键发现和核心要点进行高度概括。接着,我将详细解释 RPC 协议,包括一些基本术语的定义。然后,我将演示如何操纵 RPC 的核心组件并伪装成合法的内置服务,从而迫使受保护进程向任意服务器进行身份验证,并泄露计算机账户的 NTLM 哈希。我还将重点说明供应商的响应,并描述组织可以部署的几种检测方法,以保护其他可能易受此类攻击的客户端和接口。最后,我将解释我如何与更广泛的安全社区分享这些信息,以帮助各个组织进行自我保护。
概述
关键发现
我的研究目标是探寻是否可以将一个受信任 RPC 接口的 UUID 映射到我所控制的端点,进而连接到我自己的恶意 RPC 接口。我很快在 Windows RPC 协议的核心组件中发现了一个严重的安全问题。具体来说,该漏洞表明,系统没有任何验证流程来阻止非特权用户冒充已知的 RPC 服务器。
然而,要让客户端连接到我,我需要在原始服务的 RPC 接口之前抢先在 EPM 中完成注册。我检查了 RPC 服务器在启动过程中特定时间点的状态,并绘制出几个可能被滥用的接口。接着,我尝试与这些服务“竞速”注册,结果成功地让各种高完整性进程——甚至包括一些受保护进程轻量版 (PPL)——信任我并把我当作它们的 RPC 服务器。
基于这些发现,我开发了 RPC-Racer——一个能够发现不安全 RPC 服务并在此例中操纵 PPL 进程,使其向我指定的任意服务器进行计算机账户身份验证的工具集 (CVE-2025-49760)。
核心要点
这项研究不仅对全球使用最广泛的桌面操作系统——Microsoft Windows——意义重大,对其他可能存在类似漏洞的操作系统供应商也具有重要影响。我们认为这些发现揭示了几个重要的观点:
- 应校验每个协议的服务器完整性。就像 SSL 证书锁定不仅验证证书是否有效,还会核对特定的公钥一样,RPC 服务器的身份也应受到校验。端点映射器 (EPM) 的当前设计并未执行此验证。缺少此验证,客户端会接受来自未知来源的数据。盲目信任这些数据,将允许攻击者控制客户端的操作并随心所欲地操纵它。
- 将服务设置为延迟启动存在固有风险。RPC 服务器的软件开发者应意识到在启动后期才启动其应用程序所带来的影响。服务通常被设置为延迟启动以加快启动过程,但性能的提升不能以牺牲安全为代价。任何可能执行非可信代码的阶段都应被视为不安全。
RPC 协议背景
Microsoft Windows 中的 RPC 协议用于客户端和服务器之间的进程间通信。服务器暴露其功能——特定的操作和逻辑——客户端可以请求服务器代为执行。服务器可以与客户端在同一台机器上运行,也可以在网络中的另一台计算机上运行。
RPC 客户端和服务器都使用接口定义语言 (IDL) 文件,该文件包含了 RPC 接口的属性,如结构体、枚举、函数定义,以及最重要的——通用唯一标识符 (UUID)。服务器在向机器注册时使用此标识符,客户端在寻找其服务器时也使用此标识符。
在客户端与服务器通信之前,它首先需要创建一个绑定句柄,该句柄由三部分组成:
- 协议序列:它决定了封装 RPC 通信所使用的协议。三种最常见的协议是 TCP、基于 SMB 的命名管道和高级本地过程调用 (ALPC)。ALPC 协议用于在同一台机器上运行的进程之间进行高效且安全的消息传输。
- 网络地址:可以是一个 IP 地址或计算机名。
- 端点:每种协议序列的端点都不同。对于 TCP,它是端口号;对于 SMB,它是管道名称;对于 ALPC,它是一个对该服务器唯一的字符串——两个 RPC 服务器不能拥有相同的端点。
ncacn
出于本研究的目的,我们将重点关注 ALPC 端点的含义。当服务器注册自身时,它可以选择是否指定端点。如果指定了端点,那么通信将基于一个众所周知的端点。客户端有一个硬编码的字符串,它知道这个字符串将与服务器匹配。如果服务器没有注册端点,系统会为其生成一个唯一的字符串,这被称为动态端点。在下图中,我们可以看到三个端点名称。
svs-host
第一个以 OLE 开头的名称是一个带有生成字符的唯一字符串,但它并非我们所讨论的动态端点。它指的是与分布式 COM 对象相关的端点,与本讨论无关。第二个名称 LSMApi,是本地会话管理器注册的一个众所周知端点。第三个以 LRPC 开头的名称,指的是一个包含生成字符的动态端点。
问题是:如果动态端点是随机的,客户端如何知道与谁通信?这就是端点映射器 (EPM)发挥作用的地方。EPM 在接口 UUID 和暴露该接口的端点之间建立映射。如果服务器决定使用动态端点,它需要确保其客户端能够找到它。它通过向 EPM 注册来实现这一点。
RPC-Server
注册之后,客户端就能仅凭 UUID 建立 RPC 连接。EPM 会将它连接到第一个注册了该接口的服务器。
EPM connects to server
EPM 遵循两条重要规则:
- 首先,只有在原始进程注销或终止时,条目才能被移除。
- 其次,EPM 将始终使用为某个接口注册的第一个端点。注册顺序无法被修改。
EPM 由 RpcEpMap函数(位于一个 DLL 中)管理,该函数由 RpcSs 服务加载。一旦加载,就可以通过多种协议访问它:TCP、基于 SMB 的命名管道和 ALPC。每种协议都有其自己的已知端点。
Protocal-Name
可以使用像 Impacket 中的 rpcdump这样的工具在本地或远程查询 EPM,如下所示。EPM 的行为与 DNS 服务器非常相似,它将 UUID 解析为端点。
kali-kali
研究过程
基于我对 RPC 协议和 EPM 的理解,我萌生了一个想法。是否可以将类似于 DNS 投毒(操纵 DNS 数据将用户重定向到恶意网站)的攻击应用于 EPM?我能否伪装成一个合法的 RPC 服务器,让客户端连接到我而不是真正的服务器,从而创造一种新型的 EPM 投毒攻击?
回顾著名的 RPC 漏洞利用——如 PrintNightmare 和 PetitPotam——我们看到它们通常针对服务器中的脆弱代码以实现远程代码执行 (RCE) 或权限提升。但 RPC 客户端中也存在脆弱代码,我决定,这将是我研究的目标。
为了实现我的目标,我首先需要弄清楚如何对 EPM 进行投毒。一旦 EPM 被诱导将 RPC 连接转发给我,我就需要表现得像一个合法的内置服务,并向客户端发送恶意响应,以助我实现权限提升。我们这次攻击的起点是在没有管理员权限的情况下,以一个中等完整性级别的进程运行。
poison-EPM
对 EPM 进行投毒
首先,我需要在 EPM 中注册,这可以通过 RpcEpRegisterAPI 来完成。但我不想随便注册任何接口,我需要表现得像一个已知的服务器,并完全复制其行为,这意味着要注册它的接口。
Good-Endpoint
我本以为会遇到各种错误代码和安全缓解措施,但当我尝试注册一个属于内置服务的接口时,它竟然成功了。而且,这甚至不需要管理员权限。
我震惊地发现,没有任何机制阻止我注册属于核心服务的已知内置接口。例如,我曾预想如果 Windows Defender 有一个唯一的标识符,其他进程是无法注册它的。但事实并非如此。
Rogue-RPC-Server
然而,即使我做到了这一点,客户端也没有连接到我的服务器。我意识到我没有收到连接,是因为原始服务在我之前就已经注册了其接口的端点。当我尝试注册一个已关闭服务的接口时,它的客户端反而连接到了我。
这个发现令人难以置信——EPM 没有进行任何安全检查。它将客户端连接到了一个未知的、甚至没有以管理员权限运行的进程。这证明了我新颖的 EPM 投毒技术不仅是可行的,而且可以用来破坏 Microsoft RPC (MSRPC) 的核心,同时还不需要管理员权限。
EP
据我所知,这是一个前所未有的攻击向量。现在,我要看看是否能够将其武器化。
开发 RPC-Recon 工具
既然我知道 EPM 投毒是可行的,现在是时候收集数据并找到一个候选目标,来发起一次具有实际影响的攻击了。我现在知道,任何不在启动时立即启动的 RPC 服务器都可能被劫持。任何设置为手动启动的服务都构成安全风险,因为它的 RPC 接口不会在启动时注册。下图展示了众多可能易受攻击的服务中的一个例子。
system-informer
我的下一步是收集所有未映射到端点的接口列表。正如我之前提到的,动态端点可以使用 WinAPI 从 EPM 本地或远程检索。为了做到万无一失,我还需要找到那些众所周知的端点。我使用 RpcView 扫描每个进程的内存,定位 rpcrt4模块,并解析其内部结构以列出如下所示的信息。
RPC-View
我需要一个能够检索这两种类型端点的综合工具,因此我开发了 RPC-Recon。它的设计目标是在系统启动后、大多数服务启动之前,找到可以被注册的接口。它通过计划任务在用户登录时启动,查询 EPM 并扫描进程内存。然后它会等待几分钟,直到延迟启动的服务启动。之后,它会再次执行相同的检索操作。
early-scan
最后,它会比较两次扫描的结果。其中的差异将揭示出那些可以在原始服务启动前被抢先注册的易受攻击的接口。
由于此工具用于信息收集而非攻击本身,我以管理员权限执行它,以便它可以扫描高权限进程的内存。
演示
为了展示这些功能的实际效果,以下演示将展示如何使用 /register标志执行 RPC-Recon 来创建一个计划任务,该任务将在我登录时以提升的权限执行。重启计算机以确保大多数服务尚未运行后,该工具将对系统进行两次扫描并比较结果。比较完成后,它将生成一个日志文件,其中包含所有可以被延迟注册的接口,从而为我提供一个潜在目标的列表。
观看演示:https://youtu[.]be/eyMa6JX4-D4
启动恶意服务器
在我最初惊讶于我可以注册 EPM 的任何接口,无论它对系统功能是否至关重要或属于核心组件之后,我开发了一个通用的 RPC 服务器。它会注册已知的接口,并收集连接到它的客户端信息。
当我开始从多个接口接收到来自各种进程的连接时,我的服务器显示这些进程是以来宾身份运行的服务。我确信我将实现有史以来最简单的权限提升。
利用连接
利用连接进行权限提升最直接的方法是调用 RpcImpersonateClient并在没有我们令牌的情况下生成一个新的控制台,但它失败了。我能够获得一个新的令牌,但由于 ERROR_BAD_IMPERSONATION_LEVEL错误,使用该令牌创建新进程失败了。显然,存在一种针对模拟场景的策略,可以防止中等完整性级别的线程模拟具有更高完整性级别的令牌。
为了更好地理解这个机制,首先了解每个模拟级别的含义会很有帮助,如下图所示。
typedef
- Anonymous(匿名)级别意味着服务器无法知道谁连接了它。
- Identification(识别)级别,也就是我获得的级别,允许服务器查询客户端的权限和安全标识符。它用于检查客户端是否被允许访问某些资源。
- Impersonation(模拟)级别是我希望拥有的。它允许服务器在本地机器上使用客户端的安全上下文执行操作。如果客户端比服务器拥有更高的权限,服务器可以使用模拟来进行权限提升。
- Delegation(委派)级别允许服务器在远程系统上模拟客户端的安全上下文。
这促使我产生了另一个想法:我能否利用这个连接进行 NT LAN Manager (NTLM) 中继认证?我尝试使用我的新令牌对我拥有的 SMB 服务器进行身份验证。这通常会泄露 NTLM 哈希。
benign-rpc
但再次地,模拟策略阻止了它。要访问网络上的远程资源,我需要最高的模拟级别,即委派级别。在这一点上,很明显我无法滥用 RPC 连接。
寻找凭据
接下来,我考虑是否可以利用 RPC 服务器提供的功能。如果我伪装成一个用于身份验证的服务器,客户端是否会向我提供敏感的凭据?
在所有易受攻击的接口中,我寻找了包含诸如“凭据 (credential)”、“身份 (identity)”和“账户 (account)”等关键词的接口。最终我找到了以下三个接口:保险库服务 (Vault Service)、微软账户登录助手 (Microsoft Account Sign-in Assistant) 和同步主机服务 (Sync Host Service)。
VaultSvc
然而,当我启动我的恶意服务器并使用这些客户端时,没有一个客户端连接到我。这是因为存在另一个安全机制。
绑定句柄可以拥有的一个属性是安全服务质量(QOS)。如果客户端期望服务器以 NT AUTHORITY\SYSTEM身份运行,它可以指定其安全身份,这将阻止它连接到以其他用户身份运行的服务器。这正是这些 RPC 客户端所做的,也是它们没有连接到我的原因。
typedef-struct
例如,我们可以看到微软账户登录助手的 RPC 客户端创建了一个带有本地系统账户安全标识符的安全 QOS 结构,然后将其应用于绑定句柄。
sid
我知道 EPM 投毒有潜力,但我必须继续寻找滥用它的正确方法。
操纵文件访问
实现权限提升的另一种方法是执行我本身不允许的操作,比如写入 system32目录。
如果我能伪装成一个文件系统服务,另一个特权服务可能会向我请求文件数据,然后将其复制到某个地方。在我的受害者列表中,我找到了存储服务 (Storage Service)。它在 StorSvc.dll文件中实现,并且被设置为延迟启动。
StorSVC Properties
接下来,我再次启动我的恶意服务器,但这次只注册了存储服务的接口。然后我监控机器上自然发生的 RPC 连接,并收集 StorSvc 客户端的数据。
第一个连接到我服务的是什么?Windows Update——一个在操作系统中拥有极高权限、可以修改驱动程序和核心 DLL 文件的服务。它连接到了一个以低权限运行的未知进程——这是一个惊人的安全漏洞。接下来,我收到了来自存储服务本身的连接,这很奇怪,因为我正在冒充它。显然,该服务使用自己的 RPC 客户端来连接自身。由于我先注册了接口,它连接到了我。
我收到的最后一个连接来自交付优化服务 (Delivery Optimization service),它负责从替代来源下载更新和包,以提高分发效率。
last-connection
交付优化服务以受保护进程轻量版 (PPL)的形式运行。能够操纵它证明了 EPM 投毒确实具有重大影响,并且利用 StorSvc 是正确的方向——即使是最受保护的服务也会连接到我。
为了操纵这个过程,我需要了解它接收什么输入以及其用途。在接口暴露的 36 个方法中,只有三个被调用,而且它们都没有文档记录。所以,很难理解它们的用途。然而,其中两个方法向客户端返回一个整数,这表明它们不太可能产生重大影响。另一方面,第三个方法返回一个未记录的结构。这更有潜力。
我需要理解 GetStorageDeviceInfo方法返回的结构定义。一种方法是查看接收此结构的客户端函数。导致 RPC 调用的调用栈指向一个名为 AppXDeploymentClient.dll的 DLL。当我反汇编它时,我惊讶地发现它的公共符号包含了大量关于存储服务接口的信息。它有枚举和变量名——基本上是我需要的一切。
最棒的是,它揭示了我们的结构包含一个路径。到此,我只需在其他客户端的这个程序集上应用这个定义,看看它们用这个路径做了什么。
在深入研究所有客户端的这个程序集后,我发现交付优化服务对它接收到的路径执行了一些健全性检查,我能够绕过这些检查,然后它会基于该路径创建一个目录。我终于找到了可以操纵的操作。我们这个低权限的进程可以返回一个路径,而这个路径将被一个高权限进程使用。
交付优化服务以 NT AUTHORITY\NETWORK SERVICE用户身份运行。利用此漏洞最简单的方法是在该用户的主文件夹中创建一个目录——它成功了。我返回了本地机器 C: 驱动器的网络共享路径以绕过健全性检查,并创建了名为“Hello DEF CON 33”的目录,如下所示。
StorSvc
为了解我还能用这个漏洞实现什么,我需要更多地了解这个用户及其用途。
以网络服务身份运行的进程拥有一个具有非常高完整性级别的令牌——与本地系统账户相同。但它们之间有一个区别。用户 NT AUTHORITY\NETWORK SERVICE不是管理员组的成员。这意味着它对机器上大多数敏感目录、注册表项和进程没有写访问权限。该用户的目的是在本地拥有有限的权限,但能够对远程机器进行身份验证。它通过计算机账户 (machine account)来实现这一点。
当计算机加入 Active Directory 域时,会在 NTDS 数据库中创建一个代表该计算机的账户。该账户可以通过其名称末尾的美元符号轻松识别。与任何域用户一样,它有密码、组成员资格,并且可以用于访问域网络中的资源。
Active-Directory-Users
计算机账户在渗透测试中经常被滥用——取决于域的配置——并且登录的用户无法使用这些凭据对远程资源进行身份验证。它们仅由本地系统和网络服务账户使用。这就是我的漏洞发挥作用的地方。我可以绕过应用于登录用户的限制,并使用计算机账户进行身份验证。
之前,我展示了我的 RPC 服务器如何向交付优化服务返回 C: 驱动器的网络共享路径。如果我返回一个外部服务器的网络共享路径,该服务将使用计算机账户凭据对其进行身份验证。我将能够中继 NTLM 身份验证。我刚刚成功地跨越了一个安全边界。
crossed security boundary
攻击流程回顾
作为一个中等完整性级别的进程,我可以创建一个计划任务,在当前用户登录时执行。此时,大多数 RPC 服务器尚未启动。我的第一步是注册存储服务的接口。然后,我将触发交付优化服务向存储服务发送 RPC 请求。它使用动态端点连接,这意味着它会查询 EPM 并获取我注册的端点。然后它将调用 GetStorageDeviceInfo方法。作为回应,它将收到我启动的服务器的 SMB 共享路径。最后一步是交付优化服务使用计算机账户凭据向我进行身份验证——然后我就可以中继该身份验证。
attack flow
RPC-Racer 工具
我开发了一个名为 RPC-Racer的新工具来完成这次攻击。除了强制进行计算机账户认证外,RPC-Racer 还被设计用于启动恶意的 RPC 接口。它收集连接到它的客户端信息,这对于研究其他服务器中的漏洞很有用。
这次攻击的起点是作为一个中等完整性进程运行。如果我能将计算机账户的认证中继回我正在运行的计算机,我就能提升我的权限。然而,由于安全缓解措施,这是不可能的。NTLM 认证不能被中继回发起它的同一台计算机。
NTLM-Authentication
因此,我需要在域中找到另一台服务器。为了理解强制和中继计算机账户认证的影响,我将目光投向了域控制器(DC)的计算机账户。
利用 ESC8 攻击
如果我在 DC 上以一个低权限用户身份执行 RPC-Racer 工具,我可以将认证用于一种称为 ESC8的攻击。ESC8 是一种利用 Active Directory 证书服务 (ADCS) 进行权限提升的攻击。
该服务器是域的一部分,它生成的证书被网络中的其他计算机所信任。此外,这些证书可用于身份验证,替代明文凭据。具体来说,ESC8 针对 ADCS 的 Web 注册功能。
该功能允许用户登录到由 ADCS 管理的 Web 服务器并请求生成证书。在 ESC8 攻击中,攻击者中继 NTLM 认证,以从 Web 服务器请求一个代表域中特权用户的证书。
第一步:为 DC 计算机账户请求证书
就像我之前说的,NTLM 认证不能被中继回同一台计算机。我想利用 DC 计算机账户的权限,但我需要另一种形式的认证。
实现这一点的第一步是将 RPC-Racer 创建的认证中继到 ADCS 的 Web 服务器。它为我生成了一个代表 DC 计算机账户的证书。这可以使用 Impacket 的 ntlmrelayx来完成。
requesting certificate
第二步:使用证书请求 TGT
我还不能立即使用这个证书在域中的任何地方进行认证。下一步是从 DC 请求一个票证授予票证 (TGT)。这是一个合法的 Kerberos 票证,可用于请求访问域中的资源。这是使用 certipy工具完成的。
一旦我拥有了 DC 计算机账户的 TGT,我就可以用它来执行多种攻击。最常见的是转储域中所有用户的密码哈希。为了实现这一点,我再次使用了 Impacket,但这次是 secretsdump工具。
Rogue-SMB
演示
为了看到这些功能的实际效果,以下演示将展示我如何使用 ntlmrelayx 启动一个恶意的 SMB 服务器,并用它将认证中继到 ADCS。然后,我在 DC 上以一个低权限用户身份执行了 RPC-Racer,并展示了交付优化服务如何向我请求路径,以及我的 SMB 服务器如何接收到认证。接着,我使用 certipy 基于为我生成的证书请求了一个 TGT。一旦我拥有了计算机账户的 TGT,我就能够转储所有域控制器的机密信息。
观看演示
其他影响
正如我在这里所展示的,EPM 投毒是一种真实存在的攻击。虽然我只展示了一种滥用它的方法,但还有更多的方法可以从中获得更大的收益:
- 中间人攻击:我可以将接收到的请求转发到原始服务,并过滤掉某些调用,以此来实现中间人技术,从而隐藏我在机器中的立足点。
- 拒绝服务 (DoS):我可以通过注册大量接口并拒绝所有请求来导致 DoS,从而禁用许多功能。与其终止进程或用数据包轰炸它们,我也可以抢先注册它们的 RPC 接口。
- 窃取凭据:我注意到一些可能被利用来窃取凭据的服务,但可能还有更多。
供应商响应
在我们的原创性研究方面,SafeBreach 坚定地致力于负责任的披露。根据这一承诺,我在 2025 年 3 月将我的研究结果通知了微软,他们为我报告的漏洞分配了 CVE-2025-49760。
该漏洞的补丁于 2025 年 7 月 8 日发布。修复是在 RPC 客户端 StorageUsage.dll中进行的,改进了绑定的方式。现在,只有当 RPC 服务器以本地系统账户运行时,RPC 连接才会建立。
检测能力
由于补丁专门针对存储服务的 RPC 客户端,因此仍有许多其他客户端和接口可能容易受到 EPM 投毒的影响。可以采取一些措施来帮助检测这类攻击:
- 安全产品可以使用钩子(hook)并监控对
RpcEpRegister的调用。如果一个进程试图向 EPM 注册一个已知的内置接口,而它又不是一个合法的服务,就应该被检测到。
detection capabilities
- 也可以使用 Windows 事件跟踪 (ETW)。操作系统会自动为机器上发生的许多操作生成事件。名为
Microsoft-Windows-RPC的提供程序记录了大量与此案例相关的有用信息。在这些事件中,如下所示,我们可以看到 RPC-Racer 的进程 ID、交付优化服务的进程 ID 以及我劫持的存储服务接口之间的关联。我们甚至可以看到被调用的确切过程编号,它与GetStorageDeviceInfo相关。这些事件类型可用于检测 EPM 投毒的情况:一个未知的进程在已知的接口上接收了 RPC 连接。
Event-5
进一步研究
虽然我利用我发现的漏洞强制进行了计算机账户的认证,但我认为通过以不同的方式利用相同的漏洞,可能会产生更强大的影响。
例如,我返回给交付优化服务的路径被用作该服务的私有文件夹,它会在其中查找配置文件。这意味着我可以将其指向一个包含有毒配置的目录,这些配置会进一步影响服务的行为。
其中一个配置文件是 KeyValueLKG.dat。它包含许多 URL。另一个有趣的配置文件是 dosvcState.dat。这是一个独立的注册表配置单元,用于管理分配给交付优化服务的作业。有一些值肯定会引起注意,例如 CdnURL和工作目录。创建具有某些值的键可能会导致服务将文件下载到受保护的目录。
Key-Name
当然,进一步研究最引人注目的攻击向量是找到更多易受攻击的 RPC 服务器。这项研究只是触及了皮毛——我相信还有更多。例如,Windows 安全中心就容易受到 EPM 投毒的影响,而 Windows Defender 会与它交互。也许可以通过发送恶意响应来使 Defender 失效。
结论
这项研究揭示了 RPC 协议核心组件中的一个严重安全问题,即对于将被操作系统关键服务使用的接口注册,缺乏验证过程。我展示了如何映射易受攻击的 RPC 服务器,然后分析和利用客户端以达到潜在的破坏性后果。
为了帮助减轻本研究发现的漏洞的潜在影响,我已经:
- 如上所述,在 2025 年 3 月负责任地向微软披露了我们的研究发现。所有用户都应该应用微软为此提供的补丁。
- 提供了若干关于组织可以实施的检测能力的建议,以保护可能容易受到 EPM 投毒影响的其他客户端和接口。
- 在本文以及我的 DEF CON 33 (2025) 演讲中公开分享了我的研究,以帮助使用 Windows 操作系统的组织和最终用户更好地理解与这些漏洞相关的风险。
- 提供了一个 GitHub 研究仓库,其中包括本研究中讨论的工具和漏洞利用,作为进一步研究和开发的基础。
- 将原始攻击内容添加到了 SafeBreach 平台,使我们的客户能够验证他们的环境是否能抵御本研究中概述的 EPM 投毒技术,从而显著降低他们的风险。
关于研究者
Ron Ben Yizhak (@RonB_Y) 是 SafeBreach 的一名拥有 10 年经验的安全研究员。他从事漏洞研究,并具备取证调查、恶意软件分析和逆向工程方面的知识。Ron 之前从事过安全产品的开发工作,并多次受邀在 DEF CON 上分享他的研究。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:securitainment Ron Ben Yizhak《兵贵神速:利用 RPC-Racer 劫持 Windows RPC 核心服务》