基于資源的約束委派
微軟試圖為域用戶提供更大的靈活性,使資源的所有者能夠配置哪些帳戶是可信的,并允許委派給他們。這可以通過修改用于控制目標資源訪問的屬性“ms-DS-AllowedToActOnBehalfOfOtherIdentity”來實現的。具體而言,如果計算機帳戶等資源設置了此屬性,則允許帳戶代表計算機帳戶執行操作。為了能夠修改此屬性,帳戶需要具備該對象的寫入權限,而默認情況下該權限是沒有的。但是,如果可以觸發 SYSTEM 帳戶并將身份驗證中繼到 Active Directory,則帳戶可能會獲得委派權限,從而充當提升的用戶。
通過基于資源的約束委派提升特權并不是一個新話題,Elad Shamir 和 Will Schroeder 過去曾對此進行過討論。此攻擊向量遵循一系列步驟并依賴于用戶服務 (S4U) Kerberos 擴展,該擴展使服務(例如 CIFS)能夠代表另一個用戶請求和獲取服務票證。通過基于資源的約束委派提權的方法包括以下步驟:
1.發現計算機賬戶配額;
2.啟用 WebClient 服務;
3.創建計算機帳戶;
4.NTLM中繼;
5.哈希計算;
6.請求服務票;
7.票證轉換;
8.通過 Kerberos 身份驗證訪問;
下圖說明了基于資源的約束委派的步驟:

尋找計算機賬戶配額
默認情況下,域中的用戶最多可以創建 10 個計算機帳戶。屬性“ms-DS-MachineAccountQuota”的值定義了可以創建多少個計算機帳戶。從 Active Directory 的角度來看,這可以通過查看域屬性中的屬性編輯器來觀察到這一點。

計算機賬戶配額
但是,可以通過在紅隊操作期間查詢 Active Directory 對象來檢索上述值。SharpView 相當于用 C# 開發的 PowerView,因此可以直接從植入程序中使用。執行下面的命令將枚舉所有域對象。

SharpView——域對象
屬性“ms-ds-machineaccountquota”的值將顯示在輸出中。

SharpView——計算機賬戶配額
另一種方法是使用 StandIn,它只能查詢感興趣的域對象。

StandIn——計算機賬戶配額對象
“ms-ds-machineaccountquota”的值將顯示在控制臺中。

StandIn——計算機賬戶配額
啟用 WebClient 服務
在Windows 10、Windows 11等較新版本操作系統中,安裝了web客戶端服務,但默認未啟用。服務的狀態可以通過在PowerShell控制臺執行以下操作來獲得。

WebClient Service – Status
為了使該技術生效,WebDav 服務需要處于運行狀態,因為 WebDav 不協商簽名,因此將允許來自當前計算機帳戶的身份驗證中繼。標準用戶沒有權限啟用該服務。James Forshaw 發布了一個概念證明,它通過觸發自定義 ETW 事件來解決此問題,該事件將從標準用戶的角度啟用該服務。

c++代碼——啟用Web客戶端
將代碼編譯為可執行文件并在目標主機上運行二進制文件以啟用該服務。

啟用 WebClient 服務
在命令提示符中,可以通過執行以下命令查詢服務:

WebClient服務
創建計算機帳戶
如上所述,默認情況下域用戶最多可以創建 10 個計算機帳戶。如果提供憑據,可以使用各種工具從加入域的系統和未加入域的系統中創建計算機帳戶。Ruben Boonen 開發了一個名為 StandIn 的 .NET 活動目錄后開發工具包,可以從植入程序中使用它來執行與基于資源的約束委派相關的任務,例如創建計算機帳戶。執行以下命令將使用隨機密碼在域上創建一個新的計算機帳戶。

StandIn——創建計算機帳戶
Impacket 包含一個 python 腳本,它可以從非域加入系統創建計算機帳戶。

Impacket——添加新計算機
另外,這個任務也可以通過PowerShell來執行,因為Kevin Robertson開發的PowerMad模塊包含一個可以創建新計算機帳戶的功能。
Import-Module .\Powermad.psm1
New-MachineAccount -MachineAccount Pentestlaboratories -Domain purple.lab -
DomainController dc.purple.lab

PowerMad——新計算機帳戶
如果系統已經針對基于資源的約束委派進行了配置,則可以使用現有的計算機帳戶,而不是使用上述方法之一創建新的計算機帳戶。StandIn 的“委派”標志可以顯示所有具有基于資源的受限委派權限的帳戶,包括具有不受約束和受限委派權限的帳戶。

StandIn——發現為基于資源的受限委派配置的帳戶
NTLM中繼
由于已經創建了一個新的計算機帳戶并且 Web 客戶端服務正在主機上運行,因此下一步是從 Impacket 配置“ntlmrelayx”以進行委派。一旦捕獲了來自合法計算機帳戶的身份驗證,將被轉發到域控制器以通過 LDAP 進行身份驗證。由于初始身份驗證將通過 HTTP 接收,因此需要在目錄中放置圖像。偽造的計算機賬戶“DESKTOP-Pentestlab$”將成為委派權限的目標。

Ntlmrelayx——委派訪問
為了強制系統帳戶通過網絡進行身份驗證,NCC 集團開發了接受 WebDav 路徑的 Change-Lockscreen。為了使身份驗證成功,需要使用主機名而不是 IP 地址,因為 WebDav 客戶端會在 Intranet 區域中自動進行身份驗證。需要注意的是,WebClient 服務將使用更改鎖屏觸發器來啟用,并且可以避免啟用Web 客戶端服務的步驟。

身份驗證觸發器——Change-LockScreen
計算機帳戶(Hive$)將通過 Kali 實例上的 HTTP 進行身份驗證,并將嘗試在隨機路徑上查找圖像。在域控制器上中繼身份驗證后,虛假計算機帳戶(DESKTOP-Pentestlab$)將獲得對 Hive$ 帳戶的委派權限。

ntlmrelayx ——基于資源的約束委派
如果使用 rbcd python 腳本提供域憑據,則該攻擊也可以從未加入的域系統執行,該腳本可自動執行該過程。

Python 實現——rbcd
與具有委派權限的計算機帳戶對應的值將出現在計算機對象 (Hive) 的“msDS-AllowedToActOnBehalfOfOtherIdentify”屬性中。

Active Directory——基于資源的約束委派
哈希計算
從密鑰傳遞中心(KDC)獲取票證的請求需要密碼的哈希表示而不是純文本值。由于計算機帳戶的密碼是已知的,因此可以使用 Rubeus 的“哈希”操作來計算給定密碼的哈希值。

計算哈希——計算機賬戶
請求服務票證
計算機帳戶“DESKTOP-Pentestlab$”具有受約束的委派權限,因此可以使用 Rubeus 代表管理員帳戶請求通用 Internet 文件系統(CIFS)的服務票證。這是通過使用用戶服務(S4U)Kerberos 擴展來實現的,該擴展能夠代表用戶請求服務票證。由于將頒發的票證屬于管理員帳戶,因此可用于通過 Kerberos 進行身份驗證,以提升的用戶身份訪問主機。將為為委派創建的計算機帳戶(DESKTOP-Pentestlab$)請求初始票證。

TGT 請求——計算機賬戶
使用“用戶服務”操作,將向管理員帳戶的當前域控制器的 Kerberos 分發中心 (KDC) 請求票證。

管理員TGS
最后使用 Kerberos 擴展 S4U2proxy 將代表管理員帳戶為 CIFS 服務請求票證。應該注意的是,即使請求的票證不會被標記為可轉發,它仍然可以用于訪問服務。

CIFS 服務票證
上述過程可以通過使用python實用程序“getST”直接從Impacket執行。與Rubeus相比,該工具不需要對計算機帳戶密碼進行散列,而是需要對純文本進行哈希處理。可以通過執行以下命令來請求服務票證:

CIFS 票證——getST
票證將在當前工作目錄中保存為 .ccache。
轉換票證
Rubeus 的最終票證授予票證(TGT)是基于 64 編碼的。為了用于 Kerberos 身份驗證,票證需要采用 .ccache 格式。執行以下命令將解碼票證并將輸出寫入 .kirbi 文件。

Base64 - Kirbi Ticket
Impacket 包含一個 python 實用程序,它可以將具有 .kirbi 擴展名的 Kerberos 票證轉換為 .ccache。

票證轉換器——從kirbi 到 ccache
“KRB5CCNAME”環境變量應設置為 .ccache 票證的位置,以便在 Kerberos 身份驗證期間使用來自緩存的票證。

環境變量——Kerberos 票證
通過 Kerberos 身份驗證訪問
獲取屬于管理員帳戶的票證意味著它可用于從更高的角度訪問目標服務。來自 Impacket 的“wmiexec”和“psexec”都支持 Kerberos 身份驗證,因此可用于以管理員或系統身份訪問主機,完成權限提升方案。

Wmiexec——Kerberos 身份驗證
執行“psexec”將在目標主機上創建一個服務,它被認為是不安全的。但是,它可以通過使用“-k”和“-no-pass”標志指定管理員帳戶和目標主機來使用 Kerberos 身份驗證來執行。

Psexec——Kerberos 身份驗證
或者僅使用相同的標志和目標主機。

psexec——Kerberos 身份驗證