熟悉域渗透的第一步其实就是针对Kerberos协议进行理解,理解Kerberos协议本身的缺点、安全问题。才能更好地在域环境中应用各种攻击手法。
0x01 Kerberos协议概述

Kerberos是一种由MIT(麻省理工大学)提出的一种网络身份验证协议。它旨在通过使用密钥加密技术为客户端/服务器应用程序提供强身份验证。
Kerberos协议中主要是有三个角色的存在:
访问服务的Client(以下表述为Client 或者用户)
提供服务的Server(以下表述为服务)
KDC(Key Distribution Center)密钥分发中心 ,其中KDC服务默认会安装在一个域的域控中。在Kerberos中Client是否有权限访问Server端的服务由KDC发放的票据来决定。
0x02 认证流程
为了方便理解我们将Kerberos协议整个认证过程抽象理解为某个人在动物园购买票进而参园的一个过程,而这个动物园相对来说比较高级仅对于认证的VIP用户开放。
第一阶段通信
该阶段是客户端第一次访问KDC,此时KDC也不确定客户端的身份;所以第一次通信的目的为了KDC认证客户端身份,确认客户端是一个可靠且拥有KDC权限的客户端。
相当于检验是否为VIP客户,只有VIP客户才能买票。

① AS_REQ:Client向KDC发起AS_REQ请求,该次请求中携带了自己的用户名,主机IP,和当前时间戳;
② AS_REP:KDC中的AS(Authentication Server)服务接收请求后会去kerberos认证数据库中根据用户名查找是否存在该用户。如果没有该用户名,认证失败,服务结束;如果存在该用户名,则AS认证中心便认为用户存在,此时便会返回响应给客户端,响应内容分为两部分。
第一部分:TGT票据,TGT票据含PAC,PAC含客户端sid第二部分:session_key(CT_SK,用于下阶段客户端与TGS通信的key)、TGS的name、TGT的有效时间,这三个内容是使用客户端端的密钥进行加密。
客户端的密钥不在网络中传输,防止假客户端认证。
第二阶段通信
该阶段的目的为了获取访问对应服务的ticket,相当于开始购买动物园的门票。

在客户端发送第二阶段的第一次请求之前:
客户端会使用自身密钥解密第一阶段KDC返回的加密信息,其中查看返回的时间戳与第一阶段的第一次请求之间的时间差是否大于5分钟。如果大于5分钟就会认定为伪造的请求,中止认证;否则开始发送第二阶段的第一次请求。
① TGS_REQ:该阶段客户端凭借TGT票据请求TGS获取ticket,其中请求内容含两部分。
第一部分:TGT票据、ServerIP(自己想访问的服务的IP),这两内容使用TGS密钥加密。第二部分:client的name、client的ip、client的时间戳,这三个内容使用session_key(CT_SK)加密。
② TGS_REP:该阶段TGS收到来自客户端的请求:
1、首先,根据发送过来的ServereIP去kerberos数据库中查询是否存在客户端想访问的服务;如果不存在,结束认证,否则继续认证。
2、TGS使用自己的密钥解密TGT内容,此时TGS可以查看到第一阶段客户端与AS之间的认证信息,session_key、时间戳。根据时间戳判断是否超时。
3、使用CK_SK解密第二部分内容(使用CT_SK加密的内容),取出解密信息与TGT信息是否一致,一致后进行下一步。
4、此时KDC将信息返回给客户端,响应内容包含两部分。
第一部分:该字段是使用server的密码加密的ST即为ServerTicket,可理解为买到的票。ServerTicket含有客户端的Name、IP、需要访问的网络服务的IP、ST有效时间、时间戳、用于客户端与Server之间通信的key(CS_SK,sessionkey)
第二部分:使用CT_SK加密的内容,其中包括CS_SK和时间戳,还有ST的有效时间。
第三阶段通信
第二阶段已经获取的对应服务的许可票据,在第三阶段就要拿着服务许可票据进行访问资源。相当于买到了票,去动物园看演出。

① CS_REQ:该阶段客户端使用CK_SK将自己的主机信息和时间戳进行加密作为交给服务端的第一部分内容,然后将ST(服务授予票据)作为第二部分内容都发送给服务端。
② CS_REP: 服务器此时收到了来自客户端的请求,他会使用自己的密钥,即Server密钥将客户端第二部分内容进行解密。
解密之后核对时间戳之后将其中的CS_SK取出,使用CS_SK将客户端发来的第一部分内容进行解密,从而获得经过TGS认证过后的客户端信息。
此时他将这部分信息和客户端第二部分内容带来的自己的信息进行比对,最终确认该客户端就是经过了KDC认证的具有真实身份的客户端,是他可以提供服务的客户端。
此时服务端返回一段使用CT_SK加密的表示接收请求的响应给客户端,在客户端收到请求之后,使用缓存在本地的CS_ST解密之后也确定了服务端的身份(其实服务端在通信的过程中还会使用数字证书证明自己身份)。
0x03 Kerberos整体流程图


0x04 Kerberos安全问题
第一阶段通信 AS_REQ&AS_REP
1. 用户名枚举
AS_REQ阶段发送请求中含有用户名,AS拿着用户名去Kerberos数据库中去查询是否存在该用户,成功则继续进行认证,失败则中止认证。
所以因此特性就会存在用户名枚举的问题,在域外可以利用该漏洞枚举域用户,在域内则可以使用LDAP进行查询。
2. 黄金票据
AS_REP阶段,如果AS在Kerberos数据库中查询存在该用户,则会使用krbtgt hash加密的TGT票据,TGT票据内含有PAC,PAC包含用户的sid,用户所在的组。
如果我们拥有krbtgt的hash就可以给我们自己签发任意用户的TGT票据,这个票据也被称为黄金票据。
3. Password Spraying
在 Kerberos 协议认证的 AS-REQ 阶段,cname 的值是用户名。当用户不存在时,返回包提示错误。当用户名存在,密码正确和密码错误时,AS-REP 的返回包不一样。所以可以利用这点,对域内进行域用户枚举和密码喷洒攻击。
4. pass the hash
就是由于在进行认证的时候,是用用户hash加密时间戳,即使在使用密码进行登录的情况下,也是先把密码加密成hash,再进行认证。因此在只有用户hash,没有明文密码的情况下也是可以进行认证的。
5. AS-REPRoasting
对于域用户,如果设置了选项”不要求Kerberos预身份认证”,
当关闭了预身份验证后,攻击者可以使用指定用户去请求票据,此时域控不会作任何验证就将 TGT 票据 和 该用户 Hash 加密的 Session Key 返回。
因此,攻击者就可以对获取到的 用户 Hash 加密的 Session Key 进行离线破解,如果破解成功,就能得到该指定用户的密码明文。(但是Kerberos预身份认证默认是关闭的)
第二阶段通信TGS_REQ&TGS_REP
1. 白银票据
在第一阶段通信AS_REP后客户端获取了TGT票据,在获取TGT票据之后客户端再次请求向TGS请求获取TGS票据。这个返回的票据是使用服务的hash进行加密的,如果我们获取了服务的哈希就可以给我们自己签发任意用户的TGS票据。
注意:使用服务的哈希伪造的TGS票据(白银票据)是没有KDC PAC签名的,如果目标主机配置为验证KDC PAC签名则白银票据不起作用。
2. Kerberosting
在TGS_REP阶段只要TGT正确,不管是否有权限均会返回ST票据,返回的ST票据是使用服务的hash进行加密的,我们可以对ST票据的哈希进行爆破。
这里的服务只得是SPN,SPN可以分成俩种一种是注册在机器用户下,一种是注册在域用户下。注册在机器用户的下SPN是120位随机Unicode组成,几乎不可破解,所以在实际运用中我们先找到注册在域账户下的SPN服务,并申请对应的ST进行破解。
0x05 结语
本篇文章介绍了Kerberos协议的认证过程,后面将针对Kerberos协议中的安全问题所涉及的攻击手段进行详细的复现。




