Kerberos認證流程數據包分析


簡介

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM