kerberos

kerberos概述

Kerberos(/ˈkərbərəs/)是一种计算机网络授权协议,用来在非安全网络中,对个人通信以安全的手段进行身份认证。这个词又指麻省理工学院为这个协议开发的一套计算机软件。软件设计上采用客户端/服务器结构,并且能够进行相互认证,即客户端和服务器端均可对对方进行身份认证。

在kerberos协议中有三个角色:

  1. Client(访问服务)
  2. Server(提供服务)
  3. KDC(Key Distribution Center)密钥分发中心

image

其中:
KDC(Key Distribution Center)= 密钥分发中心
AS(Authentication Server)= 认证服务器
TGT(Ticket Granting Ticket)= TGT服务票据,由AS在AS-REP发放
TGS(Ticket Granting Server)= 票据授权服务器
ST(Server Ticket)=ST服务票据,由TGS在TGS-REP发放


kerberos协议分析

实验环境

域名:HIRO
域控:WIN-KONG@192.168.228.10 域管:hiro\administrator
域机器:DESKTOP-P34E60A@192.168.228.40 域用户:hiro\win10

win10用户执行:
net use \\WIN-KONG\C$ password /u:hiro\administrator

AS-REQ:

主要内容:

  1. 请求的用户端信息
  2. 加密类型
  3. Authenticator(用户Hash加密时间戳

image

客户端通过使用其凭据加密时间戳来执行预身份验证,以向 KDC 证明其拥有该帐户的凭据。使用时间戳而不是静态值有助于防止重放攻击。

AS-REP:

主要内容:

  1. 通过活动目录查询用户得到用户的Hash,用Hash解密Authenticator,如果解密成功并且时间戳在规定时间内(一般为五分钟),则预认证成功。
  2. 生成由krbtgt用户Hash加密的TGT认购权证,用于确保客户端和DC进行安全通信的用户Hash加密后的Login Session Key(作为下一阶段的认证秘钥)。
  3. 返回TGT,Login Session Key,时间戳和PAC。(PAC包含用户SID,所在组等信息)

PS:krbtgt这个用户在域生成的时候会自动创建,它是秘钥发行中心服务账户,不能直接登录。

PAC

只要用户通过预认证,拿到TGT,就能向TGS申请ST(kerberosat能利用的原因)。一切看起来好像合情合理,但是并没有判断用户是否拥有访问这个服务的权限,这就是PAC的作用。PAC在AS-REP过程中放在TGT里加密发送给Client其中包含的是用户的 SID、用户所在的组等一些信息。当Client需要访问Server所提供的某项服务时, Server为了判断用户是否具有合法的权限需要将Client的SID、用户所在的组等信息传递给KDC, KDC通过SID判断用户的用户组信息,用户权限等,进而将结果返回给Server,Server再将此信息与用户所索取的资源的ACL进行比较, 最后决定是否给用户提供相应的服务

有些服务并没有验证PAC,白银票据因此得到利用。如果验证了PAC的话,就算攻击者拥有服务Hash,制作了ST票据,也不能制作PAC(PAC由两个数字签名构成,而这两个数字签名分别由Server NTLM Hash和KDC NTLM Hash加密),并且只有KDC才能制作和查看PAC。

也恰恰是是这个 PAC,造成了 MS14-068 这个漏洞。该漏洞是位于 kdcsvc.dll 域控制器的密钥分发中心(KDC)服务中的 Windows 漏洞,它允许经过身份验证的用户在其获得的票证 TGT 中插入任意的 PAC 。普通用户可以通过呈现具有改变了 PAC 的 TGT 来伪造票据获得管理员权限。

image

TGS-REQ:

主要内容:

  1. 客户端信息
  2. Authenticator(Login Session Key加密时间戳)
  3. TGT认购权限
  4. 访问的服务名

因为请求目标服务是文件共享,则将TGS提交给CIFS服务访问

image
padata:

image

req-body:

image

TGS-REP:

主要内容:

  1. 检查自身是否存在服务,如果存在,通过krbtgt解密TGT并通过Login Session Key解密Authenticator(Login Session Key加密时间戳),就验证了对方身份。然后验证时间戳是否在范围内,并且验证TGT中的时间戳是否过期,原始地址是否和TGT保存的地址相同等。
  2. 生成用AS-REP得到的Login Session Key加密后的用于确保安全传输的Server Session Key
  3. 完成认证后,TGS生成ST票据,其中包括:客户端信息和原始的Server Session Key整个ST票据由该服务的NTLM Hash加密
  4. ST和Server Session Key发送给客户端。

DC并不会验证当前请求TGS的用户是否具有对其请求服务的访问权限,它只验证TGT是否有效,并基于TGT的信息制作TGS。

image

AP-REQ:

  1. 客户端收到TGS服务后,通过自己缓存的Login Session Key解密得到原始的Server Session Key。
  2. 将ST和Authenticator(Server Session Key加密时间戳)发送给服务端。
  3. 客户端访问服务,将PAC传递给服务进行检查;服务通过PAC查看用户的SID和用户组等并与服务自身的ACL进行对比。
  4. 域控制器验证响应上的签名并将结果返回给服务器。该错误作为适当的RPC状态代码返回。

AP-REP:

  1. 服务器验证AP-REQ,如果验证成功则发送AP-REP。
  2. 通过服务的NTLM Hash解密ST,从中提取Server Session Key。
  3. 通过提取出来的Server Session Key解密Authenticator,从而验证客户端身份。
  4. 将Server Session Key加密时间戳为Authenticator发送给客户端,客户端用缓存的Server Session Key进行解密,如果解密成功则说明两方有相同的Server Session Key。

验证TGT中携带的PAC,KDC通过SID判断用户的用户组信息,用户权限等,进而将结果返回给Server,Server再将此信息与用户所索取的资源的ACL进行比较,最后决定是否给用户提供相应的服务


kerberos简要概括

还是以上次使用域管与域控建立cifs的ipc连接为例

net use \\WIN-KONG\C$ password /u:hiro\administrator

1.用户使用该域管密码hash向域控制器 (DC) 进行身份验证。
2.DC在ntds对比用户hash是否正确,如果正确返回用户TGT票据和PAC等信息。
3.用户与域控建立cifs的ipc连接,在DC查询域控服务器的SPN。
4.识别出SPN后,与DC建立通信并呈现TGT,以及用户需要通信的SPN(在这里是域控机器的SPN)。
5.DC返回TGS票据给用户。
6.用户拿着TGS请求访问域控的cifs,DC解密TGS并检查认证用户的PAC(含sid和组等信息),判断用户是否有权限访问该服务。
7.如果有访问该服务的权限,ipc连接成功,否则拒接连接。


Kerberos攻击

AS-REQ:

域用户枚举,密码喷洒

当cname值中的用户不存在时返回包提示错误,当用户名存在时,密码正确或者错误返回包结果也不一样,所以可以尝试域用户枚举和密码喷洒攻击。
(可以在域外使用,但是能ping通域控)

AS-REP:

1.黄金票据

TGT由krbtgt用户Hash加密,如果拥有krbtgt用户Hash就可以制作任意用户的TGT。
尽管Kerberos票证生命周期受限于Active Directory域策略,但因为KDC信任TGT,所以自定义票据可以包含自定义票证生命周期(甚至超过域 kerberos 策略的票据生命周期)。

即使被模仿的用户更改了密码,为模拟用户而创建的金票仍然存在,因为它绕过了智能卡身份验证要求,绕过了 DC 在创建 TGT 之前执行的常规检查。
KRBTGT NTLM 哈希可用于生成有效的 TGT(使用 RC4加密)来模拟任何有权访问 Active Directory 中任何资源的用户。
Golden Ticket (TGT) 可以在任何机器上生成和使用,即使是未加入域的机器(需要将DNS指向域控)。

2.AS-REP Roasting攻击

enc-part是由用户密码Hash加密的,如果域用户设置了Do not require Kerberos preauthentication,就可以尝试爆破然后用hashcat破解获得用户密码。
当关闭了预身份认证后,攻击者可以使用指定用户去请求票据,此时域控不会做任何验证就将TGT票据和该用户Hash加密的Login Session Key返回。所以只要对Login Session Key离线解密,就可以得到指定用户的明文密码。

TGS-REP:

1.kerberoast攻击

ST由对应服务的Hash加密,并且攻击者可以指定kerberos加密类型(RC4,AES256,SHA1_96),如果攻击者的TGT凭证是有效的(不管用户对服务有没有访问权限),就可以在域内请求任意服务SPN。随后KDC查看哪个账户在ServicePrincipalName字段中注册了所请求的SPN,使用其对应的服务hash进行加密生成ST(使用攻击者和服务账户共同商定的加密算法)。随后在TGS-REP阶段返回给攻击者,可以进行离线解密得到服务Hash。只要TGT正确就一定会返回ST(只有关联到用户的SPN才对我们真正有价值)

2.白银票据

ticket中的enc-part是由服务Hash加密的,如果有了服务Hash,就可以签发任意用户的ST票据,不需要跟域控打交道,但是只能访问特定服务。(伪造的白银票据没有带有效KDC签名的PAC,如果目标验证了KDC的PAC签名,那么白银票据就不起作用了)

posted @ 2021-05-21 22:32  cAr7n  阅读(1396)  评论(13编辑  收藏  举报