前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Kerberos认证流程详解

Kerberos认证流程详解

作者头像
红队蓝军
发布2024-07-26 19:23:52
170
发布2024-07-26 19:23:52
举报
文章被收录于专栏:红队蓝军

Kerberos 是一种网络认证协议,是通过密钥系统为客户机/服务器应用程序 提供认证服务。该认证过程的实现不依赖于主机操作系统的认证,无需基于主机地址 的信任,不要求网络上所有主机的物理安全,并假定网络上传送的数据包可以被任意的读取、 修改和插入数据。

Kerberos 作为一种可信任的第三方认证服务,是通过传统的密码技术(如:共享密钥)执行认证服务的。

Kerberos协议中的角色

在Kerberos协议中,存在三个主要角色:

  1. 客户端(Client):发送请求的一方。
  2. 服务端(Server):接受请求的一方。
  3. 密钥分发中心(Key Distribution Center, KDC): 包括认证服务器(AS)和票据授予服务器(TGS)两个部分。
    • 认证服务器(Authentication Server, AS):AS 的作用就是验证 Client 的身份(确认你是身份证上的本人),验证通过就给一张 TGT(Ticket Granting Ticket)票给 Client。
    • 票据授予服务器(Ticket Granting Service, TGS):TGS 的作用就是通过 AS 发给 Client 的票(TGT)换取访问 Server 端的票 ST(Server Ticket)。ST也有资料称之为 TGS Ticket。
代码语言:javascript
复制
KDC 默认安装在**域控**中,而 Client 和 Server 为域内的用户或者服务,如 web 应用、数据库服务器和邮件服务器等。Client 是否有权限访问 Server 端的服务由 KDC 发放的**票据**来决定。如果把 Kerberos 中的票据比作一张火车票,那么 Client 端就是乘客,Server 就是火车, 而 KDC 就是火车站的认证系统。如果 Client 端的票据是合法的(由你本人身份证购买并且 由你本人持有)同时有访问
Server 端服务的权限(车票对应车次正确)那么你才能上车。当然和火车票不同的是 Kerberos 中有两张票据,而火车票只有一张。

Kerberos认证流程

当 Client 想要访问 Server 上的某个服务时,需要先向 AS 证明自己的身份,然后通过 AS 发放的 TGT 向Server 发起认证请求。这个过程分为三块:

代码语言:javascript
复制
The Authentication Service Exchange: Client 与 AS 的交互
The Ticket Granting Service Exchange: Client 与 TGS 的交互
The Client/Server Authentication Exchange: Client 与 Server 的交互

Kerberos的认证流程大致可以分为以下几个步骤:

  1. 客户端向AS请求TGT
    • 客户端通过命令kinit USERNAME,将信息发送给AS。
    • AS检查用户是否在AD(Account Database)中,若存在,KDC将生成一个密钥(KEY),用于客户端与TGS的通信。
    • AS使用其密钥加密TGT,并将TGT和另一条由客户端密钥加密的信息(包含TGS Session Key)一起返回给客户端。
  2. 客户端解密信息并获取TGS Session Key
    • 客户端使用本地密钥解密第二条信息,获取TGS Session Key。
    • 然后将TGT以及通过TGS Session Key加密的认证信息转发给TGS。
  3. TGS验证TGT并生成服务票据
    • TGS使用自己的密钥从TGT中解密出TGS Session Key,并用其解密客户端的认证信息并进行检查。
    • TGS生成一个HTTP Session Key,使用它加密一条信息(HTTP Ticket),并用TGS Session Key加密另一条信息(包含HTTP Session Key),一起发送给客户端。
  4. 客户端使用服务票据访问服务端
    • 客户端利用TGS Session Key解密信息,获取HTTP Session Key。
    • 然后将HTTP Ticket以及通过HTTP Session Key加密的认证信息发送给HTTP服务。
  5. 服务端验证票据并提供服务
    • HTTP服务用自身密钥解密出HTTP Ticket的信息得到HTTP Session Key,并利用它解密出认证信息。
    • 若认证成功,客户端即可与远程HTTP服务完成认证,进行后续通信。

简化认证流程

Kerberos的认证过程可以简化为以下步骤:

  1. 客户端向KDC请求服务票据
    • 客户端向AS发送自己的用户名,AS验证后生成TGT并发送给客户端。
    • 客户端使用TGT向TGS请求服务票据。
  2. 客户端使用服务票据访问服务
    • 客户端将服务票据发送给服务端,服务端验证票据后提供服务。

绕过Kerberos认证

MS14-068
  • CVE编号:CVE-2014-6324

了解PAC这个东西,PAC是用来验证Client的访问权限的,它会被放在TGT里发送给Client,然后由Client发送给TGS。

Windows域中使用kerberos协议过程中,为了让服务器判断Client是否有权限访问服务,微软在Windows平台上对Kerberos协议进行了一些扩充,即在协议中增加了PAC(Privilege Attribute Certificate),特权属性证书,也就是这个PAC造成了MS14-068这个漏洞。

MS14-068是密钥分发中心(KDC)服务中的Windows漏洞。它允许经过身份验证的用户在其Kerberos票证(TGT)中插入任意的PAC(表示所有用户权限的结构)。该漏洞位于kdcsvc.dll域控制器的密钥分发中心(KDC)中。普通用户可以通过呈现具有改变了PAC的Kerberos TGT来获得票证,进而伪造票据获得管理员权限。

利用条件

  • 攻击者需要获取域内普通用户的账号密码。
  • 攻击者需要知道该用户的SID(安全标识符)。
  • 目标服务器未安装KB3011780补丁。
  • 攻击者需要知道域控制器的IP地址。

利用工具

  • Pykek:Pykek是一个利用Kerberos协议进行攻击的工具包,可以生成高权限的Kerberos票据。结合mimikatz等工具,攻击者可以将票据注入到内存中,从而提升权限。 https://github.com/mubix/pykek
  • impacket:impacket是一个强大的Python库,用于处理网络协议,其中的goldenPac.py工具可以用来生成并利用Kerberos票据进行权限提升。 https://github.com/fortra/impacket
  • Metasploit:Metasploit是一个开源的漏洞利用框架,其中包含了针对MS14-068的漏洞利用模块,可以方便地进行漏洞利用。
黄金票据

在Windows的kerberos认证过程中,Client将自己的信息发送给KDC,然后KDC使用krbtgt用户的Hash作为密钥进行加密,生成TGT。那么如果获取到了krbtgt的Hash值,就可以伪造任意的TGT。因为krbtgt只有域控制器上面才有,所以使用黄金凭据意味着你之前拿到过域控制器的权限,黄金凭据可以理解为一个后门

黄金票据在利用过程中由 KDC颁发 TGT,并且在生成伪造的 TGT 得 20 分钟内,TGS 不会对该 TGT 的真伪进行

前提:

攻击者需要获得管理员访问域控制器的权限,并抓取到KRBTGT的哈希值。

制作条件

制作黄金票据通常需要以下条件:

域名称:需要知道目标域的DNS根域名。

代码语言:javascript
复制
ipconfig/all

域的SID值:SID(安全标识符)是每个域的唯一标识符。

代码语言:javascript
复制
whoami /all

KRBTGT账户NTLM密码哈希:KRBTGT是Kerberos认证过程中的一个重要账户,其密码哈希是制作黄金票据的关键信息。

代码语言:javascript
复制
登上域控,上传mimikatz,抓取krbtgt用户的Hash值
lsadump::lsa /patch        // 专用于在域控制器上导出用户密码或hash以及能够获取域sid
  1. 伪造用户名:黄金票据允许攻击者伪造一个有效的Kerberos票据,因此需要一个伪造的用户名,以模拟合法用户的身份进行认证。
代码语言:javascript
复制
使用mimikatz制作黄金票据
kerberos::golden /user:需要伪造的域管理员用户名 /domain:域名 /sid:域sid /krbtgt: krbtgt用户的Hash /ticket:想要生成的TGT凭证,任意填写

或者

golden_ticket_create -d 域名 -k krbtgt账户的密码hash值 -u 任意的用户名 -s 域SID -t 路径,将生成的票据保存在指定文件中,任意填写

5.再将生成的票据注入内存

代码语言:javascript
复制
kerberos::ptt 生成的TGT凭证
白银票据

白银票据不同于黄金票据,白银票据的利用过程是伪造 TGS,通过已知的授权服务密码生成一张可以访问该服务的 TGT,因为在票据生成过程中不需要使用KDC,所以可以绕过域控制器,且很少留下日志。白银票据依赖于服务账号的密码散列值。

伪造条件

伪造白银票据通常需要以下条件:

域名

域SID

目标服务器的FQDN

可利用的服务

服务账号的NTLM Hash

要伪造的用户名

代码语言:javascript
复制
登录域控,利用工具mimikatz中的模块进行收集信息,这里简单举例
privilege::debug 管理员身份运行才能进行提权操作
sekurlsa::logonpasswords 抓取内存中保存的用户所有凭据
sekurlsa::msv   抓取内存中保存的用户Hash

利用工具mimikatz进行伪造

代码语言:javascript
复制
kerberos::golden /domain:域名 /sid:域SID /target:域控制器名。即FQDN /rc4:server机器的hash /service:可利用的服务 /user:要伪造的用户名,任意填写
黄金票据和白银票据的区别

伪造票据

代码语言:javascript
复制
黄金票据伪造的是TGT
白银票据伪造的是ST

加密方式

代码语言:javascript
复制
白银票据由机器账户的hash加密生成
黄金票据由krbtgt的hash加密生成

获取的权限

代码语言:javascript
复制
黄金票据可以获得任意kerberos访问权限
白银票据只能获得部分服务的访问权限

认证流程

代码语言:javascript
复制
黄金票据同TGS交互,不同AS交互
白银票据不同AS也不同TGS交互,直接访问server

构造条件

代码语言:javascript
复制
黄金票据:域名、域sid、krbtgt用户hash、伪造的用户名
白银票据:域名、域sid、dc机器账户hash、伪造的服务、伪造的用户名
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-07-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 红队蓝军 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Kerberos协议中的角色
  • Kerberos认证流程
  • 简化认证流程
  • 绕过Kerberos认证
    • MS14-068
      • 黄金票据
        • 白银票据
          • 黄金票据和白银票据的区别
          相关产品与服务
          数据库专家服务
          数据库专家服务(Database Expert Service,DBexpert)为您提供专业化的数据库服务。仅需提交您的具体问题和需求,即可获得腾讯云数据库专家的专业支持,助您解决各类专业化问题。腾讯云数据库专家服务团队均有10年以上的 DBA 经验,拥有亿级用户产品的数据库管理经验,以及丰富的服务经验。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档