本文作为一篇科普文章,阐述了 Windows 系统中的名称解析机制,同时也提及了几种利用名称解析机制的缺陷进行内网攻击的方式。

0x00 Windows 名称解析简介


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

Windows 中的名称类型

在 Windows 操作系统中,有两种名称,分别为:主机名称 和 NetBIOS 名称。

主机名称

从狭义上来说,主机名称正如它的字面意思一样就是一台主机的名字。从广义来说,它又不仅仅包含计算机的名字,也包含互联网中的域名。

由于域名是以树状的形式所表现的,同时也是主机名称的一种,所以主机名称是有层次的,最大长度为 255 个字符,允许的字符有 A~Z,a~z 和字符“-”。在域名系统中有一种标识一台主机的 DNS 名字的域名叫做 完全限定域名(FQDN),FQDN 是由“.”连接主机名字和主域名后缀组合成的,例如,seclab.her0in.org 的 FQDN 名称就是 seclab 。

NetBIOS 名称

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

使用nbtstat -n命令查看本机的 NetBIOS 名称。

使用nbtstat -A ipaddress命令查看指定 IP 主机的 NetBIOS 名称。

0x01 Windows 名称解析相关协议


在 Windows 系统中有三种与名称解析相关的协议。

Windows 名称解析之 DNS协议

DNS 协议是一种最主要的也是操作系统首选的进行名称解析的协议,几乎每一种操作系统都支持 DNS 协议,同时, DNS 协议支持 IP v4 和 IP v6。DNS 协议在实现名称解析的过程中,在客户机上没有任何本地的数据库文件,完全依赖于 DNS 服务器,所监听的端口是 UDP/53 。在客户机上可以使用ipconfig /displaydns命令来查看本机的 DNS 缓存,使用ipconfig /flushdns命令清除本机的 DNS 缓存。

DNS 的名称解析过程如下:

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

Windows 名称解析之 NetBIOS 协议

除了 DNS 之外,在早先版本的 Windows 中也使用 NetBIOS (network basic input/output system,网络基本输入输出系统)进行名称解析。本文介绍的 NetBIOS 协议名称解析是微软后来定义的 nbt 即 NetBIOS over TCP/IP 的名称解析类型。

nbt 服务监听的端口为 UDP/137,其进行名称解析的形式为向当前主机所在的子网域发送广播包。所以,当你使用抓包工具在局域网中抓包时总会收到很多 NBNS 数据包。

由于 NetBIOS 协议进行名称解析是发送的 UDP 广播包。这样做虽然速度快且无需额外的配置,但是广播包不能跨越网域同时也会增加一些网络流量,因此微软在后来推出了 WINS(Windows Internet Name Service)服务器,当计算机配置为使用 WINS 服务器进行名称解析时,客户机将直接和 WINS 服务器进行单播通讯,这样就可以弥补 NetBIOS 协议使用广播进行名称解析的不足。

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

  • 检查本地 NetBIOS 缓存
  • 如果缓存中没有请求的名称且已配置了 WINS 服务器,接下来则会向 WINS 服务器发出请求
点击收藏 | 0 关注 | 0
登录 后跟帖