该仓库包含 TeamViewer 中一个漏洞的利用概念验证,该漏洞允许无特权的用户将任意内核驱动程序加载到系统中。我要感谢 Zero Day Initiative 与我协调,以负责任的方式报告并披露此漏洞。

关于最终导致这些漏洞的研究细节,可以在我的博客上找到以下三部分系列文章。它们更详细地介绍了这些漏洞,并展示了我在过程中失败的地方。第三部分是最有趣的部分 :P。
利用视频可在此处查看:
在能够伪造(如博客中详述的,仅需一些简单的身份验证)一个有效的 TeamViewer 客户端连接到 SYSTEM 服务 IPC 后,就可以触发任意驱动程序的安装。TeamViewer 没有验证正在安装的驱动程序签名。
因此,通过 TeamViewer,可以实现从 USER 到 KERNEL 的权限提升。
最佳方法之一是使用众所周知的 BYOD(自带易受攻击驱动程序) 技术,将一个有效签名的驱动程序加载到 Windows 内核中,然后利用它从用户级别执行特权操作,例如将任意进程的令牌替换为特权令牌。
当 TeamViewer 安装在系统上时,它会创建一个以 SYSTEM 身份运行的服务 TeamViewer_service.exe。
此服务是客户端的辅助工具,用于执行某些任务。因此,客户端不以提升的权限运行,某些任务会委托给该服务。
与服务(IPC)的通信通过套接字实现(使用 Overlapped I/O 和 IoCompletionPort)。默认情况下,TeamViewer SYSTEM 服务在 localhost 上监听 5939/tcp。
TeamViewer 没有过滤客户端发送的用于请求驱动程序安装或签名检查等参数。
因此,思路是:我们将伪造一个 TV 客户端,请求安装 VPN 驱动程序,但指定另一个 INF 文件。我复用了 TeamViewer 的原始 INF 文件,但将其放在另一个(非特权)路径下,并将“恶意”驱动程序重命名为 teamviewervpn.sys,因为这是原始 INF 文件所指的目标驱动程序名称。
这也绕过了 TeamViewer 的选项 此计算机上的更改需要管理员权限。
此检查仅通过 GUI 有效,因为当非特权用户点击按钮时,TeamViewer 选项 会被禁用。但连接套接字并执行任意驱动程序加载是可能的。
该利用程序依赖于版本,因为 IPC 消息中客户端指定了其 PID 以及版本中的其他数据。客户端的版本必须与 SYSTEM 服务的版本匹配。需要在 Main.cpp 的第 140 到 143 行修改利用程序,以匹配目标 TeamViewer_service.exe 的版本。
因此,基本上,我们伪造一个 TeamViewer 客户端连接到 SYSTEM 服务,请求安装任意驱动程序。TeamViewer 服务会友好地将其加载到内核中。
TeamViewer 还有另一个与第一个(点击 安装 VPN 驱动程序 时触发)非常相似的 IPC 消息。该消息用于安装 打印机驱动程序。
因此,本质上,CVE-2024-7479 和 CVE-2024-7481 是相同的漏洞,但 TeamViewer 犯了两次同样的错误。这些消息虽然不同,但非常相似。它们具有不同的 IPC 方法 ID。
结果相同,可以加载任意驱动程序。