【问题标题】:KDC validation from TGS-REP来自 TGS-REP 的 KDC 验证
【发布时间】:2020-12-12 13:04:27
【问题描述】:

我有一个关于从 TGS-REP 验证 KDC 的问题。

我有一个用 C++ 编写的旧版测试工具,用于验证用户的 AD 凭据。此测试工具调用 krb5 库方法来执行身份验证并在客户端(Linux 机器)上运行。我可以在数据包捕获中看到测试工具正在验证来自 AS-REP 的用户。

测试工具 在客户端 AD 服务器

------------- AS-REQ------>

(用户现在将被验证)

测试工具正在通过 AS-REP 验证用户。

它没有发送/接收 TGS-REQ/TGS-REP。 ***我从 TGS-REP 了解到,我们也可以验证 KDC。 *** 因此,我扩展了该工具以执行以下操作:

测试工具 在客户端 AD 服务器

 -———----——— AS-REQ—————>

 <----——— AS-REP —————


      
    —————— TGS-REQ (with sname: host/test.machine.examaple.com@EXAMPLE.COM)—————>

     <——— TGS-REP—————

....... 我的测试工具将通过将 KDC 的密钥与预配置的密钥表进行比较来验证 KDC。我已经为上述 SPN 创建了一个 keytab。

问:从一些在线阅读材料中,我了解到这可以通过将 KDC 的密钥与预配置的密钥表文件进行比较来完成。我确信我没有完全明白这一点。请帮助我理解这部分。为什么我们不能从 AS-REP 获得此验证?

【问题讨论】:

  • 你很困惑。应用程序服务器从不 联系 KDC。作为 AP-REQ 一部分的 UNIX/LINUX 上的 GSS-API 机制在使用部署在该 UNIX/LINUX 服务器上的密钥表解密入站凭据后验证用户。在 Windows 上,SSPI 自己处理所有这些,在 AP-REQ 期间不需要 keytab。您正在讨论客户端和 KDC 之间的 AS-REQ。到目前为止,应用服务器还不是此交换的一部分。
  • 我无法正确表达,我的错。我的测试应用程序不是服务。它只是一个可以在客户端上运行以验证用户的 AD 凭据的测试工具。我想扩展这个测试工具的功能,以便它可以在从 AS-REP 验证用户后发送 TGS-REQ。我确实改写了我的问题。谢谢。
  • @T-Heron 我认为在委托(S4U2Self/Proxy)的情况下,GSS-API 确实会联系 KDC。
  • 抱歉再次编辑问题,但这抓住了我现在的问题。
  • @BhushanKarmarkar - 在这种情况下,他不是在谈论委托。

标签: kerberos mit-kerberos kdc


【解决方案1】:

我并没有真正理解您所说的验证 KDC 的意思。通常验证传入的 kerberos 票证。 验证传入令牌时,无需往返 KDC。
传入的 kerberos 令牌使用 SPN 的密码(密钥)进行加密。用于解密令牌的密钥仅存在于 keytab 中。

查看此link 以了解其完成方式。

此外,还有两个主要部分需要考虑 - Acceptor 和 Initiator。

验证令牌的服务,可以是

  • Acceptor - 使用配置中提供的密钥表或用户名/密码接受并验证票证
  • Initiator - 应用程序可以为自己/其他服务请求令牌
  • Acceptor + Initiator - 验证传入令牌并基于此向 KDC 请求新令牌 - 这些是委托和模拟等情况。

我使用的 Kerberos 风格具有将应用程序设置为 Initiator 或 Acceptor 的配置。根据 GSS-API 决定是否与 KDC 通信。

【讨论】:

  • 通过验证 KDC,我试图解决 kdc 欺骗漏洞securityfocus.com/bid/1616/discuss。我的测试客户端仅通过 AS_REP 验证用户,并进一步忽略 TGS_REQ/TGS-REP。这 (silverfort.com/blog/…) 提供了大量有关此漏洞的信息
  • 抱歉,我没有找到在哪里添加这些选项?请看我的新评论。
【解决方案2】:

好的,这是我为满足我的要求所做的。

krb5_context  krb5Context;

 krb5_init_context(&krb5Context);

…

// get initial tkts (AS-REQ/AS-REP) for user userone@my.domain.com

krb5_get_init_creds_password(krb5Context,... )

…

// store the tkt in cache
krb5_cc_default()
krb5_cc_initialize()
krb5_cc_store_cred()
…

krb5_creds in_creds, out_creds;
memset(&in_creds, 0, sizeof(in_creds));

err = krb5_parse_name(krb5ctx, user, &user_princ); // user = “userone@my.domain.com” 

 err = krb5_parse_name(krb5ctx, spn, &server_princ); // spn = “HOST/test-host.my.domain.com@MY.DOMAIN.COM”

 in_creds.client = user_princ; 
 in_creds.server = server_princ; 

…
// send TGS-REQ if srv tkt not there in cache,
// receive a session tkt for above srvc in TGS-REP

krb5_get_credentials()

// decrypt the srvc tkt using the key in keytab file

krb5_decode_ticket()

krb5_kt_default()

krb5_kt_get_entry()
krb5_decrypt_tkt_part()

...
krb5_free...

这对我有用,但在这里面临两个问题。

  1. 在每次替代执行时,我的测试工具都因“错误:无法联系任何 KDC 领域 'MY.DOMAIN.COM'”而失败。它交替通过测试。我已经验证了我的 krb5.conf 并且它具有领域所需的条目。

  2. 当测试成功(解码 tkt、读取 keytab、解密 srvc tkt 时没有 krb5 错误)时,我在域控制器上捕获的数据包跟踪中没有看到 TGS-REQ/TGS-REP。但与此同时,在我运行测试工具的 linux 机器上存在“TGS-REQ”UDP 数据包。

上述观察结果可能是什么原因?

【讨论】:

  • 你使用 Krb5 Conf 文件吗?如果是,请在此处粘贴。如果数据包大小小于某个大小(它可以通过 Krb conf 配置,它有一些默认值),默认情况下将使用 UDP 而不是 TCP。通常 UDP 在 DC 级别被阻止。您可以检查防火墙设置。如果 Linux 机器正在发送 UDP 数据包,那么它们肯定会在 DC 被过滤。
猜你喜欢
  • 1970-01-01
  • 2014-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-16
  • 2014-01-17
  • 2016-09-10
  • 1970-01-01
相关资源
最近更新 更多