符号链接几乎自 Windows 系统诞生之日起就已存在。然而,很少有攻击性安全课程会讲解它们,尽管符号链接潜力巨大,如果运气好的话,你甚至可能获得本地可执行文件 (LPE)!本文将详细介绍符号链接及其使用方法,并清晰地展示滥用符号链接获取本地可执行文件 (LPE) 的逻辑。
什么是符号链接?
因此,符号链接允许您从一个对象指向另一个对象。字面意思:一个符号链接示例可以指向文件1.txt。Windows中有不同类型的符号链接。让我们仔细看看它们。
- NTFS(软链接)——允许您从一个文件链接到另一个文件。要创建软链接,您需要管理员权限、SeCreateSymbolicLinkPrivilege权限或启用 Windows 开发人员模式。您可以使用以下方式创建此类链接:
#cmd.exemklinklink.txtorig.txt#winapiBOOLEANCreateSymbolicLinkA([in]LPCSTRlpSymlinkFileName,[in]LPCSTRlpTargetFileName,[in]DWORDdwFlags);
软链接示例
- 硬链接——也允许您将一个文件链接到另一个文件,但仅限于同一驱动器内。创建硬链接需要 FILE_WRITE_ATTRIBUTES 权限。您无法链接到目录。您可以在此处阅读有关软链接和硬链接的更多信息。您可以使用以下方式创建硬链接:
# cmd.exemklink /H link.txt orig.txt# ZwSetInformationFilehttps://github.com/googleprojectzero/symboliclink-testing-tools/blob/00c0fe4cefcd2a62c887fe6117abc02bc98bb9fb/CommonUtils/Hardlink.cpp#L20
硬链接示例
注册表链接 - 允许您从一个注册表项链接到另一个注册表项,需要 KEY_CREATE_LINK+KEY_CREATE_SUB_KEY 权限才能创建,并且您无法在某些配置单元之间创建符号链接。例如,您无法创建从HKCUXXXX到HKLMXXXX 的符号链接。
# Creation using NtCreateKey()https://github.com/googleprojectzero/symboliclink-testing-tools/blob/main/CommonUtils/RegistrySymlink.cpp#L121
注册表符号链接示例
如你所见,几乎所有符号链接都需要相当高权限的帐户。那么如何提升权限呢?
这里我们来讨论另外两种不太流行的符号链接类型。
- NTFS 挂载点 — 这是从一个文件夹到另一个文件夹的符号链接。可以代表低权限帐户创建。成为符号链接的目录(示例中为Dir-link)必须为空,并且我们必须对其具有写权限。您可以使用以下方式创建此类链接:
# cmd.exemklink /J Dir-link Directory# DeviceIoControl()https://github.com/googleprojectzero/symboliclink-testing-tools/tree/main/CreateMountPoint
NTFS 挂载点示例
- 对象管理器符号链接 - 允许您在对象管理器命名空间内创建符号链接。作为低权限用户,您可以在RPC Control和BaseNamedObjectsRestricted命名空间中创建符号链接。
# NtCreateSymbolicLinkObject()https://github.com/googleprojectzero/symboliclink-testing-tools/tree/main/NativeSymlink# DefineDosDevice()https://github.com/googleprojectzero/symboliclink-testing-tools/tree/main/CreateDosDeviceSymlink
对象管理器符号链接示例
您可以在此处阅读有关对象管理器的更多信息。为了实现 LPE,我们将使用这两种类型的符号链接。
任意文件删除示例
我们来看一个例子。假设我们知道某个文件正在执行一些可能导致本地权限提升 (LPE) 的操作,并且我们想用符号链接替换它。
使用 NTFS 挂载点 + 对象管理器符号链接示例
假设某个 Windows 服务执行了删除文件C:Tempabcfile.txt的操作。我们想用低权限账户将此文件替换为C:Windowscontrolled.txt 。此外,我们拥有目录C:Tempabc和file.txt文件本身的完全权限,但对文件controlled.txt 没有权限。
在这种情况下,我们采取如下措施:
创建从RPC Controlfile.txt到C:WindowsControlled.txt 的对象管理器符号链接。
2. 之后,我们从C:Tempabc(不要忘记删除C:Tempabc中的所有文件)到 RPC Control 创建一个 NTFS 挂载点;
3.我们看到C:Windowscontrolled.txt被成功删除!
它是如何工作的?首先,执行删除操作的高权限服务会在文件C:Tempabcfile.txt上调用类似 DeleteFile() 的方法。但是,此文件不存在。而C:Tempabc指向RPC Control。因此,会访问RPC Controlfile.txt。这也是一个符号链接,只不过它指向C:Windowscontrolled.txt。这会导致服务跟踪两个符号链接,最终删除的不是所需的C:Tempabcfile.txt,而是C:Windowscontrolled.txt。这就是漏洞的具体表现:)它被称为任意文件删除。
更加任意的文件操作
因此,漏洞利用的一般逻辑如下。我们创建两个符号链接,然后重定向特权服务的执行流,强制其对我们需要的文件执行某些操作。
滥用逻辑
您可以在以下 CVE 上看到任意文件删除的示例:
- CVE-2020-0683 — Windows MSI“安装程序服务”权限提升;
- CVE-2023–21800 — Windows 安装程序 EOP;
- CVE-2024–29404 — Razer EOP。
然而,除了删除之外,你还可能遇到复制操作、创建文件、移动文件、覆盖等操作。我整理了以下 POC 来演示这些场景。
- CVE-2024-26238 — Windows 10 PlugScheduler EOP。任意创建;
- CVE-2024–12754 — AnyDesk LPE。任意复制;
- CVE-2024-37726 ——MSI Center 任意文件覆盖漏洞;
- CVE-2024–21111 — Oracle VirtualBox 本地可执行文件扩展名 (LPE);
- CVE-2020-1076 — VaultSvc 中的任意文件写入。
如何发现这个漏洞?
查找此类漏洞最简单的方法是使用进程监视器。操作方法如下:像我一样设置,然后监视文件操作,并检查哪些文件可以用符号链接替换。
进程监视器设置(选项 -> 选择列)
例如,当我们在 Anydesk 中调查本地执行权限提升 (LPE) 时,我们发现该操作正在对文件C:users<username>AppDataRoamingMicrosoftWindowsThemes<wallpaper>.png执行,而我们对该文件拥有完全控制权。之后,该文件被复制到C:WindowsTemp<wallpaper>.png 中。
文件操作示例
然后,你需要确定上下文,即代表谁执行特权操作。在我们的例子中,是NT AUTHORITYSYSTEM,这导致了本地可执行文件漏洞 (LPE)。
特权文件操作
因此,我们只需要对我们控制的文件执行特权文件操作,然后用符号链接替换该文件即可。但是如何触发这个特权文件操作呢?这里我提供了几种方案。
- 向驱动程序发送 IOCTL——您可以尝试触发驱动程序对您控制的文件执行文件操作;
- 批量创建 COM 对象——初始化时,COM 对象可以使用不同的文件,同时代表 NT AUTHORITYSYSTEM 运行;
- MSI 包安装— 在安装 MSI 包期间可能会使用不同的文件;
- GUI/RPC/ALPC——最后,您可以尝试通过它提供的 IPC 接口与目标应用程序进行交互。
任意文件删除
让我们仔细看看这个漏洞。例如,过去如何利用任意文件删除漏洞滥用杀毒软件。
AV滥用示例
因此,我们有一个以 NT AUTHORITYSYSTEM 权限运行的防病毒服务。黑客将一个恶意的 EICAR 文件放置在设备磁盘上。然后,它开始循环检查“上次访问时间戳”,试图检测对其文件的访问。防病毒软件访问该文件,识别出恶意文件,然后尝试将其从磁盘中删除。然而,此时黑客用一个符号链接替换了他的文件,该符号链接通过连接 NTFS 挂载点和对象管理器符号链接,指向一个对防病毒软件本身至关重要的文件。这就是防病毒软件自我删除的过程
那么一旦我们实现了任意文件删除,我们能做什么呢?
这里有一个更通用的选项——尝试删除一些 DLL 库。然后在其位置编写自己的加载程序。重点关注搜索顺序劫持和 DLL 重定向机制。然而,这种情况略微复杂。考虑一种更简单的方法——滥用Windows Installer Rollback。此方法允许你从任意文件删除原语中获取系统 Shell。
Windows Installer Rollback 滥用
该机制基于以下事实:删除 C:Config.msi 文件夹,编写自己的恶意 MSI 文件,并调用 Rollback 机制,从而导致这些文件被执行。您可以在以下 CVE 中更详细地了解此机制:
- CVE-2023–27470 — Take Control Agent 7.0.41.1141 LPE;
- CVE-2023-20178 — Cisco Secure Client(在 5.0.01242 上测试)和 Cisco AnyConnect(在 4.10.06079 上测试)中的任意文件删除漏洞;
- CVE-2022–30206 — Windows 打印后台处理程序特权提升漏洞。
有趣的事实
说实话,我对主流热门的攻击性安全课程竟然忽视了符号链接滥用这一主题感到非常惊讶。而且,这个漏洞并非空穴来风。就在几个月前,又注册了一个与符号链接滥用相关的 CVE。点击此处阅读相关研究。
任意文件创建/复制&&一些技巧
那么,如果你可以控制文件的创建或复制,而不是删除它,会怎么样呢?在这种情况下,我建议使用两种方法来应对滥用:
- 更通用的选择:尝试为某些服务写入新的配置文件,为系统范围的启动写入脚本或者使用DLL重定向机制(创建.local文件);
- 然而,DiagHub 服务存在潜在漏洞,允许我们从 C:WindowsSystem32 加载任意库。因此,请尝试将你的库写入此路径并触发该服务。你可以在这里和这里了解更多信息。
DiagHub 易受攻击的接口定义
DiagHub 初始化和滥用
然而,在利用过程中,你可能会遇到一个问题——目标应用程序在复制或创建文件之前会进行检查。在这种情况下,请查看BaitAndSwitch存储库。该存储库允许你执行“检查时间-使用时间”(TOCTOU)攻击。
它由什么组成?首先,我们创建一个符号链接,但它指向一个正在被检查的合法文件。然后,OpLock被安装在这个合法文件上。OpLock 允许你跟踪对合法文件的请求。一旦目标服务请求合法文件,OpLock 就会被触发,我们的符号链接就会从合法文件变为恶意文件。
TOCTOU 滥用示例
这是滥用任意复制或任意文件创建时可以使用的第一个技巧。
第二个技巧是覆盖 DACL。在 AnyDesk 中编写本地执行权限提升 (LPE) 的 POC 时,我们曾使用过这种方法。我们遇到过以下情况:我们可以将任意系统文件复制到C:WindowsTemp文件夹,但这些文件会连同其原始 DACL 一起复制。因此,我们无法读取这些文件。然而,我们只是在C:WindowsTemp文件夹中重新创建了目标文件,漏洞服务却意外地执行了任意覆盖操作,而不是任意复制。在这种情况下,使用的是原始 DACL,也就是我们自己创建的文件。这样,我们就可以毫无问题地读取我们自己的文件。
覆盖 DACL 示例
您可以在此处阅读更多相关信息https://mansk1es.gitbook.io/AnyDesk_CVE-2024-12754。
任意文件覆盖/移动
值得注意的是,如果你已经实现了移动或覆盖原语,滥用的方法与任意复制或创建的方法并无二致。此外,还需要考虑编写 DLL 库或使用 DiagHub。
你知道重命名可以移动文件吗?让我们仔细看看。假设我们有一个特权服务,它执行从C:abcprivate.txt到C:xyzpublic.txt 的重命名操作。在这种情况下,我们控制两个文件:private.txt 和 public.txt。
重命名为移动...
在这种情况下,我们可以创建两个符号链接:一个名为 private.txt,另一个名为 public.txt。它们将指向我们需要移动的文件。例如,private.txt 将指向恶意 DLL 库C:hackpwn.dll,而我们希望将其写入路径C:LegitServiceLegit.Dll。相应地,public.txt 应该指向C:LegitServiceLegit.dll。这样,当服务想要将C:abcprivate.txt重命名为C:xyzpublic.txt时,它会将C:hackpwn.dll重命名为C:LegitServiceLegit.dll 。您可以点击此处阅读有关此绝妙技术的更多信息。
任意目录创建
还有更复杂的方法。例如,当你能够控制正在创建的文件夹时。在这种情况下,你可以尝试将其解构为任意读取系统文件。
从任意目录创建到任意文件读取
在这种情况下,您应该创建一个具有特殊名称的文件夹,例如c_1337.nls,并将其转换为指向所需文件的 NTFS 挂载点。是的,是文件,而不是文件夹。我们将使用国家语言支持服务 (National Language Support service),该服务使用一个特殊的系统调用,允许您将 NTFS 挂载点的符号链接转换为文件。之后,我们触发国家语言支持服务,将目标文件映射到共享内存。我们所要做的就是通过其特征名称在内存中找到所需的文件。您可以在此处找到 POC,并在此处找到原始研究。
指向 UAC 滥用的符号链接
您可以使用符号链接绕过 UAC!值得注意的是,此方法仅适用于搭载 Intel 处理器的系统。要利用此方法,您需要找到 ShaderCache 文件夹,删除其中的所有文件,创建 NTFS 挂载点,实现随机覆盖原语,并编写您自己的 DLL。
使用符号链接绕过 UAC
您可以在此处找到原始研究https://g3tsyst3m.github.io/uac%20bypass/Bypass-UAC-via-Intel-ShaderCache/。
辩护笔记
那么,如何保护自己免受符号链接滥用呢?我认为有两个选择:
- RedirectionTrust — 系统不会遵循 IL 较低的用户创建的符号链接;
启用 RedirectionTrust 示例
POC用于查找正在运行的进程中的 RedirectionTrust 机制。 https://gist.github.com/MzHmO/09b5ea312efcd4bd9cc25b7facd4ded4
- 模拟 — 您的服务必须使用低权限用户令牌进行文件操作。您可以使用特殊函数(例如ImpersonateLoggedOnUser ())来使用其他人的令牌。
另外,请查看此漏洞阻止程序。 https://github.com/shubham0d/SymBlock
原文始发于微信公众号(Ots安全):我们走错路了!如何在 Windows 中滥用符号链接获取本地权限提升 (LPE)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论