zoukankan      html  css  js  c++  java
  • 域渗透基础之Kerberos认证协议

     本来昨晚就该总结整理,又拖到今天早上。。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"后,其权限提升为企业管理员,企业管理员具有最高权限。

     

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

     0x02 Kerberos详解

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

     

    Kerberos的三大要素:

    • Client

    • Server

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

     

    流程参考链接: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 的交互。(访问)

    下面摘自倾旋大佬图片

    首先,客户端需要发送自己的身份信息到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

    数据结构:

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

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

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

    第二步客户端需要提供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组成如下:

    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

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

     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:1433
    
    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
  • 相关阅读:
    【洛谷 4613】Olivander
    【洛谷 1385】密令
    【洛谷 4439】Aron
    【洛谷 3383】线性筛素数
    【洛谷 2412】查单词
    【洛谷 1980】计数问题
    【洛谷 3372】(模板)线段树 1
    Luogu P3743 kotori的设备
    Luogu P2340 [USACO03FALL]Cow Exhibition G
    Luogu P3047 [USACO12FEB]Nearby Cows G
  • 原文地址:https://www.cnblogs.com/-qing-/p/11349134.html
Copyright © 2011-2022 走看看