簡介
Kerberos協議通過密鑰系統為客戶端與服務提供認證服務,為了解決當客戶端去訪問一個服務器的某服務時,服務器如何判斷該對象是否有相關權限來訪問自己的服務,同時數據在傳輸過程中即便被篡改也不會影響整個通訊的安全
概念
DC(Domain Controller)域控
KDC(Key Distribution Center )密鑰分發中心
AD(Account Database)賬戶數據庫:存儲客戶端白名單,只有白名單中的對象才可申請TGt
TICKET票據:域內訪問憑證
TGT(Ticket granting ticket)票據中心授予的票據:包含用戶id、地址、票據有效期,用於向KDC獲取服務票據
AS(Authetication Service)身份驗證服務:認證客戶端身份,為客戶端生成TGT的服務
TGS(Ticket Grantins Service)票據中心授予的服務:為客戶端生成的某個服務的ticket
ST(Server Ticket)服務票據:由TGS進行發布
本地環境
域控:
192.168.3.142 OWA2010SP3@0day.org
域成員:
192.168.3.68 SRV-DV-0DAY@0day.org
域成員機器使用域賬戶登錄,wireshark抓包如下:
數據包分析
主要步驟如下
AS-REQ與AS-REP(AS驗證客戶端身份)、TGS-REQ與TGS-REP(客戶端獲得ST)、AP-REQ、AP-REP(客戶端請求服務)
AS-REQ數據包
此處域用戶登錄域成員終端將輸入相關賬戶密碼,也就向AS發送了一個AS-REQ的請求,主要包含用戶名、主機名、加密類型、Autherticator等:
pvno
代表Kerberos版本,這里代表kerbev5
msg-type
此處為此階段的krb-as-req
patata
ENC-TIMESTAMP,預認證數據,用戶密碼hash作為密鑰加密時間戳,加密后發送至AS,AS使用用戶密碼hash進行解密,若解密成功且時間戳在范圍內則認證成功
PA_PAC_REQUEST,啟用PAC支持的擴展,KDC通過對應的include判斷票據是否攜帶PAC
req-body
kdc-options
可理解為標志位字段
cname
主要包含登錄用戶及所在域,此處為jack與0DAY
使用krbtgt賬戶登錄區別如下
使用賬戶名@域名登錄區別如下
以下為認證失敗的情況,查看AS-REP不同結果以此可對域用戶賬戶進行枚舉
使用不存在的域用戶進行登錄:
返回信息如下:
使用存在的域用戶錯誤的密碼進行登錄:
返回信息如下:
sname
被請求的服務信息,所在域名,till為到期時間,rtime絕對到期時間(若請求為可更新票據),nonce為生成的隨機數
etype
加密類型,通過該字段的加密類型來選擇用戶hash進行解密
addresses
客戶端相關信息
AS-REP數據包
客戶端發送AS-REQ請求憑證是用戶hash加密的時間戳,憑證在padata內,當AS收到后,AS通過用戶hash進行解密,獲得時間戳,若解密成功則代表預認證成功,接着將發送響應包,主要包含krbtgt用戶hash加密后的TGT票據及用戶hash加密的 login session key,如下數據包很多一部分與先前的AS-REQ同理,不再重復贅述:
ticket
krbtgt用戶hash進行加密的TGT票據,因為域內ticket都由krbtgt hash進行加密,假設可獲得krbtgt的hash、sid可進行偽造黃金票據;tkt-vno為票據的版本號、realm為頒發票據的域名稱、sname為票據對應的服務端、enc-part為KDCkrbtgt密鑰加密的票據
確認sname與先前的AS-REQ內一致:
enc-part
這里加密使用的是用戶的hash與ticket中的enc-part不同,包含login session key,屬於下一步客戶端與KDC認證的密鑰:
當前流程階段為客戶端與AS之間的交互,主要為了獲得TGT及login session key並緩存於本地,客戶端將使用自身hash解密login session key獲得原始的login session key
TGS-REQ數據包
此處用戶已通過AS-REP獲得TGT票據、login session key后,下一步需獲取ST,因用戶訪問相關服務時需要ST進行校驗,數據包着重關注先前不同點
patata
主要包含TGT與authenticator:
其中ticket部分中enc-part同AS-REQ得到的TGT票據一致,為先前得到的TGT,用此TGT票據請求TGS獲得ST::
ticket部分中authenticator,通過先前AS-REQ的login session key作為密鑰加密的時間戳,屬於下一步認證使用的會話密鑰:
sname
請求的服務名稱,這里是要登錄的主機:
TGS-REP數據包
當TGS收到請求后將檢查是否擁有用戶請求的服務,若服務存在,通過krbtgt hash解密TGT獲得login session key,再用login session key解密authenticator,將校驗對方身份、時間戳是否過期,校驗通過后將發送ST票據
ticket
這里返回的其實是ST,enc-part使用服務對應的密鑰進行加密
enc-aprt
經過login session key(AS-REP)加密的service session key,包含服務身份信息等,用於請求服務時的會話密鑰
當前階段流程完成認證將發送給客戶端兩項內容,TGS生產的ST,以及AS-REP返回的login session key加密的service session key
任意用戶只要hash正確都可以請求域內任何一個服務票據
AP-REQ
這里其實都是本地服務了,wireshark也抓不到包,客戶端收到服務端返回的ST與enc-part,使用緩存的login session key解密enc-part獲得service session key,本地緩存server session key與ST,請求服務時將ST和service session key加密后的時間戳信息發送給server
AP-REP
server收到相關數據,使用service key解密TGS的ticket的enc-part,獲得service session key,使用service session key解密authentication后對authenticator進行驗證,通過后返回新的時間戳,客戶端通過service session key解密返回的時間戳,進行驗證,通過則證明客戶端可信賴服務器,並發送服務請求,服務器對客戶端提供相應服務
參考
https://xz.aliyun.com/t/8187
https://www.t00ls.net/viewthread.php?tid=54843