本文来自宽字节安全第一期学员Demia投稿。第二期线下培训预计十一月底开班,欢迎咨询。
比较基础的windows名称解析机制 为了NTLM relay打下一下基础。土豆家族都是基于NTLM relay进行的
TCP 协议的通信是基于 IP 地址的,“名称解析”就是把需要访问的计算机的名字解析为 IP 地址的过程。
类型
从狭义上来说,主机名称正如它的字面意思一样就是一台主机的名字。从广义来说,它又不仅仅包含计算机的名字,也包含互联网中的域名。(主机名称是有限制的255字符,A-Z a-z,-)
在 Windows 系统中的另外一种名称就是 NetBIOS 名称,准确的说 NetBIOS 名称并非是一种名字系统而是 Windows 操作系统网络的一个编程接口,允许主机之间使用 NetBIOS 名称进行通信,通信过程是建立在 NetBIOS 协议之上的在安装完 Windows 系统后系统会默认使用计算机的名字做为当前主机的 NetBIOS 名称。它的最大长度为 16 个字符,其中最后一位是不可配置的用于指定 NetBIOS 的服务类型。如果计算机名称不足 15 位则使用空格补全到 15 位,反之,如果计算机名称超过 15 位 则会截取前 15 位。
常见的 NetBIOS 后缀有 0x20(文件和打印服务)、0x00(工作站服务)、0x03(报信者服务)0x1C (域控制器) 0x21 (远程访问服务器客户端) 等。
windows端口对应的协议
DNS客户端和DNS服务器共同为计算机和用户提供计算机名称到IP地址映射的名称解析服务。DNS协议支持IPV4和IPV6,DNS协议实现名称解析的过程中,在客户端没有任何本地的数据库文件,所监听的端口UDP/53。DNS数据包的组成:
DNS的名称解析过程:
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的三种服务:
Service Name | Port | Protocol | Short Name |
---|---|---|---|
NetBIOS Name service | 137 | UDP/TCP | NBNS |
NetBIOS Datagram | 138 | UDP | NBND |
NetBIOS Session service | 139 | TCP | NBSS |
三种服务的详解:
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 -A 192.168.146.143的过程
请求包:
响应包
会带有自己的主机名 netbios名以及MAC地址返回
Name Registration NBNS名称注册
请求包
响应包
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 进行名称解析的过程为:
工作原理:当一台主机想要访问到另一台主机时,主机在自己的内部名称缓存中查询名称,如果在缓存中没有找到名称,那么主机就会向自己配置的DNS服务器发送查询请求,如果主机没有收到回应或收到了错误信息,即DNS解析会失败,那么就会转为使用LLMNR链路本地多播名称解析。使用链路本地多播名称解析时,主机会通过 UDP 向局域网内发送多播查询,查询主机名对应的IP,查询范围被限制在本地子网内。本地子网内每台支持LLMNR的主机在收到这个查询请求后,收到该请求的主机会判断自己的主机名是不是这个查询的主机名。如果是,这台主机会回复自己IP地址给请求该查询的主机;如果不是,则丢弃该请求。
协议结构图
数据包字段说明
剩下的具体内容可以参考RFC
查询和应答包
查询数据包的详情
应答数据包的详情
windows在请求一个网络资源的完整过程。
参考链接
https://datatracker.ietf.org/doc/html/rfc4795