本文為看雪論壇優秀文章
看雪論壇作者ID:Cc28256
今年5月,微軟發布安全補丁以修補Windows 印表機後臺處理程序高危本地提權升級漏洞,編號CVE-2020-1048。它可以獲取系統管理員權限,甚至部署持久化後門,影響範圍自1996年以來發布(Windows NT 4)的所有Windows版本。
這個漏洞的核心原理在於Windows添加印表機時,對port name的檢查函數可以被繞過,設置為任意文件,因此我們可以把任意內容輸出到port name對應的系統文件(如某個dll)中,實現權限提升。經過補丁後,緊隨其後的CVE-2020-1337又有姿勢可以繞檢查。
Printers, Drivers, Ports
印表機至少有兩個要素:
1. 印表機埠
你可以認為它是現在的USB埠,甚至是TCP/IP埠(和地址),印表機可以列印到一個文件(在Windows 8及以上)。
2.印表機驅動程序
這曾經是一個內核模式組件,但是有了新的"v4"模型,這些都是在用戶模式下完成的,到現在已經超過十年。
由於以Spooler實施的服務Spoolsv.exe具有SYSTEM特權,並且可以通過網絡訪問,因此這兩個要素吸引了人們執行各種有趣的攻擊。
為了使標準用戶帳戶更容易使用,並且由於這些帳戶現在以用戶模式運行,只要驅動程序是一個 預先存在的,內置驅動程序,不需要任何特權就可以安裝一個列印驅動程序。
Add-PrinterDriver -Name "Generic / Text Only"
添加一個印表機埠:
Add-PrinterPort -Name "C:\windows\tracing\myport.txt"Get-PrinterPort | ft Name 可以查看到或者查看註冊表這個位置:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Ports
在peocessmointer監控中可以看到這個動作(發現測試幾次截圖時搞混了沒有原來的圖了,下面截圖中的C:\windows\test\test.txt實際上是C:\windows\tracing\myport.txt)
系統中添加一臺新印表機:
Add-Printer -Name "PrintDemon" -DriverName "Generic / Text Only" -PortName "c:\windows\tracing\myport.txt"
輸出到文件:
"Hello,Printer!" | Out-Printer -Name "PrintDemon"列印到內容在c:\Windows\tracing\myport.txt,我們找到這個文件查看一下:
hiew打開文檔會發現內容實際比我們輸入的要多,PowerShell認為這是實際的印表機。因此會按照文檔格式的邊距,為頂部邊距添加了幾行新內容。
讓我們重新創建新的文件C:\Windows\System32\Ualapi.dll,這個位置因為需要特特殊的權限所以會被阻攔 這個函數會使Windows print spooler服務對埠的合法性校驗,當前用戶無法將其設置為一個自己不具有訪問權限的路徑創建文件時,會檢查Token權限進行驗證,同時IDA中也能找到這段代碼:
但是只有當用戶選擇了「列印到文件」選擇框,在列印對話框中可以看到。
Client Side Port Check Vulnerability
(CVE-2020-1048)PowerShell使用add-printer命令在底層則是直接調用XcvData函數,這個函數可以將port name設置為任意文件而不被檢查。就是這麼簡單,UI對話框具有檢查功能,而PowerShell的WMI列印提供程序模塊則沒有。
只需Add-PrinterPort -Name c:\Windows\system32\ualapi.dll在PowerShell窗口中執行即可。
經過補丁後,緊隨其後的CVE-2020-1337又有姿勢可以繞檢查。https://github.com/math1as/cve-2020-1337-exploitpowershell -ep bypass -F C:\CVE-2020-1337-exploit-master\exploit.ps1在查看了公布的腳本文件可以發現它的命令也是非常的簡單,在執行上述過程中添加了一條命令創建一個系統目錄軟聯接:cmd /c mklink /J c:\users\test\mytarg5 C:\Windows\system32無論是AddPort還是修復後的XcvData函數進行檢查時,都是判斷當前用戶是否具有對目標路徑的訪問權限的。
將port name指向c:\users\test\myfolder\xxx.dll,通過檢查後,再將mytarg5作為一個軟連結重定向到目標的系統路徑中,即可完成對補丁的繞過。
創建一個軟連接,將文件列印位置改為c:\users\test\mytarg5,便會在C:\Windows\system32下成功創建ualapi.dll。
首先能夠將這位置釋放文件所以我們就要想盡辦法利用上,顯然容易受到dll劫持嘗試攻擊的服務第一個突破口。
運行Process Monitor,啟動所有服務進行嘗試,不過我們要在做的時候需要一些限制,我們現在想提高特權。因此,我們需要尚未啟動的服務或者尋找一個可以被標準用戶停止的服務。
啟動服務通常需要管理權限,這不是我們想要的,通過accesschk工具我們可以很方便的獲取所有服務的權限:
accesschk.exe -c * -L > servsddl.txt[0] ACCESS_ALLOWED_ACE_TYPE: Everyone SERVICE_QUERY_STATUS SERVICE_START現在讓我們啟動FAX服務,並通過ProcessMonitor監控他:在啟動列印這個服務時,他會嘗試尋找ualapi.dll。
所以我門將這個dll放置到這個位置,然後驚喜的發現,啟動spoolsv時會發現也會尋找這個dll:經過對比他們都有相同的尋找ualapi.dll的代碼,在下面的IDA中可以看到,該服務使用GetProcAddress查找ualapi.dll一些導出:
既然能夠加載我們先前釋放的動態庫,dllmain中就可以執行我們想要執行的代碼,從github上拿到的示例運行(運行在windows10系統上),他釋放了一個PE在system32下,代碼也非常簡單的運行whoami查看權限。執行後權限是system,這就代表你能做很多事情。正當我想著如何利用dll被加載起來後,驚喜的在後面的代碼中發現,在spoolsv.exe中也有調用導出函數,這只需要我們稍微構造一下,就能製造一個永久後門,即使補丁修正後它依然存在。如果你不幸被該漏洞利用了,由於即使補丁修正後它依然存在,所以你需要在PowerShell中掃描所有基於文件的埠,查看HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Ports其中包含文件路徑的任何埠,尤其是以.DLL或擴展名結尾的埠。這是一個非常容易利用的漏洞,你完全可以將一份後門代碼構造出現在spoolsv.exe的調用中。
https://github.com/math1as/cve-2020-1337-exploit
https://github.com/ionescu007/faxhell
https://mp.weixin.qq.com/s/LLzIlKrrfpJuk6CGBRZMvw
https://windows-internals.com/faxing-your-way-to-system/
https://windows-internals.com/printdemon-cve-2020-1048/
看雪ID:Cc28256
https://bbs.pediy.com/user-845934.htm
*本文由看雪論壇 Cc28256 原創,轉載請註明來自看雪社區。