Windows 名称解析机制探究及缺陷利用

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

0x00 Windows 名称解析简介

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

Windows 中的名称类型

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

主机名称

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

由于域名是以树状的形式所表现的,同时也是主机名称的一种,所以主机名称是有层次的,最大长度为 255 个字符,允许的字符有 A~Za~z-。在域名系统中有一种标识一台主机的 DNS 名字的域名叫做 FQDN(Fully Qualified Domain Name,全限定域名),从全限定域名中包含的信息可以准确看出主机在域名树中的位置。

FQDN 是一种同时带有主机名和域名的名称,含义是完整的域名。FQDN = Hostname + DomainName。例如,主机名是 test,域名是 example.com,则该主机的 FQDN = test.example.com。

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 系统中有三种与名称解析相关的协议。

DNS 协议

DNS 协议是一种最主要的也是操作系统首选的进行名称解析的协议,几乎每一种操作系统都支持 DNS 协议,同时, DNS 协议支持 IPv4 和 IPv6。DNS 协议在实现名称解析的过程中,在客户机上没有任何本地的数据库文件,完全依赖于 DNS 服务器,所监听的端口是 UDP/53 。

使用 ipconfig /displaydns 命令来查看本机的 DNS 缓存。
使用 ipconfig /flushdns 命令清除本机的 DNS 缓存。

DNS 的名称解析过程如下:

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

hosts 文件位于 C:\Windows\System32\drivers\etc\hosts,用于提供主机名到 IP 地址的解析 。

NetBIOS 协议

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

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

NBNS(NetBIOS Name Service,NetBIOS 域名服务器),类似于 TCP/IP 协议中的 DNS,它负责查找目标机器相应的节点地址(TCP/IP协议中为IP地址),并赋予一个 NetBIOS 名称。

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

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

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

lmhosts 文件位于 C:\Windows\System32\drivers\etc\lmhosts.sam,用于把 NetBIOS 名字映射到IP地址。

使用 nbtstat -c 命令查看本机的 NetBIOS 缓存。
使用 nbtstat -R 命令清除本机的 NetBIOS 缓存。

LLMNR 协议

DNS 协议的名称解析虽然高效但是需要在局域网中单独配置一台服务器作为 DNS 服务器,NetBIOS 协议的名称解析在一些情况下也需要单独配置一台 WINS 服务器,而且 NetBIOS 协议不支持 IPv6。因此,为了弥补这些不足,微软在 Windows Vista 之后推出了基于端到端的名称解析协议,即 LLMNR(Link-Local Multicast Name Resolution,本地链路多播名称解析)

LLMNR 也称作多播 DNS ,因为其数据包格式类似于 DNS 的数据包。其监听的端口为 UDP/5355,支持 IPv4 和 IPv6 ,IPv4 的组播地址为 224.0.0.252,IPv6 的组播地址为 FF02:0:0:0:0:0:1:3 或 FF02::1:3,并且在 Linux 上也实现了此协议。其解析名称的特点是提供了 点对点 的名称解析服务,可以让同一子网中的 IPv4 和 IPv6 设备不需要 WINS 或 DNS 服务器就可以解析对方的名称。

LLMNR 主要用于在网络出现故障的情况下(如 DNS 服务器不可用时)提供名称解析,此外在建立临时对等网络(例如,机场候机区域)方面也非常有用。

Windows 名称解析过程

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

  • 检查本地 NetBIOS 缓存;
  • 如果缓存中没有则会向当前子网域(也就是本地链路)发送 UDP 广播,查询主机名对应的 IP 地址;
  • 当前子网域的其他主机收到广播包后,将查询的名称和自己的主机名进行比较,如果找到了匹配的主机名,这台计算机会传输一条包含了自己 IP 地址的单播信息给请求该查询的主机,如果没有找到则丢弃这个查询;
  • 如果发送广播后无任何主机响应则请求失败。

0x02 Windows 系统名称解析顺序

影响 Windows 系统名称解析的两个因素,分别是:操作系统版本网络节点模式

操作系统版本

从上述一小节中,可以发现并非所有的操作系统版本都支持上述三种协议。

Windows 2K,XP,2K3 只支持 DNS 和 NetBIOS。 所以此类版本的 Windows 都是先进行 DNS 名称解析,如果 DNS 解析名称失败,才会进行 NetBIOS 名称解析。

Windows Vista 之后(包括 2K8,Win7,Win8.x,Win10)都支持上述三种协议,在这类 Windows系统中的名称解析顺序为:先进行 DNS 名称解析,如果 DNS 解析名称失败,则会使用 LLMNR 进行名称解析,最后才会使用 NetBIOS 名称解析。

网络节点模式

还有一种影响 Windows 系统名称解析的一个因素就是当前主机的网络节点模式。

使用 ipconfig /all命令查看本机的网络节点模式。

网络节点模式主要会 影响 NetBIOS 名称解析过程,是优先查询 WINS 服务器还是先在子网域中进行广播。具体的节点模式描述如下:

  • B-节点(broadcast,广播)

Windows 使用广播来进行名称注册和名称解析,依据网关的配置,一个 B 节点客户机发送的数据包不能够超出局域网的范围,因此 B 节点并不适合于大型网络。实际上微软修改了标准的 B 节点类型,当 Windows 尝试解析名称时,首先检查 LMHOSTS 名称缓存,如果缓存中没有则会向当前子网发送广播,如果广播依然失败的话,Windows 才会检查实际的 LMHOSTS 文件。

  • P-节点(per-to-per,对等)

这种方法不使用广播,而是在计算机启动时,在网络中的 WINS 服务器上注册它们的名称。当计算机需要解析名称时,它会发送一个解析请求给 WINS 服务器。这种方法只在 WINS 服务器正常运行时有效,如果 WINS 服务器失败,则无法进行名称解析。

  • M-节点(mixed,混合)

Windows 联合使用 B 节点和 P 节点,并且默认使用 B 节点,如果 M 节点不能利用广播进行名称解析,它就使用 P 节点的 WINS 服务器来完成工作。

  • H-节点(hybrid,混合)

同样也是联合使用 B 节点和 P 节点,但工作方式相反,如果使用 WINS 服务器方式不能成功,则使用 B 节点的工作来完成工作。此节点模式也是目前 Windows 系统 默认使用 的节点模式。

综上所述,一种常用的 Windows 名称解析的过程为:

  1. 检查所解析名称是否是本机;
  2. 尝试通过 DNS 缓存进行名称解析;
  3. 尝试通过 hosts 文件进行名称解析;
  4. 尝试将查询请求发送到指定的 DNS 服务器;
  5. 尝试通过 NetBIOS 名称缓存;
  6. 尝试使用 LLMNR 进行名称解析;
  7. 尝试将 NetBIOS 查询请求发送到指定的 WINS 服务器;
  8. 尝试通过广播进行 NetBIOS 名称解析;
  9. 尝试通过 lmhosts 文件进行名称解析。

值得重点关注的是 4、6、7、8 条,这四种解析行为会尝试发起网络请求,容易受到攻击。

0x03 利用 Windows 名称解析机制的缺陷进行内网攻击

常见的利用 Windows 名称解析机制的缺陷进行攻击的技术有 DNS Spoof、NBNS Poison、LLMNR Poison 和 ICMP Redirection。

可以使用 SpiderLabs 的 Responder,或者 ZARP 工具包进行上述攻击。

LLMNR Poison 攻击环境如下:

  • 攻击者主机(Linux)IP:192.168.253.131
  • 受害者主机(Windows 8.1) IP:192.168.253.130
  • 两台主机处于同一个局域网中

攻击者在启动 Responder 后,当受害者去访问一个在当前局域网中不存在的主机时就会触发 LLMNR Poison 攻击,如下图所示:

受害者使用 net 指令访问一台局域网中并不存在的主机

Responder 会响应 LLMNR 的广播包并进行了 Poison 攻击

在受害者主机的 NetBIOS 缓存中已经加入了被 Poison 攻击的主机 IP 记录

上述攻击演示中,已经证实了 LLMNR Poison 攻击的效果,可以利用让受害者访问不存在的主机的共享,进行 LLMNR Poison 攻击。这样可以获得受害者主机的 HASH ,拿到 HASH 就可以进行暴力破解了,如果是弱口令的话,就可以爆破出密码。同样也可以利用让受害者访问不存在的 HTTP 服务器进行 401 认证拿到客户端的 HASH,如下图所示:

受害者访问一个不存在的主机的共享

LLMNR Poison 攻击同样拿到了 SMB 验证过程中的 HASH

获取 HASH 后,可以使用 John 对 HASH 进行暴力破解,获取用户的管理员口令。

参考文章:https://xz.aliyun.com/t/1740/


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!