You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从NTLM Type 3消息中提取可靠的完整域名信息

关于NTLM Type3消息中额外字段的可靠性及提取方法

字段可靠性说明

你观察到的Type3消息中的额外内容属于NTLMv2协议标准定义的AV_PAIR(属性值对)扩展块,是微软公开的MS-NLMP协议中的规范内容,并非厂商私有扩展,可靠性有保障:

  • 你之前参考的curl社区类RFC文档仅覆盖了早期NTLMv1的核心结构,没有包含后续扩展的AV_PAIR相关定义
  • 所有Windows Vista/Server 2008及以上版本的系统、主流现代浏览器发出的NTLMv2响应均会携带该扩展块,覆盖绝大多数企业AD环境的使用场景,可以稳定复用

提取方法

AV_PAIR块位于Type3消息所有基础字段(用户名、域、工作站、LM响应、NT响应)的后面,解析逻辑非常简单:

解析规则

每个AV_PAIR项的结构如下:

  • 前2字节(小端序):属性ID,标识当前项的类型
  • 接下来2字节(小端序):内容长度,单位为字节
  • 最后N字节(长度等于前面定义的长度):内容值,编码为UTF-16LE
    你需要的完整DNS域名对应的属性ID为0x0003,其他你观察到的额外字段也有对应标准ID:
  • 0x0002:NetBIOS格式域名
  • 0x0004:目标服务的DNS全名
  • 0x0009:客户端IP地址

Node.js 代码实现示例

你可以直接修改express-ntlm包的解析逻辑,在原有基础字段解析完成后,追加AV_PAIR的解析即可:

// type3Buffer为接收到的完整Type3消息Buffer
// parsedOffset为express-ntlm原有逻辑解析完所有基础字段后的偏移值
let currentOffset = parsedOffset;
const avPairs = {};

while (currentOffset < type3Buffer.length) {
  const avId = type3Buffer.readUInt16LE(currentOffset);
  currentOffset += 2;
  
  // 0x0000为AV_PAIR块的结束标志
  if (avId === 0x0000) break;
  
  const avLen = type3Buffer.readUInt16LE(currentOffset);
  currentOffset += 2;
  
  const avValue = type3Buffer.toString('utf16le', currentOffset, currentOffset + avLen);
  currentOffset += avLen;
  
  avPairs[avId] = avValue;
}

// 取完整DNS域名
const fullDomain = avPairs[0x0003];

注意事项

仅NTLMv2响应包含AV_PAIR扩展块,若遇到极个别仍在使用NTLMv1的老旧客户端场景,可以做降级处理,默认返回你原有逻辑提取到的短域名即可。

内容的提问来源于stack exchange,提问作者tester778899

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 08:30:01