前言
链路本地多播名称解析(LLMNR)是一个基于域名系统(DNS)数据包格式的协议,IPv4和IPv6的主机可以通过此协议对同一本地链路上的主机执行名称解析。
在DNS 服务器不可用时,DNS 客户端计算机可以使用本地链路多播名称解析 (LLMNR—Link-Local Multicast Name Resolution)(也称为多播 DNS 或 mDNS)来解析本地网段上的名称。例如,如果路由器出现故障,从网络上的所有 DNS 服务器切断了子网,则支持 LLMNR 的子网上的客户端可以继续在对等基础上解析名称,直到网络连接还原为止。
LLMNR和NetBIOS
LLMNR的工作过程
(1) 主机在自己的内部名称缓存中查询名称。如果在缓存中没有找到名称,那么主机就会向自己配置的主DNS服务器发送查询请求。如果主机没有收到回应或收到了错误信息,主机还会尝试搜索配置的备用DNS服务器。如果主机没有配置DNS服务器,或者如果在连接DNS服务器的时候没有遇到错误但失败了,那么名称解析会失败,并转为使用LLMNR。
(2) 主机通过UDP写发送多播查询,查询主机名对应的IP地址,这个查询会被限制在本地子网(也就是所谓的链路局部)内。
(3) 链路局部范围内每台支持LLMNR,并且被配置为响应传入查询的主机在收到这个查询请求后,会将被查询的名称和自己的主机名进行比较。如果没有找到匹配的主机名,那么计算机就会丢弃这个查询。如果找到了匹配的主机名,这台计算机会传输一条包含了自己IP地址的单播信息给请求该查询的主机。
NetBIOS的定义
Netbios(Network Basic Input Output System):网络基本输入输出系统,它提供了OSI模型中的会话层服务,让在不同计算机上运行的不同程序,可以在局域网中,互相连线,以及分享数据。严格来说,Netbios是一种应用程序接口(API),系统可以利用WINS服务、广播及Lmhost文件等多种模式将NetBIOS名解析为相应IP地址,几乎所有的局域网都是在NetBIOS协议的基础上工作的。NetBIOS也是计算机的标识名称,主要用于局域网内计算机的互访。NetBIOS的工作流程就是正常的机器名解析查询应答过程。在Windows操作系统中,默认情况下在安装 TCP/IP 协议后会自动安装NetBIOS。
windows系统名称解析顺序
1. 本地hosts文件(%windir%System32driversetchosts)
2. DNS缓存/DNS服务器
3. 链路本地多播名称解析(LLMNR)和NetBIOS名称服务(NBT-NS)
也就是说,如果在缓存中没有找到名称,DNS名称服务器又请求失败时,Windows系统就会通过链路本地多播名称解析(LLMNR)和Net-BIOS名称服务(NBT-NS)在本地进行名称解析。这时,客户端就会将未经认证的UDP广播到网络中,询问它是否为本地系统的名称。这就产生了一个安全问题。由于该过程未被认证,并且广播到整个网络,从而允许网络上的任何机器响应并声称是目标机器。通过工具监听LLMNR和NetBIOS广播,攻击者可以伪装成受害者要访问的目标机器,并从而让受害者交出相应的登陆凭证。
LLMNR和NetBIOS欺骗
原理探究
在使用传输控制协议 (TCP) 和互联网协议 (IP) 堆栈的网络(包括当今大多数网络)上,需要将资源名称转换为 IP 地址以连接到这些资源。因此,网络需要将“resource.domain.com”解析为“xxxx”的 IP 地址,以便准确知道将流量发送到何处。Microsoft Windows 客户端在尝试将名称解析为地址时遵循一系列方法,在成功将名称与 IP 地址匹配时停止搜索。
当计算机请求网络资源时,它通常遵循下面指定的查询层次结构(使用略有不同的配置)来识别目标资源。一旦名称被识别,它就会停止。
1. 检查以确认请求是否针对本地机器名称。
2. 检查最近成功解析的名称的本地缓存。
3. 搜索本地主机文件,该文件是存储在本地计算机上的 IP 地址和名称列表。根据设备的不同,此文件可能已加载到本地缓存中。
4. 查询 DNS 服务器(如果已配置)。
5. 如果启用了 LLMNR,则跨本地子网广播 LLMNR 查询以询问其对等方进行解析。
6. 如果启用了 NetBIOS,如果名称不在本地 NetBIOS 缓存中,则通过向本地子网广播 NetBIOS-NS 查询来尝试 NetBIOS 名称解析。如果如此配置,此步骤可能会使用 Windows Internet 名称服务 (WINS) 服务器以及 LAN 管理器主机 (LMHOSTS) 文件。
注意,计算机的 NetBIOS 名称及其主机名可以不同。但是,在大多数情况下,NetBIOS 名称与完整主机名相同或截断后的版本。IP 的 NetBIOS 名称解析可以通过广播通信、使用 WINS 服务器或使用 LMHOSTS 文件进行。
深入探究
这些协议的主要问题是受害计算机对其网络段内的其他设备的固有信任。如果计算机无法在上面列出的前四个步骤中识别出它正在寻找的资源,我们最喜欢的本地名称解析协议就会发挥作用。最好的例子是当用户输入错误的资源名称或请求不再可访问的资源时。
这种情况经常发生在网络的用户段,这就是攻击者进入的地方。一旦攻击者注意到网络上正在通过 LLMNR 或 NetBIOS-NS 请求这些资源,攻击者就无法阻止对受害计算机的响应,并且实际上是在告诉请求资源的主机自己就是被寻找的那个资源。事实上,我们可以更进一步的受害计算机,你应该尽快使用凭证跟我进行认证。果然,受害计算机使用其网络凭据的散列版本来响应攻击者。
与易受攻击的网络发现协议相关的利用步骤如下:
这里的通常目标是让攻击者从受害机器获取用户凭据。最后,要以“明文”形式获得实际密码,以便可用于获得网络身份验证,必须以 NetNTLMv2 格式破解散列密码。
另一个可能的攻击向量是攻击者将凭据在内网环境内进行碰撞。这种方法类似于前面描述的方法,不同之处在于攻击者不是简单地保存凭据,而是将它们瞄准内网内的其他系统。如果该帐户的凭据在其他系统上有效,则攻击者可以成功访问该系统,这里跟hash传递的思路有一点类似。
攻击
使用responder
工具,在kali里自带。
Responder是监听LLMNR和NetBIOS协议的工具之一,能够抓取网络中所有的LLMNR和NetBIOS请求并进行响应,获取最初的账户凭证。
Responder会利用内置SMB认证服务器、MSSQL认证服务器、HTTP认证服务器、HTTPS认证服务器、LDAP认证服务器,DNS服务器、WPAD代理服务器,以及FTP、POP3、IMAP、SMTP等服务器,收集目标网络中的明文凭据,还可以通过Multi-Relay功能在目标系统中执行命令。
在渗透测试中,使用responder并启动回应请求功能,responder会自动回应客户端的请求并声明自己就是被输入了错误主机名称的那台主机,然后尝试建立SMB连接。对于SMB协议,客户端在连接服务端时,默认先使用本机的用户名和密码hash尝试登录,此时攻击者就可以得到受害机的Net-NTML Hash,并用john、hashcat等工具破解出客户端当前用户的明文密码。
开启监听
responder -I eth0 -f
-
-I:指定使用的网卡 -
-f:允许攻击者查看受害者指纹
这里可以看到LLMNR
跟NBT-NS
都已经打开
靶机操作
这里需要注意的是靶机需要在家庭网络或公共网络下,因为必须要确保凭据通过smb协议传输
这里让靶机访问一个不存在的主机地址,也可以命令行输入net use \gha
因为在一轮寻找过程后会调用NetBIOS
去寻找,这时候攻击者就可以伪造一个LLMNR
欺骗去获取靶机的凭证
这里就会返回靶机的用户名、NTMLv2 hash
破解hash
这里我们可以让responder一直运行以尽可能捕捉更多的hash,在停止responder之后会在安装目录的log目录下生成一个txt文件保存捕捉到的hash
这里破解hash一般用到两个软件,一个是hashcat
,另外一个就是kali里面自带的John
。这里使用John
破解密码,因为这里密码设置得很简单所以就不需要外部字典,有些复杂的hash利用John
不能够破解出来的就需要加载外部字典进行破解
LLMNR和NetBIOS的防范
端口剖析
这里我总结一下能够利用LLMNR和NetBIOS进行欺骗的前提如下:
必须在受害计算机上启用 NetBIOS 或 LLMNR。此外,受害计算机上的防火墙必须允许此流量进入机器,默认情况下,机器使用端口 UDP 137、UDP 138、TCP 139、TCP 5355 和 UDP 5355。
攻击者系统必须与受害计算机位于同一网段(本地子网)。本质上,攻击者计算机必须能够接收到受害计算机的流量。
NetBIOS
最常用的三个端口就是137、138、139
137端口:137端口主要用于“NetBIOS Name Service”(NetBIOS名称服务),属于UDP端口,使用者只需要向局域网或互联网上的某台计算机的137端口发送一个请求,就可以获取该计算机的名称、注册用户名,以及是否安装主域控制器、IIS是否正在运行等信息。
138端口:主要提供NetBIOS环境下计算机名的浏览功能。
139端口:通过这个端口进入的连接试图获得NetBIOS/SMB服务。这个协议被用于Windows”文件和打印机共享”和SAMBA。
PORT STATE SERVICE VERSION
137/udp open netbios-ns Samba nmbd netbios-ns (workgroup: WORKGROUP)
138/udp open|filtered netbios-dgm
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
为什么会产生漏洞的原因或许存在于137端口呢?因为在Windows网络通信协议–“NetBIOS over TCP/IP(NBT)”的计算机名管理功能中使用的是137端口。
计算机名管理是指Windows网络中的电脑通过用于相互识别的名字–NetBIOS名,获取实际的IP地址的功能。可以用两种方法使用137端口。
一种方法是,位于同一组中的电脑之间利用广播功能进行计算机名管理。电脑在起动时或者连接网络时,会向位于同组中的所有电脑询问有没有正在使用与自己相同的NetBIOS名的电脑。每台收到询问的电脑如果使用了与自己相同的NetBIOS名,就会发送通知信息包。这些通信是利用137端口进行的。
另一种方法是利用WINS(Windows因特网名称服务)管理计算机名。被称为WINS服务器的电脑有一个IP地址和NetBIOS名的对照表。WINS客户端在系统起动时或连接网络时会将自己的NetBIOS名与IP地址发送给WINS服务器。与其他计算机通信时,会向WINS服务器发送NetBIOS名,询问IP地址。这种方法也使用137端口。
如上所述,为了得到通信对象的IP地址,137端口就要交换很多信息包。在这些信息包中,包括有很多信息。利用广播管理计算机名时,会向所有电脑发送这些信息。如果使用NBT,就会在用户没有查觉的情况下,由电脑本身就会向外部散布自己的详细信息。
防范
1.最实用的方法在每台计算机的 NIC 上禁用 NetBIOS 并通过 DHCP 禁用 LLMNR ,但是这对于一些需要使用到NetBIOS和LLMNR服务的组织不太友好,所以更好的方法是每个系统的主机防火墙上通过阻止 NetBIOS 协议和 TCP 端口 139 以及 LLMNR UDP 端口来限制出站 NetBIOS 和 LLMNR 流量5355。这样就可以有效的防止这几个端口流量出站。
2.但是使用禁用端口流量的方法并不保险,可能攻击者会使用端口的方法从另外端口将NetBIOS和LLMNR的流量转发出站。所以另外一种防范办法就是将默认端口改成一些不会引起攻击者注意的高端口,即将端口重定向。这种重定向的方法修改注册表里面的PortNumber
修改即可。
[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlTerminalServerWdsrdpwdTdstcp]
[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlTerminalServerWinStationsRDP-Tcp]
3.跟第一点防范方法比较相似的另外一种方法便是给这几个端口配置IPsec安全策略,这样在攻击者试图这几个端口进行扫描的时候就不会得到任何回应。
加下方wx,拉你一起进群学习
往期推荐
原文始发于微信公众号(红队蓝军):利用NetBIOS欺骗攻击盗取hash