Kerberos认证流程详解

2024-07-26 19:23:52 浏览数 (2)

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、伪造的服务、伪造的用户名

0 人点赞