Kerberos認(rèn)證

一、Kerberos認(rèn)證

Kerberos的重要性:

對(duì)我們搞Web的而言,弄清Kerberos認(rèn)證過(guò)程,最有利于幫助我們理解域內(nèi)的金票和銀票!

Kerberos介紹:

在古希臘神話中Kerberos指的是:有著一只三頭犬守護(hù)在地獄之門外,禁止任何人類闖入地獄之中。
而現(xiàn)實(shí)中的Kerberos是一種網(wǎng)絡(luò)身份驗(yàn)證協(xié)議,旨在通過(guò)密鑰加密技術(shù)為客戶端/服務(wù)器應(yīng)用程序提供身份驗(yàn)證,主要用在域環(huán)境下的身份驗(yàn)證。


通過(guò)上圖可以看到整個(gè)認(rèn)證流程有三個(gè)重要的角色,分別為Client、Server和KDC。

下面介紹下幾個(gè)相關(guān)的名詞:

  1. 訪問(wèn)服務(wù)的 Client;

  2. 提供服務(wù)的 Server;

3.KDC(Key Distribution Center)密鑰分發(fā)中心。
在KDC中又分為兩個(gè)部分:Authentication Service(AS,身份驗(yàn)證服務(wù))和Ticket Granting Service(TGS,票據(jù)授權(quán)服務(wù))

4.DC是Domain Controller的縮寫(xiě),即域控制器;AD是Active Directory的縮寫(xiě),即活動(dòng)目錄。
DC中有一個(gè)特殊用戶叫做:krbtgt,它是一個(gè)無(wú)法登錄的賬戶,是在創(chuàng)建域時(shí)系統(tǒng)自動(dòng)創(chuàng)建的,在整個(gè)kerberos認(rèn)證中會(huì)多次用到它的Hash值去做驗(yàn)證。
AD會(huì)維護(hù)一個(gè)Account Database(賬戶數(shù)據(jù)庫(kù)). 它存儲(chǔ)了域中所有用戶的密碼Hash和白名單。只有賬戶密碼都在白名單中的Client才能申請(qǐng)到TGT。

Kerberos粗略的驗(yàn)證流程:

舉個(gè)簡(jiǎn)單的栗子:如果把 Kerberos 中的票據(jù)一類比作一張門禁卡,那么 Client 端就是住客,Server 端就是房間,而 KDC 就是小區(qū)的門禁。住客想要進(jìn)入小區(qū),就需要手里的門禁卡與門禁想對(duì)應(yīng),只有通過(guò)門禁的檢驗(yàn),才能打開(kāi)門禁進(jìn)入小區(qū)。

需要注意的是,小區(qū)門禁卡只有一張,而Kerberos認(rèn)證則需要兩張票。

Kerberos 詳解認(rèn)證流程:

當(dāng) Client 想要訪問(wèn) Server 上的某個(gè)服務(wù)時(shí),需要先向 AS 證明自己的身份,驗(yàn)證通過(guò)后AS會(huì)發(fā)放的一個(gè)TGT,隨后Client再次向TGS證明自己的身份,驗(yàn)證通過(guò)后TGS會(huì)發(fā)放一個(gè)ST,最后Client向 Server 發(fā)起認(rèn)證請(qǐng)求,這個(gè)過(guò)程分為三塊:

Client 與 AS 的交互,
Client 與 TGS 的交互,
Client 與 Server 的交互。

第一步,Client 與 AS 的交互:

準(zhǔn)備:用戶在Client中輸入賬號(hào)密碼后,Client會(huì)對(duì)密碼進(jìn)行hash code,我們叫做Master key。

請(qǐng)求:
Client 先向 KDC 的 AS 發(fā)送 Authenticator(認(rèn)證者),我們叫它Authenticator1,為了確保Authenticator1僅限于自己和KDC知道,Client使用自己的Master Key對(duì)其的主體部分進(jìn)行加密。
其內(nèi)容為:
1.經(jīng)過(guò) Client用戶密碼hash code(Master key)加密的TimeStamp(一個(gè)當(dāng)前時(shí)間的時(shí)間戳)。
2.Client的一些信息(info),比如用戶名。

響應(yīng):
(1).AS接收到Authenticator1后,會(huì)根據(jù)Client提交的用戶名在AD中尋找是否在白名單中,然后查詢到該用戶名的密碼,并提取到Client對(duì)應(yīng)的Master key,對(duì)TimeStamp(時(shí)間戳)進(jìn)行解密,如果是一個(gè)合法的Timestamp,就證明了Client提供的用戶名和密碼是存在AD中的,并且AS提取到的Timestamp不能超過(guò)5分鐘,否則AS就會(huì)直接拒絕Client的請(qǐng)求。
(2).TimeStamp驗(yàn)證通過(guò)后,AS會(huì)給Client發(fā)送一個(gè)由Client的Master key加密過(guò)的Logon Session Key和一個(gè)TGT(client-server-ticket)。

TGT的內(nèi)容:
經(jīng)過(guò)KDC中的krbtgt的密碼HASH加密的 Logon Session Key(登錄會(huì)話密鑰) 和 TimeStamp(時(shí)間戳)、TGS會(huì)話密鑰、用戶信息、TGT到期時(shí)間。

注意

  1. Logon Session Key是什么:Client向KDC發(fā)起對(duì)TGT的申請(qǐng),”我需要一張TGT用以申請(qǐng)獲取用以訪問(wèn)所有Server的Ticket”。KDC在收到該申請(qǐng)請(qǐng)求后,生成一個(gè)用于該Client和KDC進(jìn)行安全通信的Session Key(SKDC-Client,也被稱為L(zhǎng)ogon Session Key)。這里KDC不會(huì)保存SKDC-Client。
    需要注意的是SKDC-Client是一個(gè)Session Key,他具有自己的生命周期,同時(shí)TGT和Session相互關(guān)聯(lián),當(dāng)Logon Session Key過(guò)期,TGT也就宣告失效,此后Client不得不重新向KDC申請(qǐng)新的TGT,KDC將會(huì)生成一個(gè)不同Session Key和與之關(guān)聯(lián)的TGT

  2. 第二步會(huì)有一個(gè)Session Key ,是用于Client和Server之間通信的Session Key(SServer-Client)

第二步,Client 與 TGS 的交互,Client使用TGT從KDC獲得基于某個(gè)Server的Ticket:

一、請(qǐng)求:
Client通過(guò)自己的Master key對(duì)第一部分解密獲得Logon Session Key之后,攜帶著TGT對(duì)TGT發(fā)送請(qǐng)求。Client是解不開(kāi)TGT的,它作為一個(gè)Client通過(guò)身份驗(yàn)證的票提交給TGS。

請(qǐng)求的內(nèi)容:
(1).TGT:Client通過(guò)與AS交互獲得的TGT,TGT 被 KDC 的 Master Key 進(jìn)行加密。
(2).Authenticator2:Client端使用 Logon Session Key對(duì)其進(jìn)行加密,Authenticator2實(shí)際上就是關(guān)于Client的一些信息和當(dāng)前時(shí)間的一個(gè)Timestamp,用以證明當(dāng)初 TGT 的擁有者是否就是自己。

TGS收到Client請(qǐng)求,驗(yàn)證其真實(shí)身份:
TGS 在發(fā)給Client真正的Ticket之前,先得整個(gè)Client提供的那個(gè)TGT是否是AS頒發(fā)給它的,于是它得通過(guò) Client 提供的 Authenticator2 來(lái)證明。但是 Authentication2 是通過(guò) Client的 Logon Session Key 進(jìn)行加密的,而TGS并沒(méi)有保存這個(gè) Logon Session Key 。所以 TGS 先得通過(guò)自己的 Master Key{krbtgt的密碼hash處理} 對(duì) Client 提供的 TGT 進(jìn)行解密,從而獲得Client Info和 Logon Session Key(SKDC-Client),再通過(guò)這個(gè)Logon Session Key解密 Authenticator2
獲得Client Info,對(duì)兩個(gè)Client Info進(jìn)行比較進(jìn)而驗(yàn)證對(duì)方的真實(shí)身份

二、響應(yīng)--TGS驗(yàn)證通過(guò)后發(fā)ST(Service Ticket)票:

響應(yīng)內(nèi)容:

認(rèn)證通過(guò)后TGS生成使用Logon Session Key(SKDC-Client)加密過(guò)用于Client和Server之間通信的Session Key(SServer-Client),Server的Master Key進(jìn)行加密的ST(Service Ticket)

(1).經(jīng)過(guò) Logon session key加密的Client和Server之間的Session Key
(2).經(jīng)過(guò)Server的Master Key進(jìn)行加密的ST(Service Ticket)。

Ticket大體包含以下一些內(nèi)容:
Session Key(SServer-Client)
Domain name\Client。
Ticket的到期時(shí)間。

Client 收到TGS的響應(yīng),使用 Logon session key,解密第一部分后獲得 Session Key (注意區(qū)分 Logon Session Key 與 Session Key 分別是什么步驟獲得的,及其的區(qū)別)。有了 Session Key 和 ST(Service Ticket), Client 就可以直接和 Server 進(jìn)行交互,而無(wú)須在通過(guò) KDC 作中間人了。

第三步,Client 與 Server 的交互--雙向驗(yàn)證:

Server驗(yàn)證Client:
Client通過(guò)與TGS交互獲得訪問(wèn)Server的Session Key,然后為了證明自己就是ST(Service Ticket)的真正所有者,會(huì)將Authenticator和時(shí)間戳提取出來(lái),并使用Session Key進(jìn)行加密。最后將這個(gè)被加密過(guò)的Authenticator3 和ST作為請(qǐng)求數(shù)據(jù)包發(fā)送給Server。此外還包含一個(gè)Flag用于表示Client是否需要進(jìn)行雙向驗(yàn)證。

Server接收到Request之后,首先通過(guò)自己的Master Key(krbtgt的密碼hash處理)解密ST,從而獲得Session Key。然后通過(guò)解密出來(lái)的Session Key再去解密Authenticator3 ,進(jìn)而驗(yàn)證對(duì)方的身份。如果驗(yàn)證成功,且時(shí)間戳不長(zhǎng)于5min,就讓 Client 訪問(wèn)對(duì)應(yīng)的資源,否則就會(huì)直接拒絕對(duì)方的請(qǐng)求。

雙向認(rèn)證:
到目前為止,服務(wù)端已經(jīng)完成了對(duì)客戶端的驗(yàn)證,但是,整個(gè)認(rèn)證過(guò)程還沒(méi)有結(jié)束。接下來(lái)就是Client對(duì)Server進(jìn)行驗(yàn)證以確保Client所訪問(wèn)的不是一個(gè)釣魚(yú)服務(wù).

Client驗(yàn)證Server:
Server需要將Authenticator3中解密出來(lái)的Timestamp再次用Session Key進(jìn)行加密,并發(fā)送給Client。Client再用緩存Session Key進(jìn)行解密,如果Timestamp和之前的內(nèi)容完全一樣,則可以證明此時(shí)的Server是它想訪問(wèn)的Server。


kerberos認(rèn)證原理參考于


至此,Kerberos認(rèn)證和域內(nèi)環(huán)境介紹就結(jié)束了,謝謝觀看,若有疑問(wèn)請(qǐng)留言,若有錯(cuò)誤請(qǐng)指教。

推薦另一篇關(guān)于金票和銀票的文章:黃金票據(jù)和白銀票據(jù)攻擊原理介紹

推薦另一篇內(nèi)網(wǎng)滲透的文章:內(nèi)網(wǎng)滲透


大佬隨手給個(gè)贊唄 0.0

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容