域渗透基础之Kerberos认证协议

时间:2021-07-20 18:12:18

 本来昨晚就该总结整理,又拖到今天早上。。6点起来赶可还行

0x01 Kerberos前言

Kerberos 是一种由 MIT(麻省理工大学)提出的一种网络身份验证协议。它旨在通过使用密钥加密技术为客户端/服务器应用程序提供强身份验证。

Kerberos 主要是用在域环境下的身份认证协议。

Active Directory

Active Directory(活动目录)是微软Windows Server中,负责架构中大型网路环境的集中式目录管理服务(Directory Services),Windows 2000 Server开始内建于Windows Server产品中。

Active Directory存储了有关网络对象的信息,并且让管理员和用 户能够轻松地查找和使用这些信息。Active Directory使用了一种 结构化的数据存储方式,并以此作为基础对目录信息进行合乎逻 辑的分层组织。

网络对象分为:用户、用户组、计算机、域、组织单位以及安全策略等。

Active Directory的主要功能作用

1.用户服务

管理用户域账户、用户信息、企业通讯录(与电子邮件系统集成)、用户组管理、用户身份认证、用户授权管理等, 按省实施组管理策略。

2.计算机管理

管理服务器及客户端计算机账户、所有服务器及客户端计算机加入域管理并按需实施组策略。

3.资源管理

管理打印机、文件共享服务、网络资源等实施组策略。

4.应用系统的支持

对于电子邮件(Exchange)、在线及时通讯(Lync)、企业信息管理(SharePoint)、微软CRM,ERP等业务系统提供数据认证(身份认证、数据集成、组织规则等)。这里不单是微软产品的集成,其它的业务系统根据公用接口的方式一样可以嵌入进来。

5.客户端桌面管理

系统管理员可以集中的配置各种桌面配置策略,如:用户适用域中资源权限限制、界面功能的限制、应用程序执行特征的限制、网络连接限制、安全配置限制等。

关于上面提到的网络对象:

这里转自 https://www.cnblogs.com/IFire47/p/6672176.html

1.域(Domain).简单理解为:A公司总部

域(Domain)是AD的根,是AD的管理单位。域中包含着大量的域对象,如:组织单位(Organizational Unit),组(Group),用户(User),计算机(Computer),联系人(Contact),打印机,安全策略等。

2.组织单位(Organization Unit).简单理解为:A公司的分公司

组织单位简称为OU是一个容器对象,可以把域中的对象组织成逻辑组,帮助网络管理员简化管理组。组织单位可以包含下列类型的对象:用户,计算机,工作组,打印机,安全策略,其他组织单位等。可以在组织单位基础上部署组策略,统一管理组织单位中的域对象。

3.群组(Group).简单理解为:某分公司里的某事业部

群组是一批具有相同管理任务的用户账户,计算机账户或者其他域对象的一个集合。例如公司的开发组,产品组,运维组等等。

群组类型分为两类:

  安全组:用来设置有安全权限相关任务的用户或者计算机账户的集合。比如:Tiger组都可以登录并访问某ftp地址,并拿到某个文件。

  通讯组:用于用户之间通信的组,适用通信组可以向一组用户发送电子邮件。比如:我要向团队内10为成员都发送同一封邮件这里就要抄送9次,而使用组的话我直接可以发送给@Tiger,所有Tiger组内的成员都会收到邮件。

4.用户(User).简单理解为:某个工作人员

AD中域用户是最小的管理单位,域用户最容易管理又最难管理,如果赋予域用户的权限过大,将带来安全隐患,如果权限过小域用户无法正常工作。

域用户的类型,域中常见用户类型分为:

  普通域用户:创建的域用户默认就添加到"Domain Users"中。

  域管理员:普通域用户添加进"Domain Admins"中,其权限升为域管理员。

  企业管理员:普通域管理员添加进"Enterprise Admins"后,其权限提升为企业管理员,企业管理员具有最高权限。

域渗透基础之Kerberos认证协议

AD的数据结构为树形结构,层次结构。树状目录形管理,面向对象式的存储。域(Domin)--->组织单位(Organization Unit)--->群组(Group)--->用户(User)从左至右依次嵌套,形成树状型结构。有点像文件夹的存储方式。

域渗透基础之Kerberos认证协议

0x02 Kerberos详解

Kerberos 是一种网络认证协议,其设计目标是通过密钥系统为客 户机 / 服务器应用程序提供强大的认证服务。该认证过程的实现不 依赖于主机操作系统的认证,无需基于主机地址的信任,不要求 网络上所有主机的物理安全,并假定网络上传送的数据包可以被 任意地读取、修改和插入数据。在以上情况下, Kerberos 作为一 种可信任的第三方认证服务,是通过传统的密码技术(如:共享 密钥)执行认证服务的。

域渗透基础之Kerberos认证协议

Kerberos的三大要素:

  • Client

  • Server

  • KDC(Key Distribution Center) = DC(Domain Controller)

域渗透基础之Kerberos认证协议

流程参考链接:https://tools.ietf.org/html/rfc4120.html

Kerberos认证协议的基础概念:

票据(Ticket):是网络对象互相访问的凭证。

TGT(Ticket Granting Ticket):入场券,通过入场券能够获得票据,是一种临时凭证的存在。

KDC负责管理票据、认证票据、分发票据,但是KDC不是一个独立的服务,它由以下服务组成:

  • Authentication Service: 为client生成TGT的服务(简称AS)

  • Ticket Granting Service: 为client生成某个服务的ticket(简称TGS)

另外还需要介绍一个类似于本机SAM的一个数据库:AD,全称叫account database,存储所有client的白名单,只有存在于白名单的client才能顺利申请到TGT。

从物理层面看,AD与KDC均为域控制器(Domain Controller)。

域认证粗略流程

  1. client向kerberos服务请求,希望获取访问server的权限。 kerberos得到了这个消息,首先得判断client是否是可信赖的, 也就是白名单黑名单的说法。这就是AS服务完成的工作,通过 在AD中存储黑名单和白名单来区分client。成功后,返回AS返 回TGT给client。

  2. client得到了TGT后,继续向kerberos请求,希望获取访问 server的权限。kerberos又得到了这个消息,这时候通过client 消息中的TGT,判断出了client拥有了这个权限,给了client访 问server的权限ticket。

  3. client得到ticket后,终于可以成功访问server。这个ticket只是 针对这个server,其他server需要向TGS申请。

The Authentication Service Exchange:Client 与 AS 的交互;(请求TGT)

The Ticket-Granting Service (TGS) Exchange:Client 与 TGS 的交互;(请求ST)

The Client/Server Authentication Exchange:Client 与 Server 的交互。(访问)

域渗透基础之Kerberos认证协议

下面摘自倾旋大佬图片

域渗透基础之Kerberos认证协议

首先,客户端需要发送自己的身份信息到KDC,身份信息中起码包含用户名,KDC根据用户名在AD中寻找是否在白名单中,然后根据用户名提取到对应的NTLM Hash。

KDC此时生成一个随机字符串,叫Session Key,使用用户名对应的NTLM Hash加密Session Key,作为AS数据,使用KDC中某个用户的NTLM Hash加密Session Key和客户端的信息,生成TGT。(这里的用户就是krbtgt)

  • Session Key用于客户端向TGS服务通信。

  • 域内所有网络对象的凭证都在AD中保存

  • KDC中某个用户指的是krbtgt

域渗透基础之Kerberos认证协议

数据结构:

域渗透基础之Kerberos认证协议

域渗透基础之Kerberos认证协议

其中,TGT的到期时间为8小时,如果超过了8小时,还需要重新申请TGT,不能之间进入下一步获取Ticket。

Kerberos是一个假设网络环境不安全的情况下能够正常进行认证工作的协议。

第一步中,KDC返回的TGT客户端是无法解密的,因为它没有KDC Hash。

域渗透基础之Kerberos认证协议

第二步客户端需要提供TGT与第一步中使用自己NTLM Hash解密出来的Session Key加密的客户端信息跟时间戳。

如果假设这个数据被中间人窃取到,也无法在段时间内破解,因为KDC会校验时间戳。

KDC接到TGT与其他内容后,会首先解密TGT,只有KDC可以解密TGT,从TGT中提取到Session Key,再使用Session Key解密其他内容,解密出来的内容同TGT中的信息进行校验来确认客户端是否受信。

验证通过后,就会生成一个新的Session Key,我们称之为Server Session Key,这个Server Session Key主要用于和服务器进行通信。同时还会生成一个Ticket,也就是最后的票据了。

Ticket组成如下:

域渗透基础之Kerberos认证协议

Server Hash:这个Hash是在AD中服务器计算机的NTLM Hash

在第三步里,客户端向服务器请求,需要提供Ticket,Server Session Key加密的客户端信息与时间戳。

  • Ticket客户端无法解密

  • 服务器端通过解密Ticket解密Server Session Key(Client info + Timestamp)

  • 比较时间长度

校验通过后,认证成功,该票据会一直存在客户端内存中。

0x03 PAC && SPN

PAC

在 Kerberos 最初设计的几个流程里说明了如何证明 Client 是 Client 而不是由其他人来冒充的,但并没有声明 Client 有没有访问 Server 服务的权限,因为在域中不同权限的用户能够访问的资源是有区别的。

所以微软为了解决这个问题在实现 Kerberos 时加入了 PAC 的概念,PAC 的全称是 Privilege Attribute Certificate(特权属性证书)。可以理解为火车有一等座,也有二等座,而 PAC 就是为了区别不同权限的一种方式

(1)PAC 的实现

当用户与 KDC 之间完成了认证过程之后,Client 需要访问 Server 所提供的某项服务时,Server 为了判断用户是否具有合法的权限需要将 Client 的 User SID 等信息传递给 KDC,KDC 通过 SID 判断用户的用户组信息,用户权限等,进而将结果返回给 Server,Server 再将此信息与用户所索取的资源的 ACL 进行比较,最后决定是否给用户提供相应的服务。

PAC 会在 KRB_AS_REP 中 AS 放在 TGT 里加密发送给 Client,然后由 Client 转发给 TGS 来验证 Client 所请求的服务。

在 PAC 中包含有两个数字签名 PAC_SERVER_CHECKSUM 和 PAC_PRIVSVR_CHECKSUM,这两个数字签名分别由 Server 端密码 HASH 和 KDC 的密码 HASH 加密。

同时 TGS 解密之后验证签名是否正确,然后再重新构造新的 PAC 放在 ST 里返回给客户端,客户端将 ST 发送给服务端进行验证。

(2)Server 与 KDC

PAC 可以理解为一串校验信息,为了防止被伪造和串改,原则上是存放在 TGT 里,并且 TGT 由 KDC hash 加密。同时尾部会有两个数字签名,分别由 KDC 密码和 server 密码加密,防止数字签名内容被篡改

摘自freebuf

域渗透基础之Kerberos认证协议

同时 PAC 指定了固定的 User SID 和 Groups ID,还有其他一些时间等信息,Server 的程序收到 ST 之后解密得到 PAC 会将 PAC 的数字签名发送给 KDC,KDC 再进行校验然后将结果已 RPC 返回码的形式返回给 Server。

域渗透基础之Kerberos认证协议

 SPN

SPN定义

   服务主体名称(SPN)是Kerberos客户端用于唯一标识给特定Kerberos目标计算机的服务实例名称。Kerberos身份验证使用SPN将服务实例与服务登录帐户相关联。如果在整个林中的计算机上安装多个服务实例,则每个实例都必须具有自己的SPN。如果客户端可能使用多个名称进行身份验证,则给定的服务实例可以具有多个SPN。例如,SPN总是包含运行服务实例的主机名称,所以服务实例可以为其主机的每个名称或别名注册一个SPN。

SPN扫描

spn扫描也可以叫扫描Kerberos服务实例名称,在Active Directory环境中发现服务的最佳方法是通过“SPN扫描”。通过请求特定SPN​类型的服务主体名称来查找服务,SPN扫描攻击者通过网络端口扫描的主要好处是SPN扫描不需要连接到网络上的每个IP来检查服务端口。SPN扫描通过LDAP查询向域控制器执行服务发现。由于SPN查询是普通Kerberos票据的一部分,因此如果不能被查询,但可以用网络端口扫描来确认。

SPN格式

SPN = serviceclass “/” hostname [“:”port] [“/” servicename]

serviceclass = mssql

servicename =sql.bk.com

其中:

serviceclass:标识服务类的字符串,例如Web服务的www

hostname:一个字符串,是系统的名称。这应该是全限定域名(FQDN)。

port:一个数字,是该服务的端口号。

servicename:一个字符串,它是服务的专有名称(DN),objectGuid,Internet主机名或全限定域名(FQDN)。

注意: 服务类和主机是必需参数,但 端口和服务名是可选的,主机和端口之间的冒号只有当端口存在时才需要

常见服务和spn服务实例名称

MSSQLSvc/adsmsSQLAP01.adsecurity.org:

Exchange

exchangeMDB/adsmsEXCAS01.adsecurity.org

RDP

TERMSERV/adsmsEXCAS01.adsecurity.org

WSMan / WinRM / PS Remoting

WSMAN/adsmsEXCAS01.adsecurity.org

Hyper-V Host

Microsoft Virtual Console Service/adsmsHV01.adsecurity.org

VMWare VCenter

STS/adsmsVC01.adsecurity.org