所以,我一直在告诉自己 Kerberos 是如何工作的,以及可以发起/防御哪些攻击。我读到的一个漏洞是“Pass-the-ticket”攻击,例如,当域管理员在受感染的用户计算机上留下 Ticket Graning Ticket 时,可以转储/恢复(通过 mimikatz?)。我确实掌握了这个概念,我只是不明白为什么这种方法有效。现在我的问题是:域管理员的 TGT 对攻击者有什么好处?还是任何用户的 TGT?据我所理解,
TGT使用 TGS的密钥(攻击者没有)加密,您不能使用它来访问资源,只能从 TGS 请求服务票证
Service Ticket与验证消息一起返回给客户端,其中包含客户端与请求的服务成功通信所需的服务会话密钥
但是,此消息使用TGS 会话密钥加密,仅知道:
- AS-REP 步骤中的原始/合法客户,
- TGS(包含在 TGT 中(已加密))
这意味着,攻击者无法解密消息,因此无法获得服务会话密钥。如果没有此消息中包含的 Service Session Key,攻击者应该无法访问 Service 提供的资源,因此即使他可以找到 TGT,并通过该 TGT 获得 Service Ticket,他也应该无法访问任何内容因为他缺少服务用于加密数据的服务会话密钥。
我敢肯定我在这里有些困惑,但是很难研究这样一个特定问题的答案,所以如果这里有人可以就这个主题对我进行教育,我会很高兴:D
PS:为了术语清晰,我指的是这个解释 Kerberos 的 youtube 视频:https ://www.youtube.com/watch?v=5N242XcKAsM
关于使用 Mimikatz 偷票:
您的 Kerberos 票证缓存通常将票证和相应的会话密钥存储在同一个位置,并且术语“票证”通常用作两者的简写。(换句话说,凭证缓存必须存储合法程序使用这些票证所需的所有信息。)
例如,在Unix 软件(MIT Krb5、Heimdal、Java)使用的基于文件的 ccache
keyblock
格式中,每条记录都有一个字段,其中包含后面的会话密钥ticket
。这意味着如果您窃取某人的/tmp/krb5cc_UID
文件,您现在拥有 TGT 本身和 TGT 的会话密钥——这允许您请求更多票证(或更新 TGT)并解密他们的服务会话密钥。同样在 Windows 上,LSA 内部
_KERB_TICKET_CACHE_ENTRY
结构(如 Mimikatz 所见SessionKey
)在 every 旁边包含一个字段Ticket
,因此如果您转储它,您将获得模拟用户所需的一切。关于与不受信任机器的连接:
通常,当您(比方说作为域管理员)连接到服务并使用 Kerberos 进行身份验证时,服务器只会收到您针对该特定服务的票证(TGT 永远不会发送到 KDC),并且它只会收到一次性身份验证器,但当然不是会话密钥。因此,即使网络和/或服务器不受信任,您的凭据仍然是安全的。
但是通过 RDP连接到机器与连接到大多数其他 kerberized 服务略有不同,因为它默认将您的凭据传输(委托)到远程机器 - RDP 客户端不仅发送“TERMSRV”服务票证,还传输您的整个 TGT及其随附的会话密钥。
这是故意这样做的,以便在通过 RDP 登录后,您将能够实际做一些事情,例如访问文件共享 - 但当然它会导致将您的 TGT(及其会话密钥)存储在不受信任的远程机器的 LSA 或 /tmp 中它可以在您不知情的情况下被丢弃。
可以使用“受限管理员”模式禁用 RDP 的凭据委派,但这会导致远程计算机上的某些功能不可用。
(出于同样的原因,SSH 和 PSRemoting 也支持委托,但默认情况下它们不启用它。例如,
ssh -K
会导致服务接收您的完整 TGT。)请参阅 解释攻击的通行证一文。
简而言之,访问服务的请求称为服务票 (ST),其中包含有关用户的足够信息,以允许目标服务决定是否授予访问权限,而无需询问外部参与者。此信息存储在 ST 内称为 PAC(特权属性证书)的受保护 blob 中。理论上,请求访问的用户不能篡改该 PAC。
更多信息存储在 PAC 之外的 ST 中,并且不受保护,称为
sname
,指示票证用于哪个服务。此信息基本上是目标服务的 SPN(服务主体名称)。它分为两个元素:服务类和主机名。多种服务类型(LDAP、CIFS、HTTP 等)有多种服务类。
这里的问题是,由于 SPN 不受保护,因此存在可以在票证中修改服务类的情况,从而允许攻击者访问其他服务。
这样,攻击者可以使用原始凭据访问原始用户有权访问的其他服务。
要做到这一点,防御必须存在漏洞。弱点是为 受限委托配置 的服务,可以在票证中修改服务类,从而允许攻击者访问其他类型的服务。
有关详细信息,请参阅 Kerberos 约束委派。