0

我正在尝试对我公司的一台服务器进行身份验证。我最初的连接尝试返回带有标题的 401:

www-authenticate: NTLM TlRMTVNTUAACAAAAAAAAACgAAAABggAAVU9wgQTnlrgAAAAAAAAAAA==

解析base64部分,我得到这个:

0000   4E 54 4C 4D 53 53 50 00 02 00 00 00 00 00 00 00    NTLMSSP.........
0010   28 00 00 00 01 82 00 00 B6 70 AC 57 8C D0 07 44    (........p.W...D
0020   00 00 00 00 00 00 00 00                            ........

这反过来又解析为:

Signature = NTLMSSP
msg_type = 2
TargetNameLen = 0
TargetNameMaxLen = 0
TargetNameOffset = 40
NegotiateFlags = 0x8201
ServerChallenge = B6 70 AC 57 8C D0 07 44

这是我应该提到我自己没有解析这个的地方。我认为这并不重要,但我使用的是 Python 2.7,新安装的 python_ntlm-1.0.1 和 requests-ntlm 0.0.2.1 副本,并且 ntlm 模块在其 parse_NTLM_CHALLENGE_MESSAGE 例程中崩溃,因为数据包太短. 从偏移量 0x0020 开始,显然应该有一个 16 字节的保留区域,后跟三个 32 位整数,而不是保留区域中只有 8 个字节的十六进制 00,其他数字丢失。这是我第一次需要比基本身份验证更多的东西。我怀疑 TargetNameLen 为 0 意味着一些特殊的东西,但是在我向 python_ntlm 维护者提交错误报告之前,有人可以帮我解释我得到的数据吗?

谢谢!

4

1 回答 1

2

事实证明,问题在于如何解释 NegotiateFlags 字段。根据微软发布的规范,有两点感兴趣。如果未设置 NTLMSSP_REQUEST_TARGET 标志,则不需要 TargetName,而如果未设置 NTLMSSP_NEGOTIATE_TARGET_INFO,则不需要 TargetInfo。但是,由于多年来数据包格式的演变,TargetName 字段在 NegotiateFlags 之前,因此即使被忽略,它们也必须存在并填零。另一方面,TargetInfo 字段出现在 NegotiateFlags 字段之后,因此可以省略,留下一个较短的数据包。我已经向 python-ntlm 项目提交了一个补丁,一切都应该很快得到修复。我正在提供这个解决方案,以防万一其他人在将来编写自己的身份验证代码时遇到问题。

于 2013-02-06T14:36:07.787 回答