我正在尝试对我公司的一台服务器进行身份验证。我最初的连接尝试返回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维护者提交错误报告之前,有人可以帮我解释我得到的数据吗?
谢谢!
答案 0 :(得分:2)
事实证明,问题在于如何解释NegotiateFlags字段。根据微软发布的规范,有两点值得关注。如果未设置NTLMSSP_REQUEST_TARGET标志,则不需要TargetName,而如果未设置NTLMSSP_NEGOTIATE_TARGET_INFO,则不需要TargetInfo。但是,由于多年来数据包格式的演变,TargetName字段在NegotiateFlags之前,因此它们必须存在并且即使被忽略也必须填充零。另一方面,TargetInfo字段出现在NegotiateFlags字段之后,因此可以省略,留下一个具有较短数据包的字段。我已经提交了python-ntlm项目的补丁,所有内容都应尽快修复。我提供这个解决方案,以防其他人在将来编写自己的身份验证代码。