深入探索 Windows RPC:RPC Investigator 工具全面解析

本文详细介绍 Trail of Bits 发布的 RPC Investigator 工具,这是一个基于 .NET 和 NtApiDotNet 的 Windows RPC 研究工具,支持枚举、解析 RPC 服务器,动态生成客户端代码,并集成 ETW 数据嗅探功能,帮助安全研究人员深入分析 Windows RPC 通信机制。

介绍 RPC Investigator - The Trail of Bits Blog

背景

Microsoft 远程过程调用(MSRPC)是一种普遍的通信机制,为定义服务器/客户端接口提供了可扩展框架。MSRPC 在几乎所有 Windows 系统活动中都有涉及,从登录笔记本电脑到打开文件。正因如此,几十年来它一直是防御和进攻性信息安全社区的热门研究目标。

几年前,开源 .NET 库 NtApiDotNet 的开发者 James Foreshaw 更新了他的库,增加了反编译、为任意 RPC 服务器构建客户端以及与之交互的功能。在一篇优秀的博客文章中,他重点介绍了通过 PowerShell 脚本和 cmdlet 使用新的 NtApiDotNet 功能,并包含了一小部分关于如何使用 PowerShell 脚本为给定 RPC 服务器生成 C# 代码,然后将该代码编译成 C# 应用程序的内容。

我们在开发 RPC Investigator(RPCI)时基于这一概念,这是一个 .NET/C# Windows Forms UI 应用程序,为 NtApiDotNet 平台的现有核心 RPC 功能提供了可视化界面:

  • 枚举所有活动的 ALPC RPC 服务器
  • 从任何 PE 文件解析 RPC 服务器
  • 从进程及其加载的模块(包括服务)解析 RPC 服务器
  • 集成符号服务器
  • 将服务器定义导出为序列化的 .NET 对象,供您自己的脚本使用

除了可视化这些核心功能外,RPCI 还提供了额外功能:

  • 客户端工作台允许您通过右键单击感兴趣的 RPC 服务器来动态创建和执行 RPC 客户端二进制文件。工作台有一个 C# 代码编辑器窗格,允许您实时编辑客户端并观察代码中执行的 RPC 过程的结果。
  • 发现的 RPC 服务器被组织到一个具有可定制搜索界面的库中,允许您以有用的方式透视 RPC 服务器数据,例如通过搜索所有服务器的所有 RPC 过程来查找有趣的例程。
  • RPC 嗅探器工具增加了对 RPC 相关的 Windows 事件跟踪(ETW)数据的可见性,提供近乎实时的活动 RPC 调用视图。通过将 ETW 数据与来自 NtApiDotNet 的 RPC 服务器数据结合,我们可以更全面地了解正在进行的 RPC 活动。

功能

免责声明: 在与系统服务交互时请务必小心。如果 RPCI 使用不当,可能会损坏系统状态或导致系统崩溃。

先决条件和系统要求

目前,RPCI 需要以下条件:

  • Windows 操作系统
  • .NET Framework 4.8 或更新版本
  • 安装了 Windows 调试工具组件的 Windows SDK
  • 管理员访问权限

默认情况下,RPCI 会自动发现 Windows 调试工具的安装目录,并配置自身使用公共 Windows 符号服务器。您可以通过单击“编辑”->“设置”来修改这些设置。在设置对话框中,您可以指定调试工具 DLL(dbghelp.dll)的路径,并根据需要自定义符号服务器和本地符号目录(例如,您可以指定路径 srvc:\symbolshttps://msdl.microsoft.com/download/symbols)。

如果您想观察写入 RPCI 日志的调试输出,请在设置窗口中设置适当的跟踪级别。RPCI 日志和所有其他相关文件写入当前用户的应用程序数据文件夹,通常是 C:\Users(user)\AppData\Roaming\RpcInvestigator。要查看此文件夹,只需导航到“查看”->“日志”。但是,我们建议禁用跟踪以提高性能。

需要注意的是,RPCI 的位数必须与系统匹配:如果您在 64 位系统上运行 32 位 RPCI,则只能访问托管在 32 位进程或二进制文件中的 RPC 服务器(很可能没有)。

搜索 RPC 服务器

您首先要做的是查找系统上运行的 RPC 服务器。最直接的方法是查询 RPC 端点映射器,这是操作系统提供的持久服务。由于大多数本地 RPC 服务器实际上是 ALPC 服务器,因此此查询通过“文件”->“所有 RPC ALPC 服务器…”菜单项公开。

发现的服务器根据托管进程列在表格视图中,如上图截图所示。此表格视图是在 RPCI 中导航 RPC 服务器的起点之一。双击特定服务器将打开另一个选项卡,列出所有端点及其相应的接口 ID。双击端点将打开另一个选项卡,列出可以在该端点接口上调用的所有过程。右键单击端点将打开一个上下文菜单,提供其他有用的快捷方式,其中之一是创建一个新客户端以连接到此端点的接口。我们将在后续部分描述该功能。

您可以通过解析服务器的映像来查找其他未运行(或非 ALPC)的 RPC 服务器,方法是选择“文件”->“从二进制文件加载…”并定位磁盘上的映像,或选择“文件”->“从服务加载…”并选择感兴趣的服务(这将解析服务进程中加载的所有模块中的所有服务器)。

探索库

导航 RPC 服务器的另一个起点是加载库视图。库是一个文件,包含您在使用 RPCI 时发现的每个 RPC 服务器的序列化 .NET 对象。只需选择菜单项“库”->“服务器”以查看所有发现的 RPC 服务器,以及“库”->“过程”以查看所有服务器接口的所有发现过程。两个菜单项都会在新选项卡中打开。要在任一选项卡中执行快速关键字搜索,只需右键单击任何行并在文本框中键入搜索词。下面的截图显示了对“()”的关键字搜索,以快速查看具有零参数的过程,这些是实验接口的有用起点。

第一次运行 RPCI 时,需要填充库。为此,导航到“库”->“刷新”,RPCI 将尝试从所有具有注册 ALPC 服务器的进程的所有加载模块中解析 RPC 服务器。请注意,此过程可能需要相当长的时间并使用几百兆字节的内存;这是因为有数千个这样的模块,并且在此过程中二进制文件被重新映射到内存中,并咨询公共 Microsoft 符号服务器。更糟糕的是,Dbghelp API 是单线程的,我怀疑 Microsoft 的公共符号服务器有速率限制逻辑。

您可以定期刷新数据库以捕获任何新服务器。刷新操作只会添加新发现的服务器。如果您需要从头重建库(例如,因为您的符号错误),您可以使用菜单项“库”->“擦除”来擦除它,或手动删除当前用户的漫游应用程序数据文件夹中的数据库文件(rpcserver.db)。请注意,通过使用“文件”->“从二进制文件加载…”和“文件”->“从服务加载…”菜单项发现的 RPC 服务器会自动添加到库中。

您还可以通过选择“库”->“导出为文本”将整个库导出为文本。

创建新的 RPC 客户端

RPCI 最强大的功能之一是能够动态与正在运行的感兴趣的 RPC 服务器交互。这是通过在客户端工作台窗口中创建一个新客户端来实现的。要打开客户端工作台窗口,从库服务器或过程选项卡中右键单击感兴趣的服务器,然后选择“新建客户端”。

工作台窗口分为三个窗格:

  • 静态 RPC 服务器信息
  • 包含动态客户端输出的文本框
  • 包含客户端代码和过程选项卡的选项卡控件

客户端代码选项卡包含由 NtApiDotNet 生成的 RPC 客户端的 C# 源代码。代码已被修改以包含一个“运行”函数,这是客户端的“入口点”。过程选项卡是所选 RPC 服务器接口中可用例程的快捷参考,因为源代码可能浏览起来很麻烦(我们正在努力改进!)。

生成和运行客户端的过程很简单:

  1. 修改“运行”函数以调用 RPC 服务器接口公开的一个或多个过程;如果需要,可以打印结果。
  2. 单击“运行”按钮。
  3. 观察“运行”产生的任何输出

在上面的截图中,我选择了“主机网络服务”RPC 服务器,因为它公开了一些名称暗示有趣管理员功能的过程。通过几次对 RPC 端点的函数调用,我能够与服务交互,转储似乎与 Azure 容器隔离相关的默认虚拟网络的名称。

使用 ETW 数据嗅探 RPC 流量

RPCI 的另一个有用功能是它提供了对 RPC 相关 ETW 数据的可见性。ETW 是内置于操作系统中的诊断功能。多年前 ETW 非常简陋,但自从终端检测和响应(EDR)市场在过去十年中爆炸式增长以来,Microsoft 已将 ETW 发展为关于系统中正在发生的情况的极其丰富的信息源。ETW 的工作原理是,ETW 提供程序(通常是服务或操作系统组件)以“事件”数据包的形式发出结构良好的数据,应用程序可以消费这些事件来诊断性能问题。

RPCI 注册为 Microsoft-RPC(MSRPC)ETW 提供程序的此类事件的消费者,并以表格或图形格式实时显示这些事件。要启动 RPC 嗅探器工具,导航到“工具”->“RPC 嗅探器…”并单击工具栏中的“播放”按钮。随着事件开始到达,表格和图形都将每几秒更新一次。

MSRPC 提供程序发出的事件相当简单。事件记录客户端和服务器之间 RPC 调用的结果,在 RpcClientCall 和 RpcServerCall 开始和停止任务对中。开始事件包含有关 RPC 服务器接口的详细信息,例如协议、过程编号、选项和调用中使用的身份验证。停止事件通常不太有趣,但包括状态代码。通过关联特定 RPC 服务器和请求进程之间的调用开始/停止事件,我们可以开始理解系统上正在进行的操作。在表格视图中,当 ETW 数据按 ActivityId 分组时(单击工具栏中的“分组”按钮),更容易看到这些事件对,如下所示。

数据可能令人不知所措,因为 ETW 在设计上相当嘈杂,但图形视图可以帮助您筛选噪音。要使用图形视图,只需在跟踪期间的任何时间单击工具栏中的“节点”按钮。要切换回表格视图,再次单击“节点”按钮。

长时间运行的跟踪将产生一个繁忙的图形,如上所示。您可以平移、缩放和更改图形布局类型,以帮助深入挖掘有趣的服务器活动。我们正在探索改进此可视化的其他方法!

在上面的放大截图中,我们可以看到与系统服务(如基础过滤引擎(BFE,Windows Defender 防火墙服务)、NSI 和 LSASS)交互的各个服务进程。

以下是使用 RPC 嗅探器工具时需要记住的其他有用提示:

  • 在设置中保持 RPCI 诊断跟踪禁用。
  • 不要启用 ETW 调试事件;这些会产生大量噪音,并可能在几分钟后耗尽进程内存。
  • 为了最佳性能,使用 RPCI 的发布版本。
  • 考虑将主窗口停靠在嗅探器窗口旁边,以便您可以在 ETW 数据和库数据之间导航(右键单击表格行并选择“在库中打开”或在图形视图中单击任何 RPC 节点)。
  • 请记住,图形视图将每几秒刷新一次,如果您正在缩放和平移,可能会使您失去位置。图形视图的最佳用途是在固定时间窗口内进行捕获,并在捕获停止后探索图形。

下一步计划

我们计划在继续开发 RPCI 时完成以下工作:

  • 改进客户端工作台中的代码编辑器
  • 改进名称的自动生成,使其更直观
  • 引入更多开发人员友好的编码功能
  • 提高未在端点映射器注册的 RPC/ALPC 服务器的覆盖率
  • 引入自动化的 ALPC 端口连接器/扫描器
  • 改进搜索体验
  • 扩展图形视图以更具交互性

相关研究和进一步阅读

由于 MSRPC 十多年来一直是一个热门的研究话题,有太多相关的资源和研究工作无法在此一一列举。我们在构建此工具时遇到的一些如下:

  • @tiraniddo 的《使用 NtObjectManager 查找运行的 RPC 服务器信息》
  • @clearbluejar 的《从 NtObjectManager 到 PetitPotam,从 RpcView 到 PetitPotam 和 Windows RPC 发现工具调查》
  • Eviatar Gerzi 的《理解 Windows 容器通信》
  • Microsoft Learn 上的《RPC 安全要点》

如果您想查看其他相关 RPC 工具的源代码,我们列出了一些如下:

  • RpcView
  • RpcEnum
  • RpcMon
  • WindowsRpcClients

如果您不熟悉 RPC 内部结构或需要技术复习,我们建议查看该主题的权威来源之一,Alex Ionescu 2014 年在新加坡 SyScan 的演讲“所有关于您的 PC 中的 RPC、LRPC、ALPC 和 LPC”。

如果您喜欢这篇文章,请分享: Twitter LinkedIn GitHub Mastodon Hacker News

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计