微軟試圖為域用戶提供更大的靈活性,使資源的所有者能夠配置哪些帳戶是可信的,並允許委派給他們。這可以通過修改用於控制目標資源訪問的屬性“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-MachineAccountPentestlaboratories-Domainpurple.lab-DomainControllerdc.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 身份驗證