(360 A-TEAM 长期招收高级安全研究人员,APT 攻防人员,请联系 wufangdong@360.net)
n1nty @ 360 A-TEAM
某日睡着了,突然朋友打电话问了我一个问题 “为什么我把他账号锁定了,但是在 EventLog 里面依然看到了他很多的登陆成功日志?”,当时迷迷糊糊的没给出明确回答,只是感觉跟 Kerberos 的票据有关,第二天查了点资料,所以有了这篇笔记。
前期测试
新建域账号 n1nty,为证明该账号可以正常使用 NTLM 与 Kerberos 和 dc1.ateam.com 进行认证,做如下测试:
使用 impacket 带的 smbclient.py 来连接 dc1.ateam.com,认证方式选定为 NTLM,成功:
获取 TGT 成功(将此 TGT 称为 TGT1,我将此 TGT1 另存为了 tgt.ccache),可以看到 TGT1 的生成时间为 04/02/19 16:27:49,第 1 轮过期时间为 10 小时后 04/03/19 02:27:49:
利用 TGT1 获取一张访问 CIFS/DC1.ATEAM.COM 的 Service Ticket (将此 Service Ticket 称为 ST1,我将此 ST1 另存为了 n1nty_cifs_dc1.ccache),获取成功:
并且利用此 Service Ticket 访问 CIFS/DC1.ATEAM.COM 成功:
现在我们将账号锁定:
锁定后的测试
再次尝试使用 impacket 带的 smbclient.py 来连接 dc1.ateam.com,认证方式选定为 NTLM,失败了,提示账号被锁定:
再次尝试获取该账号的 TGT,失败了,提示账号被锁定:
到这里,是不是可以说明账号真的被完全锁定了呢? 当然不是。
更多测试
在 “前期测试” 中,我们在账号被锁定之前获取到了该账号的 TGT(TGT1),以及利用 TGT1 获取到了一张访问 CIFS/DC1.ATEAM.COM 的 Service Ticket(ST1)。这些在账号被锁定之前就获取到的 Ticket,在账号被锁定后是否依然可用?
测试一下 TGT1 是否还可以利用,现在我们用 TGT1 来申请一张访问 CIFS/MEM.ATEAM.COM 的 Service Ticket:下图可以发现申请是成功的,而且成功访问了 MEM.ATEAM.COM 上的 SMB 服务:
测试一下之前申请到的 ST1 是否依然可以使用:
上面的结果证明了在账号锁定之前申请到的 Kerberos Ticket,在账号锁定之后是依然有效的。为什么呢?那是因为 Kerberos 认证只认 Ticket,只要你的 Ticket 有效,则账号有效。
Ticket 注销
那么在将账号锁定以后,如何注销之前为此账号所发出的所有 Ticket 呢?
“Kerberos V5 does not enforce revocation of accounts prior to the expiration of issued tickets.”
以上出自微软官方文档:
所以回答是:管理员无法主动发起注销操作, 只能等 Ticket 过期。
TGT 的 “主动注销”?
虽然无法主动注销,但是对于 TGT 来说却也有另一种情况。
根据上面那篇官方文档,如果一张 TGT 的发出时间已经超过了一段时间(Windows 上默认是 20 分钟),则客户端在使用这张 TGT 发起新的 TGS 请求的时候,KDC 会检查此 TGT 所对应的账号是否处于正常状态:
此时,KDC 将发现对应的账号已经被锁定了,将拒绝客户端再使用这张 TGT,在一定程度上可以理解为这张 TGT 被注销了。
看到以上链接的时候,我突然想起以前看到过 mimikatz 作者在 PDF 里面介绍 golden ticket 细节的时候说到过:“当为一个不存在的账号制作金票时,这张金票的有效期只有 20 分钟。”
原因就是上面说到的原因。
为了证明上述说法的真实性,过了 20 分钟后,我再次利用 TGT1 进行了测试:
如上图所示 TGT1 的发布时间是 16:27:49,当前时间是 16:48:00,已经过了 20 分钟,此时尝试利用 TGT1 发起 TGS-REQ 请求时,被 KDC 拒绝了,因为 KDC 此时发现了 TGT1 对应的 n1nty 账户已经被禁用了。
Service Ticket 的 “主动注销”?
很不幸的是,对于 Service Ticket,并不会有像针对于 TGT 那样的检查。因为 Service Ticket 一旦被获取到以后,攻击者就可以直接拿着它与目标服务进行认证了,不再需要与 KDC 进行联系。所以,按上面的例子,我先利用 n1nty 账号获取到了访问 CIFS/DC1.ATEAM.COM 的 ST1,随后此账号被锁了,但是却对我不会造成任何影响,我依然可以利用 n1nty 账号的身份来访问 DC1.ATEAM.COM 上的 CIFS 服务,如下图:
我目前没有看到任何有关主动注销 Service Ticket 的资料,所以目前我得出的结论是在这张 Service Ticket 过期之前,攻击者依然可以使用这个已经被锁定的账号来访问 DC1.ATEAM.COM 上的 CIFS 服务。
(先前认为开启 KDC Pac Validation 也许可以解决这个问题,但是试了一下没看出来效果)
总结
假如安全运营人员发现黑客使用了名为 evil 的账号,并在 8:00 PM 锁定了该账号,则:
NTLM 场景
黑客将不能再利用该账号进行任何形式的 NTLM 认证。
KERBEROS 场景
如果黑客在账号被锁定之前就已经获取到了该账号的 TGT,则在该账号被锁定后,此 TGT 的最长有效期将为 20 分钟(具体是多长时间要看那张 TGT 的发布时间),也就是有效期是 8:20 PM。此时虽然账号已经被锁了,但是在这个时间之前,黑客依然可以利用此账号访问任何服务。超出这个有效期后,黑客将不能再用这个 TGT 来访问新的服务。
如果黑客在账号被锁定之前就已经获取了访问某一个服务的 Service Ticket,则这张 Service Ticket 会一直有效,直到它的票面时间过期为止,而这个过期时间往往是 10 小时。也就是说一般在 10 小时以内,黑客依然可以畅通无阻地访问目标服务。
你如果在日常的安全运营工作中发现有明明已经禁用、删除的账号访问了某些资源,有可能有以下三种情况:
本文中所说的情况
域被黑客控了并且黑客做了金票
黑客针对目标服务做了银票
参考资料
360 A-TEAM 是隶属于 360 企业安全集团旗下的纯技术研究团队。团队主要致力于 Web 渗透,APT 攻防、对抗,前瞻性攻防工具预研。从底层原理、协议层面进行严肃、有深度的技术研究,深入还原攻与防的技术本质。
欢迎有意者加入!