Kerberos主要为三方协议(地狱三头犬)
即:客户端Client、服务端Server、密钥分发中心KDC
其中KDC中包括
AS(Authentication Server、认证服务器)
和
TGS(Ticket GrantingServer、票据授予服务器)
AD(活动目录,里面包含域内用户数据库、存储用户、用户组、域相关的信息)
这里首先用一句话进行解释Kerberos协议流程以便于下文阐述的理解(仅帮助理解下述出现的名词后续有详细解析,带着这句话往下观看):
解决的问题:如何证明我就是我!!!!
大体分为三步:
1、客户端向 密钥分发中心KDC 中的 认证服务器AS进行请求,AS接收到请求后响应客户端并且返回一张票据TGT(此处是伪造黄金票据的位置)
2、客户端拿着认证服务器AS返回的票据TGT再次向密钥分发中心KDC 中的 票据授予服务器TGS请求,TGS收到请求后响应客户端并且返回一张票据ST(此处是伪造白银票据的位置)
3、客户端拿着票据授予服务器TGS返回的票据ST向服务端发起请求,服务端接收到请求后响应客户端,如若成功则完成整套Kerberos认证流程否则中断失败
究极简化:乘客进行购票,首先经过第一个房屋安检厅进行安检,安检过后证明乘客是“良民”,会给乘客一张“良票”(这里伪造的是黄金票据),乘客拿着这张“良票”去第二个房屋售票厅进行购票,乘客凭借着“良票”去售票厅购买车票(一张良票只能对应一张车票),购买完成后拿着车票在去找车厢和座位号(乘客一人一座这里是白银票据的限制)
问题一:怎么证明我就是我?
问题二:怎么证明客户端所带的票据不是假票?
第一步可以分为两小步:
①客户端首先向KDC 中的 AS(认证服务器)发起请求来获取TGT(验证客户端身份的票据)
②AS(认证服务器)返回响应,客户端是第一次访问KDC这时候KDC也不确定他的身份,所以第一步就是确定客户端是一个没有安全隐患的客户端,一个有权访问KDC的客户端(细化说就是as接受了请求然后去Kerberos的数据库中去找看有没有这个人)若有此人返回票据TGT,反之中断。
①客户端先以明文方式向AS(认证服务器)发出请求,其中内容包括:用户名、自己的IP、当前时间戳。
②AS(认证服务器)接收请求去Kerberos数据库中查找有无此用户,此时只会查找Kerberos数据库中是否有与之相同的用户,并不会判断身份的可靠性。
③如果AS(认证服务器)找AS到了相应的用户则返回TGT(TGT有时限约为8小时如果返回响应后客户端没有进一步操作超时后还需要再一次向AS请求)票据,反之则中断认证过程。
其中返回的TGT又包括两部分:
第一部分:是使用用户hash加密的内容包括:当前时间戳、要访问的TGS的名字、响应回TGT有效时间、访问TGS所用到的CT_SK(Client TGT Session key);
这部分内容是客户端自己可以解密的,通过自身密钥解密后可以看到内部下一步要访问TGS的名字,以及要访问TGS所用到的CT_SK。这里才认证了客户端身份,如果是假客户端是解不开的。
第二部分:是krbtgt的hash加密的内容包括:用户名、IP、TGS的名字、TGT有效时间、当前时间戳、CT_SK;第二部分内容客户端是解不开的。
第二步可以分为两小步:
首先它会根据时间戳判断该时间戳与自己发送请求时的时间的差值是否大于5分钟,如果大于5分钟则认为该TGT是伪造的,认证至此失败。反之客户端准备向TGS发起请求。
①客户端已经收到了AS(认证服务器)响应回的TGT票据,这时客户端会用自己密钥将刚才第一步的内容解密得到下一步要访问TGS(票据授予服务器)的信息和与TGS(票据授予服务器)通信的CT_SK(缓存起来)得到确定的路径,然后向tgs发送请求,这个请求就是为了能获取访问服务端的请求。
②TGS(票据授予服务器)接收到请求,返回响应票据ST(用户访问服务端的票据)
①客户端将会携带三部分内容向KDC中的TGS(票据授予服务器)发起请求。
第一部分:由krbtgt加密的的内容也就是第一次通信AS返回的TGT;
第二部分:使用CT_SK加密的客户端内容信息;
第三部分:明文发送的要请求的服务端名字IP等。
② TGS(票据授予服务器)接收客户端的请求,TGS根据客户端明文传输过的服务端IP与NAME查看当前Kerberos系统中是否有可以被客户端所访问的指定的服务。如若无则认证中断反之继续。
③TGS(票据授予服务器)使用自己的密钥进行解密,解密后可以看到全部票据TGT的内容以及用户信息,根据时间戳判断时延是否正确且在范围内,正常的话则会用自身的CK_SK解密得到用户的信息,在与其和TGT中的信息进行比对看是否正确。
④上述无误完成后,TGS(票据授予服务器)返回响应客户端票据ST,其中包括俩个部分内容:
第一部分:是使用CT_SK加密的内容包括:时间戳、ST有效时间、要访问服务端所用到的CS_SK,因为第一次与AS交互通信过程中已经对CT_SK进行了缓存,所以这部分内容用户是可以自行用密钥解密的。
第二部分:是使用Server的hash加密的内容包括:用户名、客户端IP、要请求的服务端IP、时间戳、ST有效时间、访问服务端所需要的CS_SK(Session Key)。
第三步可以分为两小步:
①客户端请求后收到了TGS的响应,并用缓存的CT_SK解密了其中的内容获得了需要向服务端请求的CS_SK,确认时间戳后准备向服务端访问(Server的hash加密的部分客户端无法解密 、PS:因为是客户端向服务端请求的某种服务所以内容中不需要有请求的服务端的IP等)
②服务端接收到了客户端请求返回相应,成功则建立通信完成Kerberos认证证明了我就是我的过程,反之则中断认证失败
①客户端将第二次通信响应回的票据ST使用CT_SK解密得到其中的CS_SK和其他信息,再用CS_SK将自己的时间戳、用户名等信息再次加密作为第一部分内容发送给服务端,再将第二次 通信时的第二部分内容原封不动的发送给服务端。
②服务端接收到客户端请求,会先用自己的密钥解密第二部分内容(Server的hash加密部分)确认时间戳后将其中的内容取出会得到CS_SK,在用取出的CS_SK把第一部分内容进行解密得到客户端的信息内容,此时服务端将两者内容进行比较,确认这个客户端就是有KDC认证的客户端,是可以信任的无害客户端(证明了我就是我!!)确认后服务端会返回响应一段由CT_SK加密的内容即服务端请求了一次客户端,客户端收到请求后再次使用缓存的CT_SK进行解密然后响应请求确定服务端身份完成通信。
PS:根据ST内的时间戳和解密时的时间戳进行对比,如果时间超过8小时则为验证失败,然后服务端会将PAC发送给DC(Document Control域控),询问DC该用户是否有访问权限,来决定客户端是否有权限访问Server(此句出处:https://www.freebuf.com/articles/web/290907.html)
PAC:
PAC的作用是用来验证用户是否有权限来访问服务,如果没有PAC,那么只需要拿到Hash就可以访问任何服务了,所以加入PAC是为了即使获得了Hash但是也会判断用户是否有权限访问某项服务。(详细:PAC在Kerberos认证协议中的作用(一) | Microsoft Learn)
根据上述Kerberos认证引出黄金票据、白银票据:
黄金票据伪造的是TGT(伪造后可以访问任意的服务票据)主要伪造的是域的KRBTGT账户NTLM哈希;一旦KRBTGT的NTLM哈希被获取到,通过黄金票据可伪造用户登录到整个森林中。
TGT仅用于向域控制器上的KDC服务证明用户已被其他域控制器认证。TGT被KRBTGT密码散列加密并且可以被域中的任何KDC服务解密的。
白银票据不需要与KDC交互,主要伪造在ST(伪造ST只能访问去某个服务的票据) 主要需伪造的是Server的NTLM哈希。
后续文章会有黄金票据白银票据详解
附:找到比较详细的黄金票据析:https://www.cnblogs.com/backlion/p/8127868.html