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