(360 A-TEAM 长期招收高级安全研究人员,APT 攻防人员,请联系 wufangdong@360.net)

  • n1nty @ 360 A-TEAM

某日睡着了,突然朋友打电话问了我一个问题 “为什么我把他账号锁定了,但是在 EventLog 里面依然看到了他很多的登陆成功日志?”,当时迷迷糊糊的没给出明确回答,只是感觉跟 Kerberos 的票据有关,第二天查了点资料,所以有了这篇笔记。

前期测试

新建域账号 n1nty,为证明该账号可以正常使用 NTLM 与 Kerberos 和 dc1.ateam.com 进行认证,做如下测试:

  1. 使用 impacket 带的 smbclient.py 来连接 dc1.ateam.com,认证方式选定为 NTLM,成功:

  2. 获取 TGT 成功(将此 TGT 称为 TGT1,我将此 TGT1 另存为了 tgt.ccache),可以看到 TGT1 的生成时间为 04/02/19 16:27:49,第 1 轮过期时间为 10 小时后 04/03/19 02:27:49:

  3. 利用 TGT1 获取一张访问 CIFS/DC1.ATEAM.COM 的 Service Ticket (将此 Service Ticket 称为 ST1,我将此 ST1 另存为了 n1nty_cifs_dc1.ccache),获取成功:

  4. 并且利用此 Service Ticket 访问 CIFS/DC1.ATEAM.COM 成功:

现在我们将账号锁定:

锁定后的测试

  1. 再次尝试使用 impacket 带的 smbclient.py 来连接 dc1.ateam.com,认证方式选定为 NTLM,失败了,提示账号被锁定:

  2. 再次尝试获取该账号的 TGT,失败了,提示账号被锁定:

到这里,是不是可以说明账号真的被完全锁定了呢? 当然不是。

更多测试

在 “前期测试” 中,我们在账号被锁定之前获取到了该账号的 TGT(TGT1),以及利用 TGT1 获取到了一张访问 CIFS/DC1.ATEAM.COM 的 Service Ticket(ST1)。这些在账号被锁定之前就获取到的 Ticket,在账号被锁定后是否依然可用?

  1. 测试一下 TGT1 是否还可以利用,现在我们用 TGT1 来申请一张访问 CIFS/MEM.ATEAM.COM 的 Service Ticket:下图可以发现申请是成功的,而且成功访问了 MEM.ATEAM.COM 上的 SMB 服务:

  2. 测试一下之前申请到的 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 锁定了该账号,则:

  1. NTLM 场景

    1. 黑客将不能再利用该账号进行任何形式的 NTLM 认证。

  2. KERBEROS 场景

    1. 如果黑客在账号被锁定之前就已经获取到了该账号的 TGT,则在该账号被锁定后,此 TGT 的最长有效期将为 20 分钟(具体是多长时间要看那张 TGT 的发布时间),也就是有效期是 8:20 PM。此时虽然账号已经被锁了,但是在这个时间之前,黑客依然可以利用此账号访问任何服务。超出这个有效期后,黑客将不能再用这个 TGT 来访问新的服务。

    2. 如果黑客在账号被锁定之前就已经获取了访问某一个服务的 Service Ticket,则这张 Service Ticket 会一直有效,直到它的票面时间过期为止,而这个过期时间往往是 10 小时。也就是说一般在 10 小时以内,黑客依然可以畅通无阻地访问目标服务。

你如果在日常的安全运营工作中发现有明明已经禁用、删除的账号访问了某些资源,有可能有以下三种情况:

  1. 本文中所说的情况

  2. 域被黑客控了并且黑客做了金票

  3. 黑客针对目标服务做了银票

参考资料

  1. https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-kile/e19be8b8-9130-40a4-9cd1-92d0cbd46a51

  2. http://web.archive.org/web/20150406132230/http://www.aorato.com/blog/windows-authentication-flaw-allows-deleteddisabled-accounts-access-corporate-data/

  3. https://social.technet.microsoft.com/Forums/en-US/b323219c-8d93-45f1-9747-8e64b68f9a10/does-a-user-get-prompted-to-reenter-this-password-when-their-tgt-ticket-granting-ticket-reaches?forum=winserverDS

  4. http://www.infosecisland.com/blogview/23758-A-Windows-Authentication-Flaw-Allows-DeletedDisabled-Accounts-to-Access-Corporate-Data.html

  5. https://pagure.io/freeipa/issue/7607

  6. https://msdn.microsoft.com/en-us/library/cc233947.aspx?f=255&MSPPError=-2147217396

声明:本文来自n1nty,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。