在這篇文章中,我們將教大家如何利用Windows系統中的一個功能來繞過Windows 10的用戶組策略。雖然繞過用戶組策略並不意味着就是“世界末日”了,但是這畢竟是一種違規的危險操作,而且根據不同的用戶組策略配置,這種繞過行爲也會產生不同的安全後果。目前,我們已在Windows 7和Windows 10 64位企業版(10.18363 1909)中進行了測試,而且利用過程不需要管理員權限。這種技術跟系統在用戶登錄時對用戶賬號註冊表的加載過程有關,因此我們首先需要了解Windows賬號的登錄過程。

用戶登錄

當用戶登錄一個Windows賬號時會發生很多事情,其中一個就是爲該賬號加載用戶定義的設置。這些設置是從用戶的註冊表配置單元中加載的,也就是HKEY_CURRENT_USER下的子項。這個註冊表項中包含的都是操作系統以及各種已安裝應用程序中與用戶相關的配置。這個註冊表項其實是存儲在文件系統中的一個文件,路徑爲“%USERPROFILE%\NTUSER.dat”。當用戶登錄時,ProfSvc(用戶屬性服務)會定位這個文件,並調用 NtLoadKeyEx 來加載註冊表配置單元。如果用戶想要在登錄會話期間修改註冊表鍵,則必須通過相應的微軟API來實現,而且還會檢測相應註冊表鍵的修改權限。

問題分析

如果我們在啓用了”boot logging”功能之後運行ProcMon,就會發現目標設備的ProcMon服務有一個非常有趣的行爲:

ProfSvc在加載“%USERPROFILE%\NTUSER.dat”之前,只會檢測 “%USERPROFILE%\NTUSER.man”文件是否存在。那麼,“NTUSER.man”是什麼呢?它其實跟“NTUSER.dat”類似,但它主要針對的是“ 強制配置文件 ”。因爲非管理員賬號擁有“%USERPROFILE%”路徑的寫入權限,因此我們可以通過自己構造的“NTUSER.man”來實現我們的目的。

繞過用戶組策略

組策略 是Windows系統提供的一種功能,它允許域管理員在主機級別或用戶級別配置用戶組策略。針對用戶策略,相關設置會被在用戶登錄時推送至一個域用戶的賬號中,並存儲在“%USERPROFILE%\NTUSER.dat”中。這些用戶策略對域用戶只讀,以避免被篡改。

因爲我們可以直接替換整個相關的註冊表項,所以就可以繞過或者修改“被保護的”強制用戶組策略了。

爲了實現這個目的,我們只需要做以下幾件事情:

1、製作我們自己的用戶相關注冊表項-“NTUSER.man”;
2、移除或替換註冊表項中相應策略的鍵值;
3、將該文件存放到目標主機的“%USERPROFILE%”目錄中;
4、註銷並重新登錄;

組策略規則更新與覆蓋修改

如果你瞭解Windows的組策略,你就會知道系統在用戶登錄時會重新同步並應用當前已修改的組策略,但此時我們修改過的策略很可能會被覆蓋掉。雖然我們可以通過將“SYSTEM”從構造註冊表鍵值的ACL中移除來避免這種情況,但是Windows組策略客戶端-GpSvc將會檢測到這種操作,並在用戶登錄時修復ACL以便獲取到寫入權限,然後重寫組策略。

通過分析GpSvc對這種ACL的處理過程,我發現當GpSvc在檢測到註冊表中的組策略鍵值時,會調用內部函數ForceRegCreateKeyEx,這個函數會嘗試利用寫入權限來打開我們的組策略鍵值,如果失敗,則會調用AddPolicyPermissionOnKey來獲取該註冊表項的相應權限,以恢復“SYSTEM”在該表項上的寫入權限,並重新打開它然後覆蓋組策略。

通過分析AddPolicyPermissionOnKey函數,我們發現該函數會修改註冊表子項的ACL並添加“SYSTEM”角色,不過並不會刪除已有的ACL項。這樣的話一切就很明朗了,整個利用過程如下:

上圖中左側爲域控制器,右側爲該控制器所連接的主機。我們可以看到,域控制器在用戶組策略中設置了“Remove Task Manager”規則,並且應用到了我們的域用戶主機中。接下來,當我們在“%USERPROFILE%”目錄中存放了特製的“NTUSER.man”文件後,用戶的註銷或登錄操作將不會再讓這個規則生效。

漏洞利用PoC

注意事項:漏洞利用PoC可能會損壞你現有的Windows賬號,請不要在擁有管理員權限的域主機中執行。除此之外,我們也不建議大家在個人PC上測試,而且不要使用Administrator賬號測試,因爲測試完成後我們需要使用該賬號來刪除“NTUSER.man”文件。

第一步:構造NTUSER.man

1、準備一臺測試用的Windwos主機,然後拿到一個擁有管理員權限的賬號,把任意用戶對應的“%USERPROFILE%\NTUSER.dat”文件拷貝到另一個目錄中。

2、在Administrator賬號中打開註冊表編輯器(regedit.exe),將註冊表項“HKEY_LOCAL_MACHIN”備份好,然後點擊“文件”-“加載配置單元”。

3、打開新加載的註冊表項,在響應的策略註冊表項路徑下清除或者添加任意策略。比如說,很多的用戶策略會存放在“\Software\Microsoft\Windows\CurrentVersion\Policies\”路徑下。

4、在註冊表配置單元的根節點,將權限修改爲“Everyone”,即提供完整權限,並應用到該表項下的所有子項。

5、針對我們希望覆蓋或添加的“策略”,我們需要找到與之相關的子鍵,這些子鍵可能不會都在同一個表項下。比如,在“Remove Task Manager”的場景中,定義該策略的值位於“\Software\Microsoft\Windows\CurrentVersion\Policies\System”鍵中,因此我們需要在“System”子鍵中添加一個“DENY”規則,阻止SYSTEM獲取該鍵的“寫入/創建”權限,確保GpSvc無法執行覆蓋操作。

第二步:存放NTUSER.man

1、接下來,我們要確保已創建好備份的擁有管理員權限的賬號。

2、將構造的註冊表配置單元拷貝到目標主機的“%USERPROFILE%\NTUSER.man”路徑下,然後覆蓋用戶組策略。

3、註銷並重新登錄,現在所有的用戶組策略都已經被我們在“NTUSER.man”中定義的配置給替換掉了。

第三步:刪除NTUSER.man

測試完成後,我們需要註銷當前賬戶,然後使用Administrator賬號來刪除用戶配置目錄中的“NTUSER.man”文件。

總結

我們在發現了該 問題 後,便立刻將信息上報給了 微軟官方 ,但微軟方面認爲這是一種“預期”的行爲,並不屬於安全漏洞的範疇。不過我們認爲,雖然這並非一個非常嚴重的安全問題,但這種允許他人隨意修改用戶組策略的情況,早就已經超出了所謂“預期”的安全邊界了。

* 參考來源: medium ,FB小編Alpha_h4ck編譯,轉載請註明來自FreeBuf.COM

相關文章