如果没有看过第一部分的读者,可以先从第一部分看起:
寻找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 选项会被禁用。但可以连接到套接字并执行任意驱动程序加载。
重要说明 II
重要说明 II
该漏洞利用依赖于版本,因为 IPC 消息中客户端指定了其 PID 及其他数据,包括版本。
客户端的版本必须与 SYSTEM 服务的版本匹配。漏洞利用需要在 Main.cpp 的第 140 行到第 143 行进行修改,以匹配目标 TeamViewer_service.exe 的版本。
编码漏洞利用
我们将首先定义所涉及的 IPC 消息结构。
我们将用它通过 TV IPC 协议通过套接字发送必要的消息。
我们还需要 MD5 实现,关于这一部分我将略过。我还使用了以下 hpp 文件进行十六进制输出打印。
https://github.com/zmb3/hexdump/blob/master/Hexdump.hpp
首先,我们将开始连接到套接字。
我决定不使用完成 I/O 端口或重叠 I/O。从技术上讲,TeamViewer 就像其他套接字一样在监听,因此我将正常连接。
一旦我们连接到 5939/tcp,我们需要发送第一条消息,即客户端发送的第一次认证消息,其中包含挑战
IPC_CLIENTE_CHALLENGE_AUTH ipcClientAuth1 = {
{ 0x08, 0x00, 0x01, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x2d, 0x02, 0x09, 0x10, 0x00, 0x00, 0x00 },
{ 0xb7, 0x48, 0x77, 0x26, 0x8a, 0x72, 0xb8, 0xf0, 0xfe, 0x57, 0x04, 0x03, 0xfc, 0x64, 0x2e, 0xb0 },
{ 0xfe, 0x01, 0x00, 0x00, 0x00, 0x01 }
};
在此上下文中,我们定义了一个IPC消息,以启动与TeamViewer的身份验证流程。客户端挑战消息会发送到服务器以开始认证。由于我们使用的是一个静态挑战(在此为一个16字节的数组),这样可以简化流程,因为服务器会返回其挑战及预期的响应。
一旦我们接收到服务器的挑战,就可以通过使用服务器的挑战和已知的静态密钥进行MD5哈希计算出正确的响应。下一步是构造正确的响应并将其返回给服务器以完成身份验证。
然后将计算出的响应发送到身份验证消息中。
现在是发送控制 IPC 消息的时候了,表明进程的 PID。
如我在第一部分中提到的,我没有去反向解析消息中的其他字段,但只要指定正确的 PID,并在最后加上一个正确的标识符就足够了。
之后,服务会向我们发送一些关于配置的消息,并尝试同步某些配置。我们只需要读取这些数据包,但无需对这些信息进行任何处理。
接下来就是最有趣的部分了。我们已经准备好发送驱动安装请求。
重要提示
我尚未分析其原因,但似乎并不是所有路径都有效。起初我以为是路径长度的问题,但在尝试了不同长度后,发现有的路径能成功,有的则不能。我猜可能是因为我做了太多测试,导致服务有点混乱。最终,我使用了以下路径,这个路径默认情况下可以由非管理员用户在Windows中创建:
C:Not Program FaaaaaaaaaabbbAnotherThingg.inf
在IPC消息中,长度只计算正文数据的长度,不包括头部。同时,它也不包括空字节的两个字节(因为是宽字符串)。
IPC消息不以空字符结束字符串。因此,我们需要在计算当前长度时考虑这些因素。
接下来,我们就可以发送这个“魔法”消息了 🙂 。
提升到内核权限
起初,我认为我们可以使用 INF 文件创建一个以 SYSTEM 身份运行的任意服务,从而提升权限。但 TeamViewer 的辅助程序最终调用了 UpdateDriverForPlugAndPlayDevicesA,而没有进行签名(目录文件)的验证。
https://learn.microsoft.com/en-us/windows/win32/api/newdev/nf-newdev-updatedriverforplugandplaydevicesa
此函数根据硬件 ID 更新现有硬件的 INF 文件。我尚未找到执行任意服务创建的方法。
尽管如此,这里有一个示例 INF 文件。
; ExampleService.inf
; INF file to create a service that executes a binary as SYSTEM
[Version]
Signature="$WINDOWS NT$"
Class=Service
ClassGuid={4D36E97D-E325-11CE-BFC1-08002BE10318}
Provider=%ProviderName%
DriverVer=06/16/2024,1.0.0.0
[DestinationDirs]
DefaultDestDir = 12 ; DIRID_DRIVERS
[SourceDisksNames]
1 = %DiskName%,,,""
[SourceDisksFiles]
ExampleService.exe = 1
[Manufacturer]
%ManufacturerName%=Example,NTx86,NTamd64
[Example.NTx86]
%ServiceName%=ExampleService_Install, RootLEGACY_ExampleService
[Example.NTamd64]
%ServiceName%=ExampleService_Install, RootLEGACY_ExampleService
[ExampleService_Install]
CopyFiles = ExampleService_CopyFiles
AddService = ExampleService, 0x00000002, ExampleService_Service_Inst
[ExampleService_CopyFiles]
ExampleService.exe
[ExampleService_Service_Inst]
DisplayName = %ServiceName%
ServiceType = 0x10 ; SERVICE_WIN32_OWN_PROCESS
StartType = 2 ; SERVICE_AUTO_START
ErrorControl = 1 ; SERVICE_ERROR_NORMAL
ServiceBinary = %12%ExampleService.exe
StartName = LocalSystem
[Strings]
ProviderName="Example Provider"
ManufacturerName="Example Manufacturer"
ServiceName="Example Service"
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。
然后我们启动我们的漏洞利用程序,驱动程序就被加载了。
我们可以利用这个易受攻击的驱动程序来提升权限。
我们将复制PID 4的主访问令牌,即SYSTEM进程的令牌。
太好了,我们现在是SYSTEM
用户到内核
如果你想测试并加载另一个驱动,请记得删除我们从Windows CAT Store安装的驱动。
-
C:Windowssystem32>pnputil -enum-drivers
-
C:Windowssystem32>pnputil -delete-driver oem13.inf -force -uninstall
Thanks
thanks for https://pgj11.com/posts/Finding-TeamViewer-0days-Part-3/
本系列已经完结,很精彩的利用过程,如果想看更多有趣的内容,欢迎持续关注本公众号!
往期推荐
寻找 TeamViewer 0day 漏洞(二):逆向身份验证协议
寻找TeamViewer 0day漏洞—第一部分:故事的开始
至暗时刻!Linux 史诗级核弹0day EXP公开
Android活动(Activities)Exploiting 技术
点个
原文始发于微信公众号(一个不正经的黑客):找到 TeamViewer 0day漏洞- 第三部分:完整利用