前言
Kerberos协议是一种网络认证协议,其设计目标是通过密钥系统为客户/服务器应用程序提供强大的认证服务。在令牌窃取攻击中,该攻击的核心就是Kerberos协议。Kerberos协议要解决的实际上就是一个身份认证的问题,顾名思义,当一个客户机去访问一个服务器的某服务时,服务器如何判断该客户机是否有权限来访问本服务器上的服务,同时保证在该过程中的通讯内容即便被拦截或者被篡改也不影响整个通讯的安全性。
概念说明
先来简要说明几个主要的名词
1 | (1)Client:访问服务的客户机 |
认证过程
Kerberos
认证的过程形象地比喻如下:
1 | 疫情期间,小明去拿一个重要包裹,由于包裹是来自海外的,所以需要严格登记: |
在Kerboeros
协议认证过程中,会用到两个基础认证模块,分别是AS_REQ&AS_REP
和TGS_REQ&TGS_REP
,以及在认证过程中可能会使用到的S4U
和PAC
这两个认证模块。
使用wireshark
抓包得到数据包,PS:在抓包的时候,先用mimikatz
将机器中的票据清除
域控:10.10.10.10(windows server 2008 R2)
域成员:10.10.10.80(windows 7)
域用户账号密码:hunter1/1qaz@WSX
Kerberos认证
中有两个问题
1 | (1)AS如何验证Client的身份? |
因为kerberos
协议的实现,需要三方的参与,分别如下:
1 | 1.client 访问服务的客户机 |
Kerberos
认证过程如下图所示
其中:KDC
中有AS认证服务
与TGS认证服务
1 | (1)Client向KDC的AS认证服务请求TGT票据=>AS_REQ |
注:(6)(7)两步不一定发生,需要将目标主机配置为验证KDC PAC验证。
1 | 域中每个用户的Ticket都是由krbtgt的密码Hash来计算生成的,因此只要我们拿到了krbtgt的密码Hash,就可以随意伪造Ticket,进而使用Ticket登陆域控制器,使用krbtgt用户hash生成的票据被称为Golden Ticket,此类攻击方法被称为票据传递攻击。 |
先前提到两个问题,第一个问题
1 | (1)AS如何验证Client的身份? |
AS_REQ&AS_REP
分析AS-REQ的数据包
AS-REQ
:当某个域用户试图访问域中的某个服务,于是输入用户名和密码,本机Kerberos
服务会向KDC
的AS
认证服务发送一个AS-REQ
认证请求。该请求包中包含:请求用户名
,客户端主机名
,加密类型
和Autherticator(用户NTLM Hash加密的时间戳)
以及一些信息。
Client
向KDC
发起AS_REQ
请求凭据是用户hash加密的时间戳。请求凭据放在PA_DATA
里面。
1 | Pvno kerberos协议版本号:05(Hex) |
分析AS-REP的数据包
AS-REP
:Client发送AS_REQ
,请求凭据是用户 hash加密的时间戳。请求凭据放在PA_DATA里面。当KDC中的AS认证服务收到后,在AS服务器中有用户hash,使用用户hash进行解密,获得时间戳,如果解密成功,并且时间戳在五分钟之内,那么预认证通过。接着AS认证服务将会向Client发送响应包,响应包中包括krbtgt用户的NTML hash加密后的TGT票据以及用户NTML Hash加密的Login Session key和其他信息。
ticket中的enc-part是由krbtgt的密码hash加密生成的。如果我们拥有krbtgt的hash,便可以自制ticket,发起黄金票据攻击
Login Session Key使用用户NTML Hash加密,作用是用于是用于确保客户端和KDC下一阶段之间通信安全,作为下一阶段的认证密钥
1 | 在这一阶段,Client与KDC之间的交互在于AS认证服务,主要是为了获得TGT认证票据,以及Login Session Key,经过该阶段后,Client将会使用自身密码的NTML hash解密Login Session Key得到原始的Login Session Key。然后它会在本地缓存TGT票据和原始Login Session Key |
TGS_REQ&TGS_REP
先前提到两个问题,第二个问题
1 | (2)Client如何获取ST? |
Client在拿到TGT
和Login Session Key
之后,下一步的认证交互在于KDC中的TGS认证服务,主要目的是为了获取ST服务票据
,因为当Client需要访问某服务器中的某服务时,需要“门票”–ST服务票据
这一阶段,微软引进了两个扩展S4U2SELF
和S4U2PROXY
。
TGS-REQ数据包分析
该数据包中的主要内容为:客户端信息,Authenticator(Login Session Key加密的时间戳)、TGT认证权证(padata下ap-req下的ticket)以及访问的服务名
等。
padata
部分:
在padata
中有很重要的一部分叫做AP-REQ
,这是TGS-REQ
中必须有的数据,这部分会携带AS-REP里面获取到的TGT票据,KDC检验TGT票据,如果票据正确,返回ST票据。
TGS-REQ
请求包中的authenticator
就是AS-REP
响应包返回的Login Session key
加密的时间戳
req-body
部分:
在req-body
中
1 | padding:0 |
分析TGS-REP数据包
TGS-REP
:当TGS收到请求后,将会检查自身是否存在客户端所请求的服务,如果服务存在,通过krbtgt用户的NTML hash解密TGT并且得到Login Session Key,通过Login Session Key解密Authenticator。
这一系列解密成功的话,将会验证对方的身份,验证时间戳是否在范围内,并且检查TGT中的时间戳是否过期,且原始地址是否和TGT中保存的地址相同
完成认证后,TGS生成ST票据(包括客户端信息和原始Server Session key,整个ST服务票据使用该服务的NTML hash加密以及一个AS-REP返回的Login-Session-Key加密的Server Session Key。这两个将在响应包中发送给Client
PS:在这一步中,不论用户是否有权限访问服务,只要TGT解密无误,都将返回ST服务票据。任何一个用户,只要hash正确,就可以请求域内任何一个服务的票据
ST票据通过认证访问服务
使用ST票据通过认证访问服务
需要强调的是,这里需要使用双向验证,因为实际情况中,需要客户端和服务器互相验证
(1)服务端验证客户端:防止非法用户操作
(2)客户端验证服务端:防止误入恶意服务
PS:PAC并不是所有服务都开启的,这需要配置验证KDC PAC 签名。没有验证PAC,可能会导致白银票据攻击。因为开启PAC后,就算攻击者拥有用户hash,能制作ST票据后,无法通过PAC验证,还是无法访问服务。
后话
Kerberos的攻击有如下:
参考文章:
https://www.zhihu.com/question/22177404
https://blog.csdn.net/matthewei6/article/details/50769670
http://www.secwk.com/2019/11/05/13711/