zoukankan      html  css  js  c++  java
  • 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
    
    联系邮箱:yang_s1r@163.com 博客园地址:https://www.cnblogs.com/Yang34/
  • 相关阅读:

    IT人的素质 & 设计杂谈
    结构化思维思维的结构
    [WM].NET CF下如何提高应用程序的性能 【转载】
    无题
    [WM]谁抢走了应用程序的性能? 【转载】
    繁体编码文本文件转换为简体编码的工具
    生成VB多行字符串常量的工具
    跟我一步一步开发自己的Openfire插件
    cnblogs博文浏览[推荐、Top、评论、关注、收藏]利器代码片段
  • 原文地址:https://www.cnblogs.com/Yang34/p/14248737.html
Copyright © 2011-2022 走看看