【內網滲透】——S4u2擴展協議提權以及KDC欺騙提權
文章目錄
- 【內網滲透】——S4u2擴展協議提權以及KDC欺騙提權
- @[toc]
- 一:Kerberos 委派攻擊原理之 S4U2利用
- 1.1原理
- 1.2兩種擴展協議
- **S4U2Self (Service for User to Self)**
- **S4U2Proxy (Service for User to Proxy)**
- 1.3 S4U2Self利用過程
- 1.3.1前提條件
- 1.3.2利用步驟
- 1.4S4U2Proxy利用過程
- 1.4.1利用前提條件
- 1.4.2詳細利用步驟(Rubeus)
- 1.5:**基于資源的約束委派(RBCD)利用**
- 二:CVE-2021-42278-Name impersonation&CVE-2021-42287-KDC bamboozling漏洞復現
- 2.1概念說明
- 2.2漏洞復現
- (1)noPac 利用
- (2)手動注入分析
- **修改計算機賬戶的 `sAMAccountName`(推薦)**
文章目錄
- 【內網滲透】——S4u2擴展協議提權以及KDC欺騙提權
- @[toc]
- 一:Kerberos 委派攻擊原理之 S4U2利用
- 1.1原理
- 1.2兩種擴展協議
- **S4U2Self (Service for User to Self)**
- **S4U2Proxy (Service for User to Proxy)**
- 1.3 S4U2Self利用過程
- 1.3.1前提條件
- 1.3.2利用步驟
- 1.4S4U2Proxy利用過程
- 1.4.1利用前提條件
- 1.4.2詳細利用步驟(Rubeus)
- 1.5:**基于資源的約束委派(RBCD)利用**
- 二:CVE-2021-42278-Name impersonation&CVE-2021-42287-KDC bamboozling漏洞復現
- 2.1概念說明
- 2.2漏洞復現
- (1)noPac 利用
- (2)手動注入分析
- **修改計算機賬戶的 `sAMAccountName`(推薦)**
一:Kerberos 委派攻擊原理之 S4U2利用
1.1原理
S4U2Self(Service For User to Self)是 Kerberos 協議的一種委托機制,允許服務(Service)代表用戶(User)自身獲取用戶的票證(Ticket)。這個機制在 Windows 環境中廣泛應用于網絡服務和應用程序,以便在用戶訪問需要身份驗證的資源時,能夠以用戶的身份獲取必要的票證,而無需用戶交互地提供憑證。正因有了委托機制才使得攻擊者以某個合法用戶的身份請求特定服務的票證,然后利用漏洞偽造這些票證,從而獲取到更高的權限。
當 Kerberos 無約束委派在服務器上啟用,服務器托管了在 TGS-REQ (步驟3)中引用的服務主體名稱中指定的服務時,DC 域控制器將用戶 TGT 的一個副本放到服務票證中。 當向服務器提供用戶的服務票證(TGS)以進行服務訪問時,服務器打開 TGS 并將用戶的 TGT 放入 LSASS 中供后續使用。 此時,應用程序服務器就可以無限制地假冒該用戶
1.2兩種擴展協議
S4U2Self (Service for User to Self)
用途
允許服務代表用戶獲取 該用戶自己的服務票據(ST),而無需用戶密碼或交互。
典型場景:
- 用戶通過非Kerberos方式(如表單認證)登錄后,服務需獲取用戶的Kerberos票據。
- 約束委派/無約束委派攻擊中模擬用戶身份。
關鍵特性
- 無需用戶密碼:服務使用自己的TGT請求用戶的ST。
- 票據加密:返回的ST使用 服務賬戶的密鑰 加密(而非用戶的)。
- 權限要求:服務賬戶需配置 “TrustedToAuthForDelegation”(無約束委派)或約束委派權限。
請求流程
- 服務向KDC發送請求,包含:
- 服務賬戶的TGT
- 目標用戶的UPN(如
user@domain.com
) - 目標SPN(如
http/service.domain.com
)
- KDC返回加密的ST(可被服務解密使用)。
S4U2Proxy (Service for User to Proxy)
用途
允許服務在已獲得用戶授權后,代表用戶獲取 其他服務的票據(跨服務委派)。
典型場景:
- 三層應用架構中(如Web→DB),Web服務代表用戶訪問DB服務。
- 約束委派攻擊中橫向移動。
關鍵特性
- 需用戶授權:需先通過S4U2Self獲取用戶的ST(作為"證據")。
- 約束限制:僅能委派到 msDS-AllowedToDelegateTo 中指定的服務。
- 票據轉發:最終ST仍以用戶身份加密,但由服務代理請求。
請求流程
- 服務通過S4U2Self獲取用戶的ST(如
user→http/service
)。 - 服務向KDC發送請求,包含:
- 服務賬戶的TGT
- 用戶的ST(作為授權證據)
- 目標SPN(如
cifs/db.domain.com
)
- KDC返回用戶對目標服務的ST(如
user→cifs/db
)。
1.3 S4U2Self利用過程
1.3.1前提條件
-
需要擁有一個具有 SPN (Service Principal Name) 的服務賬戶
-
該服務賬戶需要被授予 “TrustedToAuthForDelegation” 權限
1.3.2利用步驟
(1)獲取服務賬戶憑據
- 通過密碼、哈希或 Kerberos 票據獲取服務賬戶的訪問權限
(2)請求 S4U2Self 票據
- 使用服務賬戶的 TGT (Ticket Granting Ticket)
- 為目標用戶請求服務票據,指定服務賬戶的 SPN
- 使用
KRB_TGS_REQ
請求,包含PA-FOR-USER
結構
①處理響應
- 接收 KDC 返回的服務票據
- 票據將加密為服務賬戶的密鑰,而不是目標用戶的密鑰
②使用票據
- 可以使用該票據訪問目標服務
- 服務會認為請求來自目標用戶
可以獲得訪問權限
1.4S4U2Proxy利用過程
1.4.1利用前提條件
- 服務賬戶:擁有SPN的賬戶
- 約束委派權限:
- 賬戶配置了
msDS-AllowedToDelegateTo
屬性 - 可以委派到指定的服務(如CIFS、LDAP等)
- 賬戶配置了
- 有效的TGT:服務賬戶的Kerberos票據
- 用戶授權:
- 需要用戶的TGS(傳統約束委派)
- 或配置了基于資源的約束委派(Resource-based Constrained Delegation)
1.4.2詳細利用步驟(Rubeus)
(1) 識別具有約束委派權限的賬戶
使用PowerShell或ldapsearch查詢域中配置了約束委派的賬戶
(2)獲取服務賬戶的TGT
使用已獲取的服務賬戶憑據請求TGT
(3)執行S4U2Proxy攻擊
(4)使用獲取的票據
如果使用了/ptt
參數,票據會自動注入當前會話。否則可以手動注入,然后可以使用該票據訪問目標服務。
1.5:基于資源的約束委派(RBCD)利用
當配置了基于資源的約束委派時:
(1) 檢查目標計算機的msDS-AllowedToActOnBehalfOfOtherIdentity
Get-NetComputer dc01 | Select-Object -Property msDS-AllowedToActOnBehalfOfOtherIdentity
(2) 配置新的委派關系
$comp = Get-ADComputer dc01
$sid = (Get-ADComputer attackercomputer).SID
$SD = New-Object Security.AccessControl.RawSecurityDescriptor "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;$($sid))"
$SDbytes = New-Object byte[] ($SD.BinaryLength)
$SD.GetBinaryForm($SDbytes,0)
Set-ADComputer dc01 -Replace @{'msDS-AllowedToActOnBehalfOfOtherIdentity'=$SDbytes}
(3) 執行完整的S4U攻擊鏈
Rubeus.exe s4u /user:attackercomputer$ /rc4:<NTLM> /impersonateuser:Administrator /msdsspn:cifs/dc01 /altservice:http /ptt
二:CVE-2021-42278-Name impersonation&CVE-2021-42287-KDC bamboozling漏洞復現
2.1概念說明
機器賬戶的名字一般來說應該以$結尾,但AD沒有對域內機器賬戶名做驗證。
創建與DC機器賬戶名字相同的機器賬戶(不以$結尾),賬戶請求一個TGT后,更名賬戶,然后通過S4U2self申請TGS Ticket,接著DC在TGS_REP階段,這個賬戶不存在的時候,DC會使用自己的密鑰加密TGS Ticket,提供一個屬于該賬戶的PAC,然后我們就得到了一個高權限ST。過程如上圖所示。
允許攻擊者任意修改計算機帳戶sAMAccountName字段,進而模擬域控申請票據。
加入域的機器賬戶默認由結尾,samAccountName默認和域機器名一致。但DC沒有對sAMAccountName屬性進行合法性判斷,導致刪除sAMAccountName結尾的$"照樣可以以機器用戶身份申請TGT票據。
配合 CVE-2021-42278 使用,創建與域控機器賬戶名字相同的機器賬戶(不以$結尾),賬戶請求一個TGT后,更名賬戶,然后通過S4U2self 申請TGS Ticket,接著域控在 TGS_REP 階段,這個賬戶不存在的時候,DC會使用自己的密鑰加密 TGS Ticket ,提供一個屬于該賬戶的 PAC,然后我們就得到了一個高權限ST。
2.2漏洞復現
域控
域名:test.com
賬戶:administrator
密碼:QAX@123
計算機名:WIN-ISB0SNPKEPI
普通域用戶
賬戶:s4u2
密碼:QAX@123
(1)noPac 利用
檢查是否存在漏洞
noPac.exe scan -domain test.com -user s4u2 -pass QAX@123
noPac.exe -domain test.com -user s4u2 -pass QAX@123 /dc WIN-ISB0SNPKEPI.test.com /mAccount demohb /mPassword QAX@123 /service cifs /ptt
[!NOTE]
參數 說明
-domain htb.local 目標域名。
-user domain_user 普通域用戶賬號(需具備創建計算機賬戶的權限)。
-pass ‘Password123!’ 對應用戶的密碼。
/dc dc02.htb.local 指定域控制器的主機名。
/mAccount demo123 攻擊者創建的惡意計算機賬戶名稱(用于名稱偽裝)。
/mPassword Password123! 惡意計算機賬戶的密碼。
/service cifs 目標服務(通常為 cifs 以訪問文件共享)。
/ptt 將生成的票據注入當前會話(Pass-the-Ticket)。
獲得票據信息以及訪問權限:
(2)手動注入分析
具體流程:
-
首先創建一個機器賬戶,可以使用 impacket 的
addcomputer.py
或是powermad
addcomputer.py
是利用SAMR協議
創建機器賬戶,這個方法所創建的機器賬戶沒有SPN,所以可以不用清除 -
清除機器賬戶的
servicePrincipalName
屬性 -
將機器賬戶的
sAMAccountName
,更改為DC的機器賬戶名字,注意后綴不帶$ -
為機器賬戶請求TGT
-
將機器賬戶的
sAMAccountName
更改為其他名字,不與步驟3重復即可 -
通過S4U2self協議向DC請求ST
-
進行 DCsync Attack
普通域賬戶:s4u2用戶是一個普通的域用戶:
新增機器賬戶:域用戶默認可以新建10個機器賬戶
清除SPN信息
重設機器名稱
[!NOTE]
修改計算機賬戶的
sAMAccountName
(推薦)適用場景:
- 你希望計算機賬戶在 AD 中顯示不帶
$
的名稱(但實際 Kerberos 認證仍會使用COMPUTERNAME$
)步驟:
- 打開
Active Directory 用戶和計算機
(dsa.msc
)- 找到目標計算機賬戶(默認在
Computers
容器或自定義 OU)- 右鍵 → 屬性 → 屬性編輯器
- 找到
sAMAccountName
,默認值類似COMPUTERNAME$
- 修改為不帶
$
的名稱(如COMPUTERNAME
)- 點擊確定保存
注意:
- 修改后,該計算機仍然需要使用
COMPUTERNAME$
進行 Kerberos 認證($
是系統必需的)。- 只是
sAMAccountName
顯示變化,不影響實際功能。
修改計算機的名字
可以看到已經修改完成了
Request TGT (請求TGT)
./Rubeus.exe asktgt /user:demo1 /password:QAX@123 /domian:test.com /dc:WIN-ISB0SNPKEPI.test.com /nowrap
[!NOTE]
參數 值 說明 /user
Demo1 目標計算機賬戶 /password
QAX@123 計算機賬戶的密碼(可能無效) /domain
test.com 目標域名 /dc
WIN-ISB0SNPKEPI.test.com 域控制器主機名(需確保可解析) /nowrap
- 輸出票據不換行
Request S4U2self(獲取票據)