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