windows 名称解析机制
2021-09-17 11:36:13 Author: mp.weixin.qq.com(查看原文) 阅读量:62 收藏

本文来自宽字节安全第一期学员Demia投稿。第二期线下培训预计十一月底开班,欢迎咨询。

比较基础的windows名称解析机制 为了NTLM relay打下一下基础。土豆家族都是基于NTLM relay进行的

TCP 协议的通信是基于 IP 地址的,“名称解析”就是把需要访问的计算机的名字解析为 IP 地址的过程。

类型

  • 主机名称

从狭义上来说,主机名称正如它的字面意思一样就是一台主机的名字。从广义来说,它又不仅仅包含计算机的名字,也包含互联网中的域名。(主机名称是有限制的255字符,A-Z a-z,-)

  • NetBIOS名称

在 Windows 系统中的另外一种名称就是 NetBIOS 名称,准确的说 NetBIOS 名称并非是一种名字系统而是 Windows 操作系统网络的一个编程接口,允许主机之间使用 NetBIOS 名称进行通信,通信过程是建立在 NetBIOS 协议之上的在安装完 Windows 系统后系统会默认使用计算机的名字做为当前主机的 NetBIOS 名称。它的最大长度为 16 个字符,其中最后一位是不可配置的用于指定 NetBIOS 的服务类型。如果计算机名称不足 15 位则使用空格补全到 15 位,反之,如果计算机名称超过 15 位 则会截取前 15 位。

常见的 NetBIOS 后缀有 0x20(文件和打印服务)、0x00(工作站服务)、0x03(报信者服务)0x1C (域控制器) 0x21 (远程访问服务器客户端) 等。

解析顺序

  • Windows 2K , XP , 2K3
    • DNS -> NetBIOS
  • Windows Vista 之后
    • DNS -> LLMNR -> NetBIOS

windows端口对应的协议

0x01 DNS协议

DNS客户端和DNS服务器共同为计算机和用户提供计算机名称到IP地址映射的名称解析服务。DNS协议支持IPV4和IPV6,DNS协议实现名称解析的过程中,在客户端没有任何本地的数据库文件,所监听的端口UDP/53。DNS数据包的组成:

DNS的名称解析过程:

  • 读取本机 DNS 缓存(本机 hosts 文件内容)
  • 如果缓存中没有,则会请求网络配置中配置的 DNS 服务器
  • 如果 DNS 服务器未作出响应,则请求失败。反之,DNS 服务器则会处理用户请求。

0x02 NetBIOS 协议(NBNS)

NBNS是NetBIOS name service的缩写,是NetBIOS的命名服务,用于将NetBIOS名称映射到IP地址上,是NetBIOS-over-TCP(NBT)协议族的一份子。NBT 服务监听的端口为 UDP/137,会话层协议。其进行名称解析的形式为向当前主机所在的子网域发送广播包。所以,当你使用抓包工具在局域网中抓包时总会收到很多 NBNS 数据包。但由于 NetBIOS 协议进行名称解析是发送的 UDP 广播包。这样做虽然速度快且无需额外的配置,但是广播包不能跨越网域同时也会增加一些网络流量,因此微软在后来推出了 WINS(Windows Internet Name Service)服务器,当计算机配置为使用 WINS 服务器进行名称解析时,客户机将直接和 WINS 服务器进行单播通讯,这样就可以弥补 NetBIOS 协议使用广播进行名称解析的不足。

综上所述,NetBIOS 协议进行名称解析的过程如下:

  • 检查本地 NetBIOS 缓存
  • 如果缓存中没有请求的名称且已配置了 WINS 服务器,接下来则会向 WINS 服务器发出请求
  • 如果没有配置 WINS 服务器或 WINS 服务器无响应则会向当前子网域发送广播
  • 如果发送广播后无任何主机响应则会读取本地的

NetBios的三种服务:

Service NamePortProtocolShort Name
NetBIOS Name service137UDP/TCPNBNS
NetBIOS Datagram138UDPNBND
NetBIOS Session service139TCPNBSS

三种服务的详解:

  • NetBIOS-NS:为了启动会话和分发数据报,程序需要使用Name Server注册NETBIOS名称,可以告诉其他应用程序提供什么服务,默认监听UDP137端口,也可以使用TCP 137端口。

  • Datagram distribution service(数据报分发服务):无连接,负责错误检测和恢复,默认在UDP 138端口。

  • Session Server(会话服务):允许两台计算机建立连接,默认在TCP 139端口。如果连接已建立,则建立会话的计算机会向连接发送"会话请求"包,其中包含建立会话的应用程序的 NetBIOS 名称和将要建立会话的 NetBIOS 名称。TCP 可处理所有会话服务包的流量控制和转载,以及将数据流分割到足够小到足以容纳链接层数据包的数据流。

lmhosts 文件lmhosts 文件位于C:\Windows\System32\drivers\etc\目录中。nbtstat -n 命令查看本机的 NetBIOS 名称。以及经过通信的netbios名称 nbtstat -A ipaddress 命令查看指定 IP 主机的 NetBIOS 名称。nbtstat -c  命令查看远程计算机名称及其ip地址的NBT缓存 nbtstat -R 命令清除本机的 NetBIOS 缓存

windows的WINS解析是默认开启的

每一个网卡会有一个NetBios的表

Nbtstat 数据包分析

nbtstat -A 192.168.146.143的过程

请求包:

响应包

会带有自己的主机名 netbios名以及MAC地址返回

Name Registration NBNS名称注册

请求包

响应包

0x03 LLMNR 协议

DNS 协议的名称解析虽然高效但是需要在局域网中单独配置一台服务器作为 DNS 服务器。NetBIOS 协议的名称解析在一些情况下也需要单独配置一台 WINS 服务器,而且 NetBIOS 协议不支持 IP v6。LLMNR 也称作多播 DNS ,因为其数据包格式类似于 DNS 的数据包。监听的端口为 UDP/5355,支持 IP v4 和 IP v6 ,并且在 Linux 上也实现了此协议。其解析名称的特点为端到端,IPv4 的广播地址为 224.0.0.252,IPv6 的广播地址为 FF02:0:0:0:0:0:1:3 或 FF02::1:3。
当局域网中的DNS服务器不可用时,DNS客户端会使用LLMNR本地链路多播名称解析来解析本地网段上的主机的名称,直到网络连接恢复正常为止。

LLMNR 进行名称解析的过程为:

  • 检查本地 NetBIOS 缓存
  • 如果缓存中没有则会像当前子网域发送广播LLMNR协议数据包
  • 当前子网域的其他主机收到并检查广播包 如果没有主机响应则请求失败

工作原理:当一台主机想要访问到另一台主机时,主机在自己的内部名称缓存中查询名称,如果在缓存中没有找到名称,那么主机就会向自己配置的DNS服务器发送查询请求,如果主机没有收到回应或收到了错误信息,即DNS解析会失败,那么就会转为使用LLMNR链路本地多播名称解析。使用链路本地多播名称解析时,主机会通过 UDP 向局域网内发送多播查询,查询主机名对应的IP,查询范围被限制在本地子网内。本地子网内每台支持LLMNR的主机在收到这个查询请求后,收到该请求的主机会判断自己的主机名是不是这个查询的主机名。如果是,这台主机会回复自己IP地址给请求该查询的主机;如果不是,则丢弃该请求。

协议结构图

数据包字段说明

  • ID 会生成一个随机的16位标识符
  • OR 一个1位字段, 1为LLMNR响应 0为LLMNR查询
  • OPCODE 4位字符 由查询的发起人设置,并复制到响应中。复制到响应中。定义了 标准查询和响应的行为(操作码值为0)。未来的规范可能会定义使用其他操作码与 LLMNR。LLMNR发送器和响应器必须支持标准查询(操作码值为零)。
  • C 冲突位(在 LLMNR 响应中,如果名称是被认为是唯一的,那么'C'位是清空的;)
  • TC 指定该信息是由于长度超过允许的长度而被截断的。
  • T 无标志
  • Z 保留位
  • RCODE 响应 在LLMNR查询中,发送方必须将RCODE设置为0;响应者忽略RCODE,并认为它是零。对多播LMNR查询的响应必须有RCODE设置为零。
  • QDCOUNT - 16 位的无符号整数,指定在质询部分中的条目数量。
  • ANCOUNT - 16 位的无符号整数,指定在应答部分中的资源记录数量。
  • NSCOUNT - 16 位的无符号整数,指定在权威记录部分的名称服务器资源录数量。
  • ARCOUNT - 16 位的无符号整数,指定在附加记录部分的资源记录数量。

剩下的具体内容可以参考RFC

协议工作过程

查询和应答包

查询数据包的详情

应答数据包的详情

windows解析过程

windows在请求一个网络资源的完整过程。

  • 检查以确认该请求是否为本地机器名。
  • 检查有没有本地缓存。
  • 搜索本地主机文件,该文件是存储在本地计算机上的IP地址和名称列表。根据设备的情况,这个文件可能已经被加载到本地缓存中。查询一个DNS服务器,如果配置了的话。
  • 如果启用了 LLMNR,则在本地子网中广播 LLMNR 查询,要求其同行进行解析。
  • 如果启用了 NetBIOS,如果名称不在本地 NetBIOS 缓存中,则通过广播 NetBIOS-NS 查询来尝试 NetBIOS 名称解析。如果配置了Windows Internet Name Service(WINS)服务器,这一步可能会使用Windows Internet Name Service(WINS)服务器,以及LAN Manager hosts(LMHOSTS)文件。

参考链接

  • https://datatracker.ietf.org/doc/html/rfc4795


文章来源: http://mp.weixin.qq.com/s?__biz=MzUzNTEyMTE0Mw==&mid=2247485254&idx=1&sn=9958bcd7a2750c077a8c66d2bb2da0cb&chksm=fa8b1adecdfc93c8ebd0357c2622e8d949335df96f70e25d33aced76742cb8ad0708821b0a05#rd
如有侵权请联系:admin#unsafe.sh