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等工具破解出客户端当前用户的明文密码。
开启监听
-
-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
不能够破解出来的就需要加载外部字典进行破解