1

我只是对 ktpass 命令有一点疑问。我有一个my-test-user有密码的用户myPassword!。我可以通过用户名和密码使用此帐户登录。但是当我使用以下命令生成keytab文件时,我只是可以使用keytab文件(例如kinit)登录。

ktpass /out test.keytab /princ HTTP/test.example.com@MY.REALM /pass * /mapuser my-test-user@MY.REALM /ptype KRB5_NT_PRINCIPAL /crypto RC4-HMAC-NT

如果我尝试使用用户名/密码进行连接,badPwdCount 属性会增加。

我的问题是:ktpass 命令是否禁用密码验证?

非常感谢。

4

2 回答 2

2

简短的回答:没有。

/pass *选项表示提示输入密码。该/mapuser选项表示在 AD 中查找详细信息。如果通过 via 传入的值/pass与 AD 中存储的值不匹配,则/mapuser调用会将 AD 中的密码设置为传入的任何值。

您在哪个版本的 Windows 上运行它?Windows 2012 中发布的 ktpass 版本在/pass参数处理中存在一个错误,该错误将输入键转义字符附加到发送到 AD 的字符串中,因此它会错误地重置它。这在后来的操作系统中得到了修复。

于 2020-10-21T15:57:16.540 回答
0

不,但这里有几个可能的因素:

一个是,如果/mapuser在未指定的情况下指定-SetUPNktpass将更改相关帐户的 UPN 以匹配使用/Princ命令中的参数指定的任何 SPN(在任何一种情况下,/mapuser都会将请求的 SPN 注册给指定的用户,但它仅在不存在时更改该帐户的 UPN -SetUPN)。

这显然是为了让 Linux 客户端可以使用此密钥表成功获取票证(因为从使用 的 Linux 客户端kinit,如果我们尝试使用注册到帐户的 SPN 获取 Kerberos 票证,但不匹配任何帐户的 UPN,kinit 会告诉我们主体不存在)。Windows 客户端能够获取刚刚注册为 SPN 的 SPN 的票证,而无需服务帐户的 UPN 与所请求的 SPN 匹配。

因此,如果我们尝试使用帐户的“常规”UPN(它在运行之前的UPN ,ktpass例如user@domain.com-SetUPN

另一个问题是,当使用参数强制它提示输入密码时,ktpass它似乎会“破坏”输入的密码。要么将密码设置为我们指定的密码(如果不包括在内),要么只使用我们指定的密码创建密钥表,并相信它是正确的(当然,如果密码无效,生成的密钥表将不起作用给出)。/Pass *ktpass-SetPass

根据我的测试,如果我们在命令本身中输入密码(例如/Pass P@ssw0rd),keytab 将正常工作(假设密码正确)并且密码验证也应该工作,尽管只有当我们以DOMAIN\username格式指定用户名或如果我们由于上述 UPN 问题,包含-SetUPN在我们的命令中。ktpass

但是,当我们尝试使用该/Pass *参数来避免必须在命令行上以明文形式输入密码时,问题就来了。在这种情况下,ktpass提示我们输入密码,但它显然会修改我们以某种方式输入的任何值(幕后)。这将产生两种可能的结果,具体取决于我们在命令中指定的选项:

  • 生成的密钥表文件将无效并且不起作用 - 如果我们包含-SetPass参数(告诉ktpass不要更改帐户的密码)会发生这种情况,因为ktpass即使“真实”密码在account 是我们在提示符下输入的值。
  • 或者,帐户上的结果密码将被设置为未知值(而不是我们期望的值) - 即我们输入的密码的错误版本 - 如果我们不包含 会发生这种情况-SetPass,在这种情况下ktpass会更改将帐户密码设置为它破坏我们输入的任何值。在这种情况下,keytab 将起作用,但是当我们尝试使用密码对该帐户进行身份验证时,我们将收到无效密码错误(因为帐户上的密码不是我们认为的密码 - 它不是我们输入的值在提示符下)。

我在 2008R2、2012 和 2012R2 上测试并确认了这种行为——我无法测试任何更新的东西。

总而言之 -如果您需要知道帐户的密码以便在生成 keytab 后使用任何一种方法(密码或 keytab)进行身份验证,那么您需要在 ktpass 命令本身中输入您的密码,而不是要求ktpass提示输入密码(即使用/Pass P@ssw0rd而不是/Pass *)。只要确保您在安全的环境中执行此操作,就不会有人从您的肩膀上偷看或默默地监视您的屏幕(幸运的是,默认情况下 Windows 不会持久记录 cmd 历史记录)。

另一方面,如果您在创建 keytab 后不需要知道帐户的密码,那么最好只使用它+rndPass- 这将强制ktpass为帐户生成一个随机密码,并且 keytab 可以正常工作。

*编辑/更新:我在测试时发现的另一个怪癖是,如果使用已知密码创建了一个新帐户,并ktpass运行该帐户以创建该帐户的密钥表,并在命令中指定密码,如上所述,但是使用该-SetPass参数,生成的 keytab 将不起作用。如果我们ktpass在没有 , 的情况下运行并指定密码-SetPass,让ktpass“重置”密码(与它已经存在的值相同 - 我们在创建帐户时设置的值),生成的 keytab 可以正常工作,密码验证也是如此。并且从那时起创建的任何后续密钥表都将起作用(即使使用 创建-SetPass)。我没有对此行为的解释(在 Server 2012 和 2012R2 上观察到)。

于 2021-07-16T21:45:19.783 回答