Windows NT LAN Manager (NTLM)安全特征繞過漏洞
微軟在本月的微軟補丁日修復了一個Windows NT LAN Manager (NTLM)安全特征繞過漏洞。該漏洞CVE編號為CVE-2021-1678,CVSS評分為4.3分。攻擊者利用該漏洞可以中繼NTLM 認證會話到攻擊者的機器,使用printer spooler MSRPC 接口來在被攻擊的機器上遠程執行代碼。
NTLM中繼攻擊是中間人攻擊的一種,攻擊者利用該攻擊可以訪問網絡來攔截客戶端和服務器之間合法的認證流量,并對經過驗證的認證請求進行中繼以訪問相關的網絡服務。
Print Spooler 權限提升
漏洞利用中,攻擊者使用了來自特權用戶賬戶的NTLM 會話來執行一系列的RPC 操作。整個漏洞利用的步驟如下所示:
(1) 建立于攻擊者控制的中繼機器的NTLM 會話;
(2) 攻擊者綁定目標的IRemoteWinspool 接口,選擇RPC_C_AUTHN_LEVEL_CONNECT的認證級別;
(3) 攻擊者通過建立的RPC 信道來中繼NTLM 認證;
(4) 執行一系列的RPC命令:
- RpcAsyncInstallPrinterDriverFromPackage (Opnum 62) — 安裝“Generic/Text”打印機驅動;
- RpcAsyncOpenPrinter (Opnum 0)
- RpcAsyncXcvData (Opnum 33) — 添加端口
- RpcAsyncAddPrinter (Opnum 1) — 用前面提到的驅動添加打印機;
- RpcAsyncStartDocPrinter(Opnum 10) — 打開新文檔;
- RpcAsyncWritePrinter (Opnum 12) — 在新文檔中寫入內容。
圖 CVE-2021-1678漏洞利用流圖
補丁分析
微軟在補丁中對定時任務服務使用的IfCallback 加入了檢查,同時對RPC運行時間沒有太大的影響。研究人員逆行了Spoolsv.exe中IRemoteWinspool的實現,發現了一個名為RpcManager::VerifyRpcValidProtocolSequence 的共享函數,該函數被多個不同的RPC 接口所使用,其中就包括IRemoteWinSpool。
本來該函數會驗證ncacn_ip_tcp協議序列是否用于IRemoteWinspool,以確保只有遠程的TCP/IP 客戶端才會被接受。但是,在認證安全級中沒有相關的檢查。
在補丁中,二進制文件中加入了一個新的IfCallback 函數,偽代碼如下所示:
圖 安裝補丁后IRemoteWinspool使用的新的RPC 驗證流
從中可以看出,驗證協議序列的調用被擴展了,如下所示:
圖 安裝補丁后安全級別驗證
如上圖所示,HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print key中的REG_DWORD value RpcAuthnLevelPrivacyEnabled 必須設置為1,否則其他的檢查就不會執行,系統仍然會受到攻擊。
更多技術細節參見:https://www.crowdstrike.com/blog/cve-2021-1678-printer-spooler-relay-security-advisory/