<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    域滲透學習(二)KERBEROS協議

    VSole2022-03-18 06:22:50

    KERBEROS認證協議

    上一篇提到了域內身份認證是采用的Kerberos協議,那么具體的認證流程是怎樣的?

    需要了解的幾個概念

    1.KDC(Key Distribution Center):密鑰分發中心,里面包含兩個服務:AS和TGS

    2.AS(Authentication Server):身份認證服務

    3.TGS(Ticket Granting Server):票據授予服務,該服務提供的票據也稱為 TGS 或者叫白銀票據

    4.TGT(Ticket Granting Ticket):由身份認證服務授予的票據(黃金票據),用于身份認證,存儲在內存,默認有效期為10小時

    關于下文需要記住的一些點

    Client 密鑰 TGS密鑰 和 Service 密鑰 均為對應用戶的NTLM Hash

    TGS密鑰 == KDC Hash == krbtgt用戶的NTLM Hash,這幾個可能有時候叫法不一樣但是是一個東西

    Server 和 Service 也可以當作一個東西,就是Client想要訪問的服務器或者服務

    Client/(TGS/Server) Sessionkey 可以看作客戶端與TGS服務和嘗試登陸的Server之間會話時用來加密的密鑰,而(Client/TGS/Service)密鑰(上面提到的三個實際為NTLM Hash的密鑰)是用來加密會話密鑰的密鑰,為了保證會話密鑰的傳輸安全,這些加密方式均為對稱加密

    也就是說,參與認證的三個角色的NTLM Hash是三個密鑰,這三個NTLM Hash的唯一作用是確保會話密鑰Sessionkey的安全傳輸

    后面的描述可以看完具體認證流程再回來看

    然后Service 和 TGS 通過對TGT 和 Ticket (TGT 和 Ticket中包含會話密鑰Sessionkey和客戶端的身份信息)使用自己的NTLM Hash進行解密獲取到會話密鑰,再使用這個會話密鑰解密客戶端通過這個會話密鑰加密發來的驗證信息

    通過解密客戶端發來的驗證信息,可以得到客戶端的身份驗證信息,再與使用自己的NTLM Hash進行解密TGT或者Ticket得到的客戶端身份信息進行比較來完成對客戶端身份的驗證

    TGT或Ticket 是由KDC使用TGS密鑰和Service密鑰進行加密的(上文講到KDC可以從AD數據庫中提取這三個東西),但是Client因為沒有這兩個密鑰所以無法解密與修改。KDC將一份會話密鑰通過Client的密鑰加密發送給Client,另一份放在TGT中和客戶端身份信息一起通過TGS的密鑰進行加密也發送給Client

    Client可以使用自己的密鑰解密第一份會話密鑰,然后用這個會話密鑰來加密一份自己的身份信息,再把加密的身份信息和TGT一起發送給KDC,KDC此時如果能使用自己的TGS密鑰來成功解密TGT,說明這個TGT是可信任的,因為Client無法修改TGT,然后再用這個TGT中的會話密鑰來解密客戶端發來的身份信息,與解密TGT得到的身份信息進行比對,如果能成功解密并且比對成功,說明這個Client是可信任的

    Server端認證跟上面是一樣的

    再說個更簡單易懂的例子(編個故事):戲說地獄三頭犬

    1. 用戶登陸

    用戶輸入 [用戶名] 和 [密碼] 信息 

    在客戶端,用戶輸入的 [密碼] 通過計算生成NTLM哈希作做為 [CLIENT密鑰]

    2.請求身份認證

    2.1 客戶端向AS(身份認證服務)發送認證請求

    客戶端向AS發送認證請求,請求中帶有明文的 [用戶名] 信息 此時并未發送[密碼]或[密鑰]信息

    2.2 AS確認Client端登錄者用戶身份

    AS收到用戶認證請求之后,根據請求中的 用戶名 信息,從數據庫中查找該用戶名是否存在。

    如果 用戶名 存在,則根據該用戶名提取NTLM Hash做為AS生成的CLIENT 密鑰,如果第1步中用戶提供的 密碼 信息正確,該秘鑰與用戶登錄中的 CLIENT密鑰 是相等的。

    AS為Client響應如下消息:

    Msg A 使用 KDC生成的CLIENT密鑰 加密的CLIENT/TGS SESSIONKEY

    Msg B 使用 TGS密鑰 加密的TGT(TICKET-GRANTING-TICKET),客戶端沒有KDC NTLM Hash因此Client無法解密TGT。TGT中包含如下信息:

    [Client/TGS SessionKey]

    Client ID

    Ticket有效時間

    CLient 地址

    Client收到AS的響應消息以后,利用自身的 CLIENT密鑰 可以對Msg A進行解密,這樣可以獲取到 CLIENT/TGS SESSIONKEY 。但由于Msg B是使用 TGS密鑰 加密的,Client無法對其解密。

    AS響應的消息中有一條是屬于Client的,但另外一條卻屬于TGS。

    Client/TGS SessionKey出現了兩個Copy,一個給Client端,一個給TGS端。

    認證過程中的加密除哈希外均采用的是對稱加密算法。

    1. 請求服務授權

    3.1 客戶端向TGS發送請求服務授權請求

    客戶端發送的請求中包含如下兩個消息:

    Msg C

    要請求的服務ID, 即[Service ID] 上一步2.2中由AS為Client提供的TGT。

    Msg D

    使用 CLIENT/TGS SESSIONKEY 加密的Authenticator 1 {Client ID, Timestamp}。

    KDC接收到TGT與其他內容后,會首先使用KDC 的NTLM Hash解密TGT,只有KDC可以解密TGT,從TGT中提取到 CLIENT/TGS SESSIONKEY ,再使用 CLIENT/TGS SESSIONKEY 解密Authenticator 1,獲取到{Client ID, Timestamp}

    并與通過解密TGT獲取到的{Client ID, 有效時間}進行對比

    3.2 TGS為Client響應服務授權票據

    TGS為Client響應的消息包括:

    Msg E 使用 SERVICE密鑰(服務器的NTLMHASH) 加密的 CLIENT-TO-SERVER TICKET , 該Ticket中包含了如下信息:

    [Client/Server SessionKey]

    Client網絡地址

    Ticket有效時間

    Client ID

    Msg F 使用 CLIENT/TGS SESSIONKEY 加密的 CLIENT/SERVER SESSIONKEY 。

    Msg F使用了 CLIENT/TGS SESSIONKEY 加密,因此,該消息對Client可見。Client對其解密以后可獲取到 CLIENT/SERVER SESSIONKEY 。

    而Msg E使用了 [SERVICE密鑰] 加密,該消息可視作是TGS給Service Server的消息,只不過由Client一起攜帶發送給Service Server

    4.發送服務請求

    4.1 Client向Service Server發送服務請求

    發送的消息中包括:

    Msg E 上一步3.2中,TGS為Client響應的消息Msg E。該消息可以理解為由Client攜帶的消息。

    Msg G 由[Client/Server SessionKey]加密的Authenticator 2,包含{Client ID, Timestamp}信息。

    CLIENT/SERVER SESSIONKEY 并非直接傳輸,而是被包含在使用[Service密鑰]加密的Msg E中。

    既然 [CLIENT/SERVER SESSIONKEY] 并不直接明文傳輸, Client需要向Service Server證明自己擁有正確的 CLIENT/SERVER SESSIONKEY ,所以,Authenticator 2使用了 CLIENT/SERVER SESSIONKEY 加密。

    4.2 SS響應Client

    SS收到客戶端的服務請求之后,先利用自身的 [SERVICE密鑰] 對Msg E進行解密,提取出Client-To-Server Ticket, 在3.2步驟中,提到了該Ticket中包含了 CLIENT/SERVER SESSIONKEY 以及Client ID信息。

    SS使用 CLIENT/SERVER SESSIONKEY 解密Msg G,提取Client ID信息,而后將該Client ID與Client-To-Server Ticket中的Client ID進行比對,如果匹配則說明Client擁有正確的 CLIENT/SERVER SESSIONKEY 。

    而后,SS向Client響應Msg H(包含使用 CLIENT/SERVER SESSIONKEY 加密的Timestamp信息)。

    Client收到SS的響應消息Msg H之后,再使用 CLIENT/SERVER SESSIONKEY 對其解密,提取Timestamp信息,然后確認該信息與Client發送的Authenticator 2中的Timestamp信息一致。

    如上信息可以看出來,該交互過程起到了Client與SS之間的“雙向認證”作用。

    認證流程中需要關注的點,票據偽造的原理

    2.2 AS確認Client端登錄者用戶身份

    KDC返回的Msg B:使用 TGS密鑰(KDCHASH/KRBTGT用戶NTLMHASH) 加密的TGT(Ticket-Granting-Ticket),當我們獲取到krbtgt用戶的NTLM哈希后,便可主動使用krbtgt用戶的NTLM哈希做為TGS密鑰來生成TGT發送給KDC,這樣KDC如果通過解密偽造TGT獲取到偽造的 [CLIENT/TGS SESSIONKEY] 可以成功解密 Authenticator 1 并完成與TGT中的數據進行比對,便成功騙過了KDC,也就是成功偽造了黃金票據

    4.1 Client向SS(Service Server)發送服務請求

    客戶端向服務器發送的為使用 SERVICE密鑰(服務器的NTLMHASH) 加密的 CLIENT-TO-SERVER TICKET Ticket中包含用來供服務器解密Authenticator 2的 CLIENT/SERVER SESSIONKEY 。如果獲取到了Service Server的NTLM Hash,便可偽造Ticket,和Authenticator 2 ,Service Server在接收到Ticket和Authenticator 2后可以使用自己的NTLM Hash正常解密完成比對,也就是成功偽造了白銀票據

    關于Service Hash,Service Hash其實是目標中一個用戶名與hostname相同的用戶的Hash

    如hostname為PC-WIN7的服務器,對應的Hash就是Username : PC-WIN7$的哈希

    kerberos對稱密鑰
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    Kerberos 身份驗證中,客戶端必須在 KDC為其提供票證授予票證 之前執行“預驗證”,該票證隨后可用于獲取服務票證。使用時間戳而不是靜態值有助于防止重放攻擊。客戶端有一個公私鑰對,并用他們的私鑰對預認證數據進行加密,KDC 用客戶端的公鑰對其進行解密。該屬性的值是 Key Credentials這種信任模型消除了使用無密碼身份驗證為每個人頒發客戶端證書的需要。PKINIT 允許 WHfB 用戶或更傳統的智能卡用戶執行 Kerberos 身份驗證并獲得 TGT。
    屬性,以獲得用于檢索 NTLM 哈希值和請求 TGT 票據。PKINIT 是 Kerberos 協議的擴展協議,允許在身份驗證階段使用數字證書。KDC 擁有客戶端密鑰的副本,并且可以解密預身份驗證的數據以對客戶端進行認證。
    盡管“密碼機制”長期以來始終是一個頗具技術性的話語表達,但如果從政策決策的角度觀察,符合特定管理目標及價值訴求的“密碼機制”仍然構成了整個密碼規范體系的基石,其決定了密碼體制的分層結構(例如我國的分類分級管理)、目的、對象和方法。“密碼機制”的基本思想是對機密信息進行“偽裝”,阻卻未經授權的訪問、篡改和披露。
    但由于Msg B是使用 TGS密鑰 加密的,Client無法對其解密。AS響應的消息中有一條是屬于Client的,但另外一條卻屬于TGS。
    本文是很久之前做的筆記,今天有空又梳理了一下,分享出來。如果有錯誤或疏漏,歡迎留言指出。 Kerberos是一種基于票據的、集中式的網絡認證協議,適用于C/S模型,由MIT開發和實現(http://web.mit.edu/kerberos/dist/)。 這里所謂的認證,就是保證使用票據(Ticket)的用戶必須是票據中指定的用戶。 簡單回憶一下,密碼學涉及機密性、完整性、認證性(實體認證+
    ?上整理的?試問題?全,有些 HW ?試的題,已經收集好了,提供給?家。
    Kerberos認證介紹Kerberos是一種計算機網絡授權協議,用來在非安全網絡中,對個人通信以安全的手段進行身份認證。這個詞又指麻省理工學院為這個協議開發的一套計算機軟件。而已有了金票后,就跳過AS驗證,不用驗證賬戶和密碼,所以也不擔心域管密碼修改。
    kerberos協議從0到1
    2021-10-12 14:26:38
    krbtgt用戶,是系統在創建域時自動生成的一個帳號,其作用是密鑰分發中心的服務賬號,其密碼是系統隨機生成的,無法登錄主機
    kerberos委派詳解
    2021-10-08 14:49:15
    委派域委派是指,將域內用戶的權限委派給服務賬號,使得服務賬號能以用戶權限開展域內活動。服務賬號,域內用戶的一種類型,服務器運行服務時所用的賬號,將服務運行起來并加入域。例如MSSQL Server在安裝時,會在域內自動注冊服務賬號'SqlServiceAccount',這類賬號不能用于交互式登錄。
    前文已經寫到檢測域內dcsync,adminsdholder等后門和一些基本域內信息
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类