此存储库包含 TeamViewer 中漏洞的利用概念证明,该漏洞使非特权用户能够将任意内核驱动程序加载到系统中。我要感谢零日倡议与他们的协调,以报告并负责任地披露该漏洞。
有关以这些漏洞结束的研究的详细信息可以在我的博客上的以下由三部分组成的博客系列中找到。它们更详细地介绍了这些漏洞,并显示了我在此过程中失败的地方。第三部分是有趣的部分:P。
可以在此处找到该漏洞利用的视频:
在连接到 SYSTEM 服务 IPC 时能够欺骗(只是博客中详细介绍的一些简单身份验证)有效的 TeamViewer 客户端后,就可以触发任意驱动程序安装。 TeamViewer 未验证正在安装的驱动程序的签名。
因此,借助 TeamViewer,可以将 USER 权限升级到 KERNEL。
最好的方法之一是使用众所周知的技术BYOD(自带易受攻击的驱动程序)将有效的签名驱动程序加载到 Windows 内核中,然后利用它从用户级别执行特权操作,例如更改任意的令牌与特权进程一起进行。
当 TeamViewer 安装在系统上时,它会创建一个作为 SYSTEM 运行的服务, TeamViewer_service.exe
该服务是客户完成某些任务的帮助者。因此,客户端不会以提升的权限运行,并且某些任务会委托给服务。
与服务(IPC)的通信是通过套接字实现的(使用Overlapped I/O和IoCompletionPort )。默认情况下,TeamViewer SYSTEM 服务在本地主机上侦听5939/tcp 。
TeamViewer不会过滤客户端发送来要求安装驱动程序或签名检查等的参数。
所以我们的想法是:我们将欺骗电视客户端,要求安装VPN 驱动程序,但指示另一个 INF。我重新利用了 TeamViewer 的相同原始 INF,但在另一个(非特权)路径中将“坏”驱动程序重命名为teamviewervpn.sys ,因为这是原始 INF 所针对的驱动程序名称。
这也绕过了 TeamViewer 选项“更改需要此计算机上的管理权限” 。
此检查仅通过 GUI 有效,因为当非特权用户单击按钮时, TeamViewer 选项会被禁用。但可以连接到套接字并执行任意驱动程序加载。
该漏洞利用与版本相关,因为客户端在 IPC 消息中指定了其 PID 和版本中的其他数据。客户端的版本必须与SYSTEM服务的版本匹配。必须将 Main.cpp 中的漏洞利用程序(第 140 至 143 行)修改为目标 TeamViewer_service.exe 版本。
因此,基本上,我们欺骗连接 SYSTEM 服务的 TeamViewer 客户端并请求安装任意驱动程序。 TeamViewer 服务请将其加载到内核中。
TeamViewer 还有另一个 IPC 消息,与我首先发现的第一个消息非常相似(单击“安装 VPN 驱动程序”时抛出)。另一条消息是安装打印机驱动程序。
因此,本质上,CVE-2024-7479 和 CVE-2024-7481 是相同的,但 TeamViewer 犯了两次相同的错误。尽管信息不同,但非常相似。他们有不同的 IPC Method Id 。
结果是一样的,可以加载任意驱动程序。