loecho@垃圾桶

内网渗透: 域认证Kerberos协议分析记录

2020-10-12 · 4 min read
内网渗透

0x01 Kerbroes认证流程分析:

域认证所参与的角色

  • Client(客户端)
  • Server(服务端)
  • KDC (Key Distribution Center) = DC
    • AD (Accent Database): 存储所有client的白名单,只有存在Celient才能申请到TGT
    • AS: 为Client生成TGT的服务
    • TGS:为Client生成某个服务ticket

Kerberos认证名词:

  • AS:⾝份认证服务(验证 Client⾝份)
  • KDC:密钥分发中⼼(域内最重要的服务器,域控制器)
  • TGT:票据中⼼,⽤⼾信授予的票据(访问TGS服务的票)
  • TGS:票据授权服务
  • ST:访问服务的票据Krbtgt:每个域中都有 krbtgt账⼾,此账⼾是KDC的服务账⼾⽤来创建TGT
  • Principal:认证主体
  • PAC:特权属性证书(⽤⼾的SID,⽤⼾所在的组)
  • SPN:服务主体名称
  • Session Key:(临时会话密钥a,只有 Client和TGS知道,在 Kerberos认证中⾄关重要)
  • Server Session Key:(临时会话密钥b,只有 Client和 Service知道,在 Kerber认证中⾄关重要)

0x02 具体流程分析:

一. Client向KDC-AS申请TGT

(1)Requests请求:

Client->KDC-AS(AS-REQ),客⼾端请求KDC(域控)的AS服务(⾝份认证服务)发送如下数据:

  • 客⼾端⽤⼾名(user's Username)
  • 服务端⽤⼾名(krbtgt service)
  • 随机数(A Nonce)由客⼾端⽣成
image-20201010094443606
(2)Response回应:

KDC-AS->Client (AS-REP),KDC处理信息并且回复Client

  • ⾝份认证服务(KDC-AS)使⽤⽤⼾的NTLM Hash解密时间戳,解密成功后检查⽤⼾的信息(登陆限制,组成员⾝份等)并创建TGT

  • 向本地LSA(Local Security Authority)请求⽣成⼀个特殊的数据PAC(权限属性证书,使⽤krbtgt密钥进⾏签名)KDC随机⽣成⼀个短期会话密钥(Session Key),此时AS向Client发送两条消息(AS-REP)

    • TGT(使⽤krbtgt NTLM Hash加密),有效期为10⼩时,内容包含:

      • ⽤⼾名(User name)
      • 零时会话密钥(Session Key)
      • 特权属性证书(PAC)由krbtgt签名
      • TGT的⽣命周期
    • T(C)使⽤Client申请TGT时使⽤的⽤⼾名对应的NTLM Hash加密,内容包含:

      • TGT⽣命周期
      • 零时会话密钥(Session Key)
      • 随机数(A Nonce)
image-20201010102148525

二. Client拿TGT请求KDC的TGS服务拿到ST

(1)Client->KDC-TGS(TGS_REQ),Client拿TGT请求KDC的TGS服务拿到ST

Client:

使⽤NTLM Hash解密T(C)获得Session Key

  • Client 向TGS发送消息:

    (1)Authenticator(使⽤Session Key加密),内容包含:

    • Client Name
    • Timestamp(正负5分钟)

    (2)TGT(使⽤krbtgt hash加密)

    Session Key

    (3)所需的SPN(服务主体名称)

    (4)A Nonce(随机数)

KDC:

KDC使⽤Krbtgt NTLM Hash 对TGT解密,获取Cilent信息和Session Key

使⽤Session Key对Client发来的Authenticator信息进⾏解密,对⽐TGT信息

image-20201012165428910

(2 )KDC-TGS->Client(TGS_REP)

KDC:

TGS⽣成Server Session Key

  1. TGS⽣成Client 需要访问服务的ST发送给Client,Ticket使⽤⽬标服务账⼾的NTLM Hash加密:
  • (1)Client Name
  • (2)Server Session Key
  • (3)PAC(krbtgt hash签名)
  • (4)TGS(⽣命周期)
  1. 使⽤Session Key加密的Server Session Key,内容如下:

    • (1)A Nonce
    • (2)TGS⽣命周期
    • (3)Server Session Key
  2. ⽤⼾名

    Client: Client 收到信息后,使⽤Session Key解密获得Server Session Key

image-20201012165213732

三、Client拿着ST访问Server

Client->Server (AP-REQ)

Client:

(1) Client发送由Server Session Key 加密的Authenticator信息和ST,访问Server, 内容如下:

  • (1) ST
  • (2) Timestamp
  • (3) Client Name

(2) ST(Server NTLM Hash加密)

  • (1) Server Session Key
  • (2) Client Name

Server->Client(AP-REP)

Server:

(1 )Server使⽤NTLM Hash解密ST,获得Server Session Key,使⽤ Server Session Key解密Authenticator信息,对⽐Authenticator信息中的Client信息和Ticket中的Client信息对⽐,将Authenticator信息的时间戳和Ticket的时

间戳是否相同(+/-2分钟)

(2) Server使⽤Server Session Key 加密Authenticator信息,其内容为:

  • (1) ID
  • (2) 时间戳

Client:

  • 1 . Client使⽤缓存中的Server Session Key解密Authenticator信息,得到该访问需要携带的ID和时间戳。
  • 2 . 认证完成,只需要使⽤申请的Service Ticket就可以正常访问服务。

0x03 体会总结:

  1. 感谢好兄弟的笔记,配合自己的抓包分析,学到了很多
  2. 把握关键点,配合攻击手段,针对认证的不同环境进行攻击
  3. 努力学习,早日脱菜!
loecho@垃圾桶