Windows认证--Kerberos

2022-11-02 17:07:45 浏览数 (2)

什么是Kerberos

Kerberos是一种由MIT(麻省理工学院)提出的一种网络身份验证协议,可通过密钥系统为客户端/服务端提供认证服务。它能够为网络中通信的双方提供严格的身份验证服务,确保通信双方身份的真实性和安全性。该认证过程的实现不依赖于主机操作系统的认证,无需基于主机地址的信任,不要求网络上所有主机的物理安全。

Kerberos组成

Kerberos协议中存在三个角色,在整个认证过程中,三个角色缺一不可:

  • 客户端(Client):访问服务的一方
  • 服务端(Server):提供服务的一方
  • 密钥分发中心(Key Distribution Center,KDC),一般为域控制器,分为两部分
    • AS(Authentication Server):认证服务器,专门用来认证客户端身份并发放客户端用于访问TGS的TGT
    • TGS(Ticket Granting Ticket):票据授予服务器,用来发放整个认证过程以及客户端访问服务端时所需要的服务授予票据(Ticket)

AD(Account Database)账户数据库,一个类似于Windows本地SAM的数据库,存储了Client的白名单,只有在白名单中的Client才可以申请到TGT KDC中还包含一个KRBTGT账户,它是在创建域时自动创建的一个账户,是KDC的服务账户,用来创建TGS加密的密钥

认证过程

第一次通信

客户端为了获得能够访问服务端的票据,需要通过KDC来获得票据,客户端需要发送自己的身份信息到KDC,KDC中的AS接收请求后,会根据用户名在AD中查找是否存在此用户,如果存在该用户并提取对应用户的NTLM Hash,此时便返回响应给客户端,响应分为两部分:第一部分为TGT,客户端需要使用TGT去KDC中的TGS获取Tickt,TGT中包含客户端的Name,IP,TimeStamp,TGS Name,TGT有效时间以及用于客户端和TGS间进行通信的Session Key(CT_SK),整个TGT是通过krbtgt用户的NTLMhash加密Session Key和客户端的信息生成,客户端是无法解密的

第二部分为客户端密钥加密的内容,其中包含Session Key,TimeStamp,TGS Name,TGT有效时间,该部分是通过用户的NTLM Hash进行加密的,所以客户端在拿到该部分的时候是可进行解密的。

image.png

第二次通信

当客户端收到KDC的响应后,会将第二部分进行解密,分别获得TimeStamp,Session Key以及用于访问TGS的信息,首先会判断TimeStamp和自己发送请求的时间时差是否大于5分钟,如果合理则向TGS进行请求,此次的请求主要目的是为了获取能够访问服务端的Ticket. 客户端将Session Key加密的客户端信息、想要访问服务端的服务、TGT发送给KDC 当KDC中TGS接收到来自客户端的请求后,首先根据传输过来的服务端服务判断是否是可被用户访问的服务,然后会使用自己的密钥将TGT进行解密,然后通过Session Key将客户端的信息进行解密,取出用户信息和TGT中的用户信息进行比较,如果一致则KDC将相应返回给客户端,此时响应也分为两部分: 第一部分是用于客户端访问服务端的使用Server密码加密的Server Ticket(ST),其中包括Name、IP、Server IP、ST有效时间、TimeStamp、Session Key. 第二部分使用Session Key加密的信息其中包括Sesion Key、TimeStamp、ST有效时间。

第三次通信

在第一次通信的时候AS将Session Key交给了客户端,并且进行了缓存,所以在接收到TGS的响应后,通过缓存在本地是Session Key将第二部分进行解密并检查TimeStamp无误后 客户端使用Session Key将自己的信息和TimeStamp进行加密作为第一部分,ST作为第二部分发送给客户端 服务端接收到请求后,使用自己的密钥将第二部分进行解密,核对TimeStamp后将Session Key取出,并将第一部分解密,从而获得TGS认证后的客户端信息,然后将这部分信息和第二部分的信息进行对比,确认身份后,服务端会将通过Session Key加密的接受请求的响应发给客户端,客户端接收到响应后,使用缓存在本地的Session Key解密后最终确定了服务端的身份。

至此Kerberos认证完成,通信双方确认身份后便可以进行网络通信

NTLM与Kerberos的区别

NTLM和Kerberos协议都是基于对称密钥加密策略,并且都是强大的相关身份验证系统

主要区别如下: 1.NTLM和Kerberos的主要区别在于前者是基于挑战/响应的身份验证协议,而后者是基于票据的身份验证协议 2.Kerberos的安全性高于NTLM 3.Kerberos提供了相互身份验证功能,NTLM不支持 4.Kerberos支持委派和模拟,NTLM仅支持模拟 5.NTLM协议下的身份验证过程涉及客户端和服务器,Kerberos写一下可靠的第三方对身份验证过程是保密的

PAC

在Kerberos认证的流程中,没有提到该用户是否有访问该服务的权限,只要用户的hash正确,那么就可以拿到TGT有了TGT就可以拿到TGS,拿到TGS就可以访问该服务,这样任何用户就可以访问此服务了,所以就在实现Kerberos时加入了PAC(Privilege Attribute Certificate,特权属性证书),PAC就是为了区别不同权限的一种方式。

PAC会在AS_REQ时AS放在TGT中发给客户端,PAC包含用户SID以及用户所在的组,当用户得到TGS以后回去请求服务,服务进行解密TGS票据如果正确就会拿着PAC去询问KDC该用户是否有访问权限,KDC解密PAC获得用户的SID以及所在的组,然后判断此用户是否有访问服务的权限,如果由权限则允许用户访问

PAC对于用户和服务全程是不可见的,只有KDC能制作和查看.

SPN

SPN(Server Principal Names,服务主体名称),是域中服务的唯一标识,Kerberos身份验证使用SPN将服务实例域服务登录账户相关联。在服务加入域时,会自动注册一个SPN。

SPN分为两种: 第一种是注册在AD上机器账户(Computers)下,当一个服务的权限为Local System或Network Service,则SPN注册在机器账户(Computers)下 第二种是注册在AD的域用户账户(Users)下,当一个服务的权限为一个域用户,则SPN注册在域用户帐户(Users)下

CN=Users为域用户帐号,CN为Computers为机器用户

SPN格式

代码语言:javascript复制
<service class>/<host>:<port>/<service name>            //service class、host为必选项
  • server class为服务类型名称,如:ldap,www,dns等
  • host为主机名,可以使用DNS名或NetBIOS名
  • port当服务运行在默认端口是,可省略
  • server name为服务实例名称

可通过setspn进行查询域内SPN

代码语言:javascript复制
setspn -T test -q */*       //-T指定域 -Q指定对应服务  */*表示所有服务

参考

https://seevae.github.io/2020/09/12/详解kerberos认证流程/ https://www.bilibili.com/read/cv15702405/ https://askanydifference.com/difference-between-ntlm-and-kerberos/ https://chenlvtang.top/2022/02/21/内网渗透入门之SPN扫描/

0 人点赞