kerberos概述
Kerberos(/ˈkərbərəs/)是一種計算機網絡授權協議,用來在非安全網絡中,對個人通信以安全的手段進行身份認證。這個詞又指麻省理工學院為這個協議開發的一套計算機軟件。軟件設計上采用客戶端/服務器結構,並且能夠進行相互認證,即客戶端和服務器端均可對對方進行身份認證。
在kerberos協議中有三個角色:
- Client(訪問服務)
- Server(提供服務)
- KDC(Key Distribution Center)密鑰分發中心

其中:
KDC(Key Distribution Center)= 密鑰分發中心
AS(Authentication Server)= 認證服務器
TGT(Ticket Granting Ticket)= TGT服務票據,由AS在AS-REP發放
TGS(Ticket Granting Server)= 票據授權服務器
ST(Server Ticket)=ST服務票據,由TGS在TGS-REP發放
kerberos協議分析
實驗環境
域名:HIRO
域控:WIN-KONG@192.168.228.10 域管:hiro\administrator
域機器:DESKTOP-P34E60A@192.168.228.40 域用戶:hiro\win10
win10用戶執行:
net use \\WIN-KONG\C$ password /u:hiro\administrator
AS-REQ:
主要內容:
- 請求的用戶端信息
- 加密類型
- Authenticator(用戶Hash加密時間戳)

客戶端通過使用其憑據加密時間戳來執行預身份驗證,以向 KDC 證明其擁有該帳戶的憑據。使用時間戳而不是靜態值有助於防止重放攻擊。
AS-REP:
主要內容:
- 通過活動目錄查詢用戶得到用戶的Hash,用Hash解密Authenticator,如果解密成功並且時間戳在規定時間內(一般為五分鍾),則預認證成功。
- 生成由krbtgt用戶Hash加密的TGT認購權證,用於確保客戶端和DC進行安全通信的用戶Hash加密后的Login Session Key(作為下一階段的認證秘鑰)。
- 返回TGT,Login Session Key,時間戳和PAC。(PAC包含用戶SID,所在組等信息)
PS:krbtgt這個用戶在域生成的時候會自動創建,它是秘鑰發行中心服務賬戶,不能直接登錄。
PAC
只要用戶通過預認證,拿到TGT,就能向TGS申請ST(kerberosat能利用的原因)。一切看起來好像合情合理,但是並沒有判斷用戶是否擁有訪問這個服務的權限,這就是PAC的作用。PAC在AS-REP過程中放在TGT里加密發送給Client,其中包含的是用戶的 SID、用戶所在的組等一些信息。當Client需要訪問Server所提供的某項服務時, Server為了判斷用戶是否具有合法的權限需要將Client的SID、用戶所在的組等信息傳遞給KDC, KDC通過SID判斷用戶的用戶組信息,用戶權限等,進而將結果返回給Server,Server再將此信息與用戶所索取的資源的ACL進行比較, 最后決定是否給用戶提供相應的服務。
有些服務並沒有驗證PAC,白銀票據因此得到利用。如果驗證了PAC的話,就算攻擊者擁有服務Hash,制作了ST票據,也不能制作PAC(PAC由兩個數字簽名構成,而這兩個數字簽名分別由Server NTLM Hash和KDC NTLM Hash加密),並且只有KDC才能制作和查看PAC。
也恰恰是是這個 PAC,造成了 MS14-068 這個漏洞。該漏洞是位於 kdcsvc.dll 域控制器的密鑰分發中心(KDC)服務中的 Windows 漏洞,它允許經過身份驗證的用戶在其獲得的票證 TGT 中插入任意的 PAC 。普通用戶可以通過呈現具有改變了 PAC 的 TGT 來偽造票據獲得管理員權限。

TGS-REQ:
主要內容:
- 客戶端信息
- Authenticator(Login Session Key加密時間戳)
- TGT認購權限
- 訪問的服務名
因為請求目標服務是文件共享,則將TGS提交給CIFS服務訪問

padata:

req-body:

TGS-REP:
主要內容:
- 檢查自身是否存在服務,如果存在,通過krbtgt解密TGT並通過Login Session Key解密Authenticator(Login Session Key加密時間戳),就驗證了對方身份。然后驗證時間戳是否在范圍內,並且驗證TGT中的時間戳是否過期,原始地址是否和TGT保存的地址相同等。
- 生成用AS-REP得到的Login Session Key加密后的用於確保安全傳輸的Server Session Key。
- 完成認證后,TGS生成ST票據,其中包括:客戶端信息和原始的Server Session Key,整個ST票據由該服務的NTLM Hash加密。
- 將ST和Server Session Key發送給客戶端。
DC並不會驗證當前請求TGS的用戶是否具有對其請求服務的訪問權限,它只驗證TGT是否有效,並基於TGT的信息制作TGS。

AP-REQ:
- 客戶端收到TGS服務后,通過自己緩存的Login Session Key解密得到原始的Server Session Key。
- 將ST和Authenticator(Server Session Key加密時間戳)發送給服務端。
- 客戶端訪問服務,將PAC傳遞給服務進行檢查;服務通過PAC查看用戶的SID和用戶組等並與服務自身的ACL進行對比。
- 域控制器驗證響應上的簽名並將結果返回給服務器。該錯誤作為適當的RPC狀態代碼返回。

AP-REP:
- 服務器驗證AP-REQ,如果驗證成功則發送AP-REP。
- 通過服務的NTLM Hash解密ST,從中提取Server Session Key。
- 通過提取出來的Server Session Key解密Authenticator,從而驗證客戶端身份。
- 將Server Session Key加密時間戳為Authenticator發送給客戶端,客戶端用緩存的Server Session Key進行解密,如果解密成功則說明兩方有相同的Server Session Key。
驗證TGT中攜帶的PAC,KDC通過SID判斷用戶的用戶組信息,用戶權限等,進而將結果返回給Server,Server再將此信息與用戶所索取的資源的ACL進行比較,最后決定是否給用戶提供相應的服務
kerberos簡要概括
還是以上次使用域管與域控建立cifs的ipc連接為例
net use \\WIN-KONG\C$ password /u:hiro\administrator
1.用戶使用該域管密碼hash向域控制器 (DC) 進行身份驗證。
2.DC在ntds對比用戶hash是否正確,如果正確返回用戶TGT票據和PAC等信息。
3.用戶與域控建立cifs的ipc連接,在DC查詢域控服務器的SPN。
4.識別出SPN后,與DC建立通信並呈現TGT,以及用戶需要通信的SPN(在這里是域控機器的SPN)。
5.DC返回TGS票據給用戶。
6.用戶拿着TGS請求訪問域控的cifs,DC解密TGS並檢查認證用戶的PAC(含sid和組等信息),判斷用戶是否有權限訪問該服務。
7.如果有訪問該服務的權限,ipc連接成功,否則拒接連接。
Kerberos攻擊
AS-REQ:
域用戶枚舉,密碼噴灑
當cname值中的用戶不存在時返回包提示錯誤,當用戶名存在時,密碼正確或者錯誤返回包結果也不一樣,所以可以嘗試域用戶枚舉和密碼噴灑攻擊。
(可以在域外使用,但是能ping通域控)
AS-REP:
1.黃金票據
TGT由krbtgt用戶Hash加密,如果擁有krbtgt用戶Hash就可以制作任意用戶的TGT。
盡管Kerberos票證生命周期受限於Active Directory域策略,但因為KDC信任TGT,所以自定義票據可以包含自定義票證生命周期(甚至超過域 kerberos 策略的票據生命周期)。
即使被模仿的用戶更改了密碼,為模擬用戶而創建的金票仍然存在,因為它繞過了智能卡身份驗證要求,繞過了 DC 在創建 TGT 之前執行的常規檢查。
KRBTGT NTLM 哈希可用於生成有效的 TGT(使用 RC4加密)來模擬任何有權訪問 Active Directory 中任何資源的用戶。
Golden Ticket (TGT) 可以在任何機器上生成和使用,即使是未加入域的機器(需要將DNS指向域控)。
2.AS-REP Roasting攻擊
enc-part是由用戶密碼Hash加密的,如果域用戶設置了Do not require Kerberos preauthentication,就可以嘗試爆破然后用hashcat破解獲得用戶密碼。
(當關閉了預身份認證后,攻擊者可以使用指定用戶去請求票據,此時域控不會做任何驗證就將TGT票據和該用戶Hash加密的Login Session Key返回。所以只要對Login Session Key離線解密,就可以得到指定用戶的明文密碼。)
TGS-REP:
1.kerberoast攻擊
ST由對應服務的Hash加密,並且攻擊者可以指定kerberos加密類型(RC4,AES256,SHA1_96),如果攻擊者的TGT憑證是有效的(不管用戶對服務有沒有訪問權限),就可以在域內請求任意服務SPN。隨后KDC查看哪個賬戶在ServicePrincipalName字段中注冊了所請求的SPN,使用其對應的服務hash進行加密生成ST(使用攻擊者和服務賬戶共同商定的加密算法)。隨后在TGS-REP階段返回給攻擊者,可以進行離線解密得到服務Hash。只要TGT正確就一定會返回ST。(只有關聯到用戶的SPN才對我們真正有價值)
2.白銀票據
ticket中的enc-part是由服務Hash加密的,如果有了服務Hash,就可以簽發任意用戶的ST票據,不需要跟域控打交道,但是只能訪問特定服務。(偽造的白銀票據沒有帶有效KDC簽名的PAC,如果目標驗證了KDC的PAC簽名,那么白銀票據就不起作用了)
