Kerberos
是一種身份驗證協議,它作為一種可信任的第三方認證服務,通過使用對稱加密技術為客戶端/服務器應用程序提供強身份驗證。在域環境下,AD域使用Kerberos協議進行驗證,熟悉和掌握Kerberos
協議是域滲透的基礎。
Kerberos
協議中主要的三個角色:
1.訪問服務的Client 2.提供服務的Server 3.KDC:密鑰分發中心,默認安裝在域控上 AS:身份驗證服務 TGS:票證授予服務
Kerberos
協議認證過程:
協議可以分為三個步驟:一是獲得票據許可票據,二是獲取服務許可票據,三是獲得服務。
第一步:獲得票據許可票據
KRB_AS_REQ:用於向KDC請求TGT
當用戶在客戶端輸入域用戶和密碼時,客戶端將用戶密碼轉換為hash作為加密密鑰,對時間戳進行加密作為請求憑據。
cipher:加密的時間戳,即客戶端的當前時間與用戶的hash加密后的結果
KRB_AS_REQ 數據包如下:
KRB_AS_REP:用於通過KDC傳遞TGT
收到請求后,KDC從AD域數據庫中找到對用用戶的hash解密時間戳來驗證用戶身份。如果時間戳在允許的時間范圍內,那么它就會生成一個會話密鑰(Session key),以AS_REP 數據包進行響應。AS_REP
包含信息:
ticket:使用krbtgt hash加密,包含用戶名/會話密鑰和到期時間等信息.
enc-part:使用用戶hash加密,包含會話密鑰/TGT到期時間和隨機數(防重放).
KRB_AS_REP數據包如下:
第二步:獲得服務許可票據
KRB_TGS_REQ:使用TGT向KDC請求TGS
客戶端獲得TGT和用戶密鑰加密的enc-part
,使用用戶hash解密enc-part
獲得會話密鑰(Session key),然后使用會話密鑰將用戶名/時間戳進行加密,生成authenticator和TGT發送給TGS。
ticket:實質上就是一張TGT,客戶端沒有 krbtgt hash,故無法解密TGT
KRB_TGS_REQ 數據包如下:
KRB_TGS_REP:通過KDC傳遞TGS
TGS 收到KRB_TGS_REQ請求后,使用 krbtgt hash解密ticket 獲取會話密鑰(Session key),然后使用會話密鑰解密 authenticator 獲取用戶名和時間戳進行身份驗證。確認信息后,創建一個服務會話密鑰(Service Session key)。
ticket:使用對應的服務密鑰進行加密,包含服務會話密鑰/用戶名/到期時間等信息,本質上就是一張ST(Service Ticket)。
enc-part:包含使用會話密鑰加密的服務會話密鑰(Service Session key)
KRB_TGS_REP
數據包如下:
第三步:獲得服務
KRB_AP_REQ:使用TGS,服務對用戶身份驗證
客戶端已經擁有了有效的TGS可以與服務進行交互,使用會話密鑰解密 enc-part,得到 服務會話密鑰(Service Session key),將用戶名/時間戳等信息使用服務會話密鑰(Service Session key)進行加密,得到新的Authentication。
KRB_AP_REP:由服務用來針對用戶標識自身
服務端接收到請求,使用自己的hash解密TGS獲得服務會話密鑰(Service Session key)和授權用戶信息,然后使用服務會話密鑰解密Authentication,比對用戶名和時間戳等信息,如果有相互驗證標記,服務端使用服務會話密鑰加密時間戳發給客戶端,客戶端解密時間戳驗證服務端,然后開始請求服務。