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